trackler 2.0.8.27 → 2.0.8.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/common/exercises/simple-cipher/description.md +1 -1
  3. data/common/exercises/triangle/description.md +12 -23
  4. data/lib/trackler/version.rb +1 -1
  5. data/tracks/kotlin/config.json +5 -0
  6. data/tracks/kotlin/exercises/bank-account/build.gradle +32 -0
  7. data/tracks/kotlin/exercises/bank-account/src/example/kotlin/BankAccount.kt +27 -0
  8. data/tracks/kotlin/exercises/bank-account/src/main/kotlin/.keep +0 -0
  9. data/tracks/kotlin/exercises/bank-account/src/test/kotlin/BankAccountTest.kt +73 -0
  10. data/tracks/kotlin/exercises/settings.gradle +1 -0
  11. data/tracks/python/config.json +11 -11
  12. data/tracks/python/exercises/accumulate/accumulate_test.py +16 -14
  13. data/tracks/python/exercises/acronym/acronym_test.py +8 -7
  14. data/tracks/python/exercises/allergies/allergies_test.py +5 -6
  15. data/tracks/python/exercises/atbash-cipher/atbash_cipher_test.py +16 -22
  16. data/tracks/python/exercises/binary-search/binary_search_test.py +12 -10
  17. data/tracks/python/exercises/binary/binary_test.py +7 -8
  18. data/tracks/python/exercises/circular-buffer/circular_buffer_test.py +16 -17
  19. data/tracks/python/exercises/clock/clock_test.py +35 -35
  20. data/tracks/python/exercises/crypto-square/crypto_square_test.py +5 -6
  21. data/tracks/python/exercises/diamond/diamond_test.py +3 -4
  22. data/tracks/python/exercises/etl/etl_test.py +4 -4
  23. data/tracks/python/exercises/gigasecond/gigasecond_test.py +11 -19
  24. data/tracks/python/exercises/grade-school/grade_school_test.py +17 -19
  25. data/tracks/python/exercises/grains/grains_test.py +14 -14
  26. data/tracks/python/exercises/grep/grep_test.py +51 -64
  27. data/tracks/python/exercises/hamming/hamming_test.py +13 -13
  28. data/tracks/python/exercises/hello-world/hello_world_test.py +1 -2
  29. data/tracks/python/exercises/hexadecimal/hexadecimal_test.py +9 -10
  30. data/tracks/python/exercises/house/house_test.py +6 -6
  31. data/tracks/python/exercises/kindergarten-garden/kindergarten_garden_test.py +22 -19
  32. data/tracks/python/exercises/largest-series-product/largest_series_product_test.py +29 -28
  33. data/tracks/python/exercises/linked-list/linked_list_test.py +18 -19
  34. data/tracks/python/exercises/list-ops/list_ops_test.py +44 -39
  35. data/tracks/python/exercises/matrix/matrix_test.py +6 -6
  36. data/tracks/python/exercises/meetup/meetup_test.py +27 -27
  37. data/tracks/python/exercises/minesweeper/example.py +4 -2
  38. data/tracks/python/exercises/minesweeper/minesweeper_test.py +9 -9
  39. data/tracks/python/exercises/nucleotide-count/nucleotide_count_test.py +6 -6
  40. data/tracks/python/exercises/ocr-numbers/ocr_numbers_test.py +63 -49
  41. data/tracks/python/exercises/octal/octal_test.py +7 -7
  42. data/tracks/python/exercises/palindrome-products/palindrome_products_test.py +9 -9
  43. data/tracks/python/exercises/pascals-triangle/pascals_triangle_test.py +7 -7
  44. data/tracks/python/exercises/phone-number/phone_number_test.py +8 -8
  45. data/tracks/python/exercises/pig-latin/pig_latin_test.py +15 -15
  46. data/tracks/python/exercises/point-mutations/point_mutations_test.py +11 -11
  47. data/tracks/python/exercises/poker/poker_test.py +32 -30
  48. data/tracks/python/exercises/prime-factors/prime_factors_test.py +11 -11
  49. data/tracks/python/exercises/proverb/proverb_test.py +16 -9
  50. data/tracks/python/exercises/pythagorean-triplet/pythagorean_triplet_test.py +14 -12
  51. data/tracks/python/exercises/queen-attack/queen_attack_test.py +10 -10
  52. data/tracks/python/exercises/rail-fence-cipher/example.py +2 -1
  53. data/tracks/python/exercises/rail-fence-cipher/rail_fence_cipher_test.py +14 -13
  54. data/tracks/python/exercises/raindrops/raindrops_test.py +16 -16
  55. data/tracks/python/exercises/rectangles/rectangles_test.py +9 -9
  56. data/tracks/python/exercises/rna-transcription/rna_transcription_test.py +8 -8
  57. data/tracks/python/exercises/robot-name/robot_name_test.py +1 -1
  58. data/tracks/python/exercises/robot-simulator/robot_simulator_test.py +18 -19
  59. data/tracks/python/exercises/roman-numerals/roman_numerals_test.py +1 -1
  60. data/tracks/python/exercises/run-length-encoding/run_length_encoding_test.py +15 -16
  61. data/tracks/python/exercises/saddle-points/saddle_points_test.py +4 -4
  62. data/tracks/python/exercises/say/say_test.py +21 -23
  63. data/tracks/python/exercises/scrabble-score/scrabble_score_test.py +9 -9
  64. data/tracks/python/exercises/secret-handshake/secret_handshake_test.py +14 -13
  65. data/tracks/python/exercises/series/example.py +3 -3
  66. data/tracks/python/exercises/series/series_test.py +16 -12
  67. data/tracks/python/exercises/simple-cipher/simple_cipher_test.py +21 -19
  68. data/tracks/python/exercises/space-age/space_age_test.py +16 -16
  69. data/tracks/python/exercises/strain/strain_test.py +9 -8
  70. data/tracks/python/exercises/sublist/sublist_test.py +19 -20
  71. data/tracks/python/exercises/sum-of-multiples/example.py +1 -4
  72. data/tracks/python/exercises/sum-of-multiples/sum_of_multiples_test.py +31 -26
  73. data/tracks/python/exercises/triangle/triangle_test.py +15 -30
  74. data/tracks/python/exercises/trinary/trinary_test.py +7 -7
  75. data/tracks/python/exercises/twelve-days/twelve_days_test.py +13 -14
  76. data/tracks/python/exercises/word-count/example.py +1 -9
  77. data/tracks/python/exercises/word-count/word_count_test.py +0 -15
  78. data/tracks/python/exercises/wordy/wordy_test.py +17 -18
  79. data/tracks/python/exercises/zebra-puzzle/example.py +20 -23
  80. data/tracks/python/exercises/zebra-puzzle/zebra_puzzle_test.py +3 -3
  81. data/tracks/python/test/check-exercises.py +1 -1
  82. metadata +6 -2
