trackler 2.2.1.137 → 2.2.1.138

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 (130) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/diffie-hellman/canonical-data.json +72 -0
  4. data/problem-specifications/exercises/yacht/description.md +2 -2
  5. data/tracks/csharp/exercises/sgf-parsing/Example.cs +1 -1
  6. data/tracks/csharp/exercises/sgf-parsing/SgfParsingTest.cs +1 -1
  7. data/tracks/csharp/exercises/sublist/SublistTest.cs +37 -78
  8. data/tracks/csharp/generators/Exercises/Sublist.cs +32 -0
  9. data/tracks/elisp/exercises/bob/README.md +2 -0
  10. data/tracks/elisp/exercises/bob/bob-test.el +60 -15
  11. data/tracks/elisp/exercises/bob/example.el +15 -5
  12. data/tracks/elisp/exercises/hamming/hamming-test.el +1 -1
  13. data/tracks/fsharp/build.ps1 +3 -3
  14. data/tracks/fsharp/build.sh +3 -3
  15. data/tracks/fsharp/exercises/bracket-push/BracketPushTest.fs +5 -1
  16. data/tracks/fsharp/exercises/isbn-verifier/IsbnVerifierTest.fs +5 -1
  17. data/tracks/fsharp/exercises/kindergarten-garden/KindergartenGardenTest.fs +1 -1
  18. data/tracks/fsharp/exercises/pov/PovTest.fs +6 -1
  19. data/tracks/fsharp/exercises/react/Example.fs +2 -2
  20. data/tracks/fsharp/exercises/react/React.fsproj +1 -0
  21. data/tracks/fsharp/exercises/react/ReactTest.fs +55 -33
  22. data/tracks/fsharp/exercises/series/Example.fs +2 -12
  23. data/tracks/fsharp/exercises/series/SeriesTest.fs +33 -56
  24. data/tracks/fsharp/generators/Generators.fs +81 -46
  25. data/tracks/idris/exercises/rna-transcription/src/{example.idr → Example.idr} +0 -0
  26. data/tracks/java/config.json +14 -0
  27. data/tracks/java/exercises/acronym/src/test/java/AcronymTest.java +10 -10
  28. data/tracks/java/exercises/all-your-base/src/test/java/BaseConverterTest.java +39 -39
  29. data/tracks/java/exercises/grep/.meta/hints.md +58 -0
  30. data/tracks/java/exercises/grep/.meta/src/reference/java/GrepTool.java +65 -0
  31. data/tracks/java/exercises/grep/.meta/version +1 -0
  32. data/tracks/java/exercises/grep/README.md +145 -0
  33. data/tracks/java/exercises/grep/build.gradle +18 -0
  34. data/tracks/java/exercises/grep/src/main/java/.keep +0 -0
  35. data/tracks/java/exercises/grep/src/test/java/GrepToolTest.java +395 -0
  36. data/tracks/java/exercises/largest-series-product/src/test/java/LargestSeriesProductCalculatorTest.java +36 -36
  37. data/tracks/java/exercises/minesweeper/src/test/java/MinesweeperBoardTest.java +36 -36
  38. data/tracks/java/exercises/phone-number/src/test/java/PhoneNumberTest.java +14 -14
  39. data/tracks/java/exercises/poker/src/test/java/PokerTest.java +40 -40
  40. data/tracks/java/exercises/pythagorean-triplet/src/test/java/PythagoreanTripletTest.java +10 -10
  41. data/tracks/java/exercises/settings.gradle +1 -0
  42. data/tracks/ocaml/exercises/anagram/example.ml +1 -1
  43. data/tracks/ocaml/exercises/change/example.ml +1 -1
  44. data/tracks/ocaml/exercises/custom-set/example.ml +4 -3
  45. data/tracks/ocaml/exercises/custom-set/test.ml +0 -1
  46. data/tracks/ocaml/exercises/dominoes/test.ml +1 -1
  47. data/tracks/ocaml/exercises/etl/example.ml +1 -1
  48. data/tracks/ocaml/exercises/grade-school/example.ml +1 -1
  49. data/tracks/ocaml/exercises/palindrome-products/example.ml +2 -2
  50. data/tracks/ocaml/exercises/prime-factors/example.ml +1 -1
  51. data/tracks/ocaml/exercises/robot-name/test.ml +1 -1
  52. data/tracks/ocaml/exercises/triangle/example.ml +1 -1
  53. data/tracks/ocaml/make-exercise.sh +1 -0
  54. data/tracks/ocaml/tools/test-generator/src/controller.ml +1 -1
  55. data/tracks/perl5/exercises/raindrops/.meta/solutions/Raindrops.pm +13 -12
  56. data/tracks/perl5/exercises/raindrops/raindrops.t +166 -111
  57. data/tracks/perl6/docs/INSTALLATION.md +1 -3
  58. data/tracks/perl6/exercises/raindrops/.meta/exercise-data.yaml +5 -5
  59. data/tracks/perl6/exercises/raindrops/.meta/solutions/Raindrops.pm6 +2 -2
  60. data/tracks/perl6/exercises/raindrops/Raindrops.pm6 +2 -2
  61. data/tracks/perl6/exercises/raindrops/raindrops.t +3 -3
  62. data/tracks/python/exercises/food-chain/example.py +11 -2
  63. data/tracks/python/exercises/food-chain/food_chain_test.py +48 -45
  64. data/tracks/python/exercises/pov/pov_test.py +12 -1
  65. data/tracks/python/exercises/series/README.md +6 -6
  66. data/tracks/python/exercises/series/example.py +2 -3
  67. data/tracks/python/exercises/series/series_test.py +27 -28
  68. data/tracks/python/exercises/sgf-parsing/example.py +1 -1
  69. data/tracks/python/exercises/sgf-parsing/sgf_parsing_test.py +1 -1
  70. data/tracks/python/exercises/yacht/README.md +2 -2
  71. data/tracks/ruby/Gemfile +0 -1
  72. data/tracks/ruby/README.md +23 -0
  73. data/tracks/ruby/bin/generate +1 -0
  74. data/tracks/ruby/exercises/complex-numbers/complex_numbers_test.rb +1 -1
  75. data/tracks/ruby/lib/generator.rb +1 -2
  76. data/tracks/ruby/lib/generator/command_line.rb +3 -0
  77. data/tracks/ruby/lib/generator/command_line/generator_optparser.rb +1 -0
  78. data/tracks/ruby/lib/generator/exercise.rb +2 -0
  79. data/tracks/ruby/lib/generator/exercise_case.rb +3 -0
  80. data/tracks/ruby/lib/generator/files.rb +1 -0
  81. data/tracks/ruby/lib/generator/files/metadata_files.rb +2 -0
  82. data/tracks/ruby/lib/generator/files/track_files.rb +1 -0
  83. data/tracks/ruby/lib/generator/implementation.rb +1 -0
  84. data/tracks/ruby/lib/generator/repository.rb +3 -0
  85. data/tracks/ruby/lib/generator/template_values.rb +1 -0
  86. data/tracks/ruby/test/generator/case_values_test.rb +2 -0
  87. data/tracks/ruby/test/generator/command_line_test.rb +1 -0
  88. data/tracks/ruby/test/generator/files/metadata_files_test.rb +2 -0
  89. data/tracks/ruby/test/generator/files/track_files_test.rb +1 -0
  90. data/tracks/ruby/test/generator/implementation_test.rb +1 -0
  91. data/tracks/ruby/test/tasks/exercise_test.rb +1 -0
  92. data/tracks/ruby/test/tasks/exercise_test_tasks_test.rb +2 -0
  93. data/tracks/ruby/test/test_helper.rb +1 -3
  94. data/tracks/rust/config.json +12 -0
  95. data/tracks/rust/exercises/atbash-cipher/src/lib.rs +9 -0
  96. data/tracks/rust/exercises/hamming/src/lib.rs +6 -0
  97. data/tracks/rust/exercises/isogram/src/lib.rs +3 -0
  98. data/tracks/rust/exercises/luhn/src/lib.rs +4 -0
  99. data/tracks/rust/exercises/palindrome-products/.meta/test-in-release-mode +1 -0
  100. data/tracks/rust/exercises/palindrome-products/Cargo.toml +6 -0
  101. data/tracks/rust/exercises/palindrome-products/README.md +72 -0
  102. data/tracks/rust/exercises/palindrome-products/example.rs +25 -0
  103. data/tracks/rust/exercises/palindrome-products/src/lib.rs +22 -0
  104. data/tracks/rust/exercises/palindrome-products/tests/palindrome-products.rs +57 -0
  105. data/tracks/rust/exercises/pangram/src/lib.rs +4 -0
  106. data/tracks/rust/exercises/run-length-encoding/src/lib.rs +7 -0
  107. data/tracks/rust/exercises/say/src/lib.rs +3 -4
  108. data/tracks/rust/exercises/scrabble-score/src/lib.rs +4 -0
  109. data/tracks/rust/exercises/word-count/src/lib.rs +6 -0
  110. data/tracks/scheme/exercises/hello-world/example.scm +1 -4
  111. data/tracks/scheme/exercises/hello-world/hello-world-test.scm +1 -5
  112. data/tracks/scheme/exercises/scrabble-score/scrabble-score-test.scm +2 -2
  113. data/tracks/typescript/config.json +30 -0
  114. data/tracks/typescript/exercises/queen-attack/README.md +59 -0
  115. data/tracks/typescript/exercises/queen-attack/package.json +36 -0
  116. data/tracks/typescript/exercises/queen-attack/queen-attack.example.ts +56 -0
  117. data/tracks/typescript/exercises/queen-attack/queen-attack.test.ts +71 -0
  118. data/tracks/typescript/exercises/queen-attack/queen-attack.ts +0 -0
  119. data/tracks/typescript/exercises/queen-attack/tsconfig.json +22 -0
  120. data/tracks/typescript/exercises/queen-attack/tslint.json +127 -0
  121. data/tracks/typescript/exercises/queen-attack/yarn.lock +2624 -0
  122. data/tracks/typescript/exercises/spiral-matrix/README.md +56 -0
  123. data/tracks/typescript/exercises/spiral-matrix/package.json +36 -0
  124. data/tracks/typescript/exercises/spiral-matrix/spiral-matrix.example.ts +33 -0
  125. data/tracks/typescript/exercises/spiral-matrix/spiral-matrix.test.ts +49 -0
  126. data/tracks/typescript/exercises/spiral-matrix/spiral-matrix.ts +0 -0
  127. data/tracks/typescript/exercises/spiral-matrix/tsconfig.json +22 -0
  128. data/tracks/typescript/exercises/spiral-matrix/tslint.json +127 -0
  129. data/tracks/typescript/exercises/spiral-matrix/yarn.lock +2624 -0
  130. metadata +35 -3
