Skip to content

Commit 805fcb5

Browse files
committed
Removed nesting from Jinja templates and re-generated test files.
1 parent c3a2e3a commit 805fcb5

27 files changed

Lines changed: 922 additions & 79 deletions

File tree

exercises/practice/acronym/.meta/template.j2

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,7 @@
1010
{{ macros.header()}}
1111

1212
class {{ exercise | camel_case }}Test(unittest.TestCase):
13-
{% for supercase in cases %}{% for case in supercase["cases"] -%}
13+
{% for case in cases %}
1414
{{ test_case(case) }}
15-
{% endfor %}{% endfor %}
16-
17-
18-
{{ macros.footer(True)}}
15+
{% endfor %}
16+
{{ macros.footer() }}

exercises/practice/acronym/acronym_test.py

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,37 @@
88

99

1010
class AcronymTest(unittest.TestCase):
11+
def test_basic(self):
12+
self.assertEqual(abbreviate("Portable Network Graphics"), "PNG")
1113

12-
# Utility functions
13-
def assertRaisesWithMessage(self, exception):
14-
return self.assertRaisesRegex(exception, r".+")
14+
def test_lowercase_words(self):
15+
self.assertEqual(abbreviate("Ruby on Rails"), "ROR")
16+
17+
def test_punctuation(self):
18+
self.assertEqual(abbreviate("First In, First Out"), "FIFO")
19+
20+
def test_all_caps_word(self):
21+
self.assertEqual(abbreviate("GNU Image Manipulation Program"), "GIMP")
22+
23+
def test_punctuation_without_whitespace(self):
24+
self.assertEqual(abbreviate("Complementary metal-oxide semiconductor"), "CMOS")
25+
26+
def test_very_long_abbreviation(self):
27+
self.assertEqual(
28+
abbreviate(
29+
"Rolling On The Floor Laughing So Hard That My Dogs Came Over And Licked Me"
30+
),
31+
"ROTFLSHTMDCOALM",
32+
)
33+
34+
def test_consecutive_delimiters(self):
35+
self.assertEqual(abbreviate("Something - I made up from thin air"), "SIMUFTA")
36+
37+
def test_apostrophes(self):
38+
self.assertEqual(abbreviate("Halley's Comet"), "HC")
39+
40+
def test_underscore_emphasis(self):
41+
self.assertEqual(abbreviate("The Road _Not_ Taken"), "TRNT")
1542

1643

1744
if __name__ == "__main__":

exercises/practice/alphametics/.meta/template.j2

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
{{ macros.header() }}
33

44
class {{ exercise | camel_case }}Test(unittest.TestCase):
5-
{% for case in cases[0]["cases"] -%}
5+
{% for case in cases -%}
66
{% set description = case["description"] | to_snake -%}
77
{% set testdef = "def test_" ~ description ~ "(self):" -%}
88
{% set value = case["input"]["puzzle"] -%}
@@ -30,4 +30,4 @@ class {{ exercise | camel_case }}Test(unittest.TestCase):
3030
{% endif %}
3131
{% endfor %}
3232

33-
{{ macros.footer(True)}}
33+
{{ macros.footer()}}

exercises/practice/alphametics/alphametics_test.py

Lines changed: 97 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,104 @@
88

99

1010
class AlphameticsTest(unittest.TestCase):
11+
def test_puzzle_with_three_letters(self):
12+
self.assertEqual(solve("I + BB == ILL"), {"I": 1, "B": 9, "L": 0})
1113

