forked from mikeckennedy/python-switch
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcoretests.py
More file actions
131 lines (100 loc) · 3.92 KB
/
coretests.py
File metadata and controls
131 lines (100 loc) · 3.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import unittest
from switchlang import switch, closed_range
# here is a custom type we can use as a key for our tests
class TestKeyObject:
pass
class CoreTests(unittest.TestCase):
def test_has_matched_case_int(self):
value = 7
with switch(value) as s:
s.case(1, lambda: "one")
s.case(5, lambda: "five")
s.case(7, lambda: "seven")
s.default(lambda: 'default')
self.assertEqual(s.result, "seven")
def test_has_matched_case_object(self):
t1 = TestKeyObject()
t2 = TestKeyObject()
t3 = TestKeyObject()
with switch(t2) as s:
s.case(t1, lambda: t1)
s.case(t2, lambda: t2)
s.case(t3, lambda: t3)
s.default(lambda: None)
self.assertEqual(s.result, t2)
def test_default_passthrough(self):
value = 11
with switch(value) as s:
s.case(1, lambda: '1')
s.case(2, lambda: '2')
s.default(lambda: 'default')
self.assertEqual(s.result, "default")
def test_none_as_valid_case(self):
with switch(None) as s:
s.case(1, lambda: 'one')
s.case(None, lambda: 'none')
s.default(lambda: "default")
self.assertEqual(s.result, 'none')
def test_error_no_match_no_default(self):
with self.assertRaises(Exception):
with switch('val') as s:
s.case(1, lambda: None)
s.case(2, lambda: None)
def test_error_duplicate_case(self):
with self.assertRaises(ValueError):
with switch('val') as s:
s.case(1, lambda: None)
s.case(1, lambda: None)
def test_multiple_values_one_case_range(self):
for value in range(1, 5):
with switch(value) as s:
s.case(range(1, 6), lambda: "1-to-5")
s.case(range(6, 7), lambda: "6")
s.default(lambda: 'default')
self.assertEqual(s.result, "1-to-5")
for value in range(6, 7):
with switch(value) as s:
s.case(range(1, 6), lambda: "1-to-5")
s.case(range(6, 7), lambda: "6")
s.default(lambda: 'default')
self.assertEqual(s.result, "6")
with switch(7) as s:
s.case(range(1, 6), lambda: "1-to-5")
s.case(range(6, 7), lambda: "6")
s.default(lambda: 'default')
self.assertEqual(s.result, "default")
def test_multiple_values_one_case_list(self):
with switch(6) as s:
s.case([1, 3, 5, 7], lambda: "odd")
s.case([0, 2, 4, 6, 8], lambda: "even")
s.default(lambda: 'default')
self.assertEqual(s.result, "even")
def test_return_value_from_case(self):
value = 4
with switch(value) as s:
s.case([1, 3, 5, 7], lambda: value + 1)
s.case([0, 2, 4, 6, 8], lambda: value * value)
s.default(lambda: 0)
self.assertEqual(s.result, 16)
# noinspection PyStatementEffect
def test_result_inaccessible_if_hasnt_run(self):
with self.assertRaises(Exception):
s = switch(7)
s.result
def test_closed_range(self):
for value in [1, 2, 3, 4, 5]:
with switch(value) as s:
s.case(closed_range(1, 5), lambda: "1-to-5")
s.case(closed_range(6, 7), lambda: "6")
s.default(lambda: 'default')
self.assertEqual(s.result, "1-to-5")
with switch(0) as s:
s.case(closed_range(1, 5), lambda: "1-to-5")
s.case(closed_range(6, 7), lambda: "6")
s.default(lambda: 'default')
self.assertEqual(s.result, "default")
with switch(6) as s:
s.case(closed_range(1, 5), lambda: "1-to-5")
s.case(closed_range(6, 7), lambda: "6")
s.default(lambda: 'default')
self.assertEqual(s.result, "6")