@@ -0,0 +1,18 @@
1
+ apply plugin: "java"
2
+ apply plugin: "eclipse"
3
+ apply plugin: "idea"
4
+
5
+ repositories {
6
+ mavenCentral()
7
+ }
8
+
9
+ dependencies {
10
+ testCompile "junit:junit:4.12"
11
+ }
12
+
13
+ test {
14
+ testLogging {
15
+ exceptionFormat = 'full'
16
+ events = ["passed", "failed", "skipped"]
17
+ }
18
+ }
@@ -0,0 +1,395 @@
1
+ import org.junit.After;
2
+ import org.junit.Before;
3
+ import org.junit.Ignore;
4
+ import org.junit.Test;
5
+
6
+ import java.io.IOException;
7
+ import java.nio.charset.Charset;
8
+ import java.nio.file.Files;
9
+ import java.nio.file.Path;
10
+ import java.nio.file.Paths;
11
+ import java.util.Arrays;
12
+ import java.util.Collections;
13
+ import java.util.List;
14
+
15
+ import static org.junit.Assert.assertEquals;
16
+
17
+ public class GrepToolTest {
18
+ private GrepTool grepTool;
19
+
20
+ @Before
21
+ public void setUp() throws IOException {
22
+ List<String> iliadText = Arrays.asList(
23
+ "Achilles sing, O Goddess! Peleus' son;",
24
+ "His wrath pernicious, who ten thousand woes",
25
+ "Caused to Achaia's host, sent many a soul",
26
+ "Illustrious into Ades premature,",
27
+ "And Heroes gave (so stood the will of Jove)",
28
+ "To dogs and to all ravening fowls a prey,",
29
+ "When fierce dispute had separated once",
30
+ "The noble Chief Achilles from the son",
31
+ "Of Atreus, Agamemnon, King of men."
32
+ );
33
+ writeToFile("iliad.txt", iliadText);
34
+
35
+ List<String> midsummerNightText = Arrays.asList(
36
+ "I do entreat your grace to pardon me.",
37
+ "I know not by what power I am made bold,",
38
+ "Nor how it may concern my modesty,",
39
+ "In such a presence here to plead my thoughts;",
40
+ "But I beseech your grace that I may know",
41
+ "The worst that may befall me in this case,",
42
+ "If I refuse to wed Demetrius."
43
+ );
44
+ writeToFile("midsummer-night.txt", midsummerNightText);
45
+
46
+ List<String> paradiseLostText = Arrays.asList(
47
+ "Of Mans First Disobedience, and the Fruit",
48
+ "Of that Forbidden Tree, whose mortal tast",
49
+ "Brought Death into the World, and all our woe,",
50
+ "With loss of Eden, till one greater Man",
51
+ "Restore us, and regain the blissful Seat,",
52
+ "Sing Heav'nly Muse, that on the secret top",
53
+ "Of Oreb, or of Sinai, didst inspire",
54
+ "That Shepherd, who first taught the chosen Seed"
55
+ );
56
+ writeToFile("paradise-lost.txt", paradiseLostText);
57
+
58
+ grepTool = new GrepTool();
59
+ }
60
+
61
+ @After
62
+ public void tearDown() throws IOException {
63
+ deleteFile("iliad.txt");
64
+ deleteFile("midsummer-night.txt");
65
+ deleteFile("paradise-lost.txt");
66
+ }
67
+
68
+ @Test
69
+ public void oneFileOneMatchNoFlags() {
70
+ String expected = "Of Atreus, Agamemnon, King of men.";
71
+
72
+ String actual = grepTool.grep(
73
+ "Agamemnon",
74
+ Collections.emptyList(),
75
+ Collections.singletonList("iliad.txt")
76
+ );
77
+
78
+ assertEquals(expected, actual);
79
+ }
80
+
81
+ @Ignore("Remove to run test")
82
+ @Test
83
+ public void oneFileOneMatchPrintLineNumbersFlag() {
84
+ String expected = "2:Of that Forbidden Tree, whose mortal tast";
85
+
86
+ String actual = grepTool.grep(
87
+ "Forbidden",
88
+ Collections.singletonList("-n"),
89
+ Collections.singletonList("paradise-lost.txt")
90
+ );
91
+
92
+ assertEquals(expected, actual);
93
+ }
94
+
95
+ @Ignore("Remove to run test")
96
+ @Test
97
+ public void oneFileOneMatchCaseInsensitiveFlag() {
98
+ String expected = "Of that Forbidden Tree, whose mortal tast";
99
+
100
+ String actual = grepTool.grep(
101
+ "FORBIDDEN",
102
+ Collections.singletonList("-i"),
103
+ Collections.singletonList("paradise-lost.txt")
104
+ );
105
+
106
+ assertEquals(expected, actual);
107
+ }
108
+
109
+ @Ignore("Remove to run test")
110
+ @Test
111
+ public void oneFileOneMatchPrintFileNamesFlag() {
112
+ String expected = "paradise-lost.txt";
113
+
114
+ String actual = grepTool.grep(
115
+ "Forbidden",
116
+ Collections.singletonList("-l"),
117
+ Collections.singletonList("paradise-lost.txt")
118
+ );
119
+
120
+ assertEquals(expected, actual);
121
+ }
122
+
123
+ @Ignore("Remove to run test")
124
+ @Test
125
+ public void oneFileOneMatchEntireLinesFlag() {
126
+ String expected = "With loss of Eden, till one greater Man";
127
+
128
+ String actual = grepTool.grep(
129
+ "With loss of Eden, till one greater Man",
130
+ Collections.singletonList("-x"),
131
+ Collections.singletonList("paradise-lost.txt")
132
+ );
133
+
134
+ assertEquals(expected, actual);
135
+ }
136
+
137
+ @Ignore("Remove to run test")
138
+ @Test
139
+ public void oneFileOneMatchMultipleFlags() {
140
+ String expected = "9:Of Atreus, Agamemnon, King of men.";
141
+
142
+ String actual = grepTool.grep(
143
+ "OF ATREUS, Agamemnon, KIng of MEN.",
144
+ Arrays.asList("-n", "-i", "-x"),
145
+ Collections.singletonList("iliad.txt")
146
+ );
147
+
148
+ assertEquals(expected, actual);
149
+ }
150
+
151
+ @Ignore("Remove to run test")
152
+ @Test
153
+ public void oneFileSeveralMatchesNoFlags() {
154
+ String expected = "Nor how it may concern my modesty,\n"
155
+ + "But I beseech your grace that I may know\n"
156
+ + "The worst that may befall me in this case,";
157
+
158
+ String actual = grepTool.grep(
159
+ "may",
160
+ Collections.emptyList(),
161
+ Collections.singletonList("midsummer-night.txt")
162
+ );
163
+
164
+ assertEquals(expected, actual);
165
+ }
166
+
167
+ @Ignore("Remove to run test")
168
+ @Test
169
+ public void oneFileSeveralMatchesPrintLineNumbersFlag() {
170
+ String expected = "3:Nor how it may concern my modesty,\n"
171
+ + "5:But I beseech your grace that I may know\n"
172
+ + "6:The worst that may befall me in this case,";
173
+
174
+ String actual = grepTool.grep(
175
+ "may",
176
+ Collections.singletonList("-n"),
177
+ Collections.singletonList("midsummer-night.txt")
178
+ );
179
+
180
+ assertEquals(expected, actual);
181
+ }
182
+
183
+ @Ignore("Remove to run test")
184
+ @Test
185
+ public void oneFileSeveralMatchesMatchEntireLineFlag() {
186
+ String expected = "";
187
+
188
+ String actual = grepTool.grep(
189
+ "may",
190
+ Collections.singletonList("-x"),
191
+ Collections.singletonList("midsummer-night.txt")
192
+ );
193
+
194
+ assertEquals(expected, actual);
195
+ }
196
+
197
+ @Ignore("Remove to run test")
198
+ @Test
199
+ public void oneFileSeveralMatchesCaseInsensitiveFlag() {
200
+ String expected = "Achilles sing, O Goddess! Peleus' son;\n"
201
+ + "The noble Chief Achilles from the son";
202
+
203
+ String actual = grepTool.grep(
204
+ "ACHILLES",
205
+ Collections.singletonList("-i"),
206
+ Collections.singletonList("iliad.txt")
207
+ );
208
+
209
+ assertEquals(expected, actual);
210
+ }
211
+
212
+ @Ignore("Remove to run test")
213
+ @Test
214
+ public void oneFileSeveralMatchesInvertedFlag() {
215
+ String expected = "Brought Death into the World, and all our woe,\n"
216
+ + "With loss of Eden, till one greater Man\n"
217
+ + "Restore us, and regain the blissful Seat,\n"
218
+ + "Sing Heav'nly Muse, that on the secret top\n"
219
+ + "That Shepherd, who first taught the chosen Seed";
220
+
221
+ String actual = grepTool.grep(
222
+ "Of",
223
+ Collections.singletonList("-v"),
224
+ Collections.singletonList("paradise-lost.txt")
225
+ );
226
+
227
+ assertEquals(expected, actual);
228
+ }
229
+
230
+ @Ignore("Remove to run test")
231
+ @Test
232
+ public void oneFileNoMatchesVariousFlags() {
233
+ String expected = "";
234
+
235
+ String actual = grepTool.grep(
236
+ "Gandalf",
237
+ Arrays.asList("-n", "-l", "-x", "-i"),
238
+ Collections.singletonList("iliad.txt")
239
+ );
240
+
241
+ assertEquals(expected, actual);
242
+ }
243
+
244
+ @Ignore("Remove to run test")
245
+ @Test
246
+ public void multipleFilesOneMatchNoFlags() {
247
+ String expected = "iliad.txt:Of Atreus, Agamemnon, King of men.";
248
+
249
+ String actual = grepTool.grep(
250
+ "Agamemnon",
251
+ Collections.emptyList(),
252
+ Arrays.asList("iliad.txt", "midsummer-night.txt", "paradise-lost.txt")
253
+ );
254
+
255
+ assertEquals(expected, actual);
256
+ }
257
+
258
+ @Ignore("Remove to run test")
259
+ @Test
260
+ public void multipleFilesSeveralMatchesNoFlags() {
261
+ String expected = "midsummer-night.txt:Nor how it may concern my modesty,\n"
262
+ + "midsummer-night.txt:But I beseech your grace that I may know\n"
263
+ + "midsummer-night.txt:The worst that may befall me in this case,";
264
+
265
+ String actual = grepTool.grep(
266
+ "may",
267
+ Collections.emptyList(),
268
+ Arrays.asList("iliad.txt", "midsummer-night.txt", "paradise-lost.txt")
269
+ );
270
+
271
+ assertEquals(expected, actual);
272
+ }
273
+
274
+ @Ignore("Remove to run test")
275
+ @Test
276
+ public void multipleFilesSeveralMatchesPrintLineNumbersFlag() {
277
+ String expected = "midsummer-night.txt:5:But I beseech your grace that I may know\n"
278
+ + "midsummer-night.txt:6:The worst that may befall me in this case,\n"
279
+ + "paradise-lost.txt:2:Of that Forbidden Tree, whose mortal tast\n"
280
+ + "paradise-lost.txt:6:Sing Heav'nly Muse, that on the secret top";
281
+
282
+ String actual = grepTool.grep(
283
+ "that",
284
+ Collections.singletonList("-n"),
285
+ Arrays.asList("iliad.txt", "midsummer-night.txt", "paradise-lost.txt")
286
+ );
287
+
288
+ assertEquals(expected, actual);
289
+ }
290
+
291
+ @Ignore("Remove to run test")
292
+ @Test
293
+ public void multipleFilesOneMatchPrintFileNamesFlag() {
294
+ String expected = "iliad.txt\n"
295
+ + "paradise-lost.txt";
296
+
297
+ String actual = grepTool.grep(
298
+ "who",
299
+ Collections.singletonList("-l"),
300
+ Arrays.asList("iliad.txt", "midsummer-night.txt", "paradise-lost.txt")
301
+ );
302
+
303
+ assertEquals(expected, actual);
304
+ }
305
+
306
+ @Ignore("Remove to run test")
307
+ @Test
308
+ public void multipleFilesSeveralMatchesCaseInsensitiveFlag() {
309
+ String expected = "iliad.txt:Caused to Achaia's host, sent many a soul\n"
310
+ + "iliad.txt:Illustrious into Ades premature,\n"
311
+ + "iliad.txt:And Heroes gave (so stood the will of Jove)\n"
312
+ + "iliad.txt:To dogs and to all ravening fowls a prey,\n"
313
+ + "midsummer-night.txt:I do entreat your grace to pardon me.\n"
314
+ + "midsummer-night.txt:In such a presence here to plead my thoughts;\n"
315
+ + "midsummer-night.txt:If I refuse to wed Demetrius.\n"
316
+ + "paradise-lost.txt:Brought Death into the World, and all our woe,\n"
317
+ + "paradise-lost.txt:Restore us, and regain the blissful Seat,\n"
318
+ + "paradise-lost.txt:Sing Heav'nly Muse, that on the secret top";
319
+
320
+ String actual = grepTool.grep(
321
+ "TO",
322
+ Collections.singletonList("-i"),
323
+ Arrays.asList("iliad.txt", "midsummer-night.txt", "paradise-lost.txt")
324
+ );
325
+
326
+ assertEquals(expected, actual);
327
+ }
328
+
329
+ @Ignore("Remove to run test")
330
+ @Test
331
+ public void multipleFilesSeveralMatchesInvertedFlag() {
332
+ String expected = "iliad.txt:Achilles sing, O Goddess! Peleus' son;\n"
333
+ + "iliad.txt:The noble Chief Achilles from the son\n"
334
+ + "midsummer-night.txt:If I refuse to wed Demetrius.";
335
+
336
+ String actual = grepTool.grep(
337
+ "a",
338
+ Collections.singletonList("-v"),
339
+ Arrays.asList("iliad.txt", "midsummer-night.txt", "paradise-lost.txt")
340
+ );
341
+
342
+ assertEquals(expected, actual);
343
+ }
344
+
345
+ @Ignore("Remove to run test")
346
+ @Test
347
+ public void multipleFilesOneMatchEntireLinesFlag() {
348
+ String expected = "midsummer-night.txt:But I beseech your grace that I may know";
349
+
350
+ String actual = grepTool.grep(
351
+ "But I beseech your grace that I may know",
352
+ Collections.singletonList("-x"),
353
+ Arrays.asList("iliad.txt", "midsummer-night.txt", "paradise-lost.txt")
354
+ );
355
+
356
+ assertEquals(expected, actual);
357
+ }
358
+
359
+ @Ignore("Remove to run test")
360
+ @Test
361
+ public void multipleFilesOneMatchMultipleFlags() {
362
+ String expected = "paradise-lost.txt:4:With loss of Eden, till one greater Man";
363
+
364
+ String actual = grepTool.grep(
365
+ "WITH LOSS OF EDEN, TILL ONE GREATER MAN",
366
+ Arrays.asList("-n", "-i", "-x"),
367
+ Arrays.asList("iliad.txt", "midsummer-night.txt", "paradise-lost.txt")
368
+ );
369
+
370
+ assertEquals(expected, actual);
371
+ }
372
+
373
+ @Ignore("Remove to run test")
374
+ @Test
375
+ public void multipleFilesNoMatchesVariousFlags() {
376
+ String expected = "";
377
+
378
+ String actual = grepTool.grep(
379
+ "Frodo",
380
+ Arrays.asList("-n", "-l", "-i", "-x"),
381
+ Arrays.asList("iliad.txt", "midsummer-night.txt", "paradise-lost.txt")
382
+ );
383
+
384
+ assertEquals(expected, actual);
385
+ }
386
+
387
+ private void writeToFile(String filename, List<String> contents) throws IOException {
388
+ Path file = Paths.get(filename);
389
+ Files.write(file, contents, Charset.forName("UTF-8"));
390
+ }
391
+
392
+ private void deleteFile(String filename) throws IOException {
393
+ Files.deleteIfExists(Paths.get(filename));
394
+ }
395
+ }
@@ -12,10 +12,10 @@ public class LargestSeriesProductCalculatorTest {
12
12
 
13
13
  @Test
14
14
  public void testCorrectlyCalculatesLargestProductWhenSeriesLengthEqualsStringToSearchLength() {
15
- final LargestSeriesProductCalculator calculator = new LargestSeriesProductCalculator("29");
16
- final long expectedProduct = 18;
15
+ LargestSeriesProductCalculator calculator = new LargestSeriesProductCalculator("29");
16
+ long expectedProduct = 18;
17
17
 
18
- final long actualProduct = calculator.calculateLargestProductForSeriesLength(2);
18
+ long actualProduct = calculator.calculateLargestProductForSeriesLength(2);
19
19
 
20
20
  assertEquals(expectedProduct, actualProduct);
21
21
  }
@@ -23,10 +23,10 @@ public class LargestSeriesProductCalculatorTest {
23
23
  @Ignore("Remove to run test")
24
24
  @Test
25
25
  public void testCorrectlyCalculatesLargestProductOfLengthTwoWithNumbersInOrder() {
26
- final LargestSeriesProductCalculator calculator = new LargestSeriesProductCalculator("0123456789");
27
- final long expectedProduct = 72;
26
+ LargestSeriesProductCalculator calculator = new LargestSeriesProductCalculator("0123456789");
27
+ long expectedProduct = 72;
28
28
 
29
- final long actualProduct = calculator.calculateLargestProductForSeriesLength(2);
29
+ long actualProduct = calculator.calculateLargestProductForSeriesLength(2);
30
30
 
31
31
  assertEquals(expectedProduct, actualProduct);
32
32
  }
@@ -34,10 +34,10 @@ public class LargestSeriesProductCalculatorTest {
34
34
  @Ignore("Remove to run test")
35
35
  @Test
36
36
  public void testCorrectlyCalculatesLargestProductOfLengthTwoWithNumbersNotInOrder() {
37
- final LargestSeriesProductCalculator calculator = new LargestSeriesProductCalculator("576802143");
38
- final long expectedProduct = 48;
37
+ LargestSeriesProductCalculator calculator = new LargestSeriesProductCalculator("576802143");
38
+ long expectedProduct = 48;
39
39
 
40
- final long actualProduct = calculator.calculateLargestProductForSeriesLength(2);
40
+ long actualProduct = calculator.calculateLargestProductForSeriesLength(2);
41
41
 
42
42
  assertEquals(expectedProduct, actualProduct);
43
43
  }
@@ -45,10 +45,10 @@ public class LargestSeriesProductCalculatorTest {
45
45
  @Ignore("Remove to run test")
46
46
  @Test
47
47
  public void testCorrectlyCalculatesLargestProductOfLengthThreeWithNumbersInOrder() {
48
- final LargestSeriesProductCalculator calculator = new LargestSeriesProductCalculator("0123456789");
49
- final long expectedProduct = 504;
48
+ LargestSeriesProductCalculator calculator = new LargestSeriesProductCalculator("0123456789");
49
+ long expectedProduct = 504;
50
50
 
51
- final long actualProduct = calculator.calculateLargestProductForSeriesLength(3);
51
+ long actualProduct = calculator.calculateLargestProductForSeriesLength(3);
52
52
 
53
53
  assertEquals(expectedProduct, actualProduct);
54
54
  }
@@ -56,10 +56,10 @@ public class LargestSeriesProductCalculatorTest {
56
56
  @Ignore("Remove to run test")
57
57
  @Test
58
58
  public void testCorrectlyCalculatesLargestProductOfLengthThreeWithNumbersNotInOrder() {
59
- final LargestSeriesProductCalculator calculator = new LargestSeriesProductCalculator("1027839564");
60
- final long expectedProduct = 270;
59
+ LargestSeriesProductCalculator calculator = new LargestSeriesProductCalculator("1027839564");
60
+ long expectedProduct = 270;
61
61
 
62
- final long actualProduct = calculator.calculateLargestProductForSeriesLength(3);
62
+ long actualProduct = calculator.calculateLargestProductForSeriesLength(3);
63
63
 
64
64
  assertEquals(expectedProduct, actualProduct);
65
65
  }
@@ -67,10 +67,10 @@ public class LargestSeriesProductCalculatorTest {
67
67
  @Ignore("Remove to run test")
68
68
  @Test
69
69
  public void testCorrectlyCalculatesLargestProductOfLengthFiveWithNumbersInOrder() {
70
- final LargestSeriesProductCalculator calculator = new LargestSeriesProductCalculator("0123456789");
71
- final long expectedProduct = 15120;
70
+ LargestSeriesProductCalculator calculator = new LargestSeriesProductCalculator("0123456789");
71
+ long expectedProduct = 15120;
72
72
 
73
- final long actualProduct = calculator.calculateLargestProductForSeriesLength(5);
73
+ long actualProduct = calculator.calculateLargestProductForSeriesLength(5);
74
74
 
75
75
  assertEquals(expectedProduct, actualProduct);
76
76
  }
@@ -78,12 +78,12 @@ public class LargestSeriesProductCalculatorTest {
78
78
  @Ignore("Remove to run test")
79
79
  @Test
80
80
  public void testCorrectlyCalculatesLargestProductInLongStringToSearchV1() {
81
- final LargestSeriesProductCalculator calculator
81
+ LargestSeriesProductCalculator calculator
82
82
  = new LargestSeriesProductCalculator("73167176531330624919225119674426574742355349194934");
83
83
 
84
- final long expectedProduct = 23520;
84
+ long expectedProduct = 23520;
85
85
 
86
- final long actualProduct = calculator.calculateLargestProductForSeriesLength(6);
86
+ long actualProduct = calculator.calculateLargestProductForSeriesLength(6);
87
87
 
88
88
  assertEquals(expectedProduct, actualProduct);
89
89
  }
@@ -91,10 +91,10 @@ public class LargestSeriesProductCalculatorTest {
91
91
  @Ignore("Remove to run test")
92
92
  @Test
93
93
  public void testCorrectlyCalculatesLargestProductOfZeroIfAllDigitsAreZeroes() {
94
- final LargestSeriesProductCalculator calculator = new LargestSeriesProductCalculator("0000");
95
- final long expectedProduct = 0;
94
+ LargestSeriesProductCalculator calculator = new LargestSeriesProductCalculator("0000");
95
+ long expectedProduct = 0;
96
96
 
97
- final long actualProduct = calculator.calculateLargestProductForSeriesLength(2);
97
+ long actualProduct = calculator.calculateLargestProductForSeriesLength(2);
98
98
 
99
99
  assertEquals(expectedProduct, actualProduct);
100
100
  }
@@ -102,10 +102,10 @@ public class LargestSeriesProductCalculatorTest {
102
102
  @Ignore("Remove to run test")
103
103
  @Test
104
104
  public void testCorrectlyCalculatesLargestProductOfZeroIfAllSeriesOfGivenLengthContainZero() {
105
- final LargestSeriesProductCalculator calculator = new LargestSeriesProductCalculator("99099");
106
- final long expectedProduct = 0;
105
+ LargestSeriesProductCalculator calculator = new LargestSeriesProductCalculator("99099");
106
+ long expectedProduct = 0;
107
107
 
108
- final long actualProduct = calculator.calculateLargestProductForSeriesLength(3);
108
+ long actualProduct = calculator.calculateLargestProductForSeriesLength(3);
109
109
 
110
110
  assertEquals(expectedProduct, actualProduct);
111
111
  }
@@ -113,7 +113,7 @@ public class LargestSeriesProductCalculatorTest {
113
113
  @Ignore("Remove to run test")
114
114
  @Test
115
115
  public void testSeriesLengthLongerThanLengthOfStringToTestIsRejected() {
116
- final LargestSeriesProductCalculator calculator = new LargestSeriesProductCalculator("123");
116
+ LargestSeriesProductCalculator calculator = new LargestSeriesProductCalculator("123");
117
117
 
118
118
  expectedException.expect(IllegalArgumentException.class);
119
119
  expectedException.expectMessage(
@@ -125,10 +125,10 @@ public class LargestSeriesProductCalculatorTest {
125
125
  @Ignore("Remove to run test")
126
126
  @Test
127
127
  public void testCorrectlyCalculatesLargestProductOfLength0ForEmptyStringToSearch() {
128
- final LargestSeriesProductCalculator calculator = new LargestSeriesProductCalculator("");
129
- final long expectedProduct = 1;
128
+ LargestSeriesProductCalculator calculator = new LargestSeriesProductCalculator("");
129
+ long expectedProduct = 1;
130
130
 
131
- final long actualProduct = calculator.calculateLargestProductForSeriesLength(0);
131
+ long actualProduct = calculator.calculateLargestProductForSeriesLength(0);
132
132
 
133
133
  assertEquals(expectedProduct, actualProduct);
134
134
  }
@@ -136,10 +136,10 @@ public class LargestSeriesProductCalculatorTest {
136
136
  @Ignore("Remove to run test")
137
137
  @Test
138
138
  public void testCorrectlyCalculatesLargestProductOfLength0ForNonEmptyStringToSearch() {
139
- final LargestSeriesProductCalculator calculator = new LargestSeriesProductCalculator("123");
140
- final long expectedProduct = 1;
139
+ LargestSeriesProductCalculator calculator = new LargestSeriesProductCalculator("123");
140
+ long expectedProduct = 1;
141
141
 
142
- final long actualProduct = calculator.calculateLargestProductForSeriesLength(0);
142
+ long actualProduct = calculator.calculateLargestProductForSeriesLength(0);
143
143
 
144
144
  assertEquals(expectedProduct, actualProduct);
145
145
  }
@@ -147,7 +147,7 @@ public class LargestSeriesProductCalculatorTest {
147
147
  @Ignore("Remove to run test")
148
148
  @Test
149
149
  public void testEmptyStringToSearchAndSeriesOfNonZeroLengthIsRejected() {
150
- final LargestSeriesProductCalculator calculator = new LargestSeriesProductCalculator("");
150
+ LargestSeriesProductCalculator calculator = new LargestSeriesProductCalculator("");
151
151
 
152
152
  expectedException.expect(IllegalArgumentException.class);
153
153
  expectedException.expectMessage(
@@ -168,7 +168,7 @@ public class LargestSeriesProductCalculatorTest {
168
168
  @Ignore("Remove to run test")
169
169
  @Test
170
170
  public void testNegativeSeriesLengthIsRejected() {
171
- final LargestSeriesProductCalculator calculator = new LargestSeriesProductCalculator("12345");
171
+ LargestSeriesProductCalculator calculator = new LargestSeriesProductCalculator("12345");
172
172
 
173
173
  expectedException.expect(IllegalArgumentException.class);
174
174
  expectedException.expectMessage("Series length must be non-negative.");