@@ -1,6 +1,6 @@
1
+ import unittest
1
2
  from collections import Sequence
2
3
  from types import GeneratorType
3
- import unittest
4
4
 
5
5
  from grade_school import School
6
6
 
@@ -14,40 +14,37 @@ class SchoolTest(unittest.TestCase):
14
14
 
15
15
  def test_an_empty_school(self):
16
16
  for n in range(1, 9):
17
- self.assertCountEqual(set(), self.school.grade(n))
17
+ self.assertCountEqual(self.school.grade(n), set())
18
18
 
19
19
  def test_add_student(self):
20
20
  self.school.add("Aimee", 2)
21
- self.assertCountEqual(("Aimee",), self.school.grade(2))
21
+ self.assertCountEqual(self.school.grade(2), ("Aimee", ))
22
22
 
23
23
  def test_add_more_students_in_same_class(self):
24
24
  self.school.add("James", 2)
25
25
  self.school.add("Blair", 2)
26
26
  self.school.add("Paul", 2)
27
- self.assertCountEqual(("James", "Blair", "Paul"), self.school.grade(2))
27
+ self.assertCountEqual(self.school.grade(2), ("James", "Blair", "Paul"))
28
28
 
29
29
  def test_add_students_to_different_grades(self):
30
30
  self.school.add("Chelsea", 3)
