trackler 2.0.0.9 → 2.0.0.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (275) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/tracks/ecmascript/SETUP.md +1 -11
  4. data/tracks/ecmascript/exercises/accumulate/package.json +2 -1
  5. data/tracks/ecmascript/exercises/acronym/package.json +2 -1
  6. data/tracks/ecmascript/exercises/allergies/package.json +2 -1
  7. data/tracks/ecmascript/exercises/anagram/package.json +2 -1
  8. data/tracks/ecmascript/exercises/atbash-cipher/package.json +2 -1
  9. data/tracks/ecmascript/exercises/beer-song/package.json +2 -1
  10. data/tracks/ecmascript/exercises/binary/package.json +2 -1
  11. data/tracks/ecmascript/exercises/binary-search/package.json +2 -1
  12. data/tracks/ecmascript/exercises/binary-search-tree/package.json +2 -1
  13. data/tracks/ecmascript/exercises/bob/package.json +2 -1
  14. data/tracks/ecmascript/exercises/bracket-push/package.json +2 -1
  15. data/tracks/ecmascript/exercises/circular-buffer/package.json +2 -1
  16. data/tracks/ecmascript/exercises/clock/package.json +2 -1
  17. data/tracks/ecmascript/exercises/crypto-square/package.json +2 -1
  18. data/tracks/ecmascript/exercises/custom-set/package.json +2 -2
  19. data/tracks/ecmascript/exercises/diamond/package.json +2 -1
  20. data/tracks/ecmascript/exercises/difference-of-squares/package.json +2 -1
  21. data/tracks/ecmascript/exercises/etl/package.json +2 -1
  22. data/tracks/ecmascript/exercises/food-chain/package.json +2 -1
  23. data/tracks/ecmascript/exercises/gigasecond/package.json +2 -1
  24. data/tracks/ecmascript/exercises/grade-school/package.json +2 -1
  25. data/tracks/ecmascript/exercises/grains/package.json +2 -1
  26. data/tracks/ecmascript/exercises/hamming/package.json +2 -1
  27. data/tracks/ecmascript/exercises/hello-world/package.json +2 -1
  28. data/tracks/ecmascript/exercises/hexadecimal/package.json +2 -1
  29. data/tracks/ecmascript/exercises/isogram/package.json +2 -1
  30. data/tracks/ecmascript/exercises/kindergarten-garden/package.json +2 -1
  31. data/tracks/ecmascript/exercises/largest-series-product/package.json +2 -1
  32. data/tracks/ecmascript/exercises/leap/package.json +2 -1
  33. data/tracks/ecmascript/exercises/linked-list/package.json +2 -1
  34. data/tracks/ecmascript/exercises/luhn/package.json +2 -1
  35. data/tracks/ecmascript/exercises/matrix/package.json +2 -1
  36. data/tracks/ecmascript/exercises/meetup/package.json +2 -1
  37. data/tracks/ecmascript/exercises/nth-prime/package.json +2 -1
  38. data/tracks/ecmascript/exercises/ocr-numbers/package.json +2 -1
  39. data/tracks/ecmascript/exercises/octal/package.json +2 -1
  40. data/tracks/ecmascript/exercises/palindrome-products/package.json +2 -1
  41. data/tracks/ecmascript/exercises/pangram/package.json +2 -1
  42. data/tracks/ecmascript/exercises/pascals-triangle/package.json +2 -1
  43. data/tracks/ecmascript/exercises/phone-number/package.json +2 -1
  44. data/tracks/ecmascript/exercises/pig-latin/package.json +2 -1
  45. data/tracks/ecmascript/exercises/prime-factors/package.json +2 -1
  46. data/tracks/ecmascript/exercises/pythagorean-triplet/package.json +2 -1
  47. data/tracks/ecmascript/exercises/queen-attack/package.json +2 -1
  48. data/tracks/ecmascript/exercises/raindrops/package.json +2 -1
  49. data/tracks/ecmascript/exercises/rna-transcription/package.json +2 -1
  50. data/tracks/ecmascript/exercises/robot-name/package.json +2 -1
  51. data/tracks/ecmascript/exercises/robot-simulator/package.json +2 -1
  52. data/tracks/ecmascript/exercises/roman-numerals/package.json +2 -1
  53. data/tracks/ecmascript/exercises/saddle-points/package.json +2 -1
  54. data/tracks/ecmascript/exercises/say/package.json +2 -1
  55. data/tracks/ecmascript/exercises/scrabble-score/package.json +2 -1
  56. data/tracks/ecmascript/exercises/secret-handshake/package.json +2 -1
  57. data/tracks/ecmascript/exercises/series/package.json +2 -1
  58. data/tracks/ecmascript/exercises/sieve/package.json +2 -1
  59. data/tracks/ecmascript/exercises/simple-cipher/package.json +2 -1
  60. data/tracks/ecmascript/exercises/space-age/package.json +2 -1
  61. data/tracks/ecmascript/exercises/strain/package.json +2 -1
  62. data/tracks/ecmascript/exercises/sum-of-multiples/package.json +2 -1
  63. data/tracks/ecmascript/exercises/triangle/package.json +2 -1
  64. data/tracks/ecmascript/exercises/trinary/package.json +2 -1
  65. data/tracks/ecmascript/exercises/two-bucket/package.json +2 -1
  66. data/tracks/ecmascript/exercises/word-count/package.json +2 -1
  67. data/tracks/ecmascript/exercises/wordy/package.json +2 -1
  68. data/tracks/ecmascript/package.json +2 -1
  69. data/tracks/go/.travis.yml +1 -1
  70. data/tracks/go/docs/LEARNING.md +1 -0
  71. data/tracks/java/config.json +6 -0
  72. data/tracks/java/exercises/settings.gradle +1 -0
  73. data/tracks/java/exercises/sum-of-multiples/build.gradle +17 -0
  74. data/tracks/java/exercises/sum-of-multiples/src/example/java/SumOfMultiples.java +27 -0
  75. data/tracks/java/exercises/sum-of-multiples/src/main/java/SumOfMultiples.java +4 -0
  76. data/tracks/java/exercises/sum-of-multiples/src/test/SumOfMultiplesTest.java +187 -0
  77. data/tracks/ocaml/exercises/word-count/example.ml +14 -19
  78. data/tracks/ocaml/exercises/word-count/test.ml +33 -18
  79. data/tracks/ocaml/tools/test-generator/src/codegen.ml +13 -6
  80. data/tracks/ocaml/tools/test-generator/src/codegen.mli +4 -2
  81. data/tracks/ocaml/tools/test-generator/src/model.ml +1 -1
  82. data/tracks/ocaml/tools/test-generator/src/parser.ml +1 -1
  83. data/tracks/ocaml/tools/test-generator/src/special_cases.ml +19 -0
  84. data/tracks/ocaml/tools/test-generator/src/special_cases.mli +6 -0
  85. data/tracks/ocaml/tools/test-generator/src/test_generator.ml +2 -2
  86. data/tracks/ocaml/tools/test-generator/templates/anagram/template.ml +1 -1
  87. data/tracks/ocaml/tools/test-generator/templates/bob/template.ml +1 -1
  88. data/tracks/ocaml/tools/test-generator/templates/hamming/template.ml +1 -1
  89. data/tracks/ocaml/tools/test-generator/templates/hello-world/template.ml +14 -0
  90. data/tracks/ocaml/tools/test-generator/templates/leap/template.ml +1 -1
  91. data/tracks/ocaml/tools/test-generator/templates/raindrops/template.ml +1 -1
  92. data/tracks/ocaml/tools/test-generator/templates/word-count/template.ml +3 -2
  93. data/tracks/ocaml/tools/test-generator/test/codegen_test.ml +6 -3
  94. data/tracks/ocaml/tools/test-generator/{src → test}/leap.json +0 -0
  95. data/tracks/ocaml/tools/test-generator/test/parser_test.ml +10 -9
  96. data/tracks/ocaml/tools/test-generator/test/special_cases_test.ml +25 -5
  97. data/tracks/perl5/.travis.yml +13 -3
  98. data/tracks/perl5/README.md +7 -2
  99. data/tracks/perl5/cpanfile +4 -0
  100. data/tracks/perl5/{accumulate → exercises/accumulate}/Example.pm +0 -0
  101. data/tracks/perl5/{accumulate → exercises/accumulate}/accumulate.t +6 -1
  102. data/tracks/perl5/{allergies → exercises/allergies}/Example.pm +0 -0
  103. data/tracks/perl5/{allergies → exercises/allergies}/allergies.t +7 -2
  104. data/tracks/perl5/{allergies → exercises/allergies}/cases.json +0 -0
  105. data/tracks/perl5/{anagram → exercises/anagram}/Example.pm +0 -0
  106. data/tracks/perl5/{anagram → exercises/anagram}/anagram.t +7 -2
  107. data/tracks/perl5/{anagram → exercises/anagram}/cases.json +0 -0
  108. data/tracks/perl5/{atbash-cipher → exercises/atbash-cipher}/Example.pm +0 -0
  109. data/tracks/perl5/{atbash-cipher → exercises/atbash-cipher}/cases.json +0 -0
  110. data/tracks/perl5/{atbash-cipher → exercises/atbash-cipher}/cipher.t +7 -2
  111. data/tracks/perl5/{beer-song → exercises/beer-song}/Example.pm +0 -0
  112. data/tracks/perl5/{beer-song → exercises/beer-song}/beer.t +7 -2
  113. data/tracks/perl5/{beer-song → exercises/beer-song}/cases.json +0 -0
  114. data/tracks/perl5/{binary → exercises/binary}/Example.pm +0 -0
  115. data/tracks/perl5/{binary → exercises/binary}/binary.t +6 -1
  116. data/tracks/perl5/{binary-search → exercises/binary-search}/Example.pm +0 -0
  117. data/tracks/perl5/{binary-search → exercises/binary-search}/binary-search.t +6 -3
  118. data/tracks/perl5/{binary-search-tree → exercises/binary-search-tree}/Example.pm +0 -0
  119. data/tracks/perl5/{binary-search-tree → exercises/binary-search-tree}/binary_search_tree.t +5 -0
  120. data/tracks/perl5/{bob → exercises/bob}/Bob.pm +0 -0
  121. data/tracks/perl5/{bob → exercises/bob}/Example.pm +0 -0
  122. data/tracks/perl5/{bob → exercises/bob}/bob.t +6 -1
  123. data/tracks/perl5/{clock → exercises/clock}/Example.pm +0 -0
  124. data/tracks/perl5/{clock → exercises/clock}/clock.t +6 -1
  125. data/tracks/perl5/{crypto-square → exercises/crypto-square}/Example.pm +0 -0
  126. data/tracks/perl5/{crypto-square → exercises/crypto-square}/crypto.t +6 -1
  127. data/tracks/perl5/{custom-set → exercises/custom-set}/Example.pm +0 -0
  128. data/tracks/perl5/{custom-set → exercises/custom-set}/custom-set.t +5 -0
  129. data/tracks/perl5/{difference-of-squares → exercises/difference-of-squares}/Example.pm +0 -0
  130. data/tracks/perl5/{difference-of-squares → exercises/difference-of-squares}/difference_of_squares.t +6 -1
  131. data/tracks/perl5/{etl → exercises/etl}/Example.pm +0 -0
  132. data/tracks/perl5/{etl → exercises/etl}/etl.t +6 -1
  133. data/tracks/perl5/{food-chain → exercises/food-chain}/Example.pm +0 -0
  134. data/tracks/perl5/{food-chain → exercises/food-chain}/food_chain.t +7 -2
  135. data/tracks/perl5/{gigasecond → exercises/gigasecond}/Example.pm +0 -0
  136. data/tracks/perl5/{gigasecond → exercises/gigasecond}/gigasecond.t +5 -0
  137. data/tracks/perl5/{grade-school → exercises/grade-school}/Example.pm +0 -0
  138. data/tracks/perl5/{grade-school → exercises/grade-school}/grade_school.t +5 -0
  139. data/tracks/perl5/{grains → exercises/grains}/Example.pm +0 -0
  140. data/tracks/perl5/{grains → exercises/grains}/cases.json +0 -0
  141. data/tracks/perl5/{grains → exercises/grains}/grains.t +7 -2
  142. data/tracks/perl5/{hamming → exercises/hamming}/Example.pm +0 -0
  143. data/tracks/perl5/{hamming → exercises/hamming}/hamming.t +6 -1
  144. data/tracks/perl5/{hexadecimal → exercises/hexadecimal}/Example.pm +0 -0
  145. data/tracks/perl5/{hexadecimal → exercises/hexadecimal}/hexadecimal.t +6 -1
  146. data/tracks/perl5/{house → exercises/house}/Example.pm +0 -0
  147. data/tracks/perl5/{house → exercises/house}/house.t +6 -1
  148. data/tracks/perl5/{kindergarten-garden → exercises/kindergarten-garden}/Example.pm +0 -0
  149. data/tracks/perl5/{kindergarten-garden → exercises/kindergarten-garden}/kindergarten.t +6 -1
  150. data/tracks/perl5/{largest-series-product → exercises/largest-series-product}/Example.pm +0 -0
  151. data/tracks/perl5/{largest-series-product → exercises/largest-series-product}/series_product.t +6 -1
  152. data/tracks/perl5/{leap → exercises/leap}/Example.pm +0 -0
  153. data/tracks/perl5/{leap → exercises/leap}/leap.t +6 -0
  154. data/tracks/perl5/{linked-list → exercises/linked-list}/Example.pm +0 -0
  155. data/tracks/perl5/{linked-list → exercises/linked-list}/cases.json +0 -0
  156. data/tracks/perl5/{linked-list → exercises/linked-list}/deque.t +9 -4
  157. data/tracks/perl5/{list-ops → exercises/list-ops}/Example.pm +0 -0
  158. data/tracks/perl5/{list-ops → exercises/list-ops}/list-ops.t +6 -3
  159. data/tracks/perl5/{luhn → exercises/luhn}/Example.pm +0 -0
  160. data/tracks/perl5/{luhn → exercises/luhn}/luhn.t +7 -2
  161. data/tracks/perl5/{matrix → exercises/matrix}/Example.pm +0 -0
  162. data/tracks/perl5/{matrix → exercises/matrix}/matrix.t +6 -1
  163. data/tracks/perl5/{meetup → exercises/meetup}/Example.pm +0 -0
  164. data/tracks/perl5/{meetup → exercises/meetup}/meetup.t +7 -1
  165. data/tracks/perl5/{minesweeper → exercises/minesweeper}/Example.pm +0 -0
  166. data/tracks/perl5/{minesweeper → exercises/minesweeper}/minesweeper.t +5 -0
  167. data/tracks/perl5/{nucleotide-count → exercises/nucleotide-count}/Example.pm +0 -0
  168. data/tracks/perl5/{nucleotide-count → exercises/nucleotide-count}/nucleotide_count.t +5 -0
  169. data/tracks/perl5/{ocr-numbers → exercises/ocr-numbers}/Example.pm +0 -0
  170. data/tracks/perl5/{ocr-numbers → exercises/ocr-numbers}/ocr.t +7 -2
  171. data/tracks/perl5/{palindrome-products → exercises/palindrome-products}/Example.pm +0 -0
  172. data/tracks/perl5/{palindrome-products → exercises/palindrome-products}/palindrome.t +6 -1
  173. data/tracks/perl5/{pascals-triangle → exercises/pascals-triangle}/Example.pm +0 -0
  174. data/tracks/perl5/{pascals-triangle → exercises/pascals-triangle}/cases.json +0 -0
  175. data/tracks/perl5/{pascals-triangle → exercises/pascals-triangle}/triangle.t +7 -2
  176. data/tracks/perl5/{phone-number → exercises/phone-number}/Example.pm +0 -0
  177. data/tracks/perl5/{phone-number → exercises/phone-number}/cases.json +0 -0
  178. data/tracks/perl5/{phone-number → exercises/phone-number}/phone.t +7 -2
  179. data/tracks/perl5/{pig-latin → exercises/pig-latin}/Example.pm +0 -0
  180. data/tracks/perl5/{pig-latin → exercises/pig-latin}/piglatin.t +6 -1
  181. data/tracks/perl5/{point-mutations → exercises/point-mutations}/Example.pm +0 -0
  182. data/tracks/perl5/{point-mutations → exercises/point-mutations}/cases.json +0 -0
  183. data/tracks/perl5/{point-mutations → exercises/point-mutations}/dna.t +7 -2
  184. data/tracks/perl5/{prime-factors → exercises/prime-factors}/Example.pm +0 -0
  185. data/tracks/perl5/{prime-factors → exercises/prime-factors}/cases.json +0 -0
  186. data/tracks/perl5/{prime-factors → exercises/prime-factors}/prime.t +7 -2
  187. data/tracks/perl5/{proverb → exercises/proverb}/Example.pm +0 -0
  188. data/tracks/perl5/{proverb → exercises/proverb}/cases.json +0 -0
  189. data/tracks/perl5/{proverb → exercises/proverb}/proverb.t +8 -2
  190. data/tracks/perl5/{pythagorean-triplet → exercises/pythagorean-triplet}/Example.pm +0 -0
  191. data/tracks/perl5/{pythagorean-triplet → exercises/pythagorean-triplet}/triplet.t +7 -2
  192. data/tracks/perl5/{queen-attack → exercises/queen-attack}/Example.pm +0 -0
  193. data/tracks/perl5/{queen-attack → exercises/queen-attack}/cases.json +0 -0
  194. data/tracks/perl5/{queen-attack → exercises/queen-attack}/queen.t +9 -4
  195. data/tracks/perl5/{raindrops → exercises/raindrops}/Example.pm +0 -0
  196. data/tracks/perl5/{raindrops → exercises/raindrops}/cases.json +0 -0
  197. data/tracks/perl5/{raindrops → exercises/raindrops}/raindrops.t +9 -4
  198. data/tracks/perl5/{rna-transcription → exercises/rna-transcription}/Example.pm +0 -0
  199. data/tracks/perl5/{rna-transcription → exercises/rna-transcription}/rna.t +8 -3
  200. data/tracks/perl5/{robot-name → exercises/robot-name}/Example.pm +0 -0
  201. data/tracks/perl5/{robot-name → exercises/robot-name}/robot_name.t +7 -1
  202. data/tracks/perl5/{robot-simulator → exercises/robot-simulator}/Example.pm +0 -0
  203. data/tracks/perl5/{robot-simulator → exercises/robot-simulator}/robot_simulator.t +6 -1
  204. data/tracks/perl5/{roman-numerals → exercises/roman-numerals}/Example.pm +0 -0
  205. data/tracks/perl5/{roman-numerals → exercises/roman-numerals}/roman.t +6 -1
  206. data/tracks/perl5/{saddle-points → exercises/saddle-points}/Example.pm +0 -0
  207. data/tracks/perl5/{saddle-points → exercises/saddle-points}/saddle_points.t +6 -1
  208. data/tracks/perl5/{say → exercises/say}/Example.pm +0 -0
  209. data/tracks/perl5/{say → exercises/say}/say.t +6 -1
  210. data/tracks/perl5/{scrabble-score → exercises/scrabble-score}/Example.pm +0 -0
  211. data/tracks/perl5/{scrabble-score → exercises/scrabble-score}/scrabble.t +6 -2
  212. data/tracks/perl5/{secret-handshake → exercises/secret-handshake}/Example.pm +0 -0
  213. data/tracks/perl5/{secret-handshake → exercises/secret-handshake}/handshake.t +6 -1
  214. data/tracks/perl5/{series → exercises/series}/Example.pm +0 -0
  215. data/tracks/perl5/{series → exercises/series}/series.t +5 -0
  216. data/tracks/perl5/{sieve → exercises/sieve}/Example.pm +0 -0
  217. data/tracks/perl5/{sieve → exercises/sieve}/sieve.t +6 -1
  218. data/tracks/perl5/{simple-cipher → exercises/simple-cipher}/Example.pm +0 -0
  219. data/tracks/perl5/{simple-cipher → exercises/simple-cipher}/cipher.t +6 -1
  220. data/tracks/perl5/{simple-linked-list → exercises/simple-linked-list}/Example.pm +0 -0
  221. data/tracks/perl5/{simple-linked-list → exercises/simple-linked-list}/simple_linked_list.t +5 -0
  222. data/tracks/perl5/{space-age → exercises/space-age}/Example.pm +0 -0
  223. data/tracks/perl5/{space-age → exercises/space-age}/space.t +6 -1
  224. data/tracks/perl5/{strain → exercises/strain}/Example.pm +0 -0
  225. data/tracks/perl5/{strain → exercises/strain}/strain.t +6 -1
  226. data/tracks/perl5/{sublist → exercises/sublist}/Example.pm +0 -0
  227. data/tracks/perl5/{sublist → exercises/sublist}/sublist.t +5 -0
  228. data/tracks/perl5/{sum-of-multiples → exercises/sum-of-multiples}/Example.pm +0 -0
  229. data/tracks/perl5/{sum-of-multiples → exercises/sum-of-multiples}/sum_of_multiples.t +6 -1
  230. data/tracks/perl5/{triangle → exercises/triangle}/Example.pm +0 -0
  231. data/tracks/perl5/{triangle → exercises/triangle}/cases.json +0 -0
  232. data/tracks/perl5/{triangle → exercises/triangle}/triangle.t +9 -4
  233. data/tracks/perl5/{trinary → exercises/trinary}/Example.pm +0 -0
  234. data/tracks/perl5/{trinary → exercises/trinary}/trinary.t +6 -1
  235. data/tracks/perl5/{twelve-days → exercises/twelve-days}/Example.pm +0 -0
  236. data/tracks/perl5/{twelve-days → exercises/twelve-days}/song.t +7 -2
  237. data/tracks/perl5/{word-count → exercises/word-count}/Example.pm +0 -0
  238. data/tracks/perl5/{word-count → exercises/word-count}/word_count.t +8 -3
  239. data/tracks/perl5/{wordy → exercises/wordy}/Example.pm +0 -0
  240. data/tracks/perl5/{wordy → exercises/wordy}/cases.json +0 -0
  241. data/tracks/perl5/{wordy → exercises/wordy}/wordy.t +9 -4
  242. data/tracks/perl6/.travis.yml +10 -3
  243. data/tracks/perl6/SETUP.md +7 -0
  244. data/tracks/perl6/docs/LEARNING.md +1 -1
  245. data/tracks/perl6/docs/RESOURCES.md +1 -2
  246. data/tracks/perl6/docs/{TOOLS.md → TESTS.md} +0 -0
  247. data/tracks/perl6/{accumulate → exercises/accumulate}/Example.pm +0 -0
  248. data/tracks/perl6/{accumulate → exercises/accumulate}/accumulate.t +1 -0
  249. data/tracks/perl6/{anagram → exercises/anagram}/Example.pm +0 -0
  250. data/tracks/perl6/{anagram → exercises/anagram}/anagram.t +1 -0
  251. data/tracks/perl6/{binary → exercises/binary}/Example.pm +0 -0
  252. data/tracks/perl6/{binary → exercises/binary}/binary.t +1 -0
  253. data/tracks/perl6/{bob → exercises/bob}/Example.pm +0 -0
  254. data/tracks/perl6/{bob → exercises/bob}/bob.t +1 -0
  255. data/tracks/perl6/{grains → exercises/grains}/Example.pm +0 -0
  256. data/tracks/perl6/{grains → exercises/grains}/grains.t +1 -0
  257. data/tracks/perl6/{leap → exercises/leap}/Example.pm +0 -0
  258. data/tracks/perl6/{leap → exercises/leap}/leap.t +1 -0
  259. data/tracks/perl6/{raindrops → exercises/raindrops}/Example.pm +0 -0
  260. data/tracks/perl6/{raindrops → exercises/raindrops}/raindrops.t +1 -0
  261. data/tracks/perl6/{rna-transcription → exercises/rna-transcription}/Example.pm +0 -0
  262. data/tracks/perl6/{rna-transcription → exercises/rna-transcription}/rna_transcription.t +5 -4
  263. data/tracks/perl6/{robot-name → exercises/robot-name}/Example.pm +0 -0
  264. data/tracks/perl6/{robot-name → exercises/robot-name}/robot.t +1 -0
  265. data/tracks/perl6/{scrabble-score → exercises/scrabble-score}/Example.pm +0 -0
  266. data/tracks/perl6/{scrabble-score → exercises/scrabble-score}/scrabble_score.t +1 -0
  267. data/tracks/perl6/{word-count → exercises/word-count}/Example.pm +0 -0
  268. data/tracks/perl6/{word-count → exercises/word-count}/word_count.t +1 -0
  269. data/tracks/ruby/exercises/accumulate/accumulate_test.rb +21 -0
  270. data/tracks/ruby/exercises/accumulate/example.rb +4 -0
  271. data/tracks/ruby/exercises/bob/bob_test.rb +1 -1
  272. data/tracks/ruby/exercises/bob/example.rb +3 -1
  273. data/tracks/ruby/exercises/bowling/example.rb +4 -4
  274. metadata +174 -169
  275. data/tracks/perl5/testall.pl +0 -18