12-
# Utility functions
13-
def assertRaisesWithMessage(self, exception):
14-
return self.assertRaisesRegex(exception, r".+")
14+
def test_solution_must_have_unique_value_for_each_letter(self):
15+
self.assertEqual(solve("A == B"), None)
16+
17+
def test_leading_zero_solution_is_invalid(self):
18+
self.assertEqual(solve("ACA + DD == BD"), None)
19+
20+
def test_puzzle_with_two_digits_final_carry(self):
21+
self.assertEqual(
22+
solve("A + A + A + A + A + A + A + A + A + A + A + B == BCC"),
23+
{"A": 9, "B": 1, "C": 0},
24+
)
25+
26+
def test_puzzle_with_four_letters(self):
27+
self.assertEqual(solve("AS + A == MOM"), {"A": 9, "S": 2, "M": 1, "O": 0})
28+
29+
def test_puzzle_with_six_letters(self):
30+
self.assertEqual(
31+
solve("NO + NO + TOO == LATE"),
32+
{"N": 7, "O": 4, "T": 9, "L": 1, "A": 0, "E": 2},
33+
)
34+
35+
def test_puzzle_with_seven_letters(self):
36+
self.assertEqual(
37+
solve("HE + SEES + THE == LIGHT"),
38+
{"E": 4, "G": 2, "H": 5, "I": 0, "L": 1, "S": 9, "T": 7},
39+
)
40+
41+
def test_puzzle_with_eight_letters(self):
42+
self.assertEqual(
43+
solve("SEND + MORE == MONEY"),
44+
{"S": 9, "E": 5, "N": 6, "D": 7, "M": 1, "O": 0, "R": 8, "Y": 2},
45+
)
46+
47+
def test_puzzle_with_ten_letters(self):
48+
self.assertEqual(
49+
solve("AND + A + STRONG + OFFENSE + AS + A + GOOD == DEFENSE"),
50+
{
51+
"A": 5,
52+
"D": 3,
53+
"E": 4,
54+
"F": 7,
55+
"G": 8,
56+
"N": 0,
57+
"O": 2,
58+
"R": 1,
59+
"S": 6,
60+
"T": 9,
61+
},
62+
)
63+
64+
# See https://github.com/exercism/python/pull/1358
65+
@unittest.skip("extra-credit")
66+
def test_puzzle_with_ten_letters_and_199_addends(self):
67+
"""This test may take a long time to run. Please be patient when running it."""
68+
puzzle = (
69+
"THIS + A + FIRE + THEREFORE + FOR + ALL + HISTORIES + I + TELL"
70+
"+ A + TALE + THAT + FALSIFIES + ITS + TITLE + TIS + A + LIE +"
71+
"THE + TALE + OF + THE + LAST + FIRE + HORSES + LATE + AFTER +"
72+
"THE + FIRST + FATHERS + FORESEE + THE + HORRORS + THE + LAST +"
73+
"FREE + TROLL + TERRIFIES + THE + HORSES + OF + FIRE + THE +"
74+
"TROLL + RESTS + AT + THE + HOLE + OF + LOSSES + IT + IS +"
75+
"THERE + THAT + SHE + STORES + ROLES + OF + LEATHERS + AFTER +"
76+
"SHE + SATISFIES + HER + HATE + OFF + THOSE + FEARS + A + TASTE"
77+
"+ RISES + AS + SHE + HEARS + THE + LEAST + FAR + HORSE + THOSE"
78+
"+ FAST + HORSES + THAT + FIRST + HEAR + THE + TROLL + FLEE +"
79+
"OFF + TO + THE + FOREST + THE + HORSES + THAT + ALERTS + RAISE"
80+
"+ THE + STARES + OF + THE + OTHERS + AS + THE + TROLL +"
81+
"ASSAILS + AT + THE + TOTAL + SHIFT + HER + TEETH + TEAR + HOOF"
82+
"+ OFF + TORSO + AS + THE + LAST + HORSE + FORFEITS + ITS +"
83+
"LIFE + THE + FIRST + FATHERS + HEAR + OF + THE + HORRORS +"
84+
"THEIR + FEARS + THAT + THE + FIRES + FOR + THEIR + FEASTS +"
85+
"ARREST + AS + THE + FIRST + FATHERS + RESETTLE + THE + LAST +"
86+
"OF + THE + FIRE + HORSES + THE + LAST + TROLL + HARASSES + THE"
87+
"+ FOREST + HEART + FREE + AT + LAST + OF + THE + LAST + TROLL"
88+
"+ ALL + OFFER + THEIR + FIRE + HEAT + TO + THE + ASSISTERS +"
89+
"FAR + OFF + THE + TROLL + FASTS + ITS + LIFE + SHORTER + AS +"
90+
"STARS + RISE + THE + HORSES + REST + SAFE + AFTER + ALL +"
91+
"SHARE + HOT + FISH + AS + THEIR + AFFILIATES + TAILOR + A +"
92+
"ROOFS + FOR + THEIR + SAFE == FORTRESSES"
93+
)
94+
self.assertEqual(
95+
solve(puzzle),
96+
{
97+
"A": 1,
98+
"E": 0,
99+
"F": 5,
100+
"H": 8,
101+
"I": 7,
102+
"L": 2,
103+
"O": 6,
104+
"R": 3,
105+
"S": 4,
106+
"T": 9,
107+
},
108+
)
15109

