-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmatcher.go
107 lines (86 loc) · 2.55 KB
/
matcher.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
/*
Copyright 2018 Turbine Labs, Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package stats
import (
"fmt"
"regexp"
"github.com/golang/mock/gomock"
"github.com/turbinelabs/test/check"
)
// Matcher creates a gomock.Matcher for a Stats implementation
// generated by this package only. It does not work with arbitrary
// Stats implementations.
func Matcher(expected Stats) gomock.Matcher {
switch s := expected.(type) {
case *xStats:
return &xstatsEqual{expected: s}
case *apiStats:
return &apiStatsEqual{expected: s}
default:
panic(fmt.Sprintf("unknown Stats implementation type %T", expected))
}
}
// xstatsEqual is a Matcher for xStats implementations of Stats.
type xstatsEqual struct {
expected *xStats
}
func (s xstatsEqual) Matches(x interface{}) bool {
got, ok := x.(*xStats)
if !ok {
fmt.Printf("wrong got type: %+v (%T), expected %T\n", x, x, &xStats{})
return false
}
same, _ := check.DeepEqual(s.expected, got)
return same
}
func (s xstatsEqual) String() string {
return fmt.Sprintf("xstatsEqual(%+v)", s.expected)
}
// apiStatsEqual is a Matcher for apiStats implementations of Stats.
type apiStatsEqual struct {
expected *apiStats
}
func (s apiStatsEqual) Matches(x interface{}) bool {
got, ok := x.(*apiStats)
if !ok {
fmt.Printf("wrong got type: %+v (%T), expected %T\n", x, x, &apiStats{})
return false
}
same, _ := check.DeepEqual(s.expected, got)
return same
}
func (s apiStatsEqual) String() string {
return fmt.Sprintf("apiStatsEqual(%+v)", s.expected)
}
// TagMatches creates a Matcher that matches a Tag with the given key
// and a value regular expression.
func TagMatches(key, valueRegex string) gomock.Matcher {
return tagMatches{
key: key,
valueRegex: regexp.MustCompile(valueRegex),
}
}
type tagMatches struct {
key string
valueRegex *regexp.Regexp
}
func (m tagMatches) Matches(x interface{}) bool {
tag, ok := x.(Tag)
if !ok {
return false
}
return m.key == tag.K && m.valueRegex.MatchString(tag.V)
}
func (m tagMatches) String() string {
return fmt.Sprintf("tagMatches(%s=~/%s/)", m.key, m.valueRegex.String())
}