@@ -0,0 +1,14 @@
1
+ open Core.Std
2
+ open OUnit2
3
+ open Hello_world
4
+
5
+ let ae exp got _test_ctxt = assert_equal ~printer:String.to_string exp got
6
+
7
+ let tests = [
8
+ (* GENERATED-CODE
9
+ "$description" >:: ae "$expected" (greet $name);
10
+ END GENERATED-CODE *)
11
+ ]
12
+
13
+ let () =
14
+ run_test_tt_main ("Hello World tests" >::: tests)
@@ -6,7 +6,7 @@ let ae exp got _test_ctxt = assert_equal exp got
6
6
 
7
7
  let tests = [
8
8
  (* GENERATED-CODE
9
- "$name" >::
9
+ "$description" >::
10
10
  ae $expected (leap_year $input);
11
11
  END GENERATED-CODE *)
12
12
  ]
@@ -6,7 +6,7 @@ let ae exp got _test_ctxt = assert_equal ~printer:Fn.id exp got
6
6
 
7
7
  let tests = [
8
8
  (* GENERATED-CODE
9
- "$name" >::
9
+ "$description" >::
10
10
  ae "$expected" (raindrop $number);
11
11
  END GENERATED-CODE *)
12
12
  ]
@@ -10,8 +10,9 @@ let ae exp got _test_ctxt =
10
10
 
