Skip to content

Commit 245f0a8

Browse files
committed
-
1 parent 6ad406d commit 245f0a8

File tree

6 files changed

+208
-45
lines changed

6 files changed

+208
-45
lines changed

source_py2/test_python_toolbox/test_monkeypatching_tools/test_monkeypatch.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,19 @@ def meow(a):
105105
assert a0.meow[0] == a1.meow[0] == A
106106

107107

108+
def test_monkeypatch_lambda_property():
109+
110+
class A(EqualByIdentity):
111+
pass
112+
113+
monkeypatching_tools.monkeypatch(A, 'meow')(
114+
property(lambda self: (type(self), 'bark'))
115+
)
116+
117+
a0 = A()
118+
a1 = A()
119+
assert a0.meow == a1.meow == (A, 'bark')
120+
108121

109122
def test_helpful_message_when_forgetting_parentheses():
110123
'''Test user gets a helpful exception when when forgetting parentheses.'''

source_py2/test_python_toolbox/test_nifty_collections/test_bagging.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,21 @@ def test_operations(self):
321321
assert 3 * bag_1 == self.bag_type('bcc' * 3)
322322
assert 3 * bag_2 == self.bag_type('cddddd' * 3)
323323

324+
# We only allow floor division on bags, not regular divison, because a
325+
# decimal bag is unheard of.
326+
with cute_testing.RaiseAssertor(TypeError):
327+
bag_0 / 2
328+
with cute_testing.RaiseAssertor(TypeError):
329+
bag_1 / 2
330+
with cute_testing.RaiseAssertor(TypeError):
331+
bag_2 / 2
332+
with cute_testing.RaiseAssertor(TypeError):
333+
bag_0 / self.bag_type('ab')
334+
with cute_testing.RaiseAssertor(TypeError):
335+
bag_1 / self.bag_type('ab')
336+
with cute_testing.RaiseAssertor(TypeError):
337+
bag_2 / self.bag_type('ab')
338+
324339
assert bag_0 // 2 == self.bag_type('bc')
325340
assert bag_1 // 2 == self.bag_type('c')
326341
assert bag_2 // 2 == self.bag_type('dd')
@@ -439,6 +454,12 @@ def test_mutating(self):
439454
assert bag == self.bag_type('abracadabra' + 'a' * 5)
440455
assert bag is bag_reference
441456

457+
# We only allow floor division on bags, not regular divison, because a
458+
# decimal bag is unheard of.
459+
bag = bag_reference = self.bag_type('abracadabra')
460+
with cute_testing.RaiseAssertor(TypeError):
461+
bag['a'] /= 2
462+
442463
bag = bag_reference = self.bag_type('abracadabra')
443464
bag['a'] //= 2
444465
assert bag == self.bag_type('abracdbr')
@@ -605,6 +626,8 @@ def test_mutating(self):
605626
bag['a'] -= 1
606627
with cute_testing.RaiseAssertor(TypeError):
607628
bag['a'] *= 2
629+
with cute_testing.RaiseAssertor(TypeError):
630+
bag['a'] /= 2
608631
with cute_testing.RaiseAssertor(TypeError):
609632
bag['a'] //= 2
610633
with cute_testing.RaiseAssertor(TypeError):
@@ -638,6 +661,12 @@ def test_mutating(self):
638661
assert bag == bag_reference + bag_reference + bag_reference
639662
assert bag is not bag_reference
640663

664+
# We only allow floor division on bags, not regular divison, because a
665+
# decimal bag is unheard of.
666+
bag = bag_reference
667+
with cute_testing.RaiseAssertor(TypeError):
668+
bag['a'] /= 2
669+
641670
bag = bag_reference
642671
bag //= 3
643672
assert bag == self.bag_type('a')

