...

Text file src/go.starlark.net/starlark/testdata/set.star

Documentation: go.starlark.net/starlark/testdata

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

View as plain text