31
31
  self.school.add("Logan", 7)
32
- self.assertCountEqual(("Chelsea",), self.school.grade(3))
33
- self.assertCountEqual(("Logan",), self.school.grade(7))
32
+ self.assertCountEqual(self.school.grade(3), ("Chelsea", ))
33
+ self.assertCountEqual(self.school.grade(7), ("Logan", ))
34
34
 
35
35
  def test_get_students_in_a_grade(self):
36
36
  self.school.add("Franklin", 5)
37
37
  self.school.add("Bradley", 5)
38
38
  self.school.add("Jeff", 1)
39
- self.assertCountEqual(("Franklin", "Bradley"), self.school.grade(5))
39
+ self.assertCountEqual(self.school.grade(5), ("Franklin", "Bradley"))
40
40
 
41
41
  def test_get_students_in_a_non_existant_grade(self):
42
- self.assertCountEqual(set(), self.school.grade(1))
42
+ self.assertCountEqual(self.school.grade(1), set())
43
43
 
44
44
  def test_sort_school(self):
45
+ students = [(3, ("Kyle", )), (4, ("Christopher", "Jennifer", )),
46
+ (6, ("Kareem", ))]
45
47
 
46
- students = [
47
- (3, ("Kyle",)),
48
- (4, ("Christopher", "Jennifer",)),
49
- (6, ("Kareem",))
50
- ]
51
48
  for grade, students_in_grade in students:
52
49
  for student in students_in_grade:
53
50
  self.school.add(student, grade)
@@ -55,14 +52,15 @@ class SchoolTest(unittest.TestCase):
55
52
  result = self.school.sort()
56
53
 
57
54
  # Attempts to catch false positives
58
- self.assertTrue(isinstance(result, Sequence) or
59
- isinstance(result, GeneratorType) or
60
- callable(getattr(result, '__reversed__', False)))
55
+ self.assertTrue(
56
+ isinstance(result, Sequence) or
57
+ isinstance(result, GeneratorType) or
58
+ callable(getattr(result, '__reversed__', False)))
61
59
 
62
- result_list = list(result.items() if hasattr(result, "items")
63
- else result)
60
+ result_list = list(result.items()
61
+ if hasattr(result, "items") else result)
64
62
 
65
- self.assertEqual(result_list, students)
63
+ self.assertEqual(students, result_list)
66
64
 
67
65
 
68
66
  if __name__ == '__main__':
@@ -5,32 +5,32 @@ from grains import on_square, total_after
5
5
 
6
6
  class GrainsTest(unittest.TestCase):
7
7
  def test_square_1(self):
8
- self.assertEqual(1, on_square(1))
9
- self.assertEqual(1, total_after(1))
8
+ self.assertEqual(on_square(1), 1)
9
+ self.assertEqual(total_after(1), 1)
10
10
 
11
11
  def test_square_2(self):
12
- self.assertEqual(2, on_square(2))
13
- self.assertEqual(3, total_after(2))
12
+ self.assertEqual(on_square(2), 2)
13
+ self.assertEqual(total_after(2), 3)
14
14
 
15
15
  def test_square_3(self):
16
- self.assertEqual(4, on_square(3))
17
- self.assertEqual(7, total_after(3))
16
+ self.assertEqual(on_square(3), 4)
17
+ self.assertEqual(total_after(3), 7)
18
18
 
19
19
  def test_square_4(self):
20
- self.assertEqual(8, on_square(4))
21
- self.assertEqual(15, total_after(4))
20
+ self.assertEqual(on_square(4), 8)
21
+ self.assertEqual(total_after(4), 15)
22
22
 
