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