xref: /aosp_15_r20/external/bazel-skylib/tests/selects_tests.bzl (revision bcb5dc7965af6ee42bf2f21341a2ec00233a8c8a)
1*bcb5dc79SHONG Yifan# Copyright 2017 The Bazel Authors. All rights reserved.
2*bcb5dc79SHONG Yifan#
3*bcb5dc79SHONG Yifan# Licensed under the Apache License, Version 2.0 (the "License");
4*bcb5dc79SHONG Yifan# you may not use this file except in compliance with the License.
5*bcb5dc79SHONG Yifan# You may obtain a copy of the License at
6*bcb5dc79SHONG Yifan#
7*bcb5dc79SHONG Yifan#    http://www.apache.org/licenses/LICENSE-2.0
8*bcb5dc79SHONG Yifan#
9*bcb5dc79SHONG Yifan# Unless required by applicable law or agreed to in writing, software
10*bcb5dc79SHONG Yifan# distributed under the License is distributed on an "AS IS" BASIS,
11*bcb5dc79SHONG Yifan# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*bcb5dc79SHONG Yifan# See the License for the specific language governing permissions and
13*bcb5dc79SHONG Yifan# limitations under the License.
14*bcb5dc79SHONG Yifan
15*bcb5dc79SHONG Yifan"""Unit tests for selects.bzl."""
16*bcb5dc79SHONG Yifan
17*bcb5dc79SHONG Yifanload("//lib:selects.bzl", "selects")
18*bcb5dc79SHONG Yifanload("//lib:unittest.bzl", "analysistest", "asserts", "unittest")
19*bcb5dc79SHONG Yifan
20*bcb5dc79SHONG Yifan###################################################
21*bcb5dc79SHONG Yifan# with_or_test
22*bcb5dc79SHONG Yifan###################################################
23*bcb5dc79SHONG Yifandef _with_or_test(ctx):
24*bcb5dc79SHONG Yifan    """Unit tests for with_or."""
25*bcb5dc79SHONG Yifan    env = unittest.begin(ctx)
26*bcb5dc79SHONG Yifan
27*bcb5dc79SHONG Yifan    # We actually test on with_or_dict because Starlark can't get the
28*bcb5dc79SHONG Yifan    # dictionary from a select().
29*bcb5dc79SHONG Yifan
30*bcb5dc79SHONG Yifan    # Test select()-compatible input syntax.
31*bcb5dc79SHONG Yifan    input_dict = {":foo": ":d1", "//conditions:default": ":d1"}
32*bcb5dc79SHONG Yifan    asserts.equals(env, input_dict, selects.with_or_dict(input_dict))
33*bcb5dc79SHONG Yifan
34*bcb5dc79SHONG Yifan    # Test OR syntax.
35*bcb5dc79SHONG Yifan    or_dict = {(":foo", ":bar"): ":d1"}
36*bcb5dc79SHONG Yifan    asserts.equals(
37*bcb5dc79SHONG Yifan        env,
38*bcb5dc79SHONG Yifan        {":bar": ":d1", ":foo": ":d1"},
39*bcb5dc79SHONG Yifan        selects.with_or_dict(or_dict),
40*bcb5dc79SHONG Yifan    )
41*bcb5dc79SHONG Yifan
42*bcb5dc79SHONG Yifan    # Test mixed syntax.
43*bcb5dc79SHONG Yifan    mixed_dict = {
44*bcb5dc79SHONG Yifan        ":foo": ":d1",
45*bcb5dc79SHONG Yifan        (":bar", ":baz"): ":d2",
46*bcb5dc79SHONG Yifan        "//conditions:default": ":d3",
47*bcb5dc79SHONG Yifan    }
48*bcb5dc79SHONG Yifan    asserts.equals(
49*bcb5dc79SHONG Yifan        env,
50*bcb5dc79SHONG Yifan        {
51*bcb5dc79SHONG Yifan            ":bar": ":d2",
52*bcb5dc79SHONG Yifan            ":baz": ":d2",
53*bcb5dc79SHONG Yifan            ":foo": ":d1",
54*bcb5dc79SHONG Yifan            "//conditions:default": ":d3",
55*bcb5dc79SHONG Yifan        },
56*bcb5dc79SHONG Yifan        selects.with_or_dict(mixed_dict),
57*bcb5dc79SHONG Yifan    )
58*bcb5dc79SHONG Yifan
59*bcb5dc79SHONG Yifan    return unittest.end(env)
60*bcb5dc79SHONG Yifan
61*bcb5dc79SHONG Yifanwith_or_test = unittest.make(_with_or_test)
62*bcb5dc79SHONG Yifan
63*bcb5dc79SHONG Yifan###################################################
64*bcb5dc79SHONG Yifan# BUILD declarations for config_setting_group tests
65*bcb5dc79SHONG Yifan###################################################
66*bcb5dc79SHONG Yifan
67*bcb5dc79SHONG Yifan# TODO: redefine these config_settings with Starlark build flags when
68*bcb5dc79SHONG Yifan# they're available non-experimentally.
69*bcb5dc79SHONG Yifandef _create_config_settings():
70*bcb5dc79SHONG Yifan    native.config_setting(
71*bcb5dc79SHONG Yifan        name = "condition1",
72*bcb5dc79SHONG Yifan        values = {"cpu": "ppc"},
73*bcb5dc79SHONG Yifan    )
74*bcb5dc79SHONG Yifan    native.config_setting(
75*bcb5dc79SHONG Yifan        name = "condition2",
76*bcb5dc79SHONG Yifan        values = {"compilation_mode": "opt"},
77*bcb5dc79SHONG Yifan    )
78*bcb5dc79SHONG Yifan    native.config_setting(
79*bcb5dc79SHONG Yifan        name = "condition3",
80*bcb5dc79SHONG Yifan        values = {"features": "myfeature"},
81*bcb5dc79SHONG Yifan    )
82*bcb5dc79SHONG Yifan
83*bcb5dc79SHONG Yifandef _create_config_setting_groups():
84*bcb5dc79SHONG Yifan    selects.config_setting_group(
85*bcb5dc79SHONG Yifan        name = "1_and_2_and_3",
86*bcb5dc79SHONG Yifan        match_all = [":condition1", ":condition2", ":condition3"],
87*bcb5dc79SHONG Yifan    )
88*bcb5dc79SHONG Yifan    selects.config_setting_group(
89*bcb5dc79SHONG Yifan        name = "1_and_nothing_else",
90*bcb5dc79SHONG Yifan        match_all = [":condition1"],
91*bcb5dc79SHONG Yifan    )
92*bcb5dc79SHONG Yifan    selects.config_setting_group(
93*bcb5dc79SHONG Yifan        name = "1_or_2_or_3",
94*bcb5dc79SHONG Yifan        match_any = [":condition1", ":condition2", ":condition3"],
95*bcb5dc79SHONG Yifan    )
96*bcb5dc79SHONG Yifan    selects.config_setting_group(
97*bcb5dc79SHONG Yifan        name = "1_or_nothing_else",
98*bcb5dc79SHONG Yifan        match_any = [":condition1"],
99*bcb5dc79SHONG Yifan    )
100*bcb5dc79SHONG Yifan
101*bcb5dc79SHONG Yifan###################################################
102*bcb5dc79SHONG Yifan# Support code for config_setting_group tests
103*bcb5dc79SHONG Yifan###################################################
104*bcb5dc79SHONG Yifan
105*bcb5dc79SHONG Yifandef _set_conditions(condition_list):
106*bcb5dc79SHONG Yifan    """Returns an argument for config_settings that sets specific options.
107*bcb5dc79SHONG Yifan
108*bcb5dc79SHONG Yifan    Args:
109*bcb5dc79SHONG Yifan      condition_list: a list of three booleans
110*bcb5dc79SHONG Yifan
111*bcb5dc79SHONG Yifan    Returns:
112*bcb5dc79SHONG Yifan      a dictionary parameter for config_settings such that ":conditionN" is True
113*bcb5dc79SHONG Yifan          iff condition_list[N + 1] is True
114*bcb5dc79SHONG Yifan    """
115*bcb5dc79SHONG Yifan    if len(condition_list) != 3:
116*bcb5dc79SHONG Yifan        fail("condition_list must be a list of 3 booleans")
117*bcb5dc79SHONG Yifan    ans = {}
118*bcb5dc79SHONG Yifan    if condition_list[0]:
119*bcb5dc79SHONG Yifan        ans["//command_line_option:cpu"] = "ppc"
120*bcb5dc79SHONG Yifan    else:
121*bcb5dc79SHONG Yifan        ans["//command_line_option:cpu"] = "k8"
122*bcb5dc79SHONG Yifan    if condition_list[1]:
123*bcb5dc79SHONG Yifan        ans["//command_line_option:compilation_mode"] = "opt"
124*bcb5dc79SHONG Yifan    else:
125*bcb5dc79SHONG Yifan        ans["//command_line_option:compilation_mode"] = "dbg"
126*bcb5dc79SHONG Yifan    if condition_list[2]:
127*bcb5dc79SHONG Yifan        ans["//command_line_option:features"] = ["myfeature"]
128*bcb5dc79SHONG Yifan    else:
129*bcb5dc79SHONG Yifan        ans["//command_line_option:features"] = ["notmyfeature"]
130*bcb5dc79SHONG Yifan    return ans
131*bcb5dc79SHONG Yifan
132*bcb5dc79SHONG Yifan_BooleanInfo = provider(
133*bcb5dc79SHONG Yifan    doc = "value for boolean tests",
134*bcb5dc79SHONG Yifan    fields = ["value"],
135*bcb5dc79SHONG Yifan)
136*bcb5dc79SHONG Yifan
137*bcb5dc79SHONG Yifandef _boolean_attr_impl(ctx):
138*bcb5dc79SHONG Yifan    return [_BooleanInfo(value = ctx.attr.myboolean)]
139*bcb5dc79SHONG Yifan
140*bcb5dc79SHONG Yifanboolean_attr_rule = rule(
141*bcb5dc79SHONG Yifan    implementation = _boolean_attr_impl,
142*bcb5dc79SHONG Yifan    attrs = {"myboolean": attr.bool()},
143*bcb5dc79SHONG Yifan)
144*bcb5dc79SHONG Yifan
145*bcb5dc79SHONG Yifandef _expect_matches(ctx):
146*bcb5dc79SHONG Yifan    """Generic test implementation expecting myboolean == True."""
147*bcb5dc79SHONG Yifan    env = analysistest.begin(ctx)
148*bcb5dc79SHONG Yifan    attrval = analysistest.target_under_test(env)[_BooleanInfo].value
149*bcb5dc79SHONG Yifan    asserts.equals(env, True, attrval)
150*bcb5dc79SHONG Yifan    return analysistest.end(env)
151*bcb5dc79SHONG Yifan
152*bcb5dc79SHONG Yifandef _expect_doesnt_match(ctx):
153*bcb5dc79SHONG Yifan    """Generic test implementation expecting myboolean == False."""
154*bcb5dc79SHONG Yifan    env = analysistest.begin(ctx)
155*bcb5dc79SHONG Yifan    attrval = analysistest.target_under_test(env)[_BooleanInfo].value
156*bcb5dc79SHONG Yifan    asserts.equals(env, False, attrval)
157*bcb5dc79SHONG Yifan    return analysistest.end(env)
158*bcb5dc79SHONG Yifan
159*bcb5dc79SHONG Yifan###################################################
160*bcb5dc79SHONG Yifan# and_config_setting_group_matches_test
161*bcb5dc79SHONG Yifan###################################################
162*bcb5dc79SHONG Yifanand_config_setting_group_matches_test = analysistest.make(
163*bcb5dc79SHONG Yifan    _expect_matches,
164*bcb5dc79SHONG Yifan    config_settings = _set_conditions([True, True, True]),
165*bcb5dc79SHONG Yifan)
166*bcb5dc79SHONG Yifan
167*bcb5dc79SHONG Yifandef _and_config_setting_group_matches_test():
168*bcb5dc79SHONG Yifan    """Test verifying match on an ANDing config_setting_group."""
169*bcb5dc79SHONG Yifan    boolean_attr_rule(
170*bcb5dc79SHONG Yifan        name = "and_config_setting_group_matches_rule",
171*bcb5dc79SHONG Yifan        myboolean = select(
172*bcb5dc79SHONG Yifan            {
173*bcb5dc79SHONG Yifan                ":1_and_2_and_3": True,
174*bcb5dc79SHONG Yifan                "//conditions:default": False,
175*bcb5dc79SHONG Yifan            },
176*bcb5dc79SHONG Yifan        ),
177*bcb5dc79SHONG Yifan    )
178*bcb5dc79SHONG Yifan    and_config_setting_group_matches_test(
179*bcb5dc79SHONG Yifan        name = "and_config_setting_group_matches_test",
180*bcb5dc79SHONG Yifan        target_under_test = ":and_config_setting_group_matches_rule",
181*bcb5dc79SHONG Yifan    )
182*bcb5dc79SHONG Yifan
183*bcb5dc79SHONG Yifan###################################################
184*bcb5dc79SHONG Yifan# and_config_setting_group_first_match_fails_test
185*bcb5dc79SHONG Yifan###################################################
186*bcb5dc79SHONG Yifanand_config_setting_group_first_match_fails_test = analysistest.make(
187*bcb5dc79SHONG Yifan    _expect_doesnt_match,
188*bcb5dc79SHONG Yifan    config_settings = _set_conditions([False, True, True]),
189*bcb5dc79SHONG Yifan)
190*bcb5dc79SHONG Yifan
191*bcb5dc79SHONG Yifandef _and_config_setting_group_first_match_fails_test():
192*bcb5dc79SHONG Yifan    """Test verifying first condition mismatch on an ANDing config_setting_group."""
193*bcb5dc79SHONG Yifan    boolean_attr_rule(
194*bcb5dc79SHONG Yifan        name = "and_config_setting_group_first_match_fails_rule",
195*bcb5dc79SHONG Yifan        myboolean = select(
196*bcb5dc79SHONG Yifan            {
197*bcb5dc79SHONG Yifan                ":1_and_2_and_3": True,
198*bcb5dc79SHONG Yifan                "//conditions:default": False,
199*bcb5dc79SHONG Yifan            },
200*bcb5dc79SHONG Yifan        ),
201*bcb5dc79SHONG Yifan    )
202*bcb5dc79SHONG Yifan    and_config_setting_group_first_match_fails_test(
203*bcb5dc79SHONG Yifan        name = "and_config_setting_group_first_match_fails_test",
204*bcb5dc79SHONG Yifan        target_under_test = ":and_config_setting_group_first_match_fails_rule",
205*bcb5dc79SHONG Yifan    )
206*bcb5dc79SHONG Yifan
207*bcb5dc79SHONG Yifan###################################################
208*bcb5dc79SHONG Yifan# and_config_setting_group_middle_match_fails_test
209*bcb5dc79SHONG Yifan###################################################
210*bcb5dc79SHONG Yifanand_config_setting_group_middle_match_fails_test = analysistest.make(
211*bcb5dc79SHONG Yifan    _expect_doesnt_match,
212*bcb5dc79SHONG Yifan    config_settings = _set_conditions([True, False, True]),
213*bcb5dc79SHONG Yifan)
214*bcb5dc79SHONG Yifan
215*bcb5dc79SHONG Yifandef _and_config_setting_group_middle_match_fails_test():
216*bcb5dc79SHONG Yifan    """Test verifying middle condition mismatch on an ANDing config_setting_group."""
217*bcb5dc79SHONG Yifan    boolean_attr_rule(
218*bcb5dc79SHONG Yifan        name = "and_config_setting_group_middle_match_fails_rule",
219*bcb5dc79SHONG Yifan        myboolean = select(
220*bcb5dc79SHONG Yifan            {
221*bcb5dc79SHONG Yifan                ":1_and_2_and_3": True,
222*bcb5dc79SHONG Yifan                "//conditions:default": False,
223*bcb5dc79SHONG Yifan            },
224*bcb5dc79SHONG Yifan        ),
225*bcb5dc79SHONG Yifan    )
226*bcb5dc79SHONG Yifan    and_config_setting_group_middle_match_fails_test(
227*bcb5dc79SHONG Yifan        name = "and_config_setting_group_middle_match_fails_test",
228*bcb5dc79SHONG Yifan        target_under_test = ":and_config_setting_group_middle_match_fails_rule",
229*bcb5dc79SHONG Yifan    )
230*bcb5dc79SHONG Yifan
231*bcb5dc79SHONG Yifan###################################################
232*bcb5dc79SHONG Yifan# and_config_setting_group_last_match_fails_test
233*bcb5dc79SHONG Yifan###################################################
234*bcb5dc79SHONG Yifanand_config_setting_group_last_match_fails_test = analysistest.make(
235*bcb5dc79SHONG Yifan    _expect_doesnt_match,
236*bcb5dc79SHONG Yifan    config_settings = _set_conditions([True, True, False]),
237*bcb5dc79SHONG Yifan)
238*bcb5dc79SHONG Yifan
239*bcb5dc79SHONG Yifandef _and_config_setting_group_last_match_fails_test():
240*bcb5dc79SHONG Yifan    """Test verifying last condition mismatch on an ANDing config_setting_group."""
241*bcb5dc79SHONG Yifan    boolean_attr_rule(
242*bcb5dc79SHONG Yifan        name = "and_config_setting_group_last_match_fails_rule",
243*bcb5dc79SHONG Yifan        myboolean = select(
244*bcb5dc79SHONG Yifan            {
245*bcb5dc79SHONG Yifan                ":1_and_2_and_3": True,
246*bcb5dc79SHONG Yifan                "//conditions:default": False,
247*bcb5dc79SHONG Yifan            },
248*bcb5dc79SHONG Yifan        ),
249*bcb5dc79SHONG Yifan    )
250*bcb5dc79SHONG Yifan    and_config_setting_group_last_match_fails_test(
251*bcb5dc79SHONG Yifan        name = "and_config_setting_group_last_match_fails_test",
252*bcb5dc79SHONG Yifan        target_under_test = ":and_config_setting_group_last_match_fails_rule",
253*bcb5dc79SHONG Yifan    )
254*bcb5dc79SHONG Yifan
255*bcb5dc79SHONG Yifan###################################################
256*bcb5dc79SHONG Yifan# and_config_setting_group_multiple_matches_fail_test
257*bcb5dc79SHONG Yifan###################################################
258*bcb5dc79SHONG Yifanand_config_setting_group_multiple_matches_fail_test = analysistest.make(
259*bcb5dc79SHONG Yifan    _expect_doesnt_match,
260*bcb5dc79SHONG Yifan    config_settings = _set_conditions([True, False, False]),
261*bcb5dc79SHONG Yifan)
262*bcb5dc79SHONG Yifan
263*bcb5dc79SHONG Yifandef _and_config_setting_group_multiple_matches_fail_test():
264*bcb5dc79SHONG Yifan    """Test verifying multiple conditions mismatch on an ANDing config_setting_group."""
265*bcb5dc79SHONG Yifan    boolean_attr_rule(
266*bcb5dc79SHONG Yifan        name = "and_config_setting_group_multiple_matches_fail_rule",
267*bcb5dc79SHONG Yifan        myboolean = select(
268*bcb5dc79SHONG Yifan            {
269*bcb5dc79SHONG Yifan                ":1_and_2_and_3": True,
270*bcb5dc79SHONG Yifan                "//conditions:default": False,
271*bcb5dc79SHONG Yifan            },
272*bcb5dc79SHONG Yifan        ),
273*bcb5dc79SHONG Yifan    )
274*bcb5dc79SHONG Yifan    and_config_setting_group_multiple_matches_fail_test(
275*bcb5dc79SHONG Yifan        name = "and_config_setting_group_multiple_matches_fail_test",
276*bcb5dc79SHONG Yifan        target_under_test = ":and_config_setting_group_multiple_matches_fail_rule",
277*bcb5dc79SHONG Yifan    )
278*bcb5dc79SHONG Yifan
279*bcb5dc79SHONG Yifan###################################################
280*bcb5dc79SHONG Yifan# and_config_setting_group_all_matches_fail_test
281*bcb5dc79SHONG Yifan###################################################
282*bcb5dc79SHONG Yifanand_config_setting_group_all_matches_fail_test = analysistest.make(
283*bcb5dc79SHONG Yifan    _expect_doesnt_match,
284*bcb5dc79SHONG Yifan    config_settings = _set_conditions([False, False, False]),
285*bcb5dc79SHONG Yifan)
286*bcb5dc79SHONG Yifan
287*bcb5dc79SHONG Yifandef _and_config_setting_group_all_matches_fail_test():
288*bcb5dc79SHONG Yifan    """Test verifying all conditions mismatch on an ANDing config_setting_group."""
289*bcb5dc79SHONG Yifan    boolean_attr_rule(
290*bcb5dc79SHONG Yifan        name = "and_config_setting_group_all_matches_fail_rule",
291*bcb5dc79SHONG Yifan        myboolean = select(
292*bcb5dc79SHONG Yifan            {
293*bcb5dc79SHONG Yifan                ":1_and_2_and_3": True,
294*bcb5dc79SHONG Yifan                "//conditions:default": False,
295*bcb5dc79SHONG Yifan            },
296*bcb5dc79SHONG Yifan        ),
297*bcb5dc79SHONG Yifan    )
298*bcb5dc79SHONG Yifan    and_config_setting_group_all_matches_fail_test(
299*bcb5dc79SHONG Yifan        name = "and_config_setting_group_all_matches_fail_test",
300*bcb5dc79SHONG Yifan        target_under_test = ":and_config_setting_group_all_matches_fail_rule",
301*bcb5dc79SHONG Yifan    )
302*bcb5dc79SHONG Yifan
303*bcb5dc79SHONG Yifan###################################################
304*bcb5dc79SHONG Yifan# and_config_setting_group_single_setting_matches_test
305*bcb5dc79SHONG Yifan###################################################
306*bcb5dc79SHONG Yifanand_config_setting_group_single_setting_matches_test = analysistest.make(
307*bcb5dc79SHONG Yifan    _expect_matches,
308*bcb5dc79SHONG Yifan    config_settings = {"//command_line_option:cpu": "ppc"},
309*bcb5dc79SHONG Yifan)
310*bcb5dc79SHONG Yifan
311*bcb5dc79SHONG Yifandef _and_config_setting_group_single_setting_matches_test():
312*bcb5dc79SHONG Yifan    """Test verifying match on single-entry ANDing config_setting_group."""
313*bcb5dc79SHONG Yifan    boolean_attr_rule(
314*bcb5dc79SHONG Yifan        name = "and_config_setting_group_single_setting_matches_rule",
315*bcb5dc79SHONG Yifan        myboolean = select(
316*bcb5dc79SHONG Yifan            {
317*bcb5dc79SHONG Yifan                ":1_and_nothing_else": True,
318*bcb5dc79SHONG Yifan                "//conditions:default": False,
319*bcb5dc79SHONG Yifan            },
320*bcb5dc79SHONG Yifan        ),
321*bcb5dc79SHONG Yifan    )
322*bcb5dc79SHONG Yifan    and_config_setting_group_single_setting_matches_test(
323*bcb5dc79SHONG Yifan        name = "and_config_setting_group_single_setting_matches_test",
324*bcb5dc79SHONG Yifan        target_under_test = ":and_config_setting_group_single_setting_matches_rule",
325*bcb5dc79SHONG Yifan    )
326*bcb5dc79SHONG Yifan
327*bcb5dc79SHONG Yifan###################################################
328*bcb5dc79SHONG Yifan# and_config_setting_group_single_setting_fails_test
329*bcb5dc79SHONG Yifan###################################################
330*bcb5dc79SHONG Yifanand_config_setting_group_single_setting_fails_test = analysistest.make(
331*bcb5dc79SHONG Yifan    _expect_doesnt_match,
332*bcb5dc79SHONG Yifan    config_settings = {"//command_line_option:cpu": "x86"},
333*bcb5dc79SHONG Yifan)
334*bcb5dc79SHONG Yifan
335*bcb5dc79SHONG Yifandef _and_config_setting_group_single_setting_fails_test():
336*bcb5dc79SHONG Yifan    """Test verifying no match on single-entry ANDing config_setting_group."""
337*bcb5dc79SHONG Yifan    boolean_attr_rule(
338*bcb5dc79SHONG Yifan        name = "and_config_setting_group_single_setting_fails_rule",
339*bcb5dc79SHONG Yifan        myboolean = select(
340*bcb5dc79SHONG Yifan            {
341*bcb5dc79SHONG Yifan                ":1_and_nothing_else": True,
342*bcb5dc79SHONG Yifan                "//conditions:default": False,
343*bcb5dc79SHONG Yifan            },
344*bcb5dc79SHONG Yifan        ),
345*bcb5dc79SHONG Yifan    )
346*bcb5dc79SHONG Yifan    and_config_setting_group_single_setting_fails_test(
347*bcb5dc79SHONG Yifan        name = "and_config_setting_group_single_setting_fails_test",
348*bcb5dc79SHONG Yifan        target_under_test = ":and_config_setting_group_single_setting_fails_rule",
349*bcb5dc79SHONG Yifan    )
350*bcb5dc79SHONG Yifan
351*bcb5dc79SHONG Yifan###################################################
352*bcb5dc79SHONG Yifan# or_config_setting_group_no_match_test
353*bcb5dc79SHONG Yifan###################################################
354*bcb5dc79SHONG Yifanor_config_setting_group_no_matches_test = analysistest.make(
355*bcb5dc79SHONG Yifan    _expect_doesnt_match,
356*bcb5dc79SHONG Yifan    config_settings = _set_conditions([False, False, False]),
357*bcb5dc79SHONG Yifan)
358*bcb5dc79SHONG Yifan
359*bcb5dc79SHONG Yifandef _or_config_setting_group_no_matches_test():
360*bcb5dc79SHONG Yifan    """Test verifying no matches on an ORing config_setting_group."""
361*bcb5dc79SHONG Yifan    boolean_attr_rule(
362*bcb5dc79SHONG Yifan        name = "or_config_setting_group_no_matches_rule",
363*bcb5dc79SHONG Yifan        myboolean = select(
364*bcb5dc79SHONG Yifan            {
365*bcb5dc79SHONG Yifan                ":1_or_2_or_3": True,
366*bcb5dc79SHONG Yifan                "//conditions:default": False,
367*bcb5dc79SHONG Yifan            },
368*bcb5dc79SHONG Yifan        ),
369*bcb5dc79SHONG Yifan    )
370*bcb5dc79SHONG Yifan    or_config_setting_group_no_matches_test(
371*bcb5dc79SHONG Yifan        name = "or_config_setting_group_no_matches_test",
372*bcb5dc79SHONG Yifan        target_under_test = ":or_config_setting_group_no_matches_rule",
373*bcb5dc79SHONG Yifan    )
374*bcb5dc79SHONG Yifan
375*bcb5dc79SHONG Yifan###################################################
376*bcb5dc79SHONG Yifan# or_config_setting_group_first_cond_matches_test
377*bcb5dc79SHONG Yifan###################################################
378*bcb5dc79SHONG Yifanor_config_setting_group_first_cond_matches_test = analysistest.make(
379*bcb5dc79SHONG Yifan    _expect_matches,
380*bcb5dc79SHONG Yifan    config_settings = _set_conditions([True, False, False]),
381*bcb5dc79SHONG Yifan)
382*bcb5dc79SHONG Yifan
383*bcb5dc79SHONG Yifandef _or_config_setting_group_first_cond_matches_test():
384*bcb5dc79SHONG Yifan    """Test verifying first condition matching on an ORing config_setting_group."""
385*bcb5dc79SHONG Yifan    boolean_attr_rule(
386*bcb5dc79SHONG Yifan        name = "or_config_setting_group_first_cond_matches_rule",
387*bcb5dc79SHONG Yifan        myboolean = select(
388*bcb5dc79SHONG Yifan            {
389*bcb5dc79SHONG Yifan                ":1_or_2_or_3": True,
390*bcb5dc79SHONG Yifan                "//conditions:default": False,
391*bcb5dc79SHONG Yifan            },
392*bcb5dc79SHONG Yifan        ),
393*bcb5dc79SHONG Yifan    )
394*bcb5dc79SHONG Yifan    or_config_setting_group_first_cond_matches_test(
395*bcb5dc79SHONG Yifan        name = "or_config_setting_group_first_cond_matches_test",
396*bcb5dc79SHONG Yifan        target_under_test = ":or_config_setting_group_first_cond_matches_rule",
397*bcb5dc79SHONG Yifan    )
398*bcb5dc79SHONG Yifan
399*bcb5dc79SHONG Yifan###################################################
400*bcb5dc79SHONG Yifan# or_config_setting_group_middle_cond_matches_test
401*bcb5dc79SHONG Yifan###################################################
402*bcb5dc79SHONG Yifanor_config_setting_group_middle_cond_matches_test = analysistest.make(
403*bcb5dc79SHONG Yifan    _expect_matches,
404*bcb5dc79SHONG Yifan    config_settings = _set_conditions([False, True, False]),
405*bcb5dc79SHONG Yifan)
406*bcb5dc79SHONG Yifan
407*bcb5dc79SHONG Yifandef _or_config_setting_group_middle_cond_matches_test():
408*bcb5dc79SHONG Yifan    """Test verifying middle condition matching on an ORing config_setting_group."""
409*bcb5dc79SHONG Yifan    boolean_attr_rule(
410*bcb5dc79SHONG Yifan        name = "or_config_setting_group_middle_cond_matches_rule",
411*bcb5dc79SHONG Yifan        myboolean = select(
412*bcb5dc79SHONG Yifan            {
413*bcb5dc79SHONG Yifan                ":1_or_2_or_3": True,
414*bcb5dc79SHONG Yifan                "//conditions:default": False,
415*bcb5dc79SHONG Yifan            },
416*bcb5dc79SHONG Yifan        ),
417*bcb5dc79SHONG Yifan    )
418*bcb5dc79SHONG Yifan    or_config_setting_group_middle_cond_matches_test(
419*bcb5dc79SHONG Yifan        name = "or_config_setting_group_middle_cond_matches_test",
420*bcb5dc79SHONG Yifan        target_under_test = ":or_config_setting_group_middle_cond_matches_rule",
421*bcb5dc79SHONG Yifan    )
422*bcb5dc79SHONG Yifan
423*bcb5dc79SHONG Yifan###################################################
424*bcb5dc79SHONG Yifan# or_config_setting_group_last_cond_matches_test
425*bcb5dc79SHONG Yifan###################################################
426*bcb5dc79SHONG Yifanor_config_setting_group_last_cond_matches_test = analysistest.make(
427*bcb5dc79SHONG Yifan    _expect_matches,
428*bcb5dc79SHONG Yifan    config_settings = _set_conditions([False, False, True]),
429*bcb5dc79SHONG Yifan)
430*bcb5dc79SHONG Yifan
431*bcb5dc79SHONG Yifandef _or_config_setting_group_last_cond_matches_test():
432*bcb5dc79SHONG Yifan    """Test verifying last condition matching on an ORing config_setting_group."""
433*bcb5dc79SHONG Yifan    boolean_attr_rule(
434*bcb5dc79SHONG Yifan        name = "or_config_setting_group_last_cond_matches_rule",
435*bcb5dc79SHONG Yifan        myboolean = select(
436*bcb5dc79SHONG Yifan            {
437*bcb5dc79SHONG Yifan                ":1_or_2_or_3": True,
438*bcb5dc79SHONG Yifan                "//conditions:default": False,
439*bcb5dc79SHONG Yifan            },
440*bcb5dc79SHONG Yifan        ),
441*bcb5dc79SHONG Yifan    )
442*bcb5dc79SHONG Yifan    or_config_setting_group_last_cond_matches_test(
443*bcb5dc79SHONG Yifan        name = "or_config_setting_group_last_cond_matches_test",
444*bcb5dc79SHONG Yifan        target_under_test = ":or_config_setting_group_last_cond_matches_rule",
445*bcb5dc79SHONG Yifan    )
446*bcb5dc79SHONG Yifan
447*bcb5dc79SHONG Yifan###################################################
448*bcb5dc79SHONG Yifan# or_config_setting_group_multiple_conds_match_test
449*bcb5dc79SHONG Yifan###################################################
450*bcb5dc79SHONG Yifanor_config_setting_group_multiple_conds_match_test = analysistest.make(
451*bcb5dc79SHONG Yifan    _expect_matches,
452*bcb5dc79SHONG Yifan    config_settings = _set_conditions([False, True, True]),
453*bcb5dc79SHONG Yifan)
454*bcb5dc79SHONG Yifan
455*bcb5dc79SHONG Yifandef _or_config_setting_group_multiple_conds_match_test():
456*bcb5dc79SHONG Yifan    """Test verifying multiple conditions matching on an ORing config_setting_group."""
457*bcb5dc79SHONG Yifan    boolean_attr_rule(
458*bcb5dc79SHONG Yifan        name = "or_config_setting_group_multiple_conds_match_rule",
459*bcb5dc79SHONG Yifan        myboolean = select(
460*bcb5dc79SHONG Yifan            {
461*bcb5dc79SHONG Yifan                ":1_or_2_or_3": True,
462*bcb5dc79SHONG Yifan                "//conditions:default": False,
463*bcb5dc79SHONG Yifan            },
464*bcb5dc79SHONG Yifan        ),
465*bcb5dc79SHONG Yifan    )
466*bcb5dc79SHONG Yifan    or_config_setting_group_multiple_conds_match_test(
467*bcb5dc79SHONG Yifan        name = "or_config_setting_group_multiple_conds_match_test",
468*bcb5dc79SHONG Yifan        target_under_test = ":or_config_setting_group_multiple_conds_match_rule",
469*bcb5dc79SHONG Yifan    )
470*bcb5dc79SHONG Yifan
471*bcb5dc79SHONG Yifan###################################################
472*bcb5dc79SHONG Yifan# or_config_setting_group_all_conds_match_test
473*bcb5dc79SHONG Yifan###################################################
474*bcb5dc79SHONG Yifanor_config_setting_group_all_conds_match_test = analysistest.make(
475*bcb5dc79SHONG Yifan    _expect_matches,
476*bcb5dc79SHONG Yifan    config_settings = _set_conditions([False, True, True]),
477*bcb5dc79SHONG Yifan)
478*bcb5dc79SHONG Yifan
479*bcb5dc79SHONG Yifandef _or_config_setting_group_all_conds_match_test():
480*bcb5dc79SHONG Yifan    """Test verifying all conditions matching on an ORing config_setting_group."""
481*bcb5dc79SHONG Yifan    boolean_attr_rule(
482*bcb5dc79SHONG Yifan        name = "or_config_setting_group_all_conds_match_rule",
483*bcb5dc79SHONG Yifan        myboolean = select(
484*bcb5dc79SHONG Yifan            {
485*bcb5dc79SHONG Yifan                ":1_or_2_or_3": True,
486*bcb5dc79SHONG Yifan                "//conditions:default": False,
487*bcb5dc79SHONG Yifan            },
488*bcb5dc79SHONG Yifan        ),
489*bcb5dc79SHONG Yifan    )
490*bcb5dc79SHONG Yifan    or_config_setting_group_all_conds_match_test(
491*bcb5dc79SHONG Yifan        name = "or_config_setting_group_all_conds_match_test",
492*bcb5dc79SHONG Yifan        target_under_test = ":or_config_setting_group_all_conds_match_rule",
493*bcb5dc79SHONG Yifan    )
494*bcb5dc79SHONG Yifan
495*bcb5dc79SHONG Yifan###################################################
496*bcb5dc79SHONG Yifan# or_config_setting_group_single_setting_matches_test
497*bcb5dc79SHONG Yifan###################################################
498*bcb5dc79SHONG Yifanor_config_setting_group_single_setting_matches_test = analysistest.make(
499*bcb5dc79SHONG Yifan    _expect_matches,
500*bcb5dc79SHONG Yifan    config_settings = {"//command_line_option:cpu": "ppc"},
501*bcb5dc79SHONG Yifan)
502*bcb5dc79SHONG Yifan
503*bcb5dc79SHONG Yifandef _or_config_setting_group_single_setting_matches_test():
504*bcb5dc79SHONG Yifan    """Test verifying match on single-entry ORing config_setting_group."""
505*bcb5dc79SHONG Yifan    boolean_attr_rule(
506*bcb5dc79SHONG Yifan        name = "or_config_setting_group_single_setting_matches_rule",
507*bcb5dc79SHONG Yifan        myboolean = select(
508*bcb5dc79SHONG Yifan            {
509*bcb5dc79SHONG Yifan                ":1_or_nothing_else": True,
510*bcb5dc79SHONG Yifan                "//conditions:default": False,
511*bcb5dc79SHONG Yifan            },
512*bcb5dc79SHONG Yifan        ),
513*bcb5dc79SHONG Yifan    )
514*bcb5dc79SHONG Yifan    or_config_setting_group_single_setting_matches_test(
515*bcb5dc79SHONG Yifan        name = "or_config_setting_group_single_setting_matches_test",
516*bcb5dc79SHONG Yifan        target_under_test = ":or_config_setting_group_single_setting_matches_rule",
517*bcb5dc79SHONG Yifan    )
518*bcb5dc79SHONG Yifan
519*bcb5dc79SHONG Yifan###################################################
520*bcb5dc79SHONG Yifan# or_config_setting_group_single_setting_fails_test
521*bcb5dc79SHONG Yifan###################################################
522*bcb5dc79SHONG Yifanor_config_setting_group_single_setting_fails_test = analysistest.make(
523*bcb5dc79SHONG Yifan    _expect_doesnt_match,
524*bcb5dc79SHONG Yifan    config_settings = {"//command_line_option:cpu": "x86"},
525*bcb5dc79SHONG Yifan)
526*bcb5dc79SHONG Yifan
527*bcb5dc79SHONG Yifandef _or_config_setting_group_single_setting_fails_test():
528*bcb5dc79SHONG Yifan    """Test verifying no match on single-entry ORing config_setting_group."""
529*bcb5dc79SHONG Yifan    boolean_attr_rule(
530*bcb5dc79SHONG Yifan        name = "or_config_setting_group_single_setting_fails_rule",
531*bcb5dc79SHONG Yifan        myboolean = select(
532*bcb5dc79SHONG Yifan            {
533*bcb5dc79SHONG Yifan                ":1_or_nothing_else": True,
534*bcb5dc79SHONG Yifan                "//conditions:default": False,
535*bcb5dc79SHONG Yifan            },
536*bcb5dc79SHONG Yifan        ),
537*bcb5dc79SHONG Yifan    )
538*bcb5dc79SHONG Yifan    or_config_setting_group_single_setting_fails_test(
539*bcb5dc79SHONG Yifan        name = "or_config_setting_group_single_setting_fails_test",
540*bcb5dc79SHONG Yifan        target_under_test = ":or_config_setting_group_single_setting_fails_rule",
541*bcb5dc79SHONG Yifan    )
542*bcb5dc79SHONG Yifan
543*bcb5dc79SHONG Yifan###################################################
544*bcb5dc79SHONG Yifan# always_true_match_all_test
545*bcb5dc79SHONG Yifan###################################################
546*bcb5dc79SHONG Yifanalways_true_match_all_test = analysistest.make(_expect_matches)
547*bcb5dc79SHONG Yifan
548*bcb5dc79SHONG Yifandef _always_true_match_all_test():
549*bcb5dc79SHONG Yifan    """Tests that "match_all=['//conditions:default']" always matches."""
550*bcb5dc79SHONG Yifan    selects.config_setting_group(
551*bcb5dc79SHONG Yifan        name = "all_always_match",
552*bcb5dc79SHONG Yifan        match_all = ["//conditions:default"],
553*bcb5dc79SHONG Yifan    )
554*bcb5dc79SHONG Yifan    boolean_attr_rule(
555*bcb5dc79SHONG Yifan        name = "match_always_true_rule",
556*bcb5dc79SHONG Yifan        myboolean = select(
557*bcb5dc79SHONG Yifan            {
558*bcb5dc79SHONG Yifan                ":all_always_match": True,
559*bcb5dc79SHONG Yifan            },
560*bcb5dc79SHONG Yifan        ),
561*bcb5dc79SHONG Yifan    )
562*bcb5dc79SHONG Yifan    always_true_match_all_test(
563*bcb5dc79SHONG Yifan        name = "always_true_match_all_test",
564*bcb5dc79SHONG Yifan        target_under_test = ":match_always_true_rule",
565*bcb5dc79SHONG Yifan    )
566*bcb5dc79SHONG Yifan
567*bcb5dc79SHONG Yifan###################################################
568*bcb5dc79SHONG Yifan# always_true_match_any_test
569*bcb5dc79SHONG Yifan###################################################
570*bcb5dc79SHONG Yifanalways_true_match_any_test = analysistest.make(_expect_matches)
571*bcb5dc79SHONG Yifan
572*bcb5dc79SHONG Yifandef _always_true_match_any_test():
573*bcb5dc79SHONG Yifan    """Tests that "match_any=['//conditions:default']" always matches."""
574*bcb5dc79SHONG Yifan    selects.config_setting_group(
575*bcb5dc79SHONG Yifan        name = "any_always_match",
576*bcb5dc79SHONG Yifan        match_any = ["//conditions:default"],
577*bcb5dc79SHONG Yifan    )
578*bcb5dc79SHONG Yifan    boolean_attr_rule(
579*bcb5dc79SHONG Yifan        name = "match_any_always_true_rule",
580*bcb5dc79SHONG Yifan        myboolean = select(
581*bcb5dc79SHONG Yifan            {
582*bcb5dc79SHONG Yifan                ":any_always_match": True,
583*bcb5dc79SHONG Yifan            },
584*bcb5dc79SHONG Yifan        ),
585*bcb5dc79SHONG Yifan    )
586*bcb5dc79SHONG Yifan    always_true_match_any_test(
587*bcb5dc79SHONG Yifan        name = "always_true_match_any_test",
588*bcb5dc79SHONG Yifan        target_under_test = ":match_any_always_true_rule",
589*bcb5dc79SHONG Yifan    )
590*bcb5dc79SHONG Yifan
591*bcb5dc79SHONG Yifan###################################################
592*bcb5dc79SHONG Yifan# empty_config_setting_group_not_allowed_test
593*bcb5dc79SHONG Yifan###################################################
594*bcb5dc79SHONG Yifan
595*bcb5dc79SHONG Yifan# config_setting_group with no parameters triggers a failure.
596*bcb5dc79SHONG Yifan# TODO: how do we test this? This requires catching macro
597*bcb5dc79SHONG Yifan# evaluation failure.
598*bcb5dc79SHONG Yifan
599*bcb5dc79SHONG Yifan###################################################
600*bcb5dc79SHONG Yifan# and_and_or_not_allowed_together_test
601*bcb5dc79SHONG Yifan###################################################
602*bcb5dc79SHONG Yifan
603*bcb5dc79SHONG Yifan# config_setting_group: setting both match_any and match_or
604*bcb5dc79SHONG Yifan# triggers a failure.
605*bcb5dc79SHONG Yifan# TODO: how do we test this? This requires catching macro
606*bcb5dc79SHONG Yifan# evaluation failure.
607*bcb5dc79SHONG Yifan
608*bcb5dc79SHONG Yifan###################################################
609*bcb5dc79SHONG Yifan
610*bcb5dc79SHONG Yifan# buildifier: disable=unnamed-macro
611*bcb5dc79SHONG Yifandef selects_test_suite():
612*bcb5dc79SHONG Yifan    """Creates the test targets and test suite for selects.bzl tests."""
613*bcb5dc79SHONG Yifan    unittest.suite(
614*bcb5dc79SHONG Yifan        "selects_tests",
615*bcb5dc79SHONG Yifan        with_or_test,
616*bcb5dc79SHONG Yifan    )
617*bcb5dc79SHONG Yifan
618*bcb5dc79SHONG Yifan    _create_config_settings()
619*bcb5dc79SHONG Yifan    _create_config_setting_groups()
620*bcb5dc79SHONG Yifan
621*bcb5dc79SHONG Yifan    _and_config_setting_group_matches_test()
622*bcb5dc79SHONG Yifan    _and_config_setting_group_first_match_fails_test()
623*bcb5dc79SHONG Yifan    _and_config_setting_group_middle_match_fails_test()
624*bcb5dc79SHONG Yifan    _and_config_setting_group_last_match_fails_test()
625*bcb5dc79SHONG Yifan    _and_config_setting_group_multiple_matches_fail_test()
626*bcb5dc79SHONG Yifan    _and_config_setting_group_all_matches_fail_test()
627*bcb5dc79SHONG Yifan    _and_config_setting_group_single_setting_matches_test()
628*bcb5dc79SHONG Yifan    _and_config_setting_group_single_setting_fails_test()
629*bcb5dc79SHONG Yifan
630*bcb5dc79SHONG Yifan    _or_config_setting_group_no_matches_test()
631*bcb5dc79SHONG Yifan    _or_config_setting_group_first_cond_matches_test()
632*bcb5dc79SHONG Yifan    _or_config_setting_group_middle_cond_matches_test()
633*bcb5dc79SHONG Yifan    _or_config_setting_group_last_cond_matches_test()
634*bcb5dc79SHONG Yifan    _or_config_setting_group_multiple_conds_match_test()
635*bcb5dc79SHONG Yifan    _or_config_setting_group_all_conds_match_test()
636*bcb5dc79SHONG Yifan    _or_config_setting_group_single_setting_matches_test()
637*bcb5dc79SHONG Yifan    _or_config_setting_group_single_setting_fails_test()
638*bcb5dc79SHONG Yifan
639*bcb5dc79SHONG Yifan    _always_true_match_all_test()
640*bcb5dc79SHONG Yifan    _always_true_match_any_test()
641*bcb5dc79SHONG Yifan
642*bcb5dc79SHONG Yifan    # _empty_config_setting_group_not_allowed_test()
643*bcb5dc79SHONG Yifan    # _and_and_or_not_allowed_together_test()
644