1from copy import copy, deepcopy
2
3from pytest import raises
4
5from graphql.pyutils import FrozenError, FrozenList
6
7
8def describe_frozen_list():
9    def can_read():
10        fl = FrozenList([1, 2, 3])
11        assert fl == [1, 2, 3]
12        assert list(i for i in fl) == fl
13        assert fl.copy() == fl
14        assert 2 in fl
15        assert 4 not in fl
16        assert fl + [4, 5] == [1, 2, 3, 4, 5]
17        assert [4, 5] + fl == [4, 5, 1, 2, 3]
18        assert fl * 2 == [1, 2, 3, 1, 2, 3]
19        assert 2 * fl == [1, 2, 3, 1, 2, 3]
20        assert fl[1] == 2
21        with raises(IndexError):
22            fl[3]
23        assert fl[1:4] == [2, 3]
24        assert fl[::2] == [1, 3]
25        assert len(fl) == 3
26        assert min(fl) == 1
27        assert max(fl) == 3
28        assert sum(fl) == 6
29        assert fl.index(2) == 1
30        with raises(ValueError):
31            fl.index(4)
32        assert fl.count(2) == 1
33        assert fl.count(4) == 0
34        assert list(reversed(fl)) == [3, 2, 1]
35        assert sorted(fl) == [1, 2, 3]
36
37    def cannot_write():
38        fl = FrozenList([1, 2, 3])
39        with raises(FrozenError):
40            fl[1] = 4
41        with raises(FrozenError):
42            fl[1:4] = [4]
43        with raises(FrozenError):
44            del fl[1]
45        with raises(FrozenError):
46            del fl[1:4]
47        with raises(FrozenError):
48            fl[1::2] = [4]
49        with raises(FrozenError):
50            del fl[::2]
51        with raises(FrozenError):
52            fl.append(4)
53        with raises(FrozenError):
54            fl.clear()
55        with raises(FrozenError):
56            fl.extend([4])
57        with raises(FrozenError):
58            fl += [4]
59        with raises(FrozenError):
60            fl *= 2
61        with raises(FrozenError):
62            fl.insert(1, 4)
63        with raises(FrozenError):
64            fl.pop()
65        with raises(FrozenError):
66            fl.remove(2)
67        with raises(FrozenError):
68            fl.sort()
69        with raises(FrozenError):
70            fl.reverse()
71        assert fl == [1, 2, 3]
72
73    def can_add_rol():
74        fl1 = FrozenList([1, 2])
75        rol2 = FrozenList([3, 4])
76        assert fl1 + rol2 == [1, 2, 3, 4]
77
78    def can_add_tuple():
79        fl = FrozenList([1, 2])
80        assert fl + (3, 4) == [1, 2, 3, 4]
81
82    def can_hash():
83        fl1 = FrozenList([1, 2])
84        fl2 = FrozenList([1, 2])
85        assert fl2 == fl1
86        assert fl2 is not fl1
87        assert hash(fl2) == hash(fl1)
88        fl3 = FrozenList([1, 3])
89        assert fl3 != fl1
90        assert hash(fl3) != hash(fl1)
91
92    def can_copy():
93        fl1 = FrozenList([1, 2])
94        fl2 = copy(fl1)
95        assert isinstance(fl2, FrozenList)
96        assert fl2 == fl1
97        assert hash(fl2) == hash(fl1)
98        assert fl2 is not fl1
99
100    def can_deep_copy():
101        fl11 = FrozenList([1, 2])
102        fl12 = FrozenList([2, 1])
103        fl1 = FrozenList([fl11, fl12])
104        fl2 = deepcopy(fl1)
105        assert isinstance(fl2, FrozenList)
106        assert fl2 == fl1
107        assert hash(fl2) == hash(fl1)
108        assert isinstance(fl2[0], FrozenList)
109        assert isinstance(fl2[1], FrozenList)
110        assert fl2[0] == fl1[0]
111        assert fl2[0] is not fl1[0]
112        assert fl2[1] == fl1[1]
113        assert fl2[1] is not fl1[1]
114