source_py2/test_python_toolbox/test_nifty_collections/test_lazy_tuple/test_lazy_tuple.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ def test_empty():
7272
'''Test an empty `LazyTuple`.'''
7373
def empty_generator():
7474
if False: yield # (Unreachable `yield` to make this a generator.)
75-
raise StopIteration
75+
return
7676
lazy_tuple = LazyTuple(empty_generator())
7777
assert repr(lazy_tuple) == '<LazyTuple: (...)>'
7878

source_py2/test_python_toolbox/test_nifty_collections/test_ordered_set/__init__.py

Lines changed: 0 additions & 4 deletions
This file was deleted.

source_py2/test_python_toolbox/test_nifty_collections/test_ordered_set/test.py

Lines changed: 0 additions & 40 deletions
This file was deleted.
Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
# Copyright 2009-2015 Ram Rachum.
2+
# This program is distributed under the MIT license.
3+
4+
import operator
5+
6+
from python_toolbox import cute_testing
7+
8+
from python_toolbox import logic_tools
9+
from python_toolbox import emitting
10+
from python_toolbox.nifty_collections import (OrderedSet, FrozenOrderedSet,
11+
EmittingOrderedSet)
12+
13+
14+
class BaseOrderedSetTestCase(cute_testing.TestCase):
15+
__test__ = False
16+
17+
def test_operations(self):
18+
ordered_set = self.ordered_set_type([5, 61, 2, 7, 2])
19+
assert type(ordered_set | ordered_set) == \
20+
type(ordered_set & ordered_set) == type(ordered_set)
21+
22+
def test_bool(self):
23+
assert bool(self.ordered_set_type({})) is False
24+
assert bool(self.ordered_set_type({0})) is True
25+
assert bool(self.ordered_set_type(range(5))) is True
26+
27+
28+
class BaseMutableOrderedSetTestCase(BaseOrderedSetTestCase):
29+
__test__ = False
30+
def test_sort(self):
31+
ordered_set = self.ordered_set_type([5, 61, 2, 7, 2])
32+
assert ordered_set != {5, 61, 2, 7}
33+
ordered_set.move_to_end(61)
34+
assert list(ordered_set) == [5, 2, 7, 61]
35+
ordered_set.sort()
36+
assert list(ordered_set) == [2, 5, 7, 61]
37+
ordered_set.sort(key=lambda x: -x, reverse=True)
38+
assert list(ordered_set) == [2, 5, 7, 61]
39+
40+
def test_mutable(self):
41+
42+
ordered_set = self.ordered_set_type(range(4))
43+
44+
assert list(ordered_set) == list(range(4))
45+
assert len(ordered_set) == 4
46+
assert 1 in ordered_set
47+
assert 3 in ordered_set
48+
assert 7 not in ordered_set
49+
ordered_set.add(8)
50+
assert list(ordered_set)[-1] == 8
51+
ordered_set.discard(2)
52+
assert 2 not in ordered_set
53+
assert list(reversed(ordered_set)) == [8, 3, 1, 0]
54+
assert ordered_set.pop() == 8
55+
assert ordered_set.pop(last=False) == 0
56+
ordered_set.add(7, last=False)
57+
assert tuple(ordered_set) == (7, 1, 3)
58+
with cute_testing.RaiseAssertor(KeyError):
59+
ordered_set.remove('meow')
60+
ordered_set.discard('meow')
61+
ordered_set.discard('meow')
62+
ordered_set.discard('meow')
63+
assert ordered_set | ordered_set == ordered_set
64+
assert ordered_set & ordered_set == ordered_set
65+
66+
class OrderedSetTestCase(BaseMutableOrderedSetTestCase):
67+
__test__ = True
68+
ordered_set_type = OrderedSet
69+
70+
class FrozenOrderedSetTestCase(BaseOrderedSetTestCase):
71+
__test__ = True
72+
ordered_set_type = FrozenOrderedSet
73+
74+
def test_frozen(self):
75+
76+
frozen_ordered_set = self.ordered_set_type(range(4))
77+
78+
assert list(frozen_ordered_set) == list(range(4))
79+
assert len(frozen_ordered_set) == 4
80+
assert 1 in frozen_ordered_set
81+
assert 3 in frozen_ordered_set
82+
assert 7 not in frozen_ordered_set
83+
with cute_testing.RaiseAssertor(AttributeError):
84+
frozen_ordered_set.add(8)
85+
with cute_testing.RaiseAssertor(AttributeError):
86+
frozen_ordered_set.discard(2)
87+
with cute_testing.RaiseAssertor(AttributeError):
88+
frozen_ordered_set.remove(2)
89+
with cute_testing.RaiseAssertor(AttributeError):
90+
frozen_ordered_set.clear()
91+
with cute_testing.RaiseAssertor(AttributeError):
92+
frozen_ordered_set.sort()
93+
with cute_testing.RaiseAssertor(AttributeError):
94+
frozen_ordered_set.move_to_end(2)
95+
with cute_testing.RaiseAssertor(AttributeError):
96+
frozen_ordered_set.pop(2)
97+
assert list(frozen_ordered_set) == list(range(4))
98+
99+
def test_hashable(self):
100+
d = {
101+
FrozenOrderedSet(range(1)): 1,
102+
FrozenOrderedSet(range(2)): 2,
103+
FrozenOrderedSet(range(3)): 3,
104+
}
105+
assert len(d) == 3
106+
assert set(d.values()) == {1, 2, 3}
107+
assert d[FrozenOrderedSet(range(2))] == 2
108+
d[FrozenOrderedSet(range(2))] = 20
109+
assert set(d.values()) == {1, 20, 3}
110+
111+
112+
class EmittingOrderedSetTestCase(BaseMutableOrderedSetTestCase):
113+
__test__ = True
114+
ordered_set_type = EmittingOrderedSet
115+
def test_emitting(self):
116+
times_emitted = [0]
117+
def increment_times_emitted():
118+
times_emitted[0] += 1
119+
emitter = emitting.Emitter(outputs=increment_times_emitted)
120+
emitting_ordered_set = self.ordered_set_type(range(7), emitter=emitter)
121+
assert times_emitted == [0]
122+
emitting_ordered_set.add(7)
123+
assert times_emitted == [1]
124+
emitting_ordered_set.add(7)
125+
assert times_emitted == [1]
126+
emitting_ordered_set.discard(17)
127+
assert times_emitted == [1]
128+
assert emitting_ordered_set.get_without_emitter() == \
129+
OrderedSet(range(8))
130+
emitting_ordered_set |= (8, 9, 10)
131+
assert times_emitted == [4]
132+
emitting_ordered_set |= (8, 9, 10)
133+
assert times_emitted == [4]
134+
assert emitting_ordered_set.get_without_emitter() == \
135+
OrderedSet(range(11))
136+
emitting_ordered_set.move_to_end(4)
137+
assert times_emitted == [5]
138+
assert tuple(emitting_ordered_set) == \
139+
(0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 4)
140+
141+
142+
143+
144+
145+
def test_operations_on_different_types():
146+
x1 = OrderedSet(range(0, 4)) | FrozenOrderedSet(range(2, 6))
147+
x2 = OrderedSet(range(0, 4)) & FrozenOrderedSet(range(2, 6))
148+
x3 = FrozenOrderedSet(range(0, 4)) | OrderedSet(range(2, 6))
149+
x4 = FrozenOrderedSet(range(0, 4)) & OrderedSet(range(2, 6))
150+
151+
assert type(x1) == OrderedSet
152+
assert type(x2) == OrderedSet
153+
assert type(x3) == FrozenOrderedSet
154+
assert type(x4) == FrozenOrderedSet
155+
156+
assert x1 == OrderedSet(range(0, 6))
157+
assert x2 == OrderedSet(range(2, 4))
158+
assert x3 == FrozenOrderedSet(range(0, 6))
159+
assert x4 == FrozenOrderedSet(range(2, 4))
160+
161+
assert logic_tools.all_equivalent((x1, x2, x3, x4),
162+
relation=operator.ne)
163+
164+
165+

0 commit comments

Comments
 (0)