Skip to content

Commit 223733b

Browse files
tqa236yawpitch
authored andcommitted
Custom set add test template (#2128)
* Partially implement test template for custom-set * Partially implement test template for custom-set * Add more functionality * Fix bugs * Fix bugs * Add template for add * Fix bugs * Add a macro for empty list * Refactor
1 parent 35b04f4 commit 223733b

File tree

3 files changed

+98
-38
lines changed

3 files changed

+98
-38
lines changed

config/generator_macros.j2

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,11 @@ from {{ exercise | to_snake }} import ({% if imports -%}
4343
if __name__ == '__main__':
4444
unittest.main()
4545
{%- endmacro %}
46+
47+
{% macro empty_set(set, list, class_name) -%}
48+
{%- if list|length > 0 -%}
49+
{{ set }} = {{ class_name }}({{ list }})
50+
{%- else -%}
51+
{{ set }} = {{ class_name }}()
52+
{%- endif %}
53+
{%- endmacro %}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
{%- import "generator_macros.j2" as macros with context -%}
2+
{% set class_name = exercise | camel_case -%}
3+
{{ macros.header([class_name]) }}
4+
5+
class {{ class_name }}Test(unittest.TestCase):
6+
{% for case in cases -%}
7+
{% for subcase in case["cases"] -%}
8+
def test_{{ subcase["description"] | to_snake }}(self):
9+
{% set expected = subcase["expected"] -%}
10+
{% set property = subcase["property"] -%}
11+
{% if "set" in subcase["input"] -%}
12+
{% set list = subcase["input"]["set"] -%}
13+
{{ macros.empty_set("sut", list, class_name) }}
14+
{% else -%}
15+
{% set list1 = subcase["input"]["set1"] -%}
16+
{{ macros.empty_set("set1", list1, class_name) }}
17+
{% set list2 = subcase["input"]["set2"] -%}
18+
{{ macros.empty_set("set2", list2, class_name) }}
19+
{% endif -%}
20+
{% if expected is iterable -%}
21+
{{ macros.empty_set("expected", expected, class_name) }}
22+
{% elif expected == true -%}
23+
{%- set flag = "" -%}
24+
{% else -%}
25+
{%- set flag = "Not" -%}
26+
{% endif -%}
27+
{% if property == "add" -%}
28+
sut.{{ property }}({{ subcase["input"]["element"] }})
29+
self.assertEqual(sut, expected)
30+
{% elif property == "contains" -%}
31+
self.assert{{ flag }}In({{ subcase["input"]["element"] }}, sut)
32+
{% elif property == "difference" -%}
33+
self.assertEqual(set1 - set2, expected)
34+
{% elif property == "empty" -%}
35+
self.assertIs(sut.is{{ property }}(), {{ expected }})
36+
{% elif property == "equal" -%}
37+
self.assert{{ flag }}Equal(set1, set2)
38+
{% elif property == "intersection" -%}
39+
self.assertEqual(set1.{{ property }}(set2), expected)
40+
{% elif property == "union" -%}
41+
self.assertEqual(set1 + set2, expected)
42+
{% else -%}
43+
self.assertIs(set1.is{{ property }}(set2), {{ expected }})
44+
{% endif %}
45+
{% endfor %}
46+
{% endfor %}
47+
48+
{{ macros.footer() }}

exercises/custom-set/custom_set_test.py

Lines changed: 42 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
from custom_set import CustomSet
44

5-
65
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.3.0
76

7+
88
class CustomSetTest(unittest.TestCase):
99
def test_sets_with_no_elements_are_empty(self):
1010
sut = CustomSet()
@@ -14,69 +14,69 @@ def test_sets_with_elements_are_not_empty(self):
1414
sut = CustomSet([1])
1515
self.assertIs(sut.isempty(), False)
1616

17-
def test_empty_set_contains_nothing(self):
17+
def test_nothing_is_contained_in_an_empty_set(self):
1818
sut = CustomSet()
1919
self.assertNotIn(1, sut)
2020

21-
def test_set_contains_when_element_in_set(self):
22-
sut = CustomSet([1])
21+
def test_when_the_element_is_in_the_set(self):
22+
sut = CustomSet([1, 2, 3])
2323
self.assertIn(1, sut)
2424

25-
def test_set_does_not_contains_when_element_not_in_set(self):
25+
def test_when_the_element_is_not_in_the_set(self):
2626
sut = CustomSet([1, 2, 3])
2727
self.assertNotIn(4, sut)
2828

29-
def test_empty_set_is_subset_of_another_empty_set(self):
29+
def test_empty_set_is_a_subset_of_another_empty_set(self):
3030
set1 = CustomSet()
3131
set2 = CustomSet()
3232
self.assertIs(set1.issubset(set2), True)
3333

34-
def test_empty_set_is_subset_of_non_empty_set(self):
34+
def test_empty_set_is_a_subset_of_non_empty_set(self):
3535
set1 = CustomSet()
3636
set2 = CustomSet([1])
3737
self.assertIs(set1.issubset(set2), True)
3838

39-
def test_non_empty_set_is_not_subet_of_empty_set(self):
39+
def test_non_empty_set_is_not_a_subset_of_empty_set(self):
4040
set1 = CustomSet([1])
4141
set2 = CustomSet()
4242
self.assertIs(set1.issubset(set2), False)
4343

44-
def test_set_is_subset_of_set_with_exact_same_elements(self):
44+
def test_set_is_a_subset_of_set_with_exact_same_elements(self):
4545
set1 = CustomSet([1, 2, 3])
4646
set2 = CustomSet([1, 2, 3])
4747
self.assertIs(set1.issubset(set2), True)
4848

49-
def test_set_is_subset_of_larger_set_with_same_elements(self):
49+
def test_set_is_a_subset_of_larger_set_with_same_elements(self):
5050
set1 = CustomSet([1, 2, 3])
5151
set2 = CustomSet([4, 1, 2, 3])
5252
self.assertIs(set1.issubset(set2), True)
5353

54-
def test_set_not_subset_of_set_that_does_not_contain_its_elements(self):
54+
def test_set_is_not_a_subset_of_set_that_does_not_contain_its_elements(self):
5555
set1 = CustomSet([1, 2, 3])
5656
set2 = CustomSet([4, 1, 3])
5757
self.assertIs(set1.issubset(set2), False)
5858

59-
def test_empty_set_disjoint_with_itself(self):
59+
def test_the_empty_set_is_disjoint_with_itself(self):
6060
set1 = CustomSet()
6161
set2 = CustomSet()
6262
self.assertIs(set1.isdisjoint(set2), True)
6363

64-
def test_empty_set_disjoint_with_non_empty_set(self):
64+
def test_empty_set_is_disjoint_with_non_empty_set(self):
6565
set1 = CustomSet()
6666
set2 = CustomSet([1])
6767
self.assertIs(set1.isdisjoint(set2), True)
6868

69-
def test_non_empty_set_disjoint_with_empty_set(self):
69+
def test_non_empty_set_is_disjoint_with_empty_set(self):
7070
set1 = CustomSet([1])
7171
set2 = CustomSet()
7272
self.assertIs(set1.isdisjoint(set2), True)
7373

74-
def test_sets_not_disjoint_if_element_is_shared(self):
74+
def test_sets_are_not_disjoint_if_they_share_an_element(self):
7575
set1 = CustomSet([1, 2])
7676
set2 = CustomSet([2, 3])
7777
self.assertIs(set1.isdisjoint(set2), False)
7878

79-
def test_sets_disjoint_if_not_elements_are_shared(self):
79+
def test_sets_are_disjoint_if_they_share_no_elements(self):
8080
set1 = CustomSet([1, 2])
8181
set2 = CustomSet([3, 4])
8282
self.assertIs(set1.isdisjoint(set2), True)
@@ -86,17 +86,17 @@ def test_empty_sets_are_equal(self):
8686
set2 = CustomSet()
8787
self.assertEqual(set1, set2)
8888

89-
def test_empty_set_not_equal_to_non_empty_set(self):
89+
def test_empty_set_is_not_equal_to_non_empty_set(self):
9090
set1 = CustomSet()
9191
set2 = CustomSet([1, 2, 3])
9292
self.assertNotEqual(set1, set2)
9393

94-
def test_non_empty_set_not_equal_to_empty_set(self):
94+
def test_non_empty_set_is_not_equal_to_empty_set(self):
9595
set1 = CustomSet([1, 2, 3])
9696
set2 = CustomSet()
9797
self.assertNotEqual(set1, set2)
9898

99-
def test_sets_with_same_exact_same_elements_are_equal(self):
99+
def test_sets_with_the_same_elements_are_equal(self):
100100
set1 = CustomSet([1, 2])
101101
set2 = CustomSet([2, 1])
102102
self.assertEqual(set1, set2)
@@ -113,89 +113,93 @@ def test_set_is_not_equal_to_larger_set_with_same_elements(self):
113113

114114
def test_add_to_empty_set(self):
115115
sut = CustomSet()
116-
sut.add(1)
117-
expected = CustomSet([1])
116+
expected = CustomSet([3])
117+
sut.add(3)
118118
self.assertEqual(sut, expected)
119119

120120
def test_add_to_non_empty_set(self):
121121
sut = CustomSet([1, 2, 4])
122-
sut.add(3)
123122
expected = CustomSet([1, 2, 3, 4])
123+
sut.add(3)
124124
self.assertEqual(sut, expected)
125125

126-
def test_adding_existing_element_does_not_change_set(self):
126+
def test_adding_an_existing_element_does_not_change_the_set(self):
127127
sut = CustomSet([1, 2, 3])
128-
sut.add(3)
129128
expected = CustomSet([1, 2, 3])
129+
sut.add(3)
130130
self.assertEqual(sut, expected)
131131

132-
def test_intersection_of_two_empty_sets_is_empty_set(self):
132+
def test_intersection_of_two_empty_sets_is_an_empty_set(self):
133133
set1 = CustomSet()
134134
set2 = CustomSet()
135135
expected = CustomSet()
136136
self.assertEqual(set1.intersection(set2), expected)
137137

138-
def test_intersection_of_empty_set_and_non_empty_set_is_empty_set(self):
138+
def test_intersection_of_an_empty_set_and_non_empty_set_is_an_empty_set(self):
139139
set1 = CustomSet()
140140
set2 = CustomSet([3, 2, 5])
141141
expected = CustomSet()
142142
self.assertEqual(set1.intersection(set2), expected)
143143

144-
def test_intersection_of_non_empty_set_and_empty_set_is_empty_set(self):
144+
def test_intersection_of_a_non_empty_set_and_an_empty_set_is_an_empty_set(self):
145145
set1 = CustomSet([1, 2, 3, 4])
146146
set2 = CustomSet()
147147
expected = CustomSet()
148148
self.assertEqual(set1.intersection(set2), expected)
149149

150-
def test_intersection_of_sets_with_no_shared_elements_is_empty_set(self):
150+
def test_intersection_of_two_sets_with_no_shared_elements_is_an_empty_set(self):
151151
set1 = CustomSet([1, 2, 3])
152152
set2 = CustomSet([4, 5, 6])
153153
expected = CustomSet()
154154
self.assertEqual(set1.intersection(set2), expected)
155155

156-
def test_intersection_contains_shared_elements_only(self):
156+
def test_intersection_of_two_sets_with_shared_elements_is_a_set_of_the_shared_elements(
157+
self
158+
):
157159
set1 = CustomSet([1, 2, 3, 4])
158160
set2 = CustomSet([3, 2, 5])
159161
expected = CustomSet([2, 3])
160162
self.assertEqual(set1.intersection(set2), expected)
161163

162-
def test_difference_of_two_empty_sets_is_empty_set(self):
164+
def test_difference_of_two_empty_sets_is_an_empty_set(self):
163165
set1 = CustomSet()
164166
set2 = CustomSet()
165167
expected = CustomSet()
166168
self.assertEqual(set1 - set2, expected)
167169

168-
def test_difference_of_empty_set_and_non_empty_set_is_empty_set(self):
170+
def test_difference_of_empty_set_and_non_empty_set_is_an_empty_set(self):
169171
set1 = CustomSet()
170172
set2 = CustomSet([3, 2, 5])
171173
expected = CustomSet()
172174
self.assertEqual(set1 - set2, expected)
173175

174-
def test_difference_of_non_empty_set_and_empty_set_is_non_empty_set(self):
176+
def test_difference_of_a_non_empty_set_and_an_empty_set_is_the_non_empty_set(self):
175177
set1 = CustomSet([1, 2, 3, 4])
176178
set2 = CustomSet()
177179
expected = CustomSet([1, 2, 3, 4])
178180
self.assertEqual(set1 - set2, expected)
179181

180-
def test_difference_of_non_empty_sets_elements_in_first_set_only(self):
182+
def test_difference_of_two_non_empty_sets_is_a_set_of_elements_that_are_only_in_the_first_set(
183+
self
184+
):
181185
set1 = CustomSet([3, 2, 1])
182186
set2 = CustomSet([2, 4])
183187
expected = CustomSet([1, 3])
184188
self.assertEqual(set1 - set2, expected)
185189

186-
def test_union_of_empty_sets_is_empty_set(self):
190+
def test_union_of_empty_sets_is_an_empty_set(self):
187191
set1 = CustomSet()
188192
set2 = CustomSet()
189193
expected = CustomSet()
190194
self.assertEqual(set1 + set2, expected)
191195

192-
def test_union_of_empty_set_and_non_empty_set_is_the_non_empty_set(self):
196+
def test_union_of_an_empty_set_and_non_empty_set_is_the_non_empty_set(self):
193197
set1 = CustomSet()
194198
set2 = CustomSet([2])
195199
expected = CustomSet([2])
196200
self.assertEqual(set1 + set2, expected)
197201

198-
def test_union_of_non_empty_set_and_empty_set_is_the_non_empty_set(self):
202+
def test_union_of_a_non_empty_set_and_empty_set_is_the_non_empty_set(self):
199203
set1 = CustomSet([1, 3])
200204
set2 = CustomSet()
201205
expected = CustomSet([1, 3])
@@ -204,9 +208,9 @@ def test_union_of_non_empty_set_and_empty_set_is_the_non_empty_set(self):
204208
def test_union_of_non_empty_sets_contains_all_unique_elements(self):
205209
set1 = CustomSet([1, 3])
206210
set2 = CustomSet([2, 3])
207-
expected = CustomSet([1, 2, 3])
211+
expected = CustomSet([3, 2, 1])
208212
self.assertEqual(set1 + set2, expected)
209213

210214

211-
if __name__ == '__main__':
215+
if __name__ == "__main__":
212216
unittest.main()

0 commit comments

Comments
 (0)