11
11
  let tests = [
12
12
  (* GENERATED-CODE
13
- "$name" >::
14
- ae $expected (word_count "$input");
13
+ "$description" >::
14
+ ae $expected
15
+ (word_count "$input");
15
16
  END GENERATED-CODE *)
16
17
  ]
17
18
 
@@ -3,10 +3,13 @@ open OUnit2
3
3
  open Codegen
4
4
  open Model
5
5
 
6
- let leap_template = "\"$name\" >:: ae $expected (leap_year $input);"
6
+ let leap_template = "\"$description\" >:: ae $expected (leap_year $input);"
7
7
 
8
8
  let fixup ~key ~value = parameter_to_string value
9
- let assert_gen exp cases = assert_equal (Ok exp) ~printer:(fun (Ok xs) -> "[" ^ (String.concat ~sep:";" xs) ^ "]") (generate_code fixup leap_template cases)
9
+ let edit = Fn.id
10
+ let assert_gen exp cases = assert_equal exp
11
+ ~printer:(fun xs -> "[" ^ (String.concat ~sep:";" xs) ^ "]")
12
+ (Result.ok_or_failwith @@ generate_code fixup edit leap_template cases)
10
13
  let ae exp cases _test_ctxt = assert_gen exp cases
11
14
 
12
15
  let codegen_tests = [
@@ -14,7 +17,7 @@ let codegen_tests = [
14
17
  ae [] [];
15
18
 
16
19
  "generates one function based on leap year for one case" >::(fun ctxt ->
17
- let c = {name = "leap_year"; parameters = [("input", Int 1996)]; expected = Bool true} in
20
+ let c = {description = "leap_year"; parameters = [("input", Int 1996)]; expected = Bool true} in
18
21
  assert_gen ["\"leap_year\" >:: ae true (leap_year 1996);"] [c]
19
22
  );
20
23
  ]
@@ -26,27 +26,27 @@ let parser_tests = [
26
26
  (parse_json_text "{\"cases\" : [\"key\"]}");
27
27
 
28
28
  "parses a single element with a description and expected string output" >::
29
- ae (Ok [{name = "d1"; parameters = []; expected = String "value"}])
29
+ ae (Ok [{description = "d1"; parameters = []; expected = String "value"}])
30
30
  (parse_json_text "{\"cases\" : [{\"description\" : \"d1\", \"expected\" : \"value\"}]}");
31
31
 
32
32
  "parses a single element with a description and expected float output" >::
33
- ae (Ok [{name = "d1"; parameters = []; expected = Float 100.}])
33
+ ae (Ok [{description = "d1"; parameters = []; expected = Float 100.}])
34
34
  (parse_json_text "{\"cases\" : [{\"description\" : \"d1\", \"expected\" : 100.0}]}");
35
35
 
36
36
  "parses a single element with a description and expected bool output" >::
37
- ae (Ok [{name = "d1"; parameters = []; expected = Bool true}])
37
+ ae (Ok [{description = "d1"; parameters = []; expected = Bool true}])
38
38
  (parse_json_text "{\"cases\" : [{\"description\" : \"d1\", \"expected\" : true}]}");
39
39
 
40
40
  "parses a single element with an int key value pair" >::
41
- ae (Ok [{name = "d1"; parameters = [("input", Int 1996)]; expected = Bool true}])
41
+ ae (Ok [{description = "d1"; parameters = [("input", Int 1996)]; expected = Bool true}])
42
42
  (parse_json_text "{\"cases\" : [{\"description\" : \"d1\", \"input\" : 1996, \"expected\" : true}]}");
43
43
 
44
44
  "parses a single element with a string key value pair" >::
45
- ae (Ok [{name = "d1"; parameters = [("input", String "some-string")]; expected = Int 85}])
45
+ ae (Ok [{description = "d1"; parameters = [("input", String "some-string")]; expected = Int 85}])
46
46
  (parse_json_text "{\"cases\" : [{\"description\" : \"d1\", \"input\" : \"some-string\", \"expected\" : 85}]}");
47
47
 
48
48
  "parses a single element with a string list key value pair" >::
49
- ae (Ok [{name = "d1"; parameters = [("input", StringList ["s1"; "s2"])]; expected = Int 85}])
49
+ ae (Ok [{description = "d1"; parameters = [("input", StringList ["s1"; "s2"])]; expected = Int 85}])
50
50
  (parse_json_text "{\"cases\" : [{\"description\" : \"d1\", \"input\" : [\"s1\", \"s2\"], \"expected\" : 85}]}");
51
51
 
52
52
  "an element without a description is an Error" >::
@@ -62,12 +62,13 @@ let parser_tests = [
62
62
  (parse_json_text "{\"cases\" : [{\"input\" : 11}]}");
63
63
 
64
64
  "parses a map in the expected parameter" >::(fun _ctx ->
65
- assert_equal (Ok [{name = "d1"; parameters = []; expected = IntStringMap [("one", 1); ("two", 2)]}])
65
+ assert_equal (Ok [{description = "d1"; parameters = []; expected = IntStringMap [("one", 1); ("two", 2)]}])
66
66
  (parse_json_text "{\"cases\" : [{\"description\" : \"d1\", \"expected\" : {\"one\": 1, \"two\": 2}}]}");
67
67
  );
68
68
 
69
69
  "parses leap.json" >::(fun ctxt ->
70
- let (Ok p) = parse_json_text @@ In_channel.read_all "src/leap.json" in
71
- assert_equal 7 (List.length p)
70
+ match parse_json_text @@ In_channel.read_all "test/leap.json" with
71
+ | Ok p -> assert_equal 7 (List.length p)
72
+ | _ -> failwith "failed to parse leap.json"
72
73
  );
73
74
  ]
@@ -6,17 +6,37 @@ open Special_cases
6
6
 
7
7
  let ae exp got _ctxt = assert_equal ~printer:Fn.id exp got
8
8
 
9
+ let tuples_printer kvs =
10
+ String.concat ~sep:";" @@ List.map ~f:(fun (k,v) -> "(" ^ k ^ "," ^ v ^ ")") kvs
11
+
12
+ let stringify = function
13
+ | Bool true -> "stringified"
14
+ | _ -> failwith "Bad type for stringify"
15
+
9
16
  let special_cases_tests = [
10
17
  "for a non special cased slug convert the parameter to a string" >:: (fun _ctx ->
11
- let stringify (Bool true) = "stringified" in
12
- assert_equal ~printer:Fn.id "stringified" (fixup ~stringify ~slug:"some-slug" ~key:"key" ~value:(Bool true))
18
+ assert_equal ~printer:Fn.id "stringified" @@ fixup ~stringify ~slug:"some-slug" ~key:"key" ~value:(Bool true)
13
19
  );
14
20
 
15
21
  "an optional int parameter is converted to none if it matches the special value" >:: (fun _ctx ->
16
- assert_equal "None" (optional_int ~none:88 (Int 88))
22
+ assert_equal "None" @@ optional_int ~none:88 (Int 88)
17
23
  );
18
24
 
19
25
  "an optional int parameter is converted to (Some value) if it does not match the special value" >:: (fun _ctx ->
20
- assert_equal "(Some 0)" (optional_int ~none:88 (Int 0))
21
- )
26
+ assert_equal "(Some 0)" @@ optional_int ~none:88 (Int 0)
27
+ );
28
+
29
+ "default_value does not provide a default for a list that has the given key already" >:: (fun _ctx ->
30
+ let ps = [("key", "value")] in
31
+ assert_equal ps @@ default_value ~key:"key" ~value:"value2" ps
32
+ );
33
+
34
+ "default_value does provides a default for a list that does not have the given key" >:: (fun _ctx ->
35
+ assert_equal [("key", "value")] @@ default_value ~key:"key" ~value:"value" []
36
+ );
37
+
38
+ "optional_string replace value with Some(value)" >:: (fun _ctx ->
39
+ assert_equal ~printer:tuples_printer [("key", "(Some \"value\")"); ("key2", "value2")]
40
+ @@ optional_string ~f:(fun x -> x = "key") [("key", "value"); ("key2", "value2")]
41
+ );
22
42
  ]
@@ -1,5 +1,15 @@
1
- language: bash
2
-
3
- script:
1
+ sudo: false
2
+ language: perl
3
+ perl:
4
+ - '5.22'
5
+ - '5.20'
6
+ - '5.18'
7
+ - '5.16'
8
+ - '5.14'
9
+ - '5.12'
10
+ - '5.10'
11
+ before_script:
4
12
  - bin/fetch-configlet
13
+ script:
5
14
  - bin/configlet .
15
+ - EXERCISM=1 prove -vr exercises/
@@ -4,7 +4,12 @@ Exercism exercises in Perl 5
4
4
 
5
5
  ## Dependencies
6
6
 
7
- The tests depend on the JSON.pm module.
7
+ The tests depend on the following modules:
8
+
9
+ JSON
10
+ DateTime
11
+ Test::Exception
12
+ List::MoreUtils
8
13
 
9
14
  ## Testing the Tests
10
15
 
@@ -20,7 +25,7 @@ So the sample solutions are all called Example.pm.
20
25
 
21
26
  Run the full tests with
22
27
 
23
- perl testall.pl
28
+ EXERCISM=1 prove -r
24
29
 
25
30
  ### Testing a Single Exercise
26
31
 
@@ -0,0 +1,4 @@
1
+ requires 'JSON', 0;
2
+ requires 'DateTime', 0;
3
+ requires 'Test::Exception', 0;
4
+ requires 'List::MoreUtils', 0;
@@ -1,7 +1,12 @@
1
+ #!/usr/bin/env perl
1
2
  use strict;
2
3
  use warnings;
3
4
 
4
5
  use Test::More;
6
+ use FindBin;
7
+ my $dir;
8
+ BEGIN { $dir = $FindBin::Bin . '/' };
9
+ use lib $dir;
5
10
 
6
11
  my $module = $ENV{EXERCISM} ? 'Example' : 'Accumulate';
7
12
 
@@ -54,7 +59,7 @@ my @cases = (
54
59
 
55
60
  plan tests => 3 + @cases;
56
61
 
57
- ok -e "$module.pm", "missing $module.pm"
62
+ ok -e "${dir}${module}.pm", "missing $module.pm"
58
63
  or BAIL_OUT("You need to create a class called $module.pm with a constructor called new.");
59
64
 
60
65
  eval "use $module";
@@ -1,12 +1,17 @@
1
+ #!/usr/bin/env perl
1
2
  use strict;
2
3
  use warnings;
3
4
 
4
5
  use Test::More;
5
6
  use JSON qw(from_json);
7
+ use FindBin;
8
+ my $dir;
9
+ BEGIN { $dir = $FindBin::Bin . '/' };
10
+ use lib $dir;
6
11
 
7
12
  my $module = $ENV{EXERCISM} ? 'Example' : 'Allergies';
8
13
 
9
- my $cases_file = 'cases.json';
14
+ my $cases_file = "${dir}cases.json";
10
15
  my $cases;
11
16
 
12
17
  if (open my $fh, '<', $cases_file) {
@@ -18,7 +23,7 @@ if (open my $fh, '<', $cases_file) {
18
23
 
19
24
  plan tests => 4 + @$cases;
20
25
 
21
- ok -e "$module.pm", "Missing $module.pm" or BAIL_OUT "Missing $module.pm";
26
+ ok -e "${dir}${module}.pm" or BAIL_OUT "missing $module.pm";
22
27
 
23
28
  eval "use $module";
24
29
  ok !$@, "Cannot load $module.pm"
@@ -1,12 +1,17 @@
1
+ #!/usr/bin/env perl
1
2
  use strict;
2
3
  use warnings;
3
4
 
4
5
  use Test::More;
5
6
  use JSON qw(from_json);
7
+ use FindBin;
8
+ my $dir;
9
+ BEGIN { $dir = $FindBin::Bin . '/' };
10
+ use lib $dir;
6
11
 
7
12
  my $module = $ENV{EXERCISM} ? 'Example' : 'Anagram';
8
13
 
9
- my $cases_file = 'cases.json';
14
+ my $cases_file = "${dir}cases.json";
10
15
  my $cases;
11
16
  if (open my $fh, '<', $cases_file) {
12
17
  local $/ = undef;
@@ -18,7 +23,7 @@ if (open my $fh, '<', $cases_file) {
18
23
  plan tests => 3 + @$cases;
19
24
  #diag explain $cases;
20
25
 
21
- ok -e "$module.pm", "missing $module.pm"
26
+ ok -e "${dir}${module}.pm", "missing $module.pm"
22
27
  or BAIL_OUT("You need to create a class called $module.pm with an function called match() that gets the original word as the first parameter and a reference to a list of word to check. It should return a referene to a list of words.");
23
28
 
24
29
  eval "use $module";
@@ -1,13 +1,18 @@
1
+ #!/usr/bin/env perl
1
2
  use strict;
2
3
  use warnings;
3
4
 
4
5
  use Test::More;
6
+ use FindBin;
7
+ my $dir;
8
+ BEGIN { $dir = $FindBin::Bin . '/' };
9
+ use lib $dir;
5
10
 
6
11
  my $module = $ENV{EXERCISM} ? 'Example' : 'Cipher';
7
12
 
8
13
  use JSON qw(from_json);
9
14
 
10
- my $cases_file = 'cases.json';
15
+ my $cases_file = "${dir}cases.json";
11
16
  my $cases;
12
17
 
13
18
  if (open my $fh, '<', $cases_file) {
@@ -19,7 +24,7 @@ if (open my $fh, '<', $cases_file) {
19
24
 
20
25
  plan tests => 4 + @$cases;
21
26
 
22
- ok -e "$module.pm", "Missing $module.pm",
27
+ ok -e "${dir}${module}.pm", "Missing $module.pm",
23
28
  or BAIL_OUT "You need to create a class called $module.pm";
24
29
 
25
30
  eval "use $module";
@@ -1,13 +1,18 @@
1
+ #!/usr/bin/env perl
1
2
  use strict;
2
3
  use warnings;
3
4
 
4
5
  use Test::More;
6
+ use FindBin;
7
+ my $dir;
8
+ BEGIN { $dir = $FindBin::Bin . '/' };
9
+ use lib $dir;
5
10
 
6
11
  my $module = $ENV{EXERCISM} ? 'Example' : 'Beer';
7
12
 
8
13
  use JSON qw(from_json);
9
14
 
10
- my $cases_file = 'cases.json';
15
+ my $cases_file = "${dir}cases.json";
11
16
  my $cases;
12
17
  if (open my $fh, '<', $cases_file) {
13
18
  local $/ = undef;
@@ -19,7 +24,7 @@ if (open my $fh, '<', $cases_file) {
19
24
  #diag explain $cases;
20
25
  plan tests => 4 + @$cases;
21
26
 
22
- ok -e "$module.pm", "missing $module.pm"
27
+ ok -e "${dir}${module}.pm", "missing $module.pm"
23
28
  or BAIL_OUT("You need to create a class called $module.pm");
24
29
 
25
30
  eval "use $module";
@@ -1,7 +1,12 @@
1
+ #!/usr/bin/env perl
1
2
  use strict;
2
3
  use warnings;
3
4
 
4
5
  use Test::More;
6
+ use FindBin;
7
+ my $dir;
8
+ BEGIN { $dir = $FindBin::Bin . '/' };
9
+ use lib $dir;
5
10
 
6
11
  my @cases = (
7
12
  {
@@ -42,7 +47,7 @@ my $module = $ENV{EXERCISM} ? 'Example' : 'Binary';
42
47
 
43
48
  plan tests => 4 + @cases;
44
49
 
45
- ok -e "$module.pm", "Missing $module.pm",
50
+ ok -e "${dir}${module}.pm", "Missing $module.pm",
46
51
  or BAIL_OUT "You need to create a file called $module.pm";
47
52
 
48
53
  eval "use $module";
@@ -1,11 +1,14 @@
1
- #!/usr/bin/perl
2
-
1
+ #!/usr/bin/env perl
3
2
  use strict;
4
3
  use warnings;
5
4
 
6
5
  use Data::Dumper;
7
6
  use Test::Exception;
8
7
  use Test::More;
8
+ use FindBin;
9
+ my $dir;
10
+ BEGIN { $dir = $FindBin::Bin . '/' };
11
+ use lib $dir;
9
12
 
10
13
  my $module = $ENV{EXERCISM} ? 'Example' : 'BinarySearch';
11
14
 
@@ -90,7 +93,7 @@ foreach my $test_type ( keys %test_cases ) {
90
93
 
91
94
  plan tests => 3 + $num_test_cases;
92
95
 
93
- ok -e "$module.pm", "missing $module.pm"
96
+ ok -e "${dir}${module}.pm", "missing $module.pm"
94
97
  or BAIL_OUT("You need to create a class called $module.pm with 1 functions: binary_search");
95
98
 
96
99
  eval "use $module";
@@ -1,7 +1,12 @@
1
+ #!/usr/bin/env perl
1
2
  use warnings;
2
3
  use strict;
3
4
 
4
5
  use Test::More;
6
+ use FindBin;
7
+ my $dir;
8
+ BEGIN { $dir = $FindBin::Bin . '/' };
9
+ use lib $dir;
5
10
 
6
11
  my $module = $ENV{EXERCISM} ? 'Example' : 'BinarySearchTree';
7
12
 
File without changes
File without changes
@@ -1,7 +1,12 @@
1
+ #!/usr/bin/env perl
1
2
  use strict;
2
3
  use warnings;
3
4
  use open ':std', ':encoding(utf8)';
4
5
  use utf8;
6
+ use FindBin;
7
+ my $dir;
8
+ BEGIN { $dir = $FindBin::Bin . '/' };
9
+ use lib $dir;
5
10
 
6
11
  my $module = $ENV{EXERCISM} ? 'Example' : 'Bob';
7
12
 
@@ -41,7 +46,7 @@ my @cases = map {
41
46
  [" \nI just remembered...", 'Whatever.', 'Silence, then more'],
42
47
  );
43
48
 
44
- ok -e "$module.pm", "missing $module.pm"
49
+ ok -e "${dir}${module}.pm", "missing $module.pm"
45
50
  or BAIL_OUT("You need to create a module called $module.pm with a function called hey() that gets one parameter: The text Bob hears.");
46
51
 
47
52
  use_ok($module)
File without changes
@@ -1,7 +1,12 @@
1
+ #!/usr/bin/env perl
1
2
  use strict;
2
3
  use warnings;
3
4
 
4
5
  use Test::More;
6
+ use FindBin;
7
+ my $dir;
8
+ BEGIN { $dir = $FindBin::Bin . '/' };
9
+ use lib $dir;
5
10
 
6
11
  my @cases = (
7
12
  {
@@ -62,7 +67,7 @@ my $module = $ENV{EXERCISM} ? 'Example' : 'Clock';
62
67
 
63
68
  plan tests => 6 + @cases;
64
69
 
65
- ok -e "$module.pm", "Missing $module.pm"
70
+ ok -e "${dir}${module}.pm", "Missing $module.pm"
66
71
  or BAIL_OUT "You need to create file: $module.pm";
67
72
 
68
73
  eval "use $module";
@@ -1,7 +1,12 @@
1
+ #!/usr/bin/env perl
1
2
  use strict;
2
3
  use warnings;
3
4
 
4
5
  use Test::More;
6
+ use FindBin;
7
+ my $dir;
8
+ BEGIN { $dir = $FindBin::Bin . '/' };
9
+ use lib $dir;
5
10
 
6
11
  my @cases = (
7
12
  {
@@ -75,7 +80,7 @@ my $module = $ENV{EXERCISM} ? 'Example' : 'Crypto';
75
80
  my @subs = qw(new normalize_ciphertext normalize_plaintext plaintext_segments ciphertext size);
76
81
  plan tests => 2 + @subs + @cases;
77
82
 
78
- ok -e "$module.pm", "Missing $module.pm"
83
+ ok -e "${dir}${module}.pm", "Missing $module.pm"
79
84
  or BAIL_OUT "You need to create file: $module.pm";
80
85
 
81
86
  eval "use $module";
@@ -1,7 +1,12 @@
1
+ #!/usr/bin/env perl
1
2
  use strict;
2
3
  use warnings;
3
4
 
4
5
  use Test::More tests => 27;
6
+ use FindBin;
7
+ my $dir;
8
+ BEGIN { $dir = $FindBin::Bin . '/' };
9
+ use lib $dir;
5
10
 
6
11
  my $module = $ENV{EXERCISM} ? 'Example' : 'CustomSet';
7
12
 
@@ -1,13 +1,18 @@
1
+ #!/usr/bin/env perl
1
2
  use strict;
2
3
  use warnings;
3
4
 
4
5
  use Test::More;
6
+ use FindBin;
7
+ my $dir;
8
+ BEGIN { $dir = $FindBin::Bin . '/' };
9
+ use lib $dir;
5
10
 
6
11
  my $module = $ENV{EXERCISM} ? 'Example' : 'Squares';
7
12
 
8
13
  plan tests => 15;
9
14
 
10
- ok -e "$module.pm", "Missing $module.pm"
15
+ ok -e "${dir}${module}.pm", "Missing $module.pm"
11
16
  or BAIL_OUT "You need to create file: $module.pm";
12
17
 
13
18
  eval "use $module";
File without changes
@@ -1,7 +1,12 @@
1
+ #!/usr/bin/env perl
1
2
  use strict;
2
3
  use warnings;
3
4
 
4
5
  use Test::More;
6
+ use FindBin;
7
+ my $dir;
8
+ BEGIN { $dir = $FindBin::Bin . '/' };
9
+ use lib $dir;
5
10
 
6
11
  my @cases = (
7
12
  {
@@ -40,7 +45,7 @@ my @cases = (
40
45
 
41
46
  my $module = $ENV{EXERCISM} ? 'Example' : 'ETL';
42
47
 
43
- ok -e "$module.pm", "Find $module.pm",
48
+ ok -e "${dir}${module}.pm", "Find $module.pm",
44
49
  or BAIL_OUT "You need to create a class called $module.pm";
45
50
 
46
51
  use_ok $module
@@ -1,11 +1,16 @@
1
+ #!/usr/bin/env perl
1
2
  use strict;
2
3
  use warnings;
3
4
 
4
- use Test::More 'no_plan';
5
+ use Test::More tests => 16;
6
+ use FindBin;
7
+ my $dir;
8
+ BEGIN { $dir = $FindBin::Bin . '/' };
9
+ use lib $dir;
5
10
 
6
11
  my $module = $ENV{EXERCISM} ? 'Example' : 'FoodChainSong';
7
12
 
8
- ok -e "$module.pm", "Missing $module.pm"
13
+ ok -e "${dir}${module}.pm", "Missing $module.pm"
9
14
  or BAIL_OUT "You need to create file: $module.pm";
10
15
 
11
16
  eval "use $module";
@@ -1,8 +1,13 @@
1
+ #!/usr/bin/env perl
1
2
  use warnings;
2
3
  use strict;
3
4
 
4
5
  use DateTime;
5
6
  use Test::More tests => 4;
7
+ use FindBin;
8
+ my $dir;
9
+ BEGIN { $dir = $FindBin::Bin . '/' };
10
+ use lib $dir;
6
11
 
7
12
  my $module = $ENV{EXERCISM} ? 'Example' : 'Gigasecond';
8
13
 
@@ -1,7 +1,12 @@
1
+ #!/usr/bin/env perl
1
2
  use warnings;
2
3
  use strict;
3
4
 
4
5
  use Test::More tests => 9;
6
+ use FindBin;
7
+ my $dir;
8
+ BEGIN { $dir = $FindBin::Bin . '/' };
9
+ use lib $dir;
5
10
 
6
11
  my $module = $ENV{EXERCISM} ? 'Example' : 'GradeSchool';
7
12