github.com/google/skylark@v0.0.0-20181101142754-a5f7082aabed/testdata/set.sky (about) 1 # Tests of Skylark 'set' 2 3 # Sets are not (yet) a standard part of Skylark, so the features 4 # tested in this file must be enabled in the application by setting 5 # resolve.AllowSet. (All sets are created by calls to the 'set' 6 # built-in or derived from operations on existing sets.) 7 # The semantics are subject to change as the spec evolves. 8 9 # TODO(adonovan): support set mutation: 10 # - del set[k] 11 # - set.remove 12 # - set.update 13 # - set.clear 14 # - set += iterable, perhaps? 15 # Test iterator invalidation. 16 17 load("assert.sky", "assert") 18 19 # literals 20 # Parser does not currently support {1, 2, 3}. 21 # TODO(adonovan): add test to syntax/testdata/errors.sky. 22 23 # set comprehensions 24 # Parser does not currently support {x for x in y}. 25 # See syntax/testdata/errors.sky. 26 27 # set constructor 28 assert.eq(type(set()), "set") 29 assert.eq(list(set()), []) 30 assert.eq(type(set([1, 3, 2, 3])), "set") 31 assert.eq(list(set([1, 3, 2, 3])), [1, 3, 2]) 32 assert.eq(type(set("hello".elems())), "set") 33 assert.eq(list(set("hello".elems())), ["h", "e", "l", "o"]) 34 assert.eq(list(set(range(3))), [0, 1, 2]) 35 assert.fails(lambda: set(1), "got int, want iterable") 36 assert.fails(lambda: set(1, 2, 3), "got 3 arguments") 37 assert.fails(lambda: set([1, 2, {}]), "unhashable type: dict") 38 39 # truth 40 assert.true(not set()) 41 assert.true(set([False])) 42 assert.true(set([1, 2, 3])) 43 44 x = set([1, 2, 3]) 45 y = set([3, 4, 5]) 46 47 # set + any is not defined 48 assert.fails(lambda: x + y, "unknown.*: set \+ set") 49 50 # set | set (use resolve.AllowBitwise to enable it) 51 assert.eq(list(set("a".elems()) | set("b".elems())), ["a", "b"]) 52 assert.eq(list(set("ab".elems()) | set("bc".elems())), ["a", "b", "c"]) 53 assert.fails(lambda: set() | [], "unknown binary op: set | list") 54 assert.eq(type(x | y), "set") 55 assert.eq(list(x | y), [1, 2, 3, 4, 5]) 56 assert.eq(list(x | set([5, 1])), [1, 2, 3, 5]) 57 assert.eq(list(x | set((6, 5, 4))), [1, 2, 3, 6, 5, 4]) 58 59 # set.union (allows any iterable for right operand) 60 assert.eq(list(set("a".elems()).union("b".elems())), ["a", "b"]) 61 assert.eq(list(set("ab".elems()).union("bc".elems())), ["a", "b", "c"]) 62 assert.eq(set().union([]), set()) 63 assert.eq(type(x.union(y)), "set") 64 assert.eq(list(x.union(y)), [1, 2, 3, 4, 5]) 65 assert.eq(list(x.union([5, 1])), [1, 2, 3, 5]) 66 assert.eq(list(x.union((6, 5, 4))), [1, 2, 3, 6, 5, 4]) 67 assert.fails(lambda: x.union([1, 2, {}]), "unhashable type: dict") 68 69 # intersection, set & set (use resolve.AllowBitwise to enable it) 70 assert.eq(list(set("a".elems()) & set("b".elems())), []) 71 assert.eq(list(set("ab".elems()) & set("bc".elems())), ["b"]) 72 73 # symmetric difference, set ^ set (use resolve.AllowBitwise to enable it) 74 assert.eq(set([1, 2, 3]) ^ set([4, 5, 3]), set([1, 2, 4, 5])) 75 76 def test_set_augmented_assign(): 77 x = set([1, 2, 3]) 78 x &= set([2, 3]) 79 assert.eq(x, set([2, 3])) 80 x |= set([1]) 81 assert.eq(x, set([1, 2, 3])) 82 x ^= set([4, 5, 3]) 83 assert.eq(x, set([1, 2, 4, 5])) 84 test_set_augmented_assign() 85 86 # len 87 assert.eq(len(x), 3) 88 assert.eq(len(y), 3) 89 assert.eq(len(x | y), 5) 90 91 # str 92 assert.eq(str(set([1])), "set([1])") 93 assert.eq(str(set([2, 3])), "set([2, 3])") 94 assert.eq(str(set([3, 2])), "set([3, 2])") 95 96 # comparison 97 assert.eq(x, x) 98 assert.eq(y, y) 99 assert.true(x != y) 100 assert.eq(set([1, 2, 3]), set([3, 2, 1])) 101 assert.fails(lambda: x < y, "set < set not implemented") 102 103 # iteration 104 assert.true(type([elem for elem in x]), "list") 105 assert.true(list([elem for elem in x]), [1, 2, 3]) 106 def iter(): 107 list = [] 108 for elem in x: 109 list.append(elem) 110 return list 111 assert.eq(iter(), [1, 2, 3]) 112 113 # sets are not indexable 114 assert.fails(lambda: x[0], "unhandled.*operation")