xref: /aosp_15_r20/build/make/tools/compliance/conditionset_test.go (revision 9e94795a3d4ef5c1d47486f9a02bb378756cea8a)
1*9e94795aSAndroid Build Coastguard Worker// Copyright 2021 Google LLC
2*9e94795aSAndroid Build Coastguard Worker//
3*9e94795aSAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*9e94795aSAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*9e94795aSAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*9e94795aSAndroid Build Coastguard Worker//
7*9e94795aSAndroid Build Coastguard Worker//      http://www.apache.org/licenses/LICENSE-2.0
8*9e94795aSAndroid Build Coastguard Worker//
9*9e94795aSAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*9e94795aSAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*9e94795aSAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9e94795aSAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*9e94795aSAndroid Build Coastguard Worker// limitations under the License.
14*9e94795aSAndroid Build Coastguard Worker
15*9e94795aSAndroid Build Coastguard Workerpackage compliance
16*9e94795aSAndroid Build Coastguard Worker
17*9e94795aSAndroid Build Coastguard Workerimport (
18*9e94795aSAndroid Build Coastguard Worker	"strings"
19*9e94795aSAndroid Build Coastguard Worker	"testing"
20*9e94795aSAndroid Build Coastguard Worker)
21*9e94795aSAndroid Build Coastguard Worker
22*9e94795aSAndroid Build Coastguard Workerfunc TestConditionSet(t *testing.T) {
23*9e94795aSAndroid Build Coastguard Worker	tests := []struct {
24*9e94795aSAndroid Build Coastguard Worker		name        string
25*9e94795aSAndroid Build Coastguard Worker		conditions  []string
26*9e94795aSAndroid Build Coastguard Worker		plus        *[]string
27*9e94795aSAndroid Build Coastguard Worker		minus       *[]string
28*9e94795aSAndroid Build Coastguard Worker		matchingAny map[string][]string
29*9e94795aSAndroid Build Coastguard Worker		expected    []string
30*9e94795aSAndroid Build Coastguard Worker	}{
31*9e94795aSAndroid Build Coastguard Worker		{
32*9e94795aSAndroid Build Coastguard Worker			name:       "empty",
33*9e94795aSAndroid Build Coastguard Worker			conditions: []string{},
34*9e94795aSAndroid Build Coastguard Worker			plus:       &[]string{},
35*9e94795aSAndroid Build Coastguard Worker			matchingAny: map[string][]string{
36*9e94795aSAndroid Build Coastguard Worker				"notice":                []string{},
37*9e94795aSAndroid Build Coastguard Worker				"restricted":            []string{},
38*9e94795aSAndroid Build Coastguard Worker				"restricted|reciprocal": []string{},
39*9e94795aSAndroid Build Coastguard Worker			},
40*9e94795aSAndroid Build Coastguard Worker			expected: []string{},
41*9e94795aSAndroid Build Coastguard Worker		},
42*9e94795aSAndroid Build Coastguard Worker		{
43*9e94795aSAndroid Build Coastguard Worker			name:       "emptyminusnothing",
44*9e94795aSAndroid Build Coastguard Worker			conditions: []string{},
45*9e94795aSAndroid Build Coastguard Worker			minus:      &[]string{},
46*9e94795aSAndroid Build Coastguard Worker			matchingAny: map[string][]string{
47*9e94795aSAndroid Build Coastguard Worker				"notice":                []string{},
48*9e94795aSAndroid Build Coastguard Worker				"restricted":            []string{},
49*9e94795aSAndroid Build Coastguard Worker				"restricted|reciprocal": []string{},
50*9e94795aSAndroid Build Coastguard Worker			},
51*9e94795aSAndroid Build Coastguard Worker			expected: []string{},
52*9e94795aSAndroid Build Coastguard Worker		},
53*9e94795aSAndroid Build Coastguard Worker		{
54*9e94795aSAndroid Build Coastguard Worker			name:       "emptyminusnotice",
55*9e94795aSAndroid Build Coastguard Worker			conditions: []string{},
56*9e94795aSAndroid Build Coastguard Worker			minus:      &[]string{"notice"},
57*9e94795aSAndroid Build Coastguard Worker			matchingAny: map[string][]string{
58*9e94795aSAndroid Build Coastguard Worker				"notice":                []string{},
59*9e94795aSAndroid Build Coastguard Worker				"restricted":            []string{},
60*9e94795aSAndroid Build Coastguard Worker				"restricted|reciprocal": []string{},
61*9e94795aSAndroid Build Coastguard Worker			},
62*9e94795aSAndroid Build Coastguard Worker			expected: []string{},
63*9e94795aSAndroid Build Coastguard Worker		},
64*9e94795aSAndroid Build Coastguard Worker		{
65*9e94795aSAndroid Build Coastguard Worker			name:       "noticeonly",
66*9e94795aSAndroid Build Coastguard Worker			conditions: []string{"notice"},
67*9e94795aSAndroid Build Coastguard Worker			matchingAny: map[string][]string{
68*9e94795aSAndroid Build Coastguard Worker				"notice":             []string{"notice"},
69*9e94795aSAndroid Build Coastguard Worker				"notice|proprietary": []string{"notice"},
70*9e94795aSAndroid Build Coastguard Worker				"restricted":         []string{},
71*9e94795aSAndroid Build Coastguard Worker			},
72*9e94795aSAndroid Build Coastguard Worker			expected: []string{"notice"},
73*9e94795aSAndroid Build Coastguard Worker		},
74*9e94795aSAndroid Build Coastguard Worker		{
75*9e94795aSAndroid Build Coastguard Worker			name:       "allnoticeonly",
76*9e94795aSAndroid Build Coastguard Worker			conditions: []string{"notice"},
77*9e94795aSAndroid Build Coastguard Worker			plus:       &[]string{"notice"},
78*9e94795aSAndroid Build Coastguard Worker			matchingAny: map[string][]string{
79*9e94795aSAndroid Build Coastguard Worker				"notice":             []string{"notice"},
80*9e94795aSAndroid Build Coastguard Worker				"notice|proprietary": []string{"notice"},
81*9e94795aSAndroid Build Coastguard Worker				"restricted":         []string{},
82*9e94795aSAndroid Build Coastguard Worker			},
83*9e94795aSAndroid Build Coastguard Worker			expected: []string{"notice"},
84*9e94795aSAndroid Build Coastguard Worker		},
85*9e94795aSAndroid Build Coastguard Worker		{
86*9e94795aSAndroid Build Coastguard Worker			name:       "emptyplusnotice",
87*9e94795aSAndroid Build Coastguard Worker			conditions: []string{},
88*9e94795aSAndroid Build Coastguard Worker			plus:       &[]string{"notice"},
89*9e94795aSAndroid Build Coastguard Worker			matchingAny: map[string][]string{
90*9e94795aSAndroid Build Coastguard Worker				"notice":             []string{"notice"},
91*9e94795aSAndroid Build Coastguard Worker				"notice|proprietary": []string{"notice"},
92*9e94795aSAndroid Build Coastguard Worker				"restricted":         []string{},
93*9e94795aSAndroid Build Coastguard Worker			},
94*9e94795aSAndroid Build Coastguard Worker			expected: []string{"notice"},
95*9e94795aSAndroid Build Coastguard Worker		},
96*9e94795aSAndroid Build Coastguard Worker		{
97*9e94795aSAndroid Build Coastguard Worker			name:       "everything",
98*9e94795aSAndroid Build Coastguard Worker			conditions: []string{"unencumbered", "permissive", "notice", "reciprocal", "restricted", "proprietary"},
99*9e94795aSAndroid Build Coastguard Worker			plus:       &[]string{"restricted_if_statically_linked", "by_exception_only", "not_allowed"},
100*9e94795aSAndroid Build Coastguard Worker			matchingAny: map[string][]string{
101*9e94795aSAndroid Build Coastguard Worker				"unencumbered":                    []string{"unencumbered"},
102*9e94795aSAndroid Build Coastguard Worker				"permissive":                      []string{"permissive"},
103*9e94795aSAndroid Build Coastguard Worker				"notice":                          []string{"notice"},
104*9e94795aSAndroid Build Coastguard Worker				"reciprocal":                      []string{"reciprocal"},
105*9e94795aSAndroid Build Coastguard Worker				"restricted":                      []string{"restricted"},
106*9e94795aSAndroid Build Coastguard Worker				"restricted_if_statically_linked": []string{"restricted_if_statically_linked"},
107*9e94795aSAndroid Build Coastguard Worker				"proprietary":                     []string{"proprietary"},
108*9e94795aSAndroid Build Coastguard Worker				"by_exception_only":               []string{"by_exception_only"},
109*9e94795aSAndroid Build Coastguard Worker				"not_allowed":                     []string{"not_allowed"},
110*9e94795aSAndroid Build Coastguard Worker				"notice|proprietary":              []string{"notice", "proprietary"},
111*9e94795aSAndroid Build Coastguard Worker			},
112*9e94795aSAndroid Build Coastguard Worker			expected: []string{
113*9e94795aSAndroid Build Coastguard Worker				"unencumbered",
114*9e94795aSAndroid Build Coastguard Worker				"permissive",
115*9e94795aSAndroid Build Coastguard Worker				"notice",
116*9e94795aSAndroid Build Coastguard Worker				"reciprocal",
117*9e94795aSAndroid Build Coastguard Worker				"restricted",
118*9e94795aSAndroid Build Coastguard Worker				"restricted_if_statically_linked",
119*9e94795aSAndroid Build Coastguard Worker				"proprietary",
120*9e94795aSAndroid Build Coastguard Worker				"by_exception_only",
121*9e94795aSAndroid Build Coastguard Worker				"not_allowed",
122*9e94795aSAndroid Build Coastguard Worker			},
123*9e94795aSAndroid Build Coastguard Worker		},
124*9e94795aSAndroid Build Coastguard Worker		{
125*9e94795aSAndroid Build Coastguard Worker			name: "everythingplusminusnothing",
126*9e94795aSAndroid Build Coastguard Worker			conditions: []string{
127*9e94795aSAndroid Build Coastguard Worker				"unencumbered",
128*9e94795aSAndroid Build Coastguard Worker				"permissive",
129*9e94795aSAndroid Build Coastguard Worker				"notice",
130*9e94795aSAndroid Build Coastguard Worker				"reciprocal",
131*9e94795aSAndroid Build Coastguard Worker				"restricted",
132*9e94795aSAndroid Build Coastguard Worker				"restricted_if_statically_linked",
133*9e94795aSAndroid Build Coastguard Worker				"proprietary",
134*9e94795aSAndroid Build Coastguard Worker				"by_exception_only",
135*9e94795aSAndroid Build Coastguard Worker				"not_allowed",
136*9e94795aSAndroid Build Coastguard Worker			},
137*9e94795aSAndroid Build Coastguard Worker			plus:  &[]string{},
138*9e94795aSAndroid Build Coastguard Worker			minus: &[]string{},
139*9e94795aSAndroid Build Coastguard Worker			matchingAny: map[string][]string{
140*9e94795aSAndroid Build Coastguard Worker				"unencumbered|permissive|notice": []string{"unencumbered", "permissive", "notice"},
141*9e94795aSAndroid Build Coastguard Worker				"restricted|reciprocal":          []string{"reciprocal", "restricted"},
142*9e94795aSAndroid Build Coastguard Worker				"proprietary|by_exception_only":  []string{"proprietary", "by_exception_only"},
143*9e94795aSAndroid Build Coastguard Worker				"not_allowed":                    []string{"not_allowed"},
144*9e94795aSAndroid Build Coastguard Worker			},
145*9e94795aSAndroid Build Coastguard Worker			expected: []string{
146*9e94795aSAndroid Build Coastguard Worker				"unencumbered",
147*9e94795aSAndroid Build Coastguard Worker				"permissive",
148*9e94795aSAndroid Build Coastguard Worker				"notice",
149*9e94795aSAndroid Build Coastguard Worker				"reciprocal",
150*9e94795aSAndroid Build Coastguard Worker				"restricted",
151*9e94795aSAndroid Build Coastguard Worker				"restricted_if_statically_linked",
152*9e94795aSAndroid Build Coastguard Worker				"proprietary",
153*9e94795aSAndroid Build Coastguard Worker				"by_exception_only",
154*9e94795aSAndroid Build Coastguard Worker				"not_allowed",
155*9e94795aSAndroid Build Coastguard Worker			},
156*9e94795aSAndroid Build Coastguard Worker		},
157*9e94795aSAndroid Build Coastguard Worker		{
158*9e94795aSAndroid Build Coastguard Worker			name:       "allbutone",
159*9e94795aSAndroid Build Coastguard Worker			conditions: []string{"unencumbered", "permissive", "notice", "reciprocal", "restricted", "proprietary"},
160*9e94795aSAndroid Build Coastguard Worker			plus:       &[]string{"restricted_if_statically_linked", "by_exception_only", "not_allowed"},
161*9e94795aSAndroid Build Coastguard Worker			matchingAny: map[string][]string{
162*9e94795aSAndroid Build Coastguard Worker				"unencumbered":                    []string{"unencumbered"},
163*9e94795aSAndroid Build Coastguard Worker				"permissive":                      []string{"permissive"},
164*9e94795aSAndroid Build Coastguard Worker				"notice":                          []string{"notice"},
165*9e94795aSAndroid Build Coastguard Worker				"reciprocal":                      []string{"reciprocal"},
166*9e94795aSAndroid Build Coastguard Worker				"restricted":                      []string{"restricted"},
167*9e94795aSAndroid Build Coastguard Worker				"restricted_if_statically_linked": []string{"restricted_if_statically_linked"},
168*9e94795aSAndroid Build Coastguard Worker				"proprietary":                     []string{"proprietary"},
169*9e94795aSAndroid Build Coastguard Worker				"by_exception_only":               []string{"by_exception_only"},
170*9e94795aSAndroid Build Coastguard Worker				"not_allowed":                     []string{"not_allowed"},
171*9e94795aSAndroid Build Coastguard Worker				"notice|proprietary":              []string{"notice", "proprietary"},
172*9e94795aSAndroid Build Coastguard Worker			},
173*9e94795aSAndroid Build Coastguard Worker			expected: []string{
174*9e94795aSAndroid Build Coastguard Worker				"unencumbered",
175*9e94795aSAndroid Build Coastguard Worker				"permissive",
176*9e94795aSAndroid Build Coastguard Worker				"notice",
177*9e94795aSAndroid Build Coastguard Worker				"reciprocal",
178*9e94795aSAndroid Build Coastguard Worker				"restricted",
179*9e94795aSAndroid Build Coastguard Worker				"restricted_if_statically_linked",
180*9e94795aSAndroid Build Coastguard Worker				"proprietary",
181*9e94795aSAndroid Build Coastguard Worker				"by_exception_only",
182*9e94795aSAndroid Build Coastguard Worker				"not_allowed",
183*9e94795aSAndroid Build Coastguard Worker			},
184*9e94795aSAndroid Build Coastguard Worker		},
185*9e94795aSAndroid Build Coastguard Worker		{
186*9e94795aSAndroid Build Coastguard Worker			name: "everythingminusone",
187*9e94795aSAndroid Build Coastguard Worker			conditions: []string{
188*9e94795aSAndroid Build Coastguard Worker				"unencumbered",
189*9e94795aSAndroid Build Coastguard Worker				"permissive",
190*9e94795aSAndroid Build Coastguard Worker				"notice",
191*9e94795aSAndroid Build Coastguard Worker				"reciprocal",
192*9e94795aSAndroid Build Coastguard Worker				"restricted",
193*9e94795aSAndroid Build Coastguard Worker				"restricted_if_statically_linked",
194*9e94795aSAndroid Build Coastguard Worker				"proprietary",
195*9e94795aSAndroid Build Coastguard Worker				"by_exception_only",
196*9e94795aSAndroid Build Coastguard Worker				"not_allowed",
197*9e94795aSAndroid Build Coastguard Worker			},
198*9e94795aSAndroid Build Coastguard Worker			minus: &[]string{"restricted_if_statically_linked"},
199*9e94795aSAndroid Build Coastguard Worker			matchingAny: map[string][]string{
200*9e94795aSAndroid Build Coastguard Worker				"unencumbered":                    []string{"unencumbered"},
201*9e94795aSAndroid Build Coastguard Worker				"permissive":                      []string{"permissive"},
202*9e94795aSAndroid Build Coastguard Worker				"notice":                          []string{"notice"},
203*9e94795aSAndroid Build Coastguard Worker				"reciprocal":                      []string{"reciprocal"},
204*9e94795aSAndroid Build Coastguard Worker				"restricted":                      []string{"restricted"},
205*9e94795aSAndroid Build Coastguard Worker				"restricted_if_statically_linked": []string{},
206*9e94795aSAndroid Build Coastguard Worker				"proprietary":                     []string{"proprietary"},
207*9e94795aSAndroid Build Coastguard Worker				"by_exception_only":               []string{"by_exception_only"},
208*9e94795aSAndroid Build Coastguard Worker				"not_allowed":                     []string{"not_allowed"},
209*9e94795aSAndroid Build Coastguard Worker				"restricted|proprietary":          []string{"restricted", "proprietary"},
210*9e94795aSAndroid Build Coastguard Worker			},
211*9e94795aSAndroid Build Coastguard Worker			expected: []string{
212*9e94795aSAndroid Build Coastguard Worker				"unencumbered",
213*9e94795aSAndroid Build Coastguard Worker				"permissive",
214*9e94795aSAndroid Build Coastguard Worker				"notice",
215*9e94795aSAndroid Build Coastguard Worker				"reciprocal",
216*9e94795aSAndroid Build Coastguard Worker				"restricted",
217*9e94795aSAndroid Build Coastguard Worker				"proprietary",
218*9e94795aSAndroid Build Coastguard Worker				"by_exception_only",
219*9e94795aSAndroid Build Coastguard Worker				"not_allowed",
220*9e94795aSAndroid Build Coastguard Worker			},
221*9e94795aSAndroid Build Coastguard Worker		},
222*9e94795aSAndroid Build Coastguard Worker		{
223*9e94795aSAndroid Build Coastguard Worker			name: "everythingminuseverything",
224*9e94795aSAndroid Build Coastguard Worker			conditions: []string{
225*9e94795aSAndroid Build Coastguard Worker				"unencumbered",
226*9e94795aSAndroid Build Coastguard Worker				"permissive",
227*9e94795aSAndroid Build Coastguard Worker				"notice",
228*9e94795aSAndroid Build Coastguard Worker				"reciprocal",
229*9e94795aSAndroid Build Coastguard Worker				"restricted",
230*9e94795aSAndroid Build Coastguard Worker				"restricted_if_statically_linked",
231*9e94795aSAndroid Build Coastguard Worker				"proprietary",
232*9e94795aSAndroid Build Coastguard Worker				"by_exception_only",
233*9e94795aSAndroid Build Coastguard Worker				"not_allowed",
234*9e94795aSAndroid Build Coastguard Worker			},
235*9e94795aSAndroid Build Coastguard Worker			minus: &[]string{
236*9e94795aSAndroid Build Coastguard Worker				"unencumbered",
237*9e94795aSAndroid Build Coastguard Worker				"permissive",
238*9e94795aSAndroid Build Coastguard Worker				"notice",
239*9e94795aSAndroid Build Coastguard Worker				"reciprocal",
240*9e94795aSAndroid Build Coastguard Worker				"restricted",
241*9e94795aSAndroid Build Coastguard Worker				"restricted_if_statically_linked",
242*9e94795aSAndroid Build Coastguard Worker				"proprietary",
243*9e94795aSAndroid Build Coastguard Worker				"by_exception_only",
244*9e94795aSAndroid Build Coastguard Worker				"not_allowed",
245*9e94795aSAndroid Build Coastguard Worker			},
246*9e94795aSAndroid Build Coastguard Worker			matchingAny: map[string][]string{
247*9e94795aSAndroid Build Coastguard Worker				"unencumbered":                    []string{},
248*9e94795aSAndroid Build Coastguard Worker				"permissive":                      []string{},
249*9e94795aSAndroid Build Coastguard Worker				"notice":                          []string{},
250*9e94795aSAndroid Build Coastguard Worker				"reciprocal":                      []string{},
251*9e94795aSAndroid Build Coastguard Worker				"restricted":                      []string{},
252*9e94795aSAndroid Build Coastguard Worker				"restricted_if_statically_linked": []string{},
253*9e94795aSAndroid Build Coastguard Worker				"proprietary":                     []string{},
254*9e94795aSAndroid Build Coastguard Worker				"by_exception_only":               []string{},
255*9e94795aSAndroid Build Coastguard Worker				"not_allowed":                     []string{},
256*9e94795aSAndroid Build Coastguard Worker				"restricted|proprietary":          []string{},
257*9e94795aSAndroid Build Coastguard Worker			},
258*9e94795aSAndroid Build Coastguard Worker			expected: []string{},
259*9e94795aSAndroid Build Coastguard Worker		},
260*9e94795aSAndroid Build Coastguard Worker		{
261*9e94795aSAndroid Build Coastguard Worker			name:       "restrictedplus",
262*9e94795aSAndroid Build Coastguard Worker			conditions: []string{"restricted", "restricted_if_statically_linked"},
263*9e94795aSAndroid Build Coastguard Worker			plus:       &[]string{"permissive", "notice", "restricted", "proprietary"},
264*9e94795aSAndroid Build Coastguard Worker			matchingAny: map[string][]string{
265*9e94795aSAndroid Build Coastguard Worker				"unencumbered":                    []string{},
266*9e94795aSAndroid Build Coastguard Worker				"permissive":                      []string{"permissive"},
267*9e94795aSAndroid Build Coastguard Worker				"notice":                          []string{"notice"},
268*9e94795aSAndroid Build Coastguard Worker				"restricted":                      []string{"restricted"},
269*9e94795aSAndroid Build Coastguard Worker				"restricted_if_statically_linked": []string{"restricted_if_statically_linked"},
270*9e94795aSAndroid Build Coastguard Worker				"proprietary":                     []string{"proprietary"},
271*9e94795aSAndroid Build Coastguard Worker				"restricted|proprietary":          []string{"restricted", "proprietary"},
272*9e94795aSAndroid Build Coastguard Worker				"by_exception_only":               []string{},
273*9e94795aSAndroid Build Coastguard Worker				"proprietary|by_exception_only":   []string{"proprietary"},
274*9e94795aSAndroid Build Coastguard Worker			},
275*9e94795aSAndroid Build Coastguard Worker			expected: []string{"permissive", "notice", "restricted", "restricted_if_statically_linked", "proprietary"},
276*9e94795aSAndroid Build Coastguard Worker		},
277*9e94795aSAndroid Build Coastguard Worker	}
278*9e94795aSAndroid Build Coastguard Worker	for _, tt := range tests {
279*9e94795aSAndroid Build Coastguard Worker		toConditions := func(names []string) []LicenseCondition {
280*9e94795aSAndroid Build Coastguard Worker			result := make([]LicenseCondition, 0, len(names))
281*9e94795aSAndroid Build Coastguard Worker			for _, name := range names {
282*9e94795aSAndroid Build Coastguard Worker				result = append(result, RecognizedConditionNames[name])
283*9e94795aSAndroid Build Coastguard Worker			}
284*9e94795aSAndroid Build Coastguard Worker			return result
285*9e94795aSAndroid Build Coastguard Worker		}
286*9e94795aSAndroid Build Coastguard Worker		populate := func() LicenseConditionSet {
287*9e94795aSAndroid Build Coastguard Worker			testSet := NewLicenseConditionSet(toConditions(tt.conditions)...)
288*9e94795aSAndroid Build Coastguard Worker			if tt.plus != nil {
289*9e94795aSAndroid Build Coastguard Worker				testSet = testSet.Plus(toConditions(*tt.plus)...)
290*9e94795aSAndroid Build Coastguard Worker			}
291*9e94795aSAndroid Build Coastguard Worker			if tt.minus != nil {
292*9e94795aSAndroid Build Coastguard Worker				testSet = testSet.Minus(toConditions(*tt.minus)...)
293*9e94795aSAndroid Build Coastguard Worker			}
294*9e94795aSAndroid Build Coastguard Worker			return testSet
295*9e94795aSAndroid Build Coastguard Worker		}
296*9e94795aSAndroid Build Coastguard Worker		populateSet := func() LicenseConditionSet {
297*9e94795aSAndroid Build Coastguard Worker			testSet := NewLicenseConditionSet(toConditions(tt.conditions)...)
298*9e94795aSAndroid Build Coastguard Worker			if tt.plus != nil {
299*9e94795aSAndroid Build Coastguard Worker				testSet = testSet.Union(NewLicenseConditionSet(toConditions(*tt.plus)...))
300*9e94795aSAndroid Build Coastguard Worker			}
301*9e94795aSAndroid Build Coastguard Worker			if tt.minus != nil {
302*9e94795aSAndroid Build Coastguard Worker				testSet = testSet.Difference(NewLicenseConditionSet(toConditions(*tt.minus)...))
303*9e94795aSAndroid Build Coastguard Worker			}
304*9e94795aSAndroid Build Coastguard Worker			return testSet
305*9e94795aSAndroid Build Coastguard Worker		}
306*9e94795aSAndroid Build Coastguard Worker		populatePlusSet := func() LicenseConditionSet {
307*9e94795aSAndroid Build Coastguard Worker			testSet := NewLicenseConditionSet(toConditions(tt.conditions)...)
308*9e94795aSAndroid Build Coastguard Worker			if tt.plus != nil {
309*9e94795aSAndroid Build Coastguard Worker				testSet = testSet.Union(NewLicenseConditionSet(toConditions(*tt.plus)...))
310*9e94795aSAndroid Build Coastguard Worker			}
311*9e94795aSAndroid Build Coastguard Worker			if tt.minus != nil {
312*9e94795aSAndroid Build Coastguard Worker				testSet = testSet.Minus(toConditions(*tt.minus)...)
313*9e94795aSAndroid Build Coastguard Worker			}
314*9e94795aSAndroid Build Coastguard Worker			return testSet
315*9e94795aSAndroid Build Coastguard Worker		}
316*9e94795aSAndroid Build Coastguard Worker		populateMinusSet := func() LicenseConditionSet {
317*9e94795aSAndroid Build Coastguard Worker			testSet := NewLicenseConditionSet(toConditions(tt.conditions)...)
318*9e94795aSAndroid Build Coastguard Worker			if tt.plus != nil {
319*9e94795aSAndroid Build Coastguard Worker				testSet = testSet.Plus(toConditions(*tt.plus)...)
320*9e94795aSAndroid Build Coastguard Worker			}
321*9e94795aSAndroid Build Coastguard Worker			if tt.minus != nil {
322*9e94795aSAndroid Build Coastguard Worker				testSet = testSet.Difference(NewLicenseConditionSet(toConditions(*tt.minus)...))
323*9e94795aSAndroid Build Coastguard Worker			}
324*9e94795aSAndroid Build Coastguard Worker			return testSet
325*9e94795aSAndroid Build Coastguard Worker		}
326*9e94795aSAndroid Build Coastguard Worker		checkMatching := func(cs LicenseConditionSet, t *testing.T) {
327*9e94795aSAndroid Build Coastguard Worker			for data, expectedNames := range tt.matchingAny {
328*9e94795aSAndroid Build Coastguard Worker				expectedConditions := toConditions(expectedNames)
329*9e94795aSAndroid Build Coastguard Worker				expected := NewLicenseConditionSet(expectedConditions...)
330*9e94795aSAndroid Build Coastguard Worker				actual := cs.MatchingAny(toConditions(strings.Split(data, "|"))...)
331*9e94795aSAndroid Build Coastguard Worker				actualNames := actual.Names()
332*9e94795aSAndroid Build Coastguard Worker
333*9e94795aSAndroid Build Coastguard Worker				t.Logf("MatchingAny(%s): actual set %#v %s", data, actual, actual.String())
334*9e94795aSAndroid Build Coastguard Worker				t.Logf("MatchingAny(%s): expected set %#v %s", data, expected, expected.String())
335*9e94795aSAndroid Build Coastguard Worker
336*9e94795aSAndroid Build Coastguard Worker				if actual != expected {
337*9e94795aSAndroid Build Coastguard Worker					t.Errorf("MatchingAny(%s): got %#v, want %#v", data, actual, expected)
338*9e94795aSAndroid Build Coastguard Worker					continue
339*9e94795aSAndroid Build Coastguard Worker				}
340*9e94795aSAndroid Build Coastguard Worker				if len(actualNames) != len(expectedNames) {
341*9e94795aSAndroid Build Coastguard Worker					t.Errorf("len(MatchinAny(%s).Names()): got %d, want %d",
342*9e94795aSAndroid Build Coastguard Worker						data, len(actualNames), len(expectedNames))
343*9e94795aSAndroid Build Coastguard Worker				} else {
344*9e94795aSAndroid Build Coastguard Worker					for i := 0; i < len(actualNames); i++ {
345*9e94795aSAndroid Build Coastguard Worker						if actualNames[i] != expectedNames[i] {
346*9e94795aSAndroid Build Coastguard Worker							t.Errorf("MatchingAny(%s).Names()[%d]: got %s, want %s",
347*9e94795aSAndroid Build Coastguard Worker								data, i, actualNames[i], expectedNames[i])
348*9e94795aSAndroid Build Coastguard Worker							break
349*9e94795aSAndroid Build Coastguard Worker						}
350*9e94795aSAndroid Build Coastguard Worker					}
351*9e94795aSAndroid Build Coastguard Worker				}
352*9e94795aSAndroid Build Coastguard Worker				actualConditions := actual.AsList()
353*9e94795aSAndroid Build Coastguard Worker				if len(actualConditions) != len(expectedConditions) {
354*9e94795aSAndroid Build Coastguard Worker					t.Errorf("len(MatchingAny(%s).AsList()):  got %d, want %d",
355*9e94795aSAndroid Build Coastguard Worker						data, len(actualNames), len(expectedNames))
356*9e94795aSAndroid Build Coastguard Worker				} else {
357*9e94795aSAndroid Build Coastguard Worker					for i := 0; i < len(actualNames); i++ {
358*9e94795aSAndroid Build Coastguard Worker						if actualNames[i] != expectedNames[i] {
359*9e94795aSAndroid Build Coastguard Worker							t.Errorf("MatchingAny(%s).AsList()[%d]: got %s, want %s",
360*9e94795aSAndroid Build Coastguard Worker								data, i, actualNames[i], expectedNames[i])
361*9e94795aSAndroid Build Coastguard Worker							break
362*9e94795aSAndroid Build Coastguard Worker						}
363*9e94795aSAndroid Build Coastguard Worker					}
364*9e94795aSAndroid Build Coastguard Worker				}
365*9e94795aSAndroid Build Coastguard Worker			}
366*9e94795aSAndroid Build Coastguard Worker		}
367*9e94795aSAndroid Build Coastguard Worker		checkMatchingSet := func(cs LicenseConditionSet, t *testing.T) {
368*9e94795aSAndroid Build Coastguard Worker			for data, expectedNames := range tt.matchingAny {
369*9e94795aSAndroid Build Coastguard Worker				expected := NewLicenseConditionSet(toConditions(expectedNames)...)
370*9e94795aSAndroid Build Coastguard Worker				actual := cs.MatchingAnySet(NewLicenseConditionSet(toConditions(strings.Split(data, "|"))...))
371*9e94795aSAndroid Build Coastguard Worker				actualNames := actual.Names()
372*9e94795aSAndroid Build Coastguard Worker
373*9e94795aSAndroid Build Coastguard Worker				t.Logf("MatchingAnySet(%s): actual set %#v %s", data, actual, actual.String())
374*9e94795aSAndroid Build Coastguard Worker				t.Logf("MatchingAnySet(%s): expected set %#v %s", data, expected, expected.String())
375*9e94795aSAndroid Build Coastguard Worker
376*9e94795aSAndroid Build Coastguard Worker				if actual != expected {
377*9e94795aSAndroid Build Coastguard Worker					t.Errorf("MatchingAnySet(%s): got %#v, want %#v", data, actual, expected)
378*9e94795aSAndroid Build Coastguard Worker					continue
379*9e94795aSAndroid Build Coastguard Worker				}
380*9e94795aSAndroid Build Coastguard Worker				if len(actualNames) != len(expectedNames) {
381*9e94795aSAndroid Build Coastguard Worker					t.Errorf("len(MatchingAnySet(%s).Names()): got %d, want %d",
382*9e94795aSAndroid Build Coastguard Worker						data, len(actualNames), len(expectedNames))
383*9e94795aSAndroid Build Coastguard Worker				} else {
384*9e94795aSAndroid Build Coastguard Worker					for i := 0; i < len(actualNames); i++ {
385*9e94795aSAndroid Build Coastguard Worker						if actualNames[i] != expectedNames[i] {
386*9e94795aSAndroid Build Coastguard Worker							t.Errorf("MatchingAnySet(%s).Names()[%d]: got %s, want %s",
387*9e94795aSAndroid Build Coastguard Worker								data, i, actualNames[i], expectedNames[i])
388*9e94795aSAndroid Build Coastguard Worker							break
389*9e94795aSAndroid Build Coastguard Worker						}
390*9e94795aSAndroid Build Coastguard Worker					}
391*9e94795aSAndroid Build Coastguard Worker				}
392*9e94795aSAndroid Build Coastguard Worker				expectedConditions := toConditions(expectedNames)
393*9e94795aSAndroid Build Coastguard Worker				actualConditions := actual.AsList()
394*9e94795aSAndroid Build Coastguard Worker				if len(actualConditions) != len(expectedConditions) {
395*9e94795aSAndroid Build Coastguard Worker					t.Errorf("len(MatchingAnySet(%s).AsList()): got %d, want %d",
396*9e94795aSAndroid Build Coastguard Worker						data, len(actualNames), len(expectedNames))
397*9e94795aSAndroid Build Coastguard Worker				} else {
398*9e94795aSAndroid Build Coastguard Worker					for i := 0; i < len(actualNames); i++ {
399*9e94795aSAndroid Build Coastguard Worker						if actualNames[i] != expectedNames[i] {
400*9e94795aSAndroid Build Coastguard Worker							t.Errorf("MatchingAnySet(%s).AsList()[%d]: got %s, want %s",
401*9e94795aSAndroid Build Coastguard Worker								data, i, actualNames[i], expectedNames[i])
402*9e94795aSAndroid Build Coastguard Worker							break
403*9e94795aSAndroid Build Coastguard Worker						}
404*9e94795aSAndroid Build Coastguard Worker					}
405*9e94795aSAndroid Build Coastguard Worker				}
406*9e94795aSAndroid Build Coastguard Worker			}
407*9e94795aSAndroid Build Coastguard Worker		}
408*9e94795aSAndroid Build Coastguard Worker
409*9e94795aSAndroid Build Coastguard Worker		checkExpected := func(actual LicenseConditionSet, t *testing.T) bool {
410*9e94795aSAndroid Build Coastguard Worker			t.Logf("checkExpected{%s}", strings.Join(tt.expected, ", "))
411*9e94795aSAndroid Build Coastguard Worker
412*9e94795aSAndroid Build Coastguard Worker			expectedConditions := toConditions(tt.expected)
413*9e94795aSAndroid Build Coastguard Worker			expected := NewLicenseConditionSet(expectedConditions...)
414*9e94795aSAndroid Build Coastguard Worker
415*9e94795aSAndroid Build Coastguard Worker			actualNames := actual.Names()
416*9e94795aSAndroid Build Coastguard Worker
417*9e94795aSAndroid Build Coastguard Worker			t.Logf("actual license condition set: %#v %s", actual, actual.String())
418*9e94795aSAndroid Build Coastguard Worker			t.Logf("expected license condition set: %#v %s", expected, expected.String())
419*9e94795aSAndroid Build Coastguard Worker
420*9e94795aSAndroid Build Coastguard Worker			if actual != expected {
421*9e94795aSAndroid Build Coastguard Worker				t.Errorf("checkExpected: got %#v, want %#v", actual, expected)
422*9e94795aSAndroid Build Coastguard Worker				return false
423*9e94795aSAndroid Build Coastguard Worker			}
424*9e94795aSAndroid Build Coastguard Worker
425*9e94795aSAndroid Build Coastguard Worker			if len(actualNames) != len(tt.expected) {
426*9e94795aSAndroid Build Coastguard Worker				t.Errorf("len(actual.Names()): got %d, want %d", len(actualNames), len(tt.expected))
427*9e94795aSAndroid Build Coastguard Worker			} else {
428*9e94795aSAndroid Build Coastguard Worker				for i := 0; i < len(actualNames); i++ {
429*9e94795aSAndroid Build Coastguard Worker					if actualNames[i] != tt.expected[i] {
430*9e94795aSAndroid Build Coastguard Worker						t.Errorf("actual.Names()[%d]: got %s, want %s", i, actualNames[i], tt.expected[i])
431*9e94795aSAndroid Build Coastguard Worker						break
432*9e94795aSAndroid Build Coastguard Worker					}
433*9e94795aSAndroid Build Coastguard Worker				}
434*9e94795aSAndroid Build Coastguard Worker			}
435*9e94795aSAndroid Build Coastguard Worker
436*9e94795aSAndroid Build Coastguard Worker			actualConditions := actual.AsList()
437*9e94795aSAndroid Build Coastguard Worker			if len(actualConditions) != len(expectedConditions) {
438*9e94795aSAndroid Build Coastguard Worker				t.Errorf("len(actual.AsList()): got %d, want %d", len(actualConditions), len(expectedConditions))
439*9e94795aSAndroid Build Coastguard Worker			} else {
440*9e94795aSAndroid Build Coastguard Worker				for i := 0; i < len(actualConditions); i++ {
441*9e94795aSAndroid Build Coastguard Worker					if actualConditions[i] != expectedConditions[i] {
442*9e94795aSAndroid Build Coastguard Worker						t.Errorf("actual.AsList()[%d]: got %s, want %s",
443*9e94795aSAndroid Build Coastguard Worker							i, actualConditions[i].Name(), expectedConditions[i].Name())
444*9e94795aSAndroid Build Coastguard Worker						break
445*9e94795aSAndroid Build Coastguard Worker					}
446*9e94795aSAndroid Build Coastguard Worker				}
447*9e94795aSAndroid Build Coastguard Worker			}
448*9e94795aSAndroid Build Coastguard Worker
449*9e94795aSAndroid Build Coastguard Worker			if len(tt.expected) == 0 {
450*9e94795aSAndroid Build Coastguard Worker				if !actual.IsEmpty() {
451*9e94795aSAndroid Build Coastguard Worker					t.Errorf("actual.IsEmpty(): got false, want true")
452*9e94795aSAndroid Build Coastguard Worker				}
453*9e94795aSAndroid Build Coastguard Worker				if actual.HasAny(expectedConditions...) {
454*9e94795aSAndroid Build Coastguard Worker					t.Errorf("actual.HasAny(): got true, want false")
455*9e94795aSAndroid Build Coastguard Worker				}
456*9e94795aSAndroid Build Coastguard Worker			} else {
457*9e94795aSAndroid Build Coastguard Worker				if actual.IsEmpty() {
458*9e94795aSAndroid Build Coastguard Worker					t.Errorf("actual.IsEmpty(): got true, want false")
459*9e94795aSAndroid Build Coastguard Worker				}
460*9e94795aSAndroid Build Coastguard Worker				if !actual.HasAny(expectedConditions...) {
461*9e94795aSAndroid Build Coastguard Worker					t.Errorf("actual.HasAny(all expected): got false, want true")
462*9e94795aSAndroid Build Coastguard Worker				}
463*9e94795aSAndroid Build Coastguard Worker			}
464*9e94795aSAndroid Build Coastguard Worker			if !actual.HasAll(expectedConditions...) {
465*9e94795aSAndroid Build Coastguard Worker				t.Errorf("actual.Hasll(all expected): want true, got false")
466*9e94795aSAndroid Build Coastguard Worker			}
467*9e94795aSAndroid Build Coastguard Worker			for _, expectedCondition := range expectedConditions {
468*9e94795aSAndroid Build Coastguard Worker				if !actual.HasAny(expectedCondition) {
469*9e94795aSAndroid Build Coastguard Worker					t.Errorf("actual.HasAny(%q): got false, want true", expectedCondition.Name())
470*9e94795aSAndroid Build Coastguard Worker				}
471*9e94795aSAndroid Build Coastguard Worker				if !actual.HasAll(expectedCondition) {
472*9e94795aSAndroid Build Coastguard Worker					t.Errorf("actual.HasAll(%q): got false, want true", expectedCondition.Name())
473*9e94795aSAndroid Build Coastguard Worker				}
474*9e94795aSAndroid Build Coastguard Worker			}
475*9e94795aSAndroid Build Coastguard Worker
476*9e94795aSAndroid Build Coastguard Worker			notExpected := (AllLicenseConditions &^ expected)
477*9e94795aSAndroid Build Coastguard Worker			notExpectedList := notExpected.AsList()
478*9e94795aSAndroid Build Coastguard Worker			t.Logf("not expected license condition set: %#v %s", notExpected, notExpected.String())
479*9e94795aSAndroid Build Coastguard Worker
480*9e94795aSAndroid Build Coastguard Worker			if len(tt.expected) == 0 {
481*9e94795aSAndroid Build Coastguard Worker				if actual.HasAny(append(expectedConditions, notExpectedList...)...) {
482*9e94795aSAndroid Build Coastguard Worker					t.Errorf("actual.HasAny(all conditions): want false, got true")
483*9e94795aSAndroid Build Coastguard Worker				}
484*9e94795aSAndroid Build Coastguard Worker			} else {
485*9e94795aSAndroid Build Coastguard Worker				if !actual.HasAny(append(expectedConditions, notExpectedList...)...) {
486*9e94795aSAndroid Build Coastguard Worker					t.Errorf("actual.HasAny(all conditions): want true, got false")
487*9e94795aSAndroid Build Coastguard Worker				}
488*9e94795aSAndroid Build Coastguard Worker			}
489*9e94795aSAndroid Build Coastguard Worker			if len(notExpectedList) == 0 {
490*9e94795aSAndroid Build Coastguard Worker				if !actual.HasAll(append(expectedConditions, notExpectedList...)...) {
491*9e94795aSAndroid Build Coastguard Worker					t.Errorf("actual.HasAll(all conditions): want true, got false")
492*9e94795aSAndroid Build Coastguard Worker				}
493*9e94795aSAndroid Build Coastguard Worker			} else {
494*9e94795aSAndroid Build Coastguard Worker				if actual.HasAll(append(expectedConditions, notExpectedList...)...) {
495*9e94795aSAndroid Build Coastguard Worker					t.Errorf("actual.HasAll(all conditions): want false, got true")
496*9e94795aSAndroid Build Coastguard Worker				}
497*9e94795aSAndroid Build Coastguard Worker			}
498*9e94795aSAndroid Build Coastguard Worker			for _, unexpectedCondition := range notExpectedList {
499*9e94795aSAndroid Build Coastguard Worker				if actual.HasAny(unexpectedCondition) {
500*9e94795aSAndroid Build Coastguard Worker					t.Errorf("actual.HasAny(%q): got true, want false", unexpectedCondition.Name())
501*9e94795aSAndroid Build Coastguard Worker				}
502*9e94795aSAndroid Build Coastguard Worker				if actual.HasAll(unexpectedCondition) {
503*9e94795aSAndroid Build Coastguard Worker					t.Errorf("actual.HasAll(%q): got true, want false", unexpectedCondition.Name())
504*9e94795aSAndroid Build Coastguard Worker				}
505*9e94795aSAndroid Build Coastguard Worker			}
506*9e94795aSAndroid Build Coastguard Worker			return true
507*9e94795aSAndroid Build Coastguard Worker		}
508*9e94795aSAndroid Build Coastguard Worker
509*9e94795aSAndroid Build Coastguard Worker		checkExpectedSet := func(actual LicenseConditionSet, t *testing.T) bool {
510*9e94795aSAndroid Build Coastguard Worker			t.Logf("checkExpectedSet{%s}", strings.Join(tt.expected, ", "))
511*9e94795aSAndroid Build Coastguard Worker
512*9e94795aSAndroid Build Coastguard Worker			expectedConditions := toConditions(tt.expected)
513*9e94795aSAndroid Build Coastguard Worker			expected := NewLicenseConditionSet(expectedConditions...)
514*9e94795aSAndroid Build Coastguard Worker
515*9e94795aSAndroid Build Coastguard Worker			actualNames := actual.Names()
516*9e94795aSAndroid Build Coastguard Worker
517*9e94795aSAndroid Build Coastguard Worker			t.Logf("actual license condition set: %#v %s", actual, actual.String())
518*9e94795aSAndroid Build Coastguard Worker			t.Logf("expected license condition set: %#v %s", expected, expected.String())
519*9e94795aSAndroid Build Coastguard Worker
520*9e94795aSAndroid Build Coastguard Worker			if actual != expected {
521*9e94795aSAndroid Build Coastguard Worker				t.Errorf("checkExpectedSet: got %#v, want %#v", actual, expected)
522*9e94795aSAndroid Build Coastguard Worker				return false
523*9e94795aSAndroid Build Coastguard Worker			}
524*9e94795aSAndroid Build Coastguard Worker
525*9e94795aSAndroid Build Coastguard Worker			if len(actualNames) != len(tt.expected) {
526*9e94795aSAndroid Build Coastguard Worker				t.Errorf("len(actual.Names()): got %d, want %d", len(actualNames), len(tt.expected))
527*9e94795aSAndroid Build Coastguard Worker			} else {
528*9e94795aSAndroid Build Coastguard Worker				for i := 0; i < len(actualNames); i++ {
529*9e94795aSAndroid Build Coastguard Worker					if actualNames[i] != tt.expected[i] {
530*9e94795aSAndroid Build Coastguard Worker						t.Errorf("actual.Names()[%d]: got %s, want %s", i, actualNames[i], tt.expected[i])
531*9e94795aSAndroid Build Coastguard Worker						break
532*9e94795aSAndroid Build Coastguard Worker					}
533*9e94795aSAndroid Build Coastguard Worker				}
534*9e94795aSAndroid Build Coastguard Worker			}
535*9e94795aSAndroid Build Coastguard Worker
536*9e94795aSAndroid Build Coastguard Worker			actualConditions := actual.AsList()
537*9e94795aSAndroid Build Coastguard Worker			if len(actualConditions) != len(expectedConditions) {
538*9e94795aSAndroid Build Coastguard Worker				t.Errorf("len(actual.AsList()): got %d, want %d", len(actualConditions), len(expectedConditions))
539*9e94795aSAndroid Build Coastguard Worker			} else {
540*9e94795aSAndroid Build Coastguard Worker				for i := 0; i < len(actualConditions); i++ {
541*9e94795aSAndroid Build Coastguard Worker					if actualConditions[i] != expectedConditions[i] {
542*9e94795aSAndroid Build Coastguard Worker						t.Errorf("actual.AsList()[%d}: got %s, want %s",
543*9e94795aSAndroid Build Coastguard Worker							i, actualConditions[i].Name(), expectedConditions[i].Name())
544*9e94795aSAndroid Build Coastguard Worker						break
545*9e94795aSAndroid Build Coastguard Worker					}
546*9e94795aSAndroid Build Coastguard Worker				}
547*9e94795aSAndroid Build Coastguard Worker			}
548*9e94795aSAndroid Build Coastguard Worker
549*9e94795aSAndroid Build Coastguard Worker			if len(tt.expected) == 0 {
550*9e94795aSAndroid Build Coastguard Worker				if !actual.IsEmpty() {
551*9e94795aSAndroid Build Coastguard Worker					t.Errorf("actual.IsEmpty(): got false, want true")
552*9e94795aSAndroid Build Coastguard Worker				}
553*9e94795aSAndroid Build Coastguard Worker				if actual.MatchesAnySet(expected) {
554*9e94795aSAndroid Build Coastguard Worker					t.Errorf("actual.MatchesAnySet({}): got true, want false")
555*9e94795aSAndroid Build Coastguard Worker				}
556*9e94795aSAndroid Build Coastguard Worker				if actual.MatchesEverySet(expected, expected) {
557*9e94795aSAndroid Build Coastguard Worker					t.Errorf("actual.MatchesEverySet({}, {}): want false, got true")
558*9e94795aSAndroid Build Coastguard Worker				}
559*9e94795aSAndroid Build Coastguard Worker			} else {
560*9e94795aSAndroid Build Coastguard Worker				if actual.IsEmpty() {
561*9e94795aSAndroid Build Coastguard Worker					t.Errorf("actual.IsEmpty(): got true, want false")
562*9e94795aSAndroid Build Coastguard Worker				}
563*9e94795aSAndroid Build Coastguard Worker				if !actual.MatchesAnySet(expected) {
564*9e94795aSAndroid Build Coastguard Worker					t.Errorf("actual.MatchesAnySet({all expected}): want true, got false")
565*9e94795aSAndroid Build Coastguard Worker				}
566*9e94795aSAndroid Build Coastguard Worker				if !actual.MatchesEverySet(expected, expected) {
567*9e94795aSAndroid Build Coastguard Worker					t.Errorf("actual.MatchesEverySet({all expected}, {all expected}): want true, got false")
568*9e94795aSAndroid Build Coastguard Worker				}
569*9e94795aSAndroid Build Coastguard Worker			}
570*9e94795aSAndroid Build Coastguard Worker
571*9e94795aSAndroid Build Coastguard Worker			notExpected := (AllLicenseConditions &^ expected)
572*9e94795aSAndroid Build Coastguard Worker			t.Logf("not expected license condition set: %#v %s", notExpected, notExpected.String())
573*9e94795aSAndroid Build Coastguard Worker
574*9e94795aSAndroid Build Coastguard Worker			if len(tt.expected) == 0 {
575*9e94795aSAndroid Build Coastguard Worker				if actual.MatchesAnySet(expected, notExpected) {
576*9e94795aSAndroid Build Coastguard Worker					t.Errorf("empty actual.MatchesAnySet({expected}, {not expected}): want false, got true")
577*9e94795aSAndroid Build Coastguard Worker				}
578*9e94795aSAndroid Build Coastguard Worker			} else {
579*9e94795aSAndroid Build Coastguard Worker				if !actual.MatchesAnySet(expected, notExpected) {
580*9e94795aSAndroid Build Coastguard Worker					t.Errorf("actual.MatchesAnySet({expected}, {not expected}): want true, got false")
581*9e94795aSAndroid Build Coastguard Worker				}
582*9e94795aSAndroid Build Coastguard Worker			}
583*9e94795aSAndroid Build Coastguard Worker			if actual.MatchesAnySet(notExpected) {
584*9e94795aSAndroid Build Coastguard Worker				t.Errorf("actual.MatchesAnySet({not expected}): want false, got true")
585*9e94795aSAndroid Build Coastguard Worker			}
586*9e94795aSAndroid Build Coastguard Worker			if actual.MatchesEverySet(notExpected) {
587*9e94795aSAndroid Build Coastguard Worker				t.Errorf("actual.MatchesEverySet({not expected}): want false, got true")
588*9e94795aSAndroid Build Coastguard Worker			}
589*9e94795aSAndroid Build Coastguard Worker			if actual.MatchesEverySet(expected, notExpected) {
590*9e94795aSAndroid Build Coastguard Worker				t.Errorf("actual.MatchesEverySet({expected}, {not expected}): want false, got true")
591*9e94795aSAndroid Build Coastguard Worker			}
592*9e94795aSAndroid Build Coastguard Worker
593*9e94795aSAndroid Build Coastguard Worker			if !actual.Difference(expected).IsEmpty() {
594*9e94795aSAndroid Build Coastguard Worker				t.Errorf("actual.Difference({expected}).IsEmpty(): want true, got false")
595*9e94795aSAndroid Build Coastguard Worker			}
596*9e94795aSAndroid Build Coastguard Worker			if expected != actual.Intersection(expected) {
597*9e94795aSAndroid Build Coastguard Worker				t.Errorf("expected == actual.Intersection({expected}): want true, got false (%#v != %#v)", expected, actual.Intersection(expected))
598*9e94795aSAndroid Build Coastguard Worker			}
599*9e94795aSAndroid Build Coastguard Worker			if actual != actual.Intersection(expected) {
600*9e94795aSAndroid Build Coastguard Worker				t.Errorf("actual == actual.Intersection({expected}): want true, got false (%#v != %#v)", actual, actual.Intersection(expected))
601*9e94795aSAndroid Build Coastguard Worker			}
602*9e94795aSAndroid Build Coastguard Worker			return true
603*9e94795aSAndroid Build Coastguard Worker		}
604*9e94795aSAndroid Build Coastguard Worker
605*9e94795aSAndroid Build Coastguard Worker		t.Run(tt.name, func(t *testing.T) {
606*9e94795aSAndroid Build Coastguard Worker			cs := populate()
607*9e94795aSAndroid Build Coastguard Worker			if checkExpected(cs, t) {
608*9e94795aSAndroid Build Coastguard Worker				checkMatching(cs, t)
609*9e94795aSAndroid Build Coastguard Worker			}
610*9e94795aSAndroid Build Coastguard Worker			if checkExpectedSet(cs, t) {
611*9e94795aSAndroid Build Coastguard Worker				checkMatchingSet(cs, t)
612*9e94795aSAndroid Build Coastguard Worker			}
613*9e94795aSAndroid Build Coastguard Worker		})
614*9e94795aSAndroid Build Coastguard Worker
615*9e94795aSAndroid Build Coastguard Worker		t.Run(tt.name+"_sets", func(t *testing.T) {
616*9e94795aSAndroid Build Coastguard Worker			cs := populateSet()
617*9e94795aSAndroid Build Coastguard Worker			if checkExpected(cs, t) {
618*9e94795aSAndroid Build Coastguard Worker				checkMatching(cs, t)
619*9e94795aSAndroid Build Coastguard Worker			}
620*9e94795aSAndroid Build Coastguard Worker			if checkExpectedSet(cs, t) {
621*9e94795aSAndroid Build Coastguard Worker				checkMatchingSet(cs, t)
622*9e94795aSAndroid Build Coastguard Worker			}
623*9e94795aSAndroid Build Coastguard Worker		})
624*9e94795aSAndroid Build Coastguard Worker
625*9e94795aSAndroid Build Coastguard Worker		t.Run(tt.name+"_plusset", func(t *testing.T) {
626*9e94795aSAndroid Build Coastguard Worker			cs := populatePlusSet()
627*9e94795aSAndroid Build Coastguard Worker			if checkExpected(cs, t) {
628*9e94795aSAndroid Build Coastguard Worker				checkMatching(cs, t)
629*9e94795aSAndroid Build Coastguard Worker			}
630*9e94795aSAndroid Build Coastguard Worker			if checkExpectedSet(cs, t) {
631*9e94795aSAndroid Build Coastguard Worker				checkMatchingSet(cs, t)
632*9e94795aSAndroid Build Coastguard Worker			}
633*9e94795aSAndroid Build Coastguard Worker		})
634*9e94795aSAndroid Build Coastguard Worker
635*9e94795aSAndroid Build Coastguard Worker		t.Run(tt.name+"_minusset", func(t *testing.T) {
636*9e94795aSAndroid Build Coastguard Worker			cs := populateMinusSet()
637*9e94795aSAndroid Build Coastguard Worker			if checkExpected(cs, t) {
638*9e94795aSAndroid Build Coastguard Worker				checkMatching(cs, t)
639*9e94795aSAndroid Build Coastguard Worker			}
640*9e94795aSAndroid Build Coastguard Worker			if checkExpectedSet(cs, t) {
641*9e94795aSAndroid Build Coastguard Worker				checkMatchingSet(cs, t)
642*9e94795aSAndroid Build Coastguard Worker			}
643*9e94795aSAndroid Build Coastguard Worker		})
644*9e94795aSAndroid Build Coastguard Worker	}
645*9e94795aSAndroid Build Coastguard Worker}
646