Skip to content

Commit 59bd2b8

Browse files
committed
Adds closed range feature.
Uses switch.result to dramatically cleanup unit tests.
1 parent 7acf576 commit 59bd2b8

2 files changed

Lines changed: 71 additions & 82 deletions

File tree

switchlang.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Here is a first pass implementation at adding switch
22
import uuid
3-
from typing import Callable, Any
3+
from typing import Callable, Any, List
44

55

66
class switch:
@@ -55,6 +55,13 @@ def __exit__(self, exc_type, exc_val, exc_tb):
5555
@property
5656
def result(self):
5757
if self.__result == switch.__no_result:
58-
raise Exception("No result has been computed.")
58+
raise Exception("No result has been computed (did you access switch.result inside the with block?)")
5959

6060
return self.__result
61+
62+
63+
def closed_range(start: int, stop: int, step=1) -> range:
64+
if start >= stop:
65+
raise ValueError("Start must be less than stop.")
66+
67+
return range(start, stop+step, step)

tests/coretests.py

Lines changed: 62 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import unittest
2-
from switchlang import switch
2+
from switchlang import switch, closed_range
33

44

55
# here is a custom type we can use as a key for our tests
@@ -10,76 +10,49 @@ class TestKeyObject:
1010
class CoreTests(unittest.TestCase):
1111
def test_has_matched_case_int(self):
1212
value = 7
13-
14-
executed_case = None
15-
16-
def get_set_case(val):
17-
nonlocal executed_case
18-
executed_case = val
19-
2013
with switch(value) as s:
21-
s.case(1, lambda: get_set_case("one"))
22-
s.case(5, lambda: get_set_case("five"))
23-
s.case(7, lambda: get_set_case("seven"))
24-
s.default(lambda: get_set_case('default'))
14+
s.case(1, lambda: "one")
15+
s.case(5, lambda: "five")
16+
s.case(7, lambda: "seven")
17+
s.default(lambda: 'default')
2518

26-
self.assertEqual(executed_case, "seven")
19+
self.assertEqual(s.result, "seven")
2720

2821
def test_has_matched_case_object(self):
2922
t1 = TestKeyObject()
3023
t2 = TestKeyObject()
3124
t3 = TestKeyObject()
32-
value = t2
3325

34-
executed_case = None
26+
with switch(t2) as s:
27+
s.case(t1, lambda: t1)
28+
s.case(t2, lambda: t2)
29+
s.case(t3, lambda: t3)
30+
s.default(lambda: None)
3531

36-
def get_set_case(val):
37-
nonlocal executed_case
38-
executed_case = val
39-
40-
with switch(value) as s:
41-
s.case(t1, lambda: get_set_case(t1))
42-
s.case(t2, lambda: get_set_case(t2))
43-
s.case(t3, lambda: get_set_case(t3))
44-
s.default(lambda: get_set_case(None))
45-
46-
self.assertEqual(executed_case, t2)
32+
self.assertEqual(s.result, t2)
4733

4834
def test_default_passthrough(self):
4935
value = 11
50-
executed_case = None
51-
52-
def get_set_case(val):
53-
nonlocal executed_case
54-
executed_case = val
55-
5636
with switch(value) as s:
57-
s.case(1, lambda: get_set_case(1))
58-
s.case(2, lambda: get_set_case(2))
59-
s.default(lambda: get_set_case("default"))
37+
s.case(1, lambda: '1')
38+
s.case(2, lambda: '2')
39+
s.default(lambda: 'default')
6040

61-
self.assertEqual(executed_case, "default")
41+
self.assertEqual(s.result, "default")
6242

6343
def test_none_as_valid_case(self):
64-
value = None
65-
executed_case = None
66-
67-
def get_set_case(val):
68-
nonlocal executed_case
69-
executed_case = val
70-
71-
with switch(value) as s:
72-
s.case(1, lambda: get_set_case(1))
73-
s.case(None, lambda: get_set_case(None))
74-
s.default(lambda: get_set_case("default"))
44+
with switch(None) as s:
45+
s.case(1, lambda: 'one')
46+
s.case(None, lambda: 'none')
47+
s.default(lambda: "default")
7548

76-
self.assertEqual(executed_case, None)
49+
self.assertEqual(s.result, 'none')
7750