16110

17111
if __name__ == "__main__":

exercises/practice/book-store/.meta/template.j2

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,9 @@
88
{{ macros.header() }}
99

1010
class {{ exercise | camel_case }}Test(unittest.TestCase):
11-
{% for casegroup in cases %}
12-
{% for case in casegroup["cases"] -%}
11+
{% for case in cases %}
1312
{{ test_case(case) }}
1413
{% endfor %}
15-
{% endfor %}
1614

1715
{% if additional_cases | length -%}
1816

exercises/practice/book-store/book_store_test.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,67 @@
88

99

1010
class BookStoreTest(unittest.TestCase):
11+
def test_only_a_single_book(self):
12+
basket = [1]
13+
self.assertEqual(total(basket), 800)
14+
15+
def test_two_of_the_same_book(self):
16+
basket = [2, 2]
17+
self.assertEqual(total(basket), 1600)
18+
19+
def test_empty_basket(self):
20+
basket = []
21+
self.assertEqual(total(basket), 0)
22+
23+
def test_two_different_books(self):
24+
basket = [1, 2]
25+
self.assertEqual(total(basket), 1520)
26+
27+
def test_three_different_books(self):
28+
basket = [1, 2, 3]
29+
self.assertEqual(total(basket), 2160)
30+
31+
def test_four_different_books(self):
32+
basket = [1, 2, 3, 4]
33+
self.assertEqual(total(basket), 2560)
34+
35+
def test_five_different_books(self):
36+
basket = [1, 2, 3, 4, 5]
37+
self.assertEqual(total(basket), 3000)
38+
39+
def test_two_groups_of_four_is_cheaper_than_group_of_five_plus_group_of_three(self):
40+
basket = [1, 1, 2, 2, 3, 3, 4, 5]
41+
self.assertEqual(total(basket), 5120)
42+
43+
def test_two_groups_of_four_is_cheaper_than_groups_of_five_and_three(self):
44+
basket = [1, 1, 2, 3, 4, 4, 5, 5]
45+
self.assertEqual(total(basket), 5120)
46+
47+
def test_group_of_four_plus_group_of_two_is_cheaper_than_two_groups_of_three(self):
48+
basket = [1, 1, 2, 2, 3, 4]
49+
self.assertEqual(total(basket), 4080)
50+
51+
def test_two_each_of_first_4_books_and_1_copy_each_of_rest(self):
52+
basket = [1, 1, 2, 2, 3, 3, 4, 4, 5]
53+
self.assertEqual(total(basket), 5560)
54+
55+
def test_two_copies_of_each_book(self):
56+
basket = [1, 1, 2, 2, 3, 3, 4, 4, 5, 5]
57+
self.assertEqual(total(basket), 6000)
58+
59+
def test_three_copies_of_first_book_and_2_each_of_remaining(self):
60+
basket = [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 1]
61+
self.assertEqual(total(basket), 6800)
62+
63+
def test_three_each_of_first_2_books_and_2_each_of_remaining_books(self):
64+
basket = [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 1, 2]
65+
self.assertEqual(total(basket), 7520)
66+
67+
def test_four_groups_of_four_are_cheaper_than_two_groups_each_of_five_and_three(
68+
self,
69+
):
70+
basket = [1, 1, 2, 2, 3, 3, 4, 5, 1, 1, 2, 2, 3, 3, 4, 5]
71+
self.assertEqual(total(basket), 10240)
1172

