xref: /aosp_15_r20/external/bazel-skylib/tests/new_sets_tests.bzl (revision bcb5dc7965af6ee42bf2f21341a2ec00233a8c8a)
1# Copyright 2018 The Bazel Authors. All rights reserved.
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7#    http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15"""Unit tests for new_sets.bzl."""
16
17load("//lib:new_sets.bzl", "sets")
18load("//lib:unittest.bzl", "asserts", "unittest")
19
20def _is_equal_test(ctx):
21    """Unit tests for sets.is_equal."""
22
23    # Note that if this test fails, the results for the other `sets` tests will
24    # be inconclusive because they use `asserts.new_set_equals`, which in turn
25    # calls `sets.is_equal`.
26    env = unittest.begin(ctx)
27
28    asserts.true(env, sets.is_equal(sets.make(), sets.make()))
29    asserts.false(env, sets.is_equal(sets.make(), sets.make([1])))
30    asserts.false(env, sets.is_equal(sets.make([1]), sets.make()))
31    asserts.true(env, sets.is_equal(sets.make([1]), sets.make([1])))
32    asserts.false(env, sets.is_equal(sets.make([1]), sets.make([1, 2])))
33    asserts.false(env, sets.is_equal(sets.make([1]), sets.make([2])))
34    asserts.false(env, sets.is_equal(sets.make([1]), sets.make([1, 2])))
35
36    # If passing a list, verify that duplicate elements are ignored.
37    asserts.true(env, sets.is_equal(sets.make([1, 1]), sets.make([1])))
38
39    return unittest.end(env)
40
41is_equal_test = unittest.make(_is_equal_test)
42
43def _is_subset_test(ctx):
44    """Unit tests for sets.is_subset."""
45    env = unittest.begin(ctx)
46
47    asserts.true(env, sets.is_subset(sets.make(), sets.make()))
48    asserts.true(env, sets.is_subset(sets.make(), sets.make([1])))
49    asserts.false(env, sets.is_subset(sets.make([1]), sets.make()))
50    asserts.true(env, sets.is_subset(sets.make([1]), sets.make([1])))
51    asserts.true(env, sets.is_subset(sets.make([1]), sets.make([1, 2])))
52    asserts.false(env, sets.is_subset(sets.make([1]), sets.make([2])))
53
54    # If passing a list, verify that duplicate elements are ignored.
55    asserts.true(env, sets.is_subset(sets.make([1, 1]), sets.make([1, 2])))
56
57    return unittest.end(env)
58
59is_subset_test = unittest.make(_is_subset_test)
60
61def _disjoint_test(ctx):
62    """Unit tests for sets.disjoint."""
63    env = unittest.begin(ctx)
64
65    asserts.true(env, sets.disjoint(sets.make(), sets.make()))
66    asserts.true(env, sets.disjoint(sets.make(), sets.make([1])))
67    asserts.true(env, sets.disjoint(sets.make([1]), sets.make()))
68    asserts.false(env, sets.disjoint(sets.make([1]), sets.make([1])))
69    asserts.false(env, sets.disjoint(sets.make([1]), sets.make([1, 2])))
70    asserts.true(env, sets.disjoint(sets.make([1]), sets.make([2])))
71
72    # If passing a list, verify that duplicate elements are ignored.
73    asserts.false(env, sets.disjoint(sets.make([1, 1]), sets.make([1, 2])))
74
75    return unittest.end(env)
76
77disjoint_test = unittest.make(_disjoint_test)
78
79def _intersection_test(ctx):
80    """Unit tests for sets.intersection."""
81    env = unittest.begin(ctx)
82
83    asserts.new_set_equals(env, sets.make(), sets.intersection(sets.make(), sets.make()))
84    asserts.new_set_equals(env, sets.make(), sets.intersection(sets.make(), sets.make([1])))
85    asserts.new_set_equals(env, sets.make(), sets.intersection(sets.make([1]), sets.make()))
86    asserts.new_set_equals(env, sets.make([1]), sets.intersection(sets.make([1]), sets.make([1])))
87    asserts.new_set_equals(env, sets.make([1]), sets.intersection(sets.make([1]), sets.make([1, 2])))
88    asserts.new_set_equals(env, sets.make(), sets.intersection(sets.make([1]), sets.make([2])))
89
90    # If passing a list, verify that duplicate elements are ignored.
91    asserts.new_set_equals(env, sets.make([1]), sets.intersection(sets.make([1, 1]), sets.make([1, 2])))
92
93    return unittest.end(env)
94
95intersection_test = unittest.make(_intersection_test)
96
97def _union_test(ctx):
98    """Unit tests for sets.union."""
99    env = unittest.begin(ctx)
100
101    asserts.new_set_equals(env, sets.make(), sets.union())
102    asserts.new_set_equals(env, sets.make([1]), sets.union(sets.make([1])))
103    asserts.new_set_equals(env, sets.make(), sets.union(sets.make(), sets.make()))
104    asserts.new_set_equals(env, sets.make([1]), sets.union(sets.make(), sets.make([1])))
105    asserts.new_set_equals(env, sets.make([1]), sets.union(sets.make([1]), sets.make()))
106    asserts.new_set_equals(env, sets.make([1]), sets.union(sets.make([1]), sets.make([1])))
107    asserts.new_set_equals(env, sets.make([1, 2]), sets.union(sets.make([1]), sets.make([1, 2])))
108    asserts.new_set_equals(env, sets.make([1, 2]), sets.union(sets.make([1]), sets.make([2])))
109
110    # If passing a list, verify that duplicate elements are ignored.
111    asserts.new_set_equals(env, sets.make([1, 2]), sets.union(sets.make([1, 1]), sets.make([1, 2])))
112
113    return unittest.end(env)
114
115union_test = unittest.make(_union_test)
116
117def _difference_test(ctx):
118    """Unit tests for sets.difference."""
119    env = unittest.begin(ctx)
120
121    asserts.new_set_equals(env, sets.make(), sets.difference(sets.make(), sets.make()))
122    asserts.new_set_equals(env, sets.make(), sets.difference(sets.make(), sets.make([1])))
123    asserts.new_set_equals(env, sets.make([1]), sets.difference(sets.make([1]), sets.make()))
124    asserts.new_set_equals(env, sets.make(), sets.difference(sets.make([1]), sets.make([1])))
125    asserts.new_set_equals(env, sets.make(), sets.difference(sets.make([1]), sets.make([1, 2])))
126    asserts.new_set_equals(env, sets.make([1]), sets.difference(sets.make([1]), sets.make([2])))
127
128    # If passing a list, verify that duplicate elements are ignored.
129    asserts.new_set_equals(env, sets.make([2]), sets.difference(sets.make([1, 2]), sets.make([1, 1])))
130
131    return unittest.end(env)
132
133difference_test = unittest.make(_difference_test)
134
135def _to_list_test(ctx):
136    """Unit tests for sets.to_list."""
137    env = unittest.begin(ctx)
138
139    asserts.equals(env, [], sets.to_list(sets.make()))
140    asserts.equals(env, [1], sets.to_list(sets.make([1, 1, 1])))
141    asserts.equals(env, [1, 2, 3], sets.to_list(sets.make([1, 2, 3])))
142
143    return unittest.end(env)
144
145to_list_test = unittest.make(_to_list_test)
146
147def _make_test(ctx):
148    """Unit tests for sets.make."""
149    env = unittest.begin(ctx)
150
151    asserts.equals(env, {}, sets.make()._values)
152    asserts.equals(env, {x: None for x in [1, 2, 3]}, sets.make([1, 1, 2, 2, 3, 3])._values)
153
154    return unittest.end(env)
155
156make_test = unittest.make(_make_test)
157
158def _copy_test(ctx):
159    """Unit tests for sets.copy."""
160    env = unittest.begin(ctx)
161
162    asserts.new_set_equals(env, sets.copy(sets.make()), sets.make())
163    asserts.new_set_equals(env, sets.copy(sets.make([1, 2, 3])), sets.make([1, 2, 3]))
164
165    # Ensure mutating the copy does not mutate the original
166    original = sets.make([1, 2, 3])
167    copy = sets.copy(original)
168    copy._values[5] = None
169    asserts.false(env, sets.is_equal(original, copy))
170
171    return unittest.end(env)
172
173copy_test = unittest.make(_copy_test)
174
175def _insert_test(ctx):
176    """Unit tests for sets.insert."""
177    env = unittest.begin(ctx)
178
179    asserts.new_set_equals(env, sets.make([1, 2, 3]), sets.insert(sets.make([1, 2]), 3))
180
181    # Ensure mutating the inserted set does mutate the original set.
182    original = sets.make([1, 2, 3])
183    after_insert = sets.insert(original, 4)
184    asserts.new_set_equals(
185        env,
186        original,
187        after_insert,
188        msg = "Insert creates a new set which is an O(n) operation, insert should be O(1).",
189    )
190
191    return unittest.end(env)
192
193insert_test = unittest.make(_insert_test)
194
195def _contains_test(ctx):
196    """Unit tests for sets.contains."""
197    env = unittest.begin(ctx)
198
199    asserts.false(env, sets.contains(sets.make(), 1))
200    asserts.true(env, sets.contains(sets.make([1]), 1))
201    asserts.true(env, sets.contains(sets.make([1, 2]), 1))
202    asserts.false(env, sets.contains(sets.make([2, 3]), 1))
203
204    return unittest.end(env)
205
206contains_test = unittest.make(_contains_test)
207
208def _length_test(ctx):
209    """Unit test for sets.length."""
210    env = unittest.begin(ctx)
211
212    asserts.equals(env, 0, sets.length(sets.make()))
213    asserts.equals(env, 1, sets.length(sets.make([1])))
214    asserts.equals(env, 2, sets.length(sets.make([1, 2])))
215
216    return unittest.end(env)
217
218length_test = unittest.make(_length_test)
219
220def _remove_test(ctx):
221    """Unit test for sets.remove."""
222    env = unittest.begin(ctx)
223
224    asserts.new_set_equals(env, sets.make([1, 2]), sets.remove(sets.make([1, 2, 3]), 3))
225
226    # Ensure mutating the inserted set does mutate the original set.
227    original = sets.make([1, 2, 3])
228    after_removal = sets.remove(original, 3)
229    asserts.new_set_equals(env, original, after_removal)
230
231    return unittest.end(env)
232
233remove_test = unittest.make(_remove_test)
234
235def _repr_str_test(ctx):
236    """Unit test for sets.repr and sets.str."""
237    env = unittest.begin(ctx)
238
239    asserts.equals(env, "[]", sets.repr(sets.make()))
240    asserts.equals(env, "[1]", sets.repr(sets.make([1])))
241    asserts.equals(env, "[1, 2]", sets.repr(sets.make([1, 2])))
242
243    asserts.equals(env, "[]", sets.str(sets.make()))
244    asserts.equals(env, "[1]", sets.str(sets.make([1])))
245    asserts.equals(env, "[1, 2]", sets.str(sets.make([1, 2])))
246
247    return unittest.end(env)
248
249repr_str_test = unittest.make(_repr_str_test)
250
251def new_sets_test_suite():
252    """Creates the test targets and test suite for new_sets.bzl tests."""
253    unittest.suite(
254        "new_sets_tests",
255        disjoint_test,
256        intersection_test,
257        is_equal_test,
258        is_subset_test,
259        difference_test,
260        union_test,
261        to_list_test,
262        make_test,
263        copy_test,
264        insert_test,
265        contains_test,
266        length_test,
267        remove_test,
268        repr_str_test,
269    )
270