7851
def test_error_no_match_no_default(self):
7952
with self.assertRaises(Exception):
8053
with switch('val') as s:
8154
s.case(1, lambda: None)
82-
s.case(1, lambda: None)
55+
s.case(2, lambda: None)
8356

8457
def test_error_duplicate_case(self):
8558
with self.assertRaises(ValueError):
@@ -88,50 +61,36 @@ def test_error_duplicate_case(self):
8861
s.case(1, lambda: None)
8962

9063
def test_multiple_values_one_case_range(self):
91-
executed_case = None
92-
93-
def get_set_case(val):
94-
nonlocal executed_case
95-
executed_case = val
96-
9764
for value in range(1, 5):
9865
with switch(value) as s:
99-
s.case(range(1, 6), lambda: get_set_case("1-to-5"))
100-
s.case(range(6, 7), lambda: get_set_case("6"))
101-
s.default(lambda: get_set_case('default'))
66+
s.case(range(1, 6), lambda: "1-to-5")
67+
s.case(range(6, 7), lambda: "6")
68+
s.default(lambda: 'default')
10269

103-
self.assertEqual(executed_case, "1-to-5")
70+
self.assertEqual(s.result, "1-to-5")
10471

10572
for value in range(6, 7):
10673
with switch(value) as s:
107-
s.case(range(1, 6), lambda: get_set_case("1-to-5"))
108-
s.case(range(6, 7), lambda: get_set_case("6"))
109-
s.default(lambda: get_set_case('default'))
74+
s.case(range(1, 6), lambda: "1-to-5")
75+
s.case(range(6, 7), lambda: "6")
76+
s.default(lambda: 'default')
11077

111-
self.assertEqual(executed_case, "6")
78+
self.assertEqual(s.result, "6")
11279

11380
with switch(7) as s:
114-
s.case(range(1, 6), lambda: get_set_case("1-to-5"))
115-
s.case(range(6, 7), lambda: get_set_case("6"))
116-
s.default(lambda: get_set_case('default'))
81+
s.case(range(1, 6), lambda: "1-to-5")
82+
s.case(range(6, 7), lambda: "6")
83+
s.default(lambda: 'default')
11784

118-
self.assertEqual(executed_case, "default")
85+
self.assertEqual(s.result, "default")
11986

12087
def test_multiple_values_one_case_list(self):
121-
value = 6
122-
123-
executed_case = None
124-
125-
def get_set_case(val):
126-
nonlocal executed_case
127-
executed_case = val
88+
with switch(6) as s:
89+
s.case([1, 3, 5, 7], lambda: "odd")
90+
s.case([0, 2, 4, 6, 8], lambda: "even")
91+
s.default(lambda: 'default')
12892

129-
with switch(value) as s:
130-
s.case([1, 3, 5, 7], lambda: get_set_case("odd"))
131-
s.case([0, 2, 4, 6, 8], lambda: get_set_case("even"))
132-
s.default(lambda: get_set_case('default'))
133-
134-
self.assertEqual(executed_case, "even")
93+
self.assertEqual(s.result, "even")
13594

13695
def test_return_value_from_case(self):
13796
value = 4
@@ -147,3 +106,26 @@ def test_result_inaccessible_if_hasnt_run(self):
147106
with self.assertRaises(Exception):
148107
s = switch(7)
149108
s.result
109+
110+
def test_closed_range(self):
111+
for value in [1, 2, 3, 4, 5]:
112+
with switch(value) as s:
113+
s.case(closed_range(1, 5), lambda: "1-to-5")
114+
s.case(closed_range(6, 7), lambda: "6")
115+
s.default(lambda: 'default')
116+
117+
self.assertEqual(s.result, "1-to-5")
118+
119+
with switch(0) as s:
120+
s.case(closed_range(1, 5), lambda: "1-to-5")
121+
s.case(closed_range(6, 7), lambda: "6")
122+
s.default(lambda: 'default')
123+
124+
self.assertEqual(s.result, "default")
125+
126+
with switch(6) as s:
127+
s.case(closed_range(1, 5), lambda: "1-to-5")
128+
s.case(closed_range(6, 7), lambda: "6")
129+
s.default(lambda: 'default')
130+
131+
self.assertEqual(s.result, "6")

0 commit comments

Comments
 (0)