1273
# Additional tests for this track
1374

exercises/practice/etl/.meta/template.j2

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212
{{ macros.header()}}
1313

1414
class {{ exercise | camel_case }}Test(unittest.TestCase):
15-
{% for supercase in cases %}{% for case in supercase["cases"] -%}
15+
{% for case in cases %}
1616
{{ test_case(case) }}
17-
{% endfor %}{% endfor %}
17+
{% endfor %}
1818

1919

20-
{{ macros.footer(True) }}
20+
{{ macros.footer() }}

exercises/practice/etl/etl_test.py

Lines changed: 53 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,60 @@
88

99

1010
class EtlTest(unittest.TestCase):
11+
def test_single_letter(self):
12+
legacy_data = {1: ["A"]}
13+
data = {"a": 1}
14+
self.assertEqual(transform(legacy_data), data)
1115

12-
# Utility functions
13-
def assertRaisesWithMessage(self, exception):
14-
return self.assertRaisesRegex(exception, r".+")
16+
def test_single_score_with_multiple_letters(self):
17+
legacy_data = {1: ["A", "E", "I", "O", "U"]}
18+
data = {"a": 1, "e": 1, "i": 1, "o": 1, "u": 1}
19+
self.assertEqual(transform(legacy_data), data)
20+
21+
def test_multiple_scores_with_multiple_letters(self):
22+
legacy_data = {1: ["A", "E"], 2: ["D", "G"]}
23+
data = {"a": 1, "d": 2, "e": 1, "g": 2}
24+
self.assertEqual(transform(legacy_data), data)
25+
26+
def test_multiple_scores_with_differing_numbers_of_letters(self):
27+
legacy_data = {
28+
1: ["A", "E", "I", "O", "U", "L", "N", "R", "S", "T"],
29+
2: ["D", "G"],
30+
3: ["B", "C", "M", "P"],
31+
4: ["F", "H", "V", "W", "Y"],
32+
5: ["K"],
33+
8: ["J", "X"],
34+
10: ["Q", "Z"],
35+
}
36+
data = {
37+
"a": 1,
38+
"b": 3,
39+
"c": 3,
40+
"d": 2,
41+
"e": 1,
42+
"f": 4,
43+
"g": 2,
44+
"h": 4,
45+
"i": 1,
46+
"j": 8,
47+
"k": 5,
48+
"l": 1,
49+
"m": 3,
50+
"n": 1,
51+
"o": 1,
52+
"p": 3,
53+
"q": 10,
54+
"r": 1,
55+
"s": 1,
56+
"t": 1,
57+
"u": 1,
58+
"v": 4,
59+
"w": 4,
60+
"x": 8,
61+
"y": 4,
62+
"z": 10,
63+
}
64+
self.assertEqual(transform(legacy_data), data)
1565

1666

1767
if __name__ == "__main__":

exercises/practice/food-chain/.meta/template.j2

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,13 @@
22
{{ macros.header() }}
33

44
class {{ exercise | camel_case }}Test(unittest.TestCase):
5-
{% for supercase in cases %}
6-
{% for case in supercase["cases"] -%}
5+
{% for case in cases %}
76
def test_{{ case["description"] | to_snake }}(self):
87
{%- set start_verse = case["input"]["startVerse"] %}
98
{%- set end_verse = case["input"]["endVerse"] %}
109
{%- set expected = case["expected"] %}
1110
self.assertEqual({{ case["property"]}}({{start_verse}}, {{end_verse}}), {{expected}})
1211

1312
{% endfor %}
14-
{% endfor %}
1513

16-
{{ macros.footer(True) }}
14+
{{ macros.footer() }}

0 commit comments

Comments
 (0)