1package gitattributes
2
3import (
4 "testing"
5
6 "github.com/stretchr/testify/suite"
7)
8
9type PatternSuite struct {
10 suite.Suite
11}
12
13func TestPatternSuite(t *testing.T) {
14 suite.Run(t, new(PatternSuite))
15}
16
17func (s *PatternSuite) TestMatch_domainLonger_mismatch() {
18 p := ParsePattern("value", []string{"head", "middle", "tail"})
19 r := p.Match([]string{"head", "middle"})
20 s.False(r)
21}
22
23func (s *PatternSuite) TestMatch_domainSameLength_mismatch() {
24 p := ParsePattern("value", []string{"head", "middle", "tail"})
25 r := p.Match([]string{"head", "middle", "tail"})
26 s.False(r)
27}
28
29func (s *PatternSuite) TestMatch_domainMismatch_mismatch() {
30 p := ParsePattern("value", []string{"head", "middle", "tail"})
31 r := p.Match([]string{"head", "middle", "_tail_", "value"})
32 s.False(r)
33}
34
35func (s *PatternSuite) TestSimpleMatch_match() {
36 p := ParsePattern("vul?ano", nil)
37 r := p.Match([]string{"value", "vulkano"})
38 s.True(r)
39}
40
41func (s *PatternSuite) TestSimpleMatch_withDomain() {
42 p := ParsePattern("middle/tail", []string{"value", "volcano"})
43 r := p.Match([]string{"value", "volcano", "middle", "tail"})
44 s.True(r)
45}
46
47func (s *PatternSuite) TestSimpleMatch_onlyMatchInDomain_mismatch() {
48 p := ParsePattern("value/volcano", []string{"value", "volcano"})
49 r := p.Match([]string{"value", "volcano", "tail"})
50 s.False(r)
51}
52
53func (s *PatternSuite) TestSimpleMatch_atStart() {
54 p := ParsePattern("value", nil)
55 r := p.Match([]string{"value", "tail"})
56 s.False(r)
57}
58
59func (s *PatternSuite) TestSimpleMatch_inTheMiddle() {
60 p := ParsePattern("value", nil)
61 r := p.Match([]string{"head", "value", "tail"})
62 s.False(r)
63}
64
65func (s *PatternSuite) TestSimpleMatch_atEnd() {
66 p := ParsePattern("value", nil)
67 r := p.Match([]string{"head", "value"})
68 s.True(r)
69}
70
71func (s *PatternSuite) TestSimpleMatch_mismatch() {
72 p := ParsePattern("value", nil)
73 r := p.Match([]string{"head", "val", "tail"})
74 s.False(r)
75}
76
77func (s *PatternSuite) TestSimpleMatch_valueLonger_mismatch() {
78 p := ParsePattern("tai", nil)
79 r := p.Match([]string{"head", "value", "tail"})
80 s.False(r)
81}
82
83func (s *PatternSuite) TestSimpleMatch_withAsterisk() {
84 p := ParsePattern("t*l", nil)
85 r := p.Match([]string{"value", "vulkano", "tail"})
86 s.True(r)
87}
88
89func (s *PatternSuite) TestSimpleMatch_withQuestionMark() {
90 p := ParsePattern("ta?l", nil)
91 r := p.Match([]string{"value", "vulkano", "tail"})
92 s.True(r)
93}
94
95func (s *PatternSuite) TestSimpleMatch_magicChars() {
96 p := ParsePattern("v[ou]l[kc]ano", nil)
97 r := p.Match([]string{"value", "volcano"})
98 s.True(r)
99}
100
101func (s *PatternSuite) TestSimpleMatch_wrongPattern_mismatch() {
102 p := ParsePattern("v[ou]l[", nil)
103 r := p.Match([]string{"value", "vol["})
104 s.False(r)
105}
106
107func (s *PatternSuite) TestGlobMatch_fromRootWithSlash() {
108 p := ParsePattern("/value/vul?ano/tail", nil)
109 r := p.Match([]string{"value", "vulkano", "tail"})
110 s.True(r)
111}
112
113func (s *PatternSuite) TestGlobMatch_withDomain() {
114 p := ParsePattern("middle/tail", []string{"value", "volcano"})
115 r := p.Match([]string{"value", "volcano", "middle", "tail"})
116 s.True(r)
117}
118
119func (s *PatternSuite) TestGlobMatch_onlyMatchInDomain_mismatch() {
120 p := ParsePattern("volcano/tail", []string{"value", "volcano"})
121 r := p.Match([]string{"value", "volcano", "tail"})
122 s.False(r)
123}
124
125func (s *PatternSuite) TestGlobMatch_fromRootWithoutSlash() {
126 p := ParsePattern("value/vul?ano/tail", nil)
127 r := p.Match([]string{"value", "vulkano", "tail"})
128 s.True(r)
129}
130
131func (s *PatternSuite) TestGlobMatch_fromRoot_mismatch() {
132 p := ParsePattern("value/vulkano", nil)
133 r := p.Match([]string{"value", "volcano"})
134 s.False(r)
135}
136
137func (s *PatternSuite) TestGlobMatch_fromRoot_tooShort_mismatch() {
138 p := ParsePattern("value/vul?ano", nil)
139 r := p.Match([]string{"value"})
140 s.False(r)
141}
142
143func (s *PatternSuite) TestGlobMatch_fromRoot_notAtRoot_mismatch() {
144 p := ParsePattern("/value/volcano", nil)
145 r := p.Match([]string{"value", "value", "volcano"})
146 s.False(r)
147}
148
149func (s *PatternSuite) TestGlobMatch_leadingAsterisks_atStart() {
150 p := ParsePattern("**/*lue/vol?ano/ta?l", nil)
151 r := p.Match([]string{"value", "volcano", "tail"})
152 s.True(r)
153}
154
155func (s *PatternSuite) TestGlobMatch_leadingAsterisks_notAtStart() {
156 p := ParsePattern("**/*lue/vol?ano/tail", nil)
157 r := p.Match([]string{"head", "value", "volcano", "tail"})
158 s.True(r)
159}
160
161func (s *PatternSuite) TestGlobMatch_leadingAsterisks_mismatch() {
162 p := ParsePattern("**/*lue/vol?ano/tail", nil)
163 r := p.Match([]string{"head", "value", "Volcano", "tail"})
164 s.False(r)
165}
166
167func (s *PatternSuite) TestGlobMatch_tailingAsterisks() {
168 p := ParsePattern("/*lue/vol?ano/**", nil)
169 r := p.Match([]string{"value", "volcano", "tail", "moretail"})
170 s.True(r)
171}
172
173func (s *PatternSuite) TestGlobMatch_tailingAsterisks_single() {
174 p := ParsePattern("/*lue/**", nil)
175 r := p.Match([]string{"value", "volcano"})
176 s.True(r)
177}
178
179func (s *PatternSuite) TestGlobMatch_tailingAsterisk_single() {
180 p := ParsePattern("/*lue/*", nil)
181 r := p.Match([]string{"value", "volcano", "tail"})
182 s.False(r)
183}
184
185func (s *PatternSuite) TestGlobMatch_tailingAsterisks_exactMatch() {
186 p := ParsePattern("/*lue/vol?ano/**", nil)
187 r := p.Match([]string{"value", "volcano"})
188 s.False(r)
189}
190
191func (s *PatternSuite) TestGlobMatch_middleAsterisks_emptyMatch() {
192 p := ParsePattern("/*lue/**/vol?ano", nil)
193 r := p.Match([]string{"value", "volcano"})
194 s.True(r)
195}
196
197func (s *PatternSuite) TestGlobMatch_middleAsterisks_oneMatch() {
198 p := ParsePattern("/*lue/**/vol?ano", nil)
199 r := p.Match([]string{"value", "middle", "volcano"})
200 s.True(r)
201}
202
203func (s *PatternSuite) TestGlobMatch_middleAsterisks_multiMatch() {
204 p := ParsePattern("/*lue/**/vol?ano", nil)
205 r := p.Match([]string{"value", "middle1", "middle2", "volcano"})
206 s.True(r)
207}
208
209func (s *PatternSuite) TestGlobMatch_wrongDoubleAsterisk_mismatch() {
210 p := ParsePattern("/*lue/**foo/vol?ano/tail", nil)
211 r := p.Match([]string{"value", "foo", "volcano", "tail"})
212 s.False(r)
213}
214
215func (s *PatternSuite) TestGlobMatch_magicChars() {
216 p := ParsePattern("**/head/v[ou]l[kc]ano", nil)
217 r := p.Match([]string{"value", "head", "volcano"})
218 s.True(r)
219}
220
221func (s *PatternSuite) TestGlobMatch_wrongPattern_noTraversal_mismatch() {
222 p := ParsePattern("**/head/v[ou]l[", nil)
223 r := p.Match([]string{"value", "head", "vol["})
224 s.False(r)
225}
226
227func (s *PatternSuite) TestGlobMatch_wrongPattern_onTraversal_mismatch() {
228 p := ParsePattern("/value/**/v[ou]l[", nil)
229 r := p.Match([]string{"value", "head", "vol["})
230 s.False(r)
231}
232
233func (s *PatternSuite) TestGlobMatch_issue_923() {
234 p := ParsePattern("**/android/**/GeneratedPluginRegistrant.java", nil)
235 r := p.Match([]string{"packages", "flutter_tools", "lib", "src", "android", "gradle.dart"})
236 s.False(r)
237}