23
23
  def test_square_16(self):
24
- self.assertEqual(32768, on_square(16))
25
- self.assertEqual(65535, total_after(16))
24
+ self.assertEqual(on_square(16), 32768)
25
+ self.assertEqual(total_after(16), 65535)
26
26
 
27
27
  def test_square_32(self):
28
- self.assertEqual(2147483648, on_square(32))
29
- self.assertEqual(4294967295, total_after(32))
28
+ self.assertEqual(on_square(32), 2147483648)
29
+ self.assertEqual(total_after(32), 4294967295)
30
30
 
31
31
  def test_square_64(self):
32
- self.assertEqual(9223372036854775808, on_square(64))
33
- self.assertEqual(18446744073709551615, total_after(64))
32
+ self.assertEqual(on_square(64), 9223372036854775808)
33
+ self.assertEqual(total_after(64), 18446744073709551615)
34
34
 
35
35
 
36
36
  if __name__ == '__main__':
@@ -3,7 +3,6 @@ import unittest
3
3
 
4
4
  from grep import grep
5
5
 
6
-
7
6
  ILIADFILENAME = 'iliad.txt'
8
7
  ILIADCONTENTS = '''Achilles sing, O Goddess! Peleus' son;
9
8
  His wrath pernicious, who ten thousand woes
@@ -51,7 +50,6 @@ def create_file(name, contents):
51
50
 
52
51
 
53
52
  class GrepTest(unittest.TestCase):
54
-
55
53
  @classmethod
56
54
  def setUpClass(self):
57
55
  create_file(ILIADFILENAME, ILIADCONTENTS)
@@ -67,67 +65,57 @@ class GrepTest(unittest.TestCase):
67
65
  def test_one_file_one_match_no_flags(self):
68
66
  self.assertMultiLineEqual(
69
67
  grep("Agamemnon", [ILIADFILENAME]),
70
- "Of Atreus, Agamemnon, King of men.\n"
71
- )
68
+ "Of Atreus, Agamemnon, King of men.\n")
72
69
 
73
70
  def test_one_file_one_match_print_line_numbers_flag(self):
74
71
  self.assertMultiLineEqual(
75
72
  grep("Forbidden", [PARADISELOSTFILENAME], "-n"),
76
- "2:Of that Forbidden Tree, whose mortal tast\n"
77
- )
73
+ "2:Of that Forbidden Tree, whose mortal tast\n")
78
74
 
79
75
  def test_one_file_one_match_case_insensitive_flag(self):
80
76
  self.assertMultiLineEqual(
81
77
  grep("FORBIDDEN", [PARADISELOSTFILENAME], "-i"),
82
- "Of that Forbidden Tree, whose mortal tast\n"
83
- )
78
+ "Of that Forbidden Tree, whose mortal tast\n")
84
79
 
85
80
  def test_one_file_one_match_print_file_names_flag(self):
86
81
  self.assertMultiLineEqual(
87
82
  grep("Forbidden", [PARADISELOSTFILENAME], "-l"),
88
- PARADISELOSTFILENAME + '\n'
89
- )
83
+ PARADISELOSTFILENAME + '\n')
90
84
 
91
85
  def test_one_file_one_match_match_entire_lines_flag(self):
92
86
  self.assertMultiLineEqual(
93
- grep("With loss of Eden, till one greater Man", [PARADISELOSTFILENAME], "-x"),
94
- "With loss of Eden, till one greater Man\n"
95
- )
87
+ grep("With loss of Eden, till one greater Man",
88
+ [PARADISELOSTFILENAME], "-x"),
89
+ "With loss of Eden, till one greater Man\n")
96
90
 
97
91
  def test_one_file_one_match_multiple_flags(self):
98
92
  self.assertMultiLineEqual(
99
- grep("OF ATREUS, Agamemnon, KIng of MEN.", [ILIADFILENAME], "-n -i -x"),
100
- "9:Of Atreus, Agamemnon, King of men.\n"
101
- )
93
+ grep("OF ATREUS, Agamemnon, KIng of MEN.", [ILIADFILENAME],
94
+ "-n -i -x"), "9:Of Atreus, Agamemnon, King of men.\n")
102
95
 
103
96
  def test_one_file_several_matches_no_flags(self):
104
97
  self.assertMultiLineEqual(
105
98
  grep("may", [MIDSUMMERNIGHTFILENAME]),
106
99
  ("Nor how it may concern my modesty,\n"
107
100
  "But I beseech your grace that I may know\n"
108
- "The worst that may befall me in this case,\n")
109
- )
101
+ "The worst that may befall me in this case,\n"))
110
102
 
111
103
  def test_one_file_several_matches_print_line_numbers_flag(self):
112
104
  self.assertMultiLineEqual(
113
105
  grep("may", [MIDSUMMERNIGHTFILENAME], "-n"),
114
106
  ("3:Nor how it may concern my modesty,\n"
115
107
  "5:But I beseech your grace that I may know\n"
116
- "6:The worst that may befall me in this case,\n")
117
- )
108
+ "6:The worst that may befall me in this case,\n"))
118
109
 
119
110
  def test_one_file_several_matches_match_entire_lines_flag(self):
120
111
  self.assertMultiLineEqual(
121
- grep("may", [MIDSUMMERNIGHTFILENAME], "-x"),
122
- ""
123
- )
112
+ grep("may", [MIDSUMMERNIGHTFILENAME], "-x"), "")
124
113
 
125
114
  def test_one_file_several_matches_case_insensitive_flag(self):
126
115
  self.assertMultiLineEqual(
127
116
  grep("ACHILLES", [ILIADFILENAME], "-i"),
128
117
  ("Achilles sing, O Goddess! Peleus' son;\n"
129
- "The noble Chief Achilles from the son\n")
130
- )
118
+ "The noble Chief Achilles from the son\n"))
131
119
 
132
120
  def test_one_file_several_matches_inverted_flag(self):
133
121
  self.assertMultiLineEqual(
@@ -136,89 +124,88 @@ class GrepTest(unittest.TestCase):
136
124
  "With loss of Eden, till one greater Man\n"
137
125
  "Restore us, and regain the blissful Seat,\n"
138
126
  "Sing Heav'nly Muse, that on the secret top\n"
139
- "That Shepherd, who first taught the chosen Seed\n")
140
- )
127
+ "That Shepherd, who first taught the chosen Seed\n"))
141
128
 
142
129
  def test_one_file_no_matches_various_flags(self):
143
130
  self.assertMultiLineEqual(
144
- grep("Gandalf", [ILIADFILENAME], "-n -l -x -i"),
145
- ""
146
- )
131
+ grep("Gandalf", [ILIADFILENAME], "-n -l -x -i"), "")
147
132
 
148
133
  def test_multiple_files_one_match_no_flags(self):
149
134
  self.assertMultiLineEqual(
150
- grep("Agamemnon", [ILIADFILENAME, MIDSUMMERNIGHTFILENAME, PARADISELOSTFILENAME]),
151
- "iliad.txt:Of Atreus, Agamemnon, King of men.\n"
152
- )
135
+ grep(
136
+ "Agamemnon",
137
+ [ILIADFILENAME, MIDSUMMERNIGHTFILENAME, PARADISELOSTFILENAME]),
138
+ "iliad.txt:Of Atreus, Agamemnon, King of men.\n")
153
139
 
154
140
  def test_multiple_files_several_matches_no_flags(self):
155
141
  self.assertMultiLineEqual(
156
- grep("may", ["iliad.txt", "midsummer-night.txt", "paradise-lost.txt"]),
142
+ grep("may",
143
+ ["iliad.txt", "midsummer-night.txt", "paradise-lost.txt"]),
157
144
  ("midsummer-night.txt:Nor how it may concern my modesty,\n"
158
145
  "midsummer-night.txt:But I beseech your grace that I may know\n"
159
- "midsummer-night.txt:The worst that may befall me in this case,\n")
160
- )
146
+ "midsummer-night.txt:The worst that may befall me in this case,\n"
147
+ ))
161
148
 
162
149
  def test_multiple_files_several_matches_print_line_numbers_flag(self):
163
150
  self.assertMultiLineEqual(
164
- grep("that", ["iliad.txt", "midsummer-night.txt", "paradise-lost.txt"], "-n"),
151
+ grep("that",
152
+ ["iliad.txt", "midsummer-night.txt", "paradise-lost.txt"],
153
+ "-n"),
165
154
  ("midsummer-night.txt:5:But I beseech your grace that I may know\n"
166
- "midsummer-night.txt:6:The worst that may befall me in this case,\n"
167
- "paradise-lost.txt:2:Of that Forbidden Tree, whose mortal tast\n"
168
- "paradise-lost.txt:6:Sing Heav'nly Muse, that on the secret top\n")
169
- )
155
+ "midsummer-night.txt:6:The worst that may befall me in this case,"
156
+ "\nparadise-lost.txt:2:Of that Forbidden Tree, whose mortal tast"
157
+ "\nparadise-lost.txt:6:Sing Heav'nly Muse, that on the secret top"
158
+ "\n"))
170
159
 
171
160
  def test_multiple_files_one_match_print_file_names_flag(self):
172
161
  self.assertMultiLineEqual(
173
- grep("who", ["iliad.txt", "midsummer-night.txt", "paradise-lost.txt"], "-l"),
174
- ILIADFILENAME + '\n' + PARADISELOSTFILENAME + '\n'
175
- )
162
+ grep("who",
163
+ ["iliad.txt", "midsummer-night.txt", "paradise-lost.txt"],
164
+ "-l"), ILIADFILENAME + '\n' + PARADISELOSTFILENAME + '\n')
176
165
 
177
166
  def test_multiple_files_several_matches_case_insensitive_flag(self):
178
167
  self.assertMultiLineEqual(
179
- grep("TO", ["iliad.txt", "midsummer-night.txt", "paradise-lost.txt"], "-i"),
168
+ grep("TO",
169
+ ["iliad.txt", "midsummer-night.txt", "paradise-lost.txt"],
170
+ "-i"),
180
171
  ("iliad.txt:Caused to Achaia's host, sent many a soul\n"
181
172
  "iliad.txt:Illustrious into Ades premature,\n"
182
173
  "iliad.txt:And Heroes gave (so stood the will of Jove)\n"
183
174
  "iliad.txt:To dogs and to all ravening fowls a prey,\n"
184
175
  "midsummer-night.txt:I do entreat your grace to pardon me.\n"
185
- "midsummer-night.txt:In such a presence here to plead my thoughts;\n"
186
- "midsummer-night.txt:If I refuse to wed Demetrius.\n"
187
- "paradise-lost.txt:Brought Death into the World, and all our woe,\n"
188
- "paradise-lost.txt:Restore us, and regain the blissful Seat,\n"
189
- "paradise-lost.txt:Sing Heav'nly Muse, that on the secret top\n")
190
- )
176
+ "midsummer-night.txt:In such a presence here to plead my thoughts"
177
+ ";\nmidsummer-night.txt:If I refuse to wed Demetrius.\n"
178
+ "paradise-lost.txt:Brought Death into the World, and all our woe,"
179
+ "\nparadise-lost.txt:Restore us, and regain the blissful Seat,\n"
180
+ "paradise-lost.txt:Sing Heav'nly Muse, that on the secret top\n"))
191
181
 
192
182
  def test_multiple_files_several_matches_inverted_flag(self):
193
183
  self.assertMultiLineEqual(
194
- grep("a", ["iliad.txt", "midsummer-night.txt", "paradise-lost.txt"], "-v"),
195
- ("iliad.txt:Achilles sing, O Goddess! Peleus' son;\n"
196
- "iliad.txt:The noble Chief Achilles from the son\n"
197
- "midsummer-night.txt:If I refuse to wed Demetrius.\n")
198
- )
184
+ grep(
185
+ "a", ["iliad.txt", "midsummer-night.txt", "paradise-lost.txt"],
186
+ "-v"), ("iliad.txt:Achilles sing, O Goddess! Peleus' son;\n"
187
+ "iliad.txt:The noble Chief Achilles from the son\n"
188
+ "midsummer-night.txt:If I refuse to wed Demetrius.\n"))
199
189
 
200
190
  def test_multiple_files_one_match_match_entire_lines_flag(self):
201
191
  self.assertMultiLineEqual(
202
192
  grep("But I beseech your grace that I may know",
203
193
  ["iliad.txt", "midsummer-night.txt", "paradise-lost.txt"],
204
194
  "-x"),
205
- "midsummer-night.txt:But I beseech your grace that I may know\n"
206
- )
195
+ "midsummer-night.txt:But I beseech your grace that I may know\n")
207
196
 
208
197
  def test_multiple_files_one_match_multiple_flags(self):
209
198
  self.assertMultiLineEqual(
210
199
  grep("WITH LOSS OF EDEN, TILL ONE GREATER MAN",
211
200
  ["iliad.txt", "midsummer-night.txt", "paradise-lost.txt"],
212
201
  "-n -i -x"),
213
- "paradise-lost.txt:4:With loss of Eden, till one greater Man\n"
214
- )
202
+ "paradise-lost.txt:4:With loss of Eden, till one greater Man\n")
215
203
 
216
204
  def test_multiple_files_no_matches_various_flags(self):
217
205
  self.assertMultiLineEqual(
218
- grep("Frodo", ["iliad.txt", "midsummer-night.txt", "paradise-lost.txt"],
219
- "-n -l -x -i"),
220
- ""
221
- )
206
+ grep("Frodo",
207
+ ["iliad.txt", "midsummer-night.txt", "paradise-lost.txt"],
208
+ "-n -l -x -i"), "")
222
209
 
223
210
 
224
211
  if __name__ == '__main__':
@@ -8,43 +8,43 @@ import hamming
8
8
  class HammingTest(unittest.TestCase):
9
9
 
10
10
  def test_identical_strands(self):
11
- self.assertEqual(0, hamming.distance("A", "A"))
11
+ self.assertEqual(hamming.distance("A", "A"), 0)
12
12
 
13
13
  def test_long_identical_strands(self):
14
- self.assertEqual(0, hamming.distance("GGACTGA", "GGACTGA"))
14
+ self.assertEqual(hamming.distance("GGACTGA", "GGACTGA"), 0)
15
15
 
16
16
  def test_complete_distance_in_single_nucleotide_strands(self):
17
- self.assertEqual(1, hamming.distance("A", "G"))
17
+ self.assertEqual(hamming.distance("A", "G"), 1)
18
18
 
19
19
  def test_complete_distance_in_small_strands(self):
20
- self.assertEqual(2, hamming.distance("AG", "CT"))
20
+ self.assertEqual(hamming.distance("AG", "CT"), 2)
21
21
 
22
22
  def test_small_distance_in_small_strands(self):
23
- self.assertEqual(1, hamming.distance("AT", "CT"))
23
+ self.assertEqual(hamming.distance("AT", "CT"), 1)
24
24
 
25
25
  def test_small_distance(self):
26
- self.assertEqual(1, hamming.distance("GGACG", "GGTCG"))
26
+ self.assertEqual(hamming.distance("GGACG", "GGTCG"), 1)
27
27
 
28
28
  def test_small_distance_in_long_strands(self):
29
- self.assertEqual(2, hamming.distance("ACCAGGG", "ACTATGG"))
29
+ self.assertEqual(hamming.distance("ACCAGGG", "ACTATGG"), 2)
30
30
 
31
31
  def test_non_unique_character_in_first_strand(self):
32
- self.assertEqual(1, hamming.distance("AGA", "AGG"))
32
+ self.assertEqual(hamming.distance("AGA", "AGG"), 1)
33
33
 
34
34
  def test_non_unique_character_in_second_strand(self):
35
- self.assertEqual(1, hamming.distance("AGG", "AGA"))
35
+ self.assertEqual(hamming.distance("AGG", "AGA"), 1)
36
36
 
37
37
  def test_same_nucleotides_in_different_positions(self):
38
- self.assertEqual(2, hamming.distance("TAG", "GAT"))
38
+ self.assertEqual(hamming.distance("TAG", "GAT"), 2)
39
39
 
40
40
  def test_large_distance(self):
41
- self.assertEqual(4, hamming.distance("GATACA", "GCATAA"))
41
+ self.assertEqual(hamming.distance("GATACA", "GCATAA"), 4)
42
42
 
43
43
  def test_large_distance_in_off_by_one_strand(self):
44
- self.assertEqual(9, hamming.distance("GGACGGATTCTG", "AGGACGGATTCT"))
44
+ self.assertEqual(hamming.distance("GGACGGATTCTG", "AGGACGGATTCT"), 9)
45
45
 
46
46
  def test_empty_strands(self):
47
- self.assertEqual(0, hamming.distance("", ""))
47
+ self.assertEqual(hamming.distance("", ""), 0)
48
48
 
49
49
  def test_disallow_first_strand_longer(self):
50
50
  with self.assertRaises(ValueError):
@@ -6,9 +6,8 @@ import hello_world
6
6
  # test cases adapted from `x-common//canonical-data.json` @ version: 1.0.0
7
7
 
8
8
  class HelloWorldTests(unittest.TestCase):
9
-
10
9
  def test_hello(self):
11
- self.assertEqual('Hello, World!', hello_world.hello())
10
+ self.assertEqual(hello_world.hello(), 'Hello, World!')
12
11
 
13
12
 
14
13
  if __name__ == '__main__':
@@ -7,33 +7,32 @@ from hexadecimal import hexa
7
7
 
8
8
 
9
9
  class HexadecimalTest(unittest.TestCase):
10
-
11
10
  def test_valid_hexa1(self):
12
- self.assertEqual(1, hexa('1'))
11
+ self.assertEqual(hexa('1'), 1)
13
12
 
14
13
  def test_valid_hexa2(self):
15
- self.assertEqual(12, hexa('c'))
14
+ self.assertEqual(hexa('c'), 12)
16
15
 
17
16
  def test_valid_hexa3(self):
18
- self.assertEqual(16, hexa('10'))
17
+ self.assertEqual(hexa('10'), 16)
19
18
 
20
19
  def test_valid_hexa4(self):
21
- self.assertEqual(175, hexa('af'))
20
+ self.assertEqual(hexa('af'), 175)
22
21
 
23
22
  def test_valid_hexa5(self):
24
- self.assertEqual(256, hexa('100'))
23
+ self.assertEqual(hexa('100'), 256)
25
24
 
26
25
  def test_valid_hexa6(self):
27
- self.assertEqual(105166, hexa('19ACE'))
26
+ self.assertEqual(hexa('19ACE'), 105166)
28
27
 
29
28
  def test_valid_hexa7(self):
30
- self.assertEqual(0, hexa('000000'))
29
+ self.assertEqual(hexa('000000'), 0)
31
30
 
32
31
  def test_valid_hexa8(self):
33
- self.assertEqual(16776960, hexa('ffff00'))
32
+ self.assertEqual(hexa('ffff00'), 16776960)
34
33
 
35
34
  def test_valid_hexa9(self):
36
- self.assertEqual(65520, hexa('00fff0'))
35
+ self.assertEqual(hexa('00fff0'), 65520)
37
36
 
38
37
  def test_invalid_hexa(self):
39
38
  with self.assertRaises(ValueError):