-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathcheckers_registry.go
112 lines (99 loc) · 3.77 KB
/
checkers_registry.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package checkers
import (
"sort"
)
// registry stores checkers meta information in checkers' priority order.
var registry = checkersRegistry{
// Regular checkers.
{factory: asCheckerFactory(NewFloatCompare), enabledByDefault: true},
{factory: asCheckerFactory(NewBoolCompare), enabledByDefault: true},
{factory: asCheckerFactory(NewEmpty), enabledByDefault: true},
{factory: asCheckerFactory(NewNegativePositive), enabledByDefault: true},
{factory: asCheckerFactory(NewCompares), enabledByDefault: true},
{factory: asCheckerFactory(NewContains), enabledByDefault: true},
{factory: asCheckerFactory(NewErrorNil), enabledByDefault: true},
{factory: asCheckerFactory(NewNilCompare), enabledByDefault: true},
{factory: asCheckerFactory(NewErrorIsAs), enabledByDefault: true},
{factory: asCheckerFactory(NewEncodedCompare), enabledByDefault: true},
{factory: asCheckerFactory(NewExpectedActual), enabledByDefault: true},
{factory: asCheckerFactory(NewLen), enabledByDefault: true},
{factory: asCheckerFactory(NewRegexp), enabledByDefault: true},
{factory: asCheckerFactory(NewSuiteExtraAssertCall), enabledByDefault: true},
{factory: asCheckerFactory(NewSuiteDontUsePkg), enabledByDefault: true},
{factory: asCheckerFactory(NewUselessAssert), enabledByDefault: true},
{factory: asCheckerFactory(NewFormatter), enabledByDefault: true},
// Advanced checkers.
{factory: asCheckerFactory(NewBlankImport), enabledByDefault: true},
{factory: asCheckerFactory(NewGoRequire), enabledByDefault: true},
{factory: asCheckerFactory(NewRequireError), enabledByDefault: true},
{factory: asCheckerFactory(NewSuiteBrokenParallel), enabledByDefault: true},
{factory: asCheckerFactory(NewSuiteSubtestRun), enabledByDefault: true},
{factory: asCheckerFactory(NewSuiteTHelper), enabledByDefault: false},
}
type checkersRegistry []checkerMeta
type checkerMeta struct {
factory checkerFactory
enabledByDefault bool
}
type checkerFactory func() Checker
func asCheckerFactory[T Checker](fn func() T) checkerFactory {
return func() Checker {
return fn()
}
}
func (r checkersRegistry) get(name string) (m checkerMeta, priority int, found bool) {
for i, meta := range r {
if meta.factory().Name() == name {
return meta, i, true
}
}
return checkerMeta{}, 0, false
}
// All returns all checkers names sorted by checker's priority.
func All() []string {
result := make([]string, 0, len(registry))
for _, meta := range registry {
result = append(result, meta.factory().Name())
}
return result
}
// EnabledByDefault returns checkers enabled by default sorted by checker's priority.
func EnabledByDefault() []string {
result := make([]string, 0, len(registry))
for _, meta := range registry {
if meta.enabledByDefault {
result = append(result, meta.factory().Name())
}
}
return result
}
// Get returns new checker instance by checker's name.
func Get(name string) (Checker, bool) {
meta, _, ok := registry.get(name)
if ok {
return meta.factory(), true
}
return nil, false
}
// IsKnown checks if there is a checker with that name.
func IsKnown(name string) bool {
_, _, ok := registry.get(name)
return ok
}
// IsEnabledByDefault returns true if a checker is enabled by default.
// Returns false if there is no such checker in the registry.
// For pre-validation use Get or IsKnown.
func IsEnabledByDefault(name string) bool {
meta, _, ok := registry.get(name)
return ok && meta.enabledByDefault
}
// SortByPriority mutates the input checkers names by sorting them in checker priority order.
// Ignores unknown checkers. For pre-validation use Get or IsKnown.
func SortByPriority(checkers []string) {
sort.Slice(checkers, func(i, j int) bool {
lhs, rhs := checkers[i], checkers[j]
_, lhsPriority, _ := registry.get(lhs)
_, rhsPriority, _ := registry.get(rhs)
return lhsPriority < rhsPriority
})
}