1# Py2.7+ only
2
3import sys
4
5
6def test_set_literal():
7    """
8    >>> type(test_set_literal()) is set
9    True
10    >>> sorted(test_set_literal())
11    ['a', 'b', 1]
12    """
13    s1 = {1, 'a', 1, 'b', 'a'}
14    return s1
15
16
17def test_set_add():
18    """
19    >>> type(test_set_add()) is set
20    True
21    >>> sorted(test_set_add())
22    ['a', 1, (1, 2)]
23    """
24    s1 = {1, (1, 2)}
25    s1.add(1)
26    s1.add('a')
27    s1.add(1)
28    s1.add((1, 2))
29    return s1
30
31
32def test_set_comp():
33    """
34    >>> type(test_set_comp()) is set
35    True
36    >>> sorted(test_set_comp())
37    [0, 1, 2]
38    """
39    s1 = {i % 3 for i in range(5)}
40    return s1
41
42
43def test_frozenset_set_comp():
44    """
45    >>> type(test_frozenset_set_comp()) is frozenset
46    True
47    >>> sorted(test_frozenset_set_comp())
48    [0, 1, 2]
49    """
50    s1 = frozenset({i % 3 for i in range(5)})
51    return s1
52
53
54def test_set_sideeffect_unhashable_failure_literal():
55    """
56    >>> test_set_sideeffect_unhashable_failure_literal()
57    [2, 4, 5]
58    """
59    L = []
60
61    def sideeffect(x):
62        L.append(x)
63        return x
64
65    def unhashable_value(x):
66        L.append(x)
67        return set()
68    try:
69        s = {1, sideeffect(2), 3, unhashable_value(4), sideeffect(5)}
70    except TypeError: pass
71    else: assert False, "expected exception not raised"
72    return L
73
74
75def test_set_comp_sideeffect_unhashable_failure():
76    """
77    >>> test_set_comp_sideeffect_unhashable_failure()
78    (None, [2, 4])
79    """
80    L = []
81
82    def value(x):
83        return x
84
85    def sideeffect(x):
86        L.append(x)
87        return x
88
89    def unhashable_value(x):
90        L.append(x)
91        return set()
92    s = None
93    try:
94        s = {f(i) for i, f in enumerate([value, sideeffect, value, unhashable_value, sideeffect], 1)}
95    except TypeError: pass
96    else: assert False, "expected exception not raised"
97    return s, L
98
99
100def sorted(it):
101    # Py3 can't compare different types
102    chars = []
103    nums = []
104    tuples = []
105    for item in it:
106        if type(item) is int:
107            nums.append(item)
108        elif type(item) is tuple:
109            tuples.append(item)
110        else:
111            chars.append(item)
112    nums.sort()
113    chars.sort()
114    tuples.sort()
115    return chars+nums+tuples
116