trackler 2.1.0.11 → 2.1.0.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (554) hide show
  1. checksums.yaml +4 -4
  2. data/bin/bump-content +3 -3
  3. data/common/CONTRIBUTING.md +1 -0
  4. data/common/exercises/atbash-cipher/description.md +1 -1
  5. data/common/exercises/dominoes/canonical-data.json +2 -2
  6. data/common/exercises/robot-name/description.md +2 -3
  7. data/lib/trackler/version.rb +1 -1
  8. data/tracks/coq/.gitignore +3 -0
  9. data/tracks/coq/README.md +12 -14
  10. data/tracks/coq/config.json +18 -1
  11. data/tracks/coq/exercises/TRACK_HINTS.md +22 -0
  12. data/tracks/coq/exercises/hello-world/example.v +12 -0
  13. data/tracks/coq/exercises/hello-world/helloworld.v +3 -0
  14. data/tracks/coq/exercises/hello-world/metadata.yml +3 -0
  15. data/tracks/coq/exercises/hello-world/test.v +9 -0
  16. data/tracks/coq/exercises/rna-transcription/DNA.v +4 -0
  17. data/tracks/coq/exercises/rna-transcription/example.v +15 -0
  18. data/tracks/coq/exercises/rna-transcription/metadata.yml +3 -0
  19. data/tracks/coq/exercises/rna-transcription/rna-transcription.v +5 -0
  20. data/tracks/coq/exercises/tautology/description.md +1 -0
  21. data/tracks/coq/exercises/tautology/example.v +4 -0
  22. data/tracks/coq/exercises/tautology/metadata.yml +3 -0
  23. data/tracks/coq/exercises/tautology/tautology.v +4 -0
  24. data/tracks/ecmascript/.travis.yml +0 -1
  25. data/tracks/ecmascript/Makefile +1 -1
  26. data/tracks/ecmascript/README.md +4 -2
  27. data/tracks/ecmascript/exercises/accumulate/package.json +3 -3
  28. data/tracks/ecmascript/exercises/acronym/package.json +3 -3
  29. data/tracks/ecmascript/exercises/all-your-base/package.json +3 -3
  30. data/tracks/ecmascript/exercises/allergies/package.json +3 -3
  31. data/tracks/ecmascript/exercises/anagram/package.json +3 -3
  32. data/tracks/ecmascript/exercises/atbash-cipher/package.json +3 -3
  33. data/tracks/ecmascript/exercises/beer-song/package.json +3 -3
  34. data/tracks/ecmascript/exercises/binary-search-tree/package.json +3 -3
  35. data/tracks/ecmascript/exercises/binary-search/package.json +3 -3
  36. data/tracks/ecmascript/exercises/binary/package.json +3 -3
  37. data/tracks/ecmascript/exercises/bob/package.json +3 -3
  38. data/tracks/ecmascript/exercises/bracket-push/package.json +3 -3
  39. data/tracks/ecmascript/exercises/circular-buffer/package.json +3 -3
  40. data/tracks/ecmascript/exercises/clock/package.json +3 -3
  41. data/tracks/ecmascript/exercises/crypto-square/package.json +3 -3
  42. data/tracks/ecmascript/exercises/custom-set/package.json +3 -3
  43. data/tracks/ecmascript/exercises/diamond/package.json +3 -3
  44. data/tracks/ecmascript/exercises/difference-of-squares/package.json +3 -3
  45. data/tracks/ecmascript/exercises/etl/package.json +3 -3
  46. data/tracks/ecmascript/exercises/food-chain/package.json +3 -3
  47. data/tracks/ecmascript/exercises/gigasecond/package.json +3 -3
  48. data/tracks/ecmascript/exercises/grade-school/package.json +3 -3
  49. data/tracks/ecmascript/exercises/grains/package.json +3 -3
  50. data/tracks/ecmascript/exercises/hamming/package.json +3 -3
  51. data/tracks/ecmascript/exercises/hello-world/package.json +3 -3
  52. data/tracks/ecmascript/exercises/hexadecimal/package.json +3 -3
  53. data/tracks/ecmascript/exercises/isogram/package.json +3 -3
  54. data/tracks/ecmascript/exercises/kindergarten-garden/package.json +3 -3
  55. data/tracks/ecmascript/exercises/largest-series-product/package.json +3 -3
  56. data/tracks/ecmascript/exercises/leap/package.json +3 -3
  57. data/tracks/ecmascript/exercises/linked-list/package.json +3 -3
  58. data/tracks/ecmascript/exercises/luhn/package.json +3 -3
  59. data/tracks/ecmascript/exercises/matrix/package.json +3 -3
  60. data/tracks/ecmascript/exercises/meetup/package.json +3 -3
  61. data/tracks/ecmascript/exercises/nth-prime/package.json +3 -3
  62. data/tracks/ecmascript/exercises/ocr-numbers/package.json +3 -3
  63. data/tracks/ecmascript/exercises/octal/package.json +3 -3
  64. data/tracks/ecmascript/exercises/palindrome-products/package.json +3 -3
  65. data/tracks/ecmascript/exercises/pangram/package.json +3 -3
  66. data/tracks/ecmascript/exercises/pascals-triangle/package.json +3 -3
  67. data/tracks/ecmascript/exercises/perfect-numbers/package.json +3 -3
  68. data/tracks/ecmascript/exercises/phone-number/package.json +3 -3
  69. data/tracks/ecmascript/exercises/pig-latin/package.json +3 -3
  70. data/tracks/ecmascript/exercises/prime-factors/package.json +3 -3
  71. data/tracks/ecmascript/exercises/pythagorean-triplet/package.json +3 -3
  72. data/tracks/ecmascript/exercises/queen-attack/package.json +3 -3
  73. data/tracks/ecmascript/exercises/raindrops/package.json +3 -3
  74. data/tracks/ecmascript/exercises/rna-transcription/package.json +3 -3
  75. data/tracks/ecmascript/exercises/robot-name/package.json +3 -3
  76. data/tracks/ecmascript/exercises/robot-simulator/package.json +3 -3
  77. data/tracks/ecmascript/exercises/roman-numerals/package.json +3 -3
  78. data/tracks/ecmascript/exercises/saddle-points/package.json +3 -3
  79. data/tracks/ecmascript/exercises/say/package.json +3 -3
  80. data/tracks/ecmascript/exercises/scrabble-score/package.json +3 -3
  81. data/tracks/ecmascript/exercises/secret-handshake/package.json +3 -3
  82. data/tracks/ecmascript/exercises/series/package.json +3 -3
  83. data/tracks/ecmascript/exercises/sieve/package.json +3 -3
  84. data/tracks/ecmascript/exercises/simple-cipher/package.json +3 -3
  85. data/tracks/ecmascript/exercises/space-age/package.json +3 -3
  86. data/tracks/ecmascript/exercises/strain/package.json +3 -3
  87. data/tracks/ecmascript/exercises/sum-of-multiples/package.json +3 -3
  88. data/tracks/ecmascript/exercises/triangle/package.json +3 -3
  89. data/tracks/ecmascript/exercises/trinary/package.json +3 -3
  90. data/tracks/ecmascript/exercises/two-bucket/package.json +3 -3
  91. data/tracks/ecmascript/exercises/word-count/package.json +3 -3
  92. data/tracks/ecmascript/exercises/wordy/package.json +3 -3
  93. data/tracks/ecmascript/package.json +3 -3
  94. data/tracks/ecmascript/yarn.lock +2886 -0
  95. data/tracks/elixir/exercises/isogram/isogram_test.exs +0 -10
  96. data/tracks/elixir/exercises/strain/strain.exs +1 -2
  97. data/tracks/erlang/exercises/roman-numerals/test/roman_numerals_tests.erl +1 -1
  98. data/tracks/go/exercises/binary-search-tree/binary_search_tree_test.go +36 -9
  99. data/tracks/go/exercises/bracket-push/.meta/gen.go +49 -0
  100. data/tracks/go/exercises/bracket-push/bracket_push_test.go +1 -43
  101. data/tracks/go/exercises/bracket-push/cases_test.go +83 -0
  102. data/tracks/go/exercises/bracket-push/example.go +13 -16
  103. data/tracks/go/gen/gen.go +26 -2
  104. data/tracks/haskell/exercises/accumulate/package.yaml +1 -1
  105. data/tracks/haskell/exercises/accumulate/test/Tests.hs +2 -2
  106. data/tracks/haskell/exercises/acronym/package.yaml +1 -1
  107. data/tracks/haskell/exercises/acronym/test/Tests.hs +1 -2
  108. data/tracks/haskell/exercises/all-your-base/package.yaml +1 -1
  109. data/tracks/haskell/exercises/all-your-base/test/Tests.hs +1 -2
  110. data/tracks/haskell/exercises/allergies/package.yaml +1 -1
  111. data/tracks/haskell/exercises/allergies/test/Tests.hs +1 -1
  112. data/tracks/haskell/exercises/alphametics/package.yaml +1 -1
  113. data/tracks/haskell/exercises/alphametics/test/Tests.hs +1 -2
  114. data/tracks/haskell/exercises/anagram/package.yaml +1 -1
  115. data/tracks/haskell/exercises/anagram/test/Tests.hs +1 -2
  116. data/tracks/haskell/exercises/atbash-cipher/package.yaml +1 -1
  117. data/tracks/haskell/exercises/atbash-cipher/test/Tests.hs +1 -1
  118. data/tracks/haskell/exercises/bank-account/package.yaml +1 -1
  119. data/tracks/haskell/exercises/bank-account/test/Tests.hs +2 -2
  120. data/tracks/haskell/exercises/beer-song/package.yaml +1 -1
  121. data/tracks/haskell/exercises/beer-song/test/Tests.hs +8 -10
  122. data/tracks/haskell/exercises/binary-search-tree/package.yaml +1 -1
  123. data/tracks/haskell/exercises/binary-search-tree/test/Tests.hs +2 -2
  124. data/tracks/haskell/exercises/binary/package.yaml +1 -1
  125. data/tracks/haskell/exercises/binary/test/Tests.hs +1 -2
  126. data/tracks/haskell/exercises/bob/package.yaml +1 -1
  127. data/tracks/haskell/exercises/bob/test/Tests.hs +1 -2
  128. data/tracks/haskell/exercises/bowling/package.yaml +1 -1
  129. data/tracks/haskell/exercises/bowling/test/Tests.hs +5 -6
  130. data/tracks/haskell/exercises/bracket-push/package.yaml +1 -1
  131. data/tracks/haskell/exercises/bracket-push/test/Tests.hs +1 -2
  132. data/tracks/haskell/exercises/change/package.yaml +1 -1
  133. data/tracks/haskell/exercises/change/test/Tests.hs +2 -3
  134. data/tracks/haskell/exercises/clock/package.yaml +1 -1
  135. data/tracks/haskell/exercises/clock/test/Tests.hs +1 -1
  136. data/tracks/haskell/exercises/connect/package.yaml +1 -1
  137. data/tracks/haskell/exercises/connect/test/Tests.hs +1 -2
  138. data/tracks/haskell/exercises/crypto-square/package.yaml +1 -1
  139. data/tracks/haskell/exercises/crypto-square/test/Tests.hs +1 -2
  140. data/tracks/haskell/exercises/custom-set/package.yaml +1 -1
  141. data/tracks/haskell/exercises/custom-set/test/Tests.hs +1 -1
  142. data/tracks/haskell/exercises/difference-of-squares/package.yaml +1 -1
  143. data/tracks/haskell/exercises/difference-of-squares/test/Tests.hs +1 -1
  144. data/tracks/haskell/exercises/dominoes/package.yaml +1 -1
  145. data/tracks/haskell/exercises/dominoes/test/Tests.hs +2 -3
  146. data/tracks/haskell/exercises/etl/package.yaml +1 -1
  147. data/tracks/haskell/exercises/etl/test/Tests.hs +1 -1
  148. data/tracks/haskell/exercises/food-chain/package.yaml +1 -1
  149. data/tracks/haskell/exercises/food-chain/test/Tests.hs +8 -10
  150. data/tracks/haskell/exercises/forth/package.yaml +1 -1
  151. data/tracks/haskell/exercises/forth/test/Tests.hs +1 -1
  152. data/tracks/haskell/exercises/gigasecond/package.yaml +1 -1
  153. data/tracks/haskell/exercises/gigasecond/test/Tests.hs +12 -13
  154. data/tracks/haskell/exercises/go-counting/package.yaml +1 -1
  155. data/tracks/haskell/exercises/go-counting/test/Tests.hs +2 -2
  156. data/tracks/haskell/exercises/grade-school/package.yaml +1 -1
  157. data/tracks/haskell/exercises/grade-school/test/Tests.hs +2 -2
  158. data/tracks/haskell/exercises/grains/package.yaml +1 -1
  159. data/tracks/haskell/exercises/grains/test/Tests.hs +1 -1
  160. data/tracks/haskell/exercises/hamming/package.yaml +1 -1
  161. data/tracks/haskell/exercises/hamming/test/Tests.hs +1 -2
  162. data/tracks/haskell/exercises/hello-world/package.yaml +1 -1
  163. data/tracks/haskell/exercises/hello-world/test/Tests.hs +3 -5
  164. data/tracks/haskell/exercises/hexadecimal/package.yaml +1 -1
  165. data/tracks/haskell/exercises/hexadecimal/test/Tests.hs +1 -2
  166. data/tracks/haskell/exercises/house/package.yaml +1 -1
  167. data/tracks/haskell/exercises/house/test/Tests.hs +8 -10
  168. data/tracks/haskell/exercises/kindergarten-garden/package.yaml +1 -1
  169. data/tracks/haskell/exercises/kindergarten-garden/test/Tests.hs +2 -2
  170. data/tracks/haskell/exercises/largest-series-product/package.yaml +1 -1
  171. data/tracks/haskell/exercises/largest-series-product/test/Tests.hs +1 -3
  172. data/tracks/haskell/exercises/leap/package.yaml +1 -1
  173. data/tracks/haskell/exercises/leap/test/Tests.hs +9 -22
  174. data/tracks/haskell/exercises/lens-person/package.yaml +1 -1
  175. data/tracks/haskell/exercises/lens-person/test/Tests.hs +2 -2
  176. data/tracks/haskell/exercises/linked-list/package.yaml +1 -1
  177. data/tracks/haskell/exercises/linked-list/test/Tests.hs +2 -2
  178. data/tracks/haskell/exercises/list-ops/package.yaml +1 -1
  179. data/tracks/haskell/exercises/list-ops/test/Tests.hs +2 -2
  180. data/tracks/haskell/exercises/luhn/examples/success-standard/src/Luhn.hs +8 -23
  181. data/tracks/haskell/exercises/luhn/package.yaml +1 -1
  182. data/tracks/haskell/exercises/luhn/src/Luhn.hs +2 -14
  183. data/tracks/haskell/exercises/luhn/test/Tests.hs +68 -70
  184. data/tracks/haskell/exercises/matrix/package.yaml +1 -1
  185. data/tracks/haskell/exercises/matrix/test/Tests.hs +2 -2
  186. data/tracks/haskell/exercises/meetup/package.yaml +1 -1
  187. data/tracks/haskell/exercises/meetup/test/Tests.hs +1 -2
  188. data/tracks/haskell/exercises/minesweeper/package.yaml +1 -1
  189. data/tracks/haskell/exercises/minesweeper/test/Tests.hs +1 -2
  190. data/tracks/haskell/exercises/nth-prime/package.yaml +1 -1
  191. data/tracks/haskell/exercises/nth-prime/test/Tests.hs +1 -2
  192. data/tracks/haskell/exercises/nucleotide-count/package.yaml +1 -1
  193. data/tracks/haskell/exercises/nucleotide-count/test/Tests.hs +1 -1
  194. data/tracks/haskell/exercises/ocr-numbers/package.yaml +1 -1
  195. data/tracks/haskell/exercises/ocr-numbers/test/Tests.hs +1 -2
  196. data/tracks/haskell/exercises/octal/package.yaml +1 -1
  197. data/tracks/haskell/exercises/octal/test/Tests.hs +2 -2
  198. data/tracks/haskell/exercises/palindrome-products/package.yaml +1 -1
  199. data/tracks/haskell/exercises/palindrome-products/test/Tests.hs +1 -1
  200. data/tracks/haskell/exercises/pangram/package.yaml +1 -1
  201. data/tracks/haskell/exercises/pangram/test/Tests.hs +1 -2
  202. data/tracks/haskell/exercises/parallel-letter-frequency/package.yaml +1 -1
  203. data/tracks/haskell/exercises/parallel-letter-frequency/test/Tests.hs +1 -1
  204. data/tracks/haskell/exercises/pascals-triangle/package.yaml +1 -1
  205. data/tracks/haskell/exercises/pascals-triangle/test/Tests.hs +1 -2
  206. data/tracks/haskell/exercises/phone-number/examples/success-standard/src/Phone.hs +12 -3
  207. data/tracks/haskell/exercises/phone-number/package.yaml +1 -1
  208. data/tracks/haskell/exercises/phone-number/test/Tests.hs +24 -17
  209. data/tracks/haskell/exercises/pig-latin/package.yaml +1 -1
  210. data/tracks/haskell/exercises/pig-latin/test/Tests.hs +1 -2
  211. data/tracks/haskell/exercises/pov/package.yaml +1 -1
  212. data/tracks/haskell/exercises/pov/test/Tests.hs +6 -9
  213. data/tracks/haskell/exercises/prime-factors/package.yaml +1 -1
  214. data/tracks/haskell/exercises/prime-factors/test/Tests.hs +1 -2
  215. data/tracks/haskell/exercises/pythagorean-triplet/package.yaml +1 -1
  216. data/tracks/haskell/exercises/pythagorean-triplet/test/Tests.hs +1 -1
  217. data/tracks/haskell/exercises/queen-attack/package.yaml +1 -1
  218. data/tracks/haskell/exercises/queen-attack/test/Tests.hs +1 -1
  219. data/tracks/haskell/exercises/raindrops/package.yaml +1 -1
  220. data/tracks/haskell/exercises/raindrops/test/Tests.hs +1 -2
  221. data/tracks/haskell/exercises/rna-transcription/package.yaml +1 -1
  222. data/tracks/haskell/exercises/rna-transcription/test/Tests.hs +1 -2
  223. data/tracks/haskell/exercises/robot-name/package.yaml +1 -1
  224. data/tracks/haskell/exercises/robot-name/test/Tests.hs +2 -2
  225. data/tracks/haskell/exercises/robot-simulator/package.yaml +1 -1
  226. data/tracks/haskell/exercises/robot-simulator/test/Tests.hs +1 -1
  227. data/tracks/haskell/exercises/roman-numerals/package.yaml +1 -1
  228. data/tracks/haskell/exercises/roman-numerals/test/Tests.hs +59 -41
  229. data/tracks/haskell/exercises/run-length-encoding/package.yaml +1 -1
  230. data/tracks/haskell/exercises/run-length-encoding/test/Tests.hs +1 -1
  231. data/tracks/haskell/exercises/saddle-points/package.yaml +1 -1
  232. data/tracks/haskell/exercises/saddle-points/test/Tests.hs +1 -2
  233. data/tracks/haskell/exercises/say/package.yaml +1 -1
  234. data/tracks/haskell/exercises/say/test/Tests.hs +1 -2
  235. data/tracks/haskell/exercises/scrabble-score/package.yaml +1 -1
  236. data/tracks/haskell/exercises/scrabble-score/test/Tests.hs +1 -1
  237. data/tracks/haskell/exercises/secret-handshake/package.yaml +1 -1
  238. data/tracks/haskell/exercises/secret-handshake/test/Tests.hs +2 -2
  239. data/tracks/haskell/exercises/series/package.yaml +1 -1
  240. data/tracks/haskell/exercises/series/test/Tests.hs +2 -2
  241. data/tracks/haskell/exercises/sgf-parsing/package.yaml +1 -1
  242. data/tracks/haskell/exercises/sgf-parsing/test/Tests.hs +1 -2
  243. data/tracks/haskell/exercises/sieve/package.yaml +1 -1
  244. data/tracks/haskell/exercises/sieve/test/Tests.hs +1 -2
  245. data/tracks/haskell/exercises/simple-cipher/package.yaml +1 -1
  246. data/tracks/haskell/exercises/simple-cipher/test/Tests.hs +2 -2
  247. data/tracks/haskell/exercises/simple-linked-list/package.yaml +1 -1
  248. data/tracks/haskell/exercises/simple-linked-list/test/Tests.hs +2 -2
  249. data/tracks/haskell/exercises/space-age/package.yaml +1 -1
  250. data/tracks/haskell/exercises/space-age/test/Tests.hs +1 -2
  251. data/tracks/haskell/exercises/strain/package.yaml +1 -1
  252. data/tracks/haskell/exercises/strain/test/Tests.hs +2 -2
  253. data/tracks/haskell/exercises/sublist/package.yaml +1 -1
  254. data/tracks/haskell/exercises/sublist/test/Tests.hs +1 -1
  255. data/tracks/haskell/exercises/sum-of-multiples/package.yaml +1 -1
  256. data/tracks/haskell/exercises/sum-of-multiples/test/Tests.hs +1 -2
  257. data/tracks/haskell/exercises/triangle/package.yaml +1 -1
  258. data/tracks/haskell/exercises/triangle/test/Tests.hs +1 -2
  259. data/tracks/haskell/exercises/trinary/package.yaml +1 -1
  260. data/tracks/haskell/exercises/trinary/test/Tests.hs +2 -2
  261. data/tracks/haskell/exercises/word-count/package.yaml +1 -1
  262. data/tracks/haskell/exercises/word-count/test/Tests.hs +1 -2
  263. data/tracks/haskell/exercises/wordy/package.yaml +1 -1
  264. data/tracks/haskell/exercises/wordy/test/Tests.hs +1 -2
  265. data/tracks/haskell/exercises/zebra-puzzle/package.yaml +1 -1
  266. data/tracks/haskell/exercises/zebra-puzzle/test/Tests.hs +3 -4
  267. data/tracks/haskell/exercises/zipper/package.yaml +1 -1
  268. data/tracks/haskell/exercises/zipper/test/Tests.hs +2 -2
  269. data/tracks/java/.github/PULL_REQUEST_TEMPLATE.md +10 -0
  270. data/tracks/java/POLICIES.md +67 -0
  271. data/tracks/java/config.json +7 -10
  272. data/tracks/java/exercises/acronym/src/example/java/Acronym.java +6 -4
  273. data/tracks/java/exercises/acronym/src/main/java/Acronym.java +11 -0
  274. data/tracks/java/exercises/atbash-cipher/src/test/java/AtbashTest.java +1 -1
  275. data/tracks/java/exercises/beer-song/src/test/java/BeerSongTest.java +6 -6
  276. data/tracks/java/exercises/binary-search-tree/src/test/java/BSTTest.java +8 -8
  277. data/tracks/java/exercises/binary-search/src/test/java/BinarySearchTest.java +9 -9
  278. data/tracks/java/exercises/bob/src/test/java/BobTest.java +17 -17
  279. data/tracks/java/exercises/crypto-square/src/test/java/CryptoSquareTest.java +14 -14
  280. data/tracks/java/exercises/difference-of-squares/src/example/java/DifferenceOfSquaresCalculator.java +4 -4
  281. data/tracks/java/exercises/difference-of-squares/src/main/java/DifferenceOfSquaresCalculator.java +11 -1
  282. data/tracks/java/exercises/hello-world/src/main/java/HelloWorld.java +1 -1
  283. data/tracks/java/exercises/pangram/src/main/java/PangramChecker.java +2 -1
  284. data/tracks/java/exercises/raindrops/src/example/java/RaindropConverter.java +4 -3
  285. data/tracks/java/exercises/raindrops/src/main/java/RaindropConverter.java +7 -0
  286. data/tracks/java/exercises/rna-transcription/src/example/java/RnaTranscription.java +2 -2
  287. data/tracks/java/exercises/rna-transcription/src/main/java/RnaTranscription.java +2 -2
  288. data/tracks/java/exercises/rna-transcription/src/test/java/RnaTranscriptionTest.java +6 -6
  289. data/tracks/java/exercises/run-length-encoding/build.gradle +17 -0
  290. data/tracks/java/exercises/run-length-encoding/src/example/java/RunLengthEncoding.java +67 -0
  291. data/tracks/java/exercises/run-length-encoding/src/main/java/RunLengthEncoding.java +9 -0
  292. data/tracks/java/exercises/run-length-encoding/src/test/java/RunLengthEncodingTest.java +111 -0
  293. data/tracks/java/exercises/scrabble-score/src/example/java/Scrabble.java +5 -6
  294. data/tracks/java/exercises/scrabble-score/src/main/java/Scrabble.java +11 -0
  295. data/tracks/java/exercises/scrabble-score/src/test/java/ScrabbleScoreTest.java +1 -3
  296. data/tracks/java/exercises/space-age/src/example/java/SpaceAge.java +13 -12
  297. data/tracks/java/exercises/space-age/src/main/java/SpaceAge.java +43 -0
  298. data/tracks/javascript/config.json +12 -2
  299. data/tracks/javascript/docs/TESTS.md +2 -2
  300. data/tracks/javascript/exercises/minesweeper/example.js +48 -0
  301. data/tracks/javascript/exercises/minesweeper/minesweeper.spec.js +182 -0
  302. data/tracks/lisp/.travis.yml +1 -1
  303. data/tracks/lisp/bin/xlisp-test.lisp +23 -5
  304. data/tracks/lisp/config.json +114 -29
  305. data/tracks/ocaml/config.json +10 -5
  306. data/tracks/ocaml/exercises/acronym/.merlin +5 -0
  307. data/tracks/ocaml/exercises/acronym/Makefile +11 -0
  308. data/tracks/ocaml/exercises/acronym/acronym.mli +2 -0
  309. data/tracks/ocaml/exercises/acronym/example.ml +12 -0
  310. data/tracks/ocaml/exercises/acronym/test.ml +26 -0
  311. data/tracks/ocaml/exercises/bowling/bowling.mli +4 -2
  312. data/tracks/ocaml/exercises/bowling/example.ml +56 -16
  313. data/tracks/ocaml/exercises/bowling/test.ml +132 -27
  314. data/tracks/ocaml/exercises/dominoes/test.ml +1 -1
  315. data/tracks/ocaml/exercises/phone-number/test.ml +0 -2
  316. data/tracks/ocaml/tools/test-generator/src/special_cases.ml +16 -0
  317. data/tracks/ocaml/tools/test-generator/templates/acronym/template.ml +16 -0
  318. data/tracks/ocaml/tools/test-generator/templates/bowling/template.ml +34 -0
  319. data/tracks/perl5/.github/stale.yml +21 -0
  320. data/tracks/perl6/.github/stale.yml +21 -0
  321. data/tracks/perl6/exercises/accumulate/accumulate.t +5 -13
  322. data/tracks/perl6/exercises/accumulate/example.yaml +23 -0
  323. data/tracks/perl6/exercises/allergies/allergies.t +138 -141
  324. data/tracks/perl6/exercises/allergies/example.yaml +21 -0
  325. data/tracks/perl6/exercises/anagram/anagram.t +141 -143
  326. data/tracks/perl6/exercises/anagram/example.yaml +6 -0
  327. data/tracks/perl6/exercises/atbash-cipher/atbash-cipher.t +99 -101
  328. data/tracks/perl6/exercises/atbash-cipher/example.yaml +13 -0
  329. data/tracks/perl6/exercises/grains/example.yaml +13 -0
  330. data/tracks/perl6/exercises/grains/grains.t +86 -89
  331. data/tracks/perl6/exercises/linked-list/example.yaml +81 -0
  332. data/tracks/perl6/exercises/linked-list/linked-list.t +4 -3
  333. data/tracks/perl6/exercises/raindrops/example.yaml +12 -0
  334. data/tracks/perl6/exercises/raindrops/raindrops.t +124 -127
  335. data/tracks/perl6/exercises/rna-transcription/example.yaml +12 -0
  336. data/tracks/perl6/exercises/rna-transcription/rna-transcription.t +75 -78
  337. data/tracks/perl6/exercises/robot-name/example.yaml +25 -0
  338. data/tracks/perl6/exercises/robot-name/robot-name.t +5 -7
  339. data/tracks/perl6/exercises/scrabble-score/example.yaml +6 -0
  340. data/tracks/perl6/exercises/scrabble-score/scrabble-score.t +81 -84
  341. data/tracks/perl6/exercises/space-age/example.yaml +6 -0
  342. data/tracks/perl6/exercises/space-age/space-age.t +71 -74
  343. data/tracks/perl6/exercises/word-count/example.yaml +6 -0
  344. data/tracks/perl6/exercises/word-count/word-count.t +125 -128
  345. data/tracks/perl6/exercises/wordy/example.yaml +12 -0
  346. data/tracks/perl6/exercises/wordy/wordy.t +117 -120
  347. data/tracks/perl6/templates/test.mustache +3 -1
  348. data/tracks/php/config.json +5 -0
  349. data/tracks/php/exercises/sum-of-multiples/example.php +15 -0
  350. data/tracks/php/exercises/sum-of-multiples/sum-of-multiples_test.php +64 -0
  351. data/tracks/python/exercises/book-store/book_store_test.py +1 -1
  352. data/tracks/python/exercises/rail-fence-cipher/rail_fence_cipher_test.py +7 -7
  353. data/tracks/python/exercises/tournament/tournament_test.py +62 -15
  354. data/tracks/r/docs/TESTS.md +2 -0
  355. data/tracks/r/exercises/TRACK_HINTS.md +1 -1
  356. data/tracks/racket/docs/INSTALLATION.md +13 -3
  357. data/tracks/ruby/README.md +27 -21
  358. data/tracks/ruby/bin/generate +3 -3
  359. data/tracks/ruby/config.json +7 -6
  360. data/tracks/ruby/exercises/accumulate/{example.rb → .meta/solutions/accumulate.rb} +0 -0
  361. data/tracks/ruby/exercises/acronym/.meta/generator/{acronym_cases.rb → acronym_case.rb} +0 -0
  362. data/tracks/ruby/exercises/acronym/{example.rb → .meta/solutions/acronym.rb} +0 -0
  363. data/tracks/ruby/exercises/all-your-base/.meta/generator/{all_your_base_cases.rb → all_your_base_case.rb} +0 -0
  364. data/tracks/ruby/exercises/all-your-base/{example.rb → .meta/solutions/all_your_base.rb} +0 -0
  365. data/tracks/ruby/exercises/allergies/{example.rb → .meta/solutions/allergies.rb} +0 -0
  366. data/tracks/ruby/exercises/alphametics/.meta/generator/{alphametics_cases.rb → alphametics_case.rb} +0 -0
  367. data/tracks/ruby/exercises/alphametics/.meta/generator/test_template.erb +2 -2
  368. data/tracks/ruby/exercises/alphametics/{example.rb → .meta/solutions/alphametics.rb} +0 -0
  369. data/tracks/ruby/exercises/anagram/.meta/generator/{anagram_cases.rb → anagram_case.rb} +0 -0
  370. data/tracks/ruby/exercises/anagram/{example.rb → .meta/solutions/anagram.rb} +0 -0
  371. data/tracks/ruby/exercises/atbash-cipher/{example.rb → .meta/solutions/atbash_cipher.rb} +0 -0
  372. data/tracks/ruby/exercises/beer-song/.meta/generator/{beer_song_cases.rb → beer_song_case.rb} +0 -0
  373. data/tracks/ruby/exercises/beer-song/{example.rb → .meta/solutions/beer_song.rb} +0 -0
  374. data/tracks/ruby/exercises/binary-search-tree/{example.rb → .meta/solutions/binary_search_tree.rb} +0 -0
  375. data/tracks/ruby/exercises/binary-search/{example.rb → .meta/solutions/binary_search.rb} +0 -0
  376. data/tracks/ruby/exercises/binary/.meta/generator/{binary_cases.rb → binary_case.rb} +0 -0
  377. data/tracks/ruby/exercises/binary/{example.rb → .meta/solutions/binary.rb} +0 -0
  378. data/tracks/ruby/exercises/bob/{example.rb → .meta/solutions/bob.rb} +0 -0
  379. data/tracks/ruby/exercises/bowling/.meta/generator/{bowling_cases.rb → bowling_case.rb} +0 -0
  380. data/tracks/ruby/exercises/bowling/.meta/generator/test_template.erb +2 -2
  381. data/tracks/ruby/exercises/bowling/{example.rb → .meta/solutions/bowling.rb} +0 -0
  382. data/tracks/ruby/exercises/bracket-push/.meta/generator/{bracket_push_cases.rb → bracket_push_case.rb} +0 -0
  383. data/tracks/ruby/exercises/bracket-push/{example.rb → .meta/solutions/bracket_push.rb} +0 -0
  384. data/tracks/ruby/exercises/circular-buffer/{example.rb → .meta/solutions/circular_buffer.rb} +0 -0
  385. data/tracks/ruby/exercises/clock/.meta/generator/{clock_cases.rb → clock_case.rb} +0 -0
  386. data/tracks/ruby/exercises/clock/{example.rb → .meta/solutions/clock.rb} +0 -0
  387. data/tracks/ruby/exercises/connect/.meta/generator/{connect_cases.rb → connect_case.rb} +0 -0
  388. data/tracks/ruby/exercises/connect/.meta/generator/test_template.erb +2 -2
  389. data/tracks/ruby/exercises/connect/{example.rb → .meta/solutions/connect.rb} +0 -0
  390. data/tracks/ruby/exercises/crypto-square/{example.rb → .meta/solutions/crypto_square.rb} +0 -0
  391. data/tracks/ruby/exercises/custom-set/.meta/generator/{custom_set_cases.rb → custom_set_case.rb} +0 -0
  392. data/tracks/ruby/exercises/custom-set/{example.rb → .meta/solutions/custom_set.rb} +0 -0
  393. data/tracks/ruby/exercises/diamond/{example.rb → .meta/solutions/diamond.rb} +0 -0
  394. data/tracks/ruby/exercises/difference-of-squares/.meta/generator/{difference_of_squares_cases.rb → difference_of_squares_case.rb} +0 -0
  395. data/tracks/ruby/exercises/difference-of-squares/{example.rb → .meta/solutions/difference_of_squares.rb} +0 -0
  396. data/tracks/ruby/exercises/dominoes/.meta/generator/{dominoes_cases.rb → dominoes_case.rb} +0 -0
  397. data/tracks/ruby/exercises/dominoes/.meta/generator/test_template.erb +2 -2
  398. data/tracks/ruby/exercises/dominoes/{example.rb → .meta/solutions/dominoes.rb} +0 -0
  399. data/tracks/ruby/exercises/dominoes/dominoes_test.rb +2 -2
  400. data/tracks/ruby/exercises/etl/.meta/generator/{etl_cases.rb → etl_case.rb} +0 -0
  401. data/tracks/ruby/exercises/etl/{example.rb → .meta/solutions/etl.rb} +0 -0
  402. data/tracks/ruby/exercises/flatten-array/{example.rb → .meta/solutions/flatten_array.rb} +0 -0
  403. data/tracks/ruby/exercises/food-chain/{example.rb → .meta/solutions/food_chain.rb} +0 -0
  404. data/tracks/ruby/exercises/gigasecond/.meta/generator/{gigasecond_cases.rb → gigasecond_case.rb} +0 -0
  405. data/tracks/ruby/exercises/gigasecond/{example.rb → .meta/solutions/gigasecond.rb} +0 -0
  406. data/tracks/ruby/exercises/grade-school/{example.rb → .meta/solutions/grade_school.rb} +0 -0
  407. data/tracks/ruby/exercises/grains/.meta/generator/{grains_cases.rb → grains_case.rb} +0 -0
  408. data/tracks/ruby/exercises/grains/{example.rb → .meta/solutions/grains.rb} +0 -0
  409. data/tracks/ruby/exercises/hamming/.meta/generator/{hamming_cases.rb → hamming_case.rb} +0 -0
  410. data/tracks/ruby/exercises/hamming/{example.rb → .meta/solutions/hamming.rb} +0 -0
  411. data/tracks/ruby/exercises/hello-world/.meta/generator/{hello_world_cases.rb → hello_world_case.rb} +0 -0
  412. data/tracks/ruby/exercises/hello-world/.meta/generator/test_template.erb +2 -2
  413. data/tracks/ruby/exercises/hello-world/{example.rb → .meta/solutions/hello_world.rb} +0 -0
  414. data/tracks/ruby/exercises/hexadecimal/{example.rb → .meta/solutions/hexadecimal.rb} +0 -0
  415. data/tracks/ruby/exercises/house/{example.rb → .meta/solutions/house.rb} +0 -0
  416. data/tracks/ruby/exercises/isogram/.meta/generator/{isogram_cases.rb → isogram_case.rb} +0 -0
  417. data/tracks/ruby/exercises/isogram/{example.rb → .meta/solutions/isogram.rb} +0 -0
  418. data/tracks/ruby/exercises/kindergarten-garden/{example.rb → .meta/solutions/kindergarten_garden.rb} +0 -0
  419. data/tracks/ruby/exercises/largest-series-product/.meta/generator/{largest_series_product_cases.rb → largest_series_product_case.rb} +0 -0
  420. data/tracks/ruby/exercises/largest-series-product/{example.rb → .meta/solutions/largest_series_product.rb} +0 -0
  421. data/tracks/ruby/exercises/leap/.meta/generator/{leap_cases.rb → leap_case.rb} +0 -0
  422. data/tracks/ruby/exercises/leap/.meta/generator/test_template.erb +2 -2
  423. data/tracks/ruby/exercises/leap/{example.rb → .meta/solutions/leap.rb} +0 -0
  424. data/tracks/ruby/exercises/linked-list/{example.rb → .meta/solutions/linked_list.rb} +0 -0
  425. data/tracks/ruby/exercises/list-ops/{example.rb → .meta/solutions/list_ops.rb} +0 -0
  426. data/tracks/ruby/exercises/luhn/.meta/generator/{luhn_cases.rb → luhn_case.rb} +0 -0
  427. data/tracks/ruby/exercises/luhn/{example.rb → .meta/solutions/luhn.rb} +0 -0
  428. data/tracks/ruby/exercises/matrix/{example.rb → .meta/solutions/matrix.rb} +0 -0
  429. data/tracks/ruby/exercises/meetup/{example.rb → .meta/solutions/meetup.rb} +0 -0
  430. data/tracks/ruby/exercises/minesweeper/{example.rb → .meta/solutions/minesweeper.rb} +0 -0
  431. data/tracks/ruby/exercises/nth-prime/.meta/generator/{nth_prime_cases.rb → nth_prime_case.rb} +0 -0
  432. data/tracks/ruby/exercises/nth-prime/{example.rb → .meta/solutions/nth_prime.rb} +0 -0
  433. data/tracks/ruby/exercises/nucleotide-count/{example.rb → .meta/solutions/nucleotide_count.rb} +0 -0
  434. data/tracks/ruby/exercises/ocr-numbers/.meta/generator/{ocr_numbers_cases.rb → ocr_numbers_case.rb} +0 -0
  435. data/tracks/ruby/exercises/ocr-numbers/{example.rb → .meta/solutions/ocr_numbers.rb} +0 -0
  436. data/tracks/ruby/exercises/octal/{example.rb → .meta/solutions/octal.rb} +0 -0
  437. data/tracks/ruby/exercises/palindrome-products/{example.rb → .meta/solutions/palindrome_products.rb} +0 -0
  438. data/tracks/ruby/exercises/pangram/.meta/generator/{pangram_cases.rb → pangram_case.rb} +0 -0
  439. data/tracks/ruby/exercises/pangram/{example.rb → .meta/solutions/pangram.rb} +0 -0
  440. data/tracks/ruby/exercises/pascals-triangle/{example.rb → .meta/solutions/pascals_triangle.rb} +0 -0
  441. data/tracks/ruby/exercises/perfect-numbers/{example.rb → .meta/solutions/perfect_numbers.rb} +0 -0
  442. data/tracks/ruby/exercises/phone-number/.meta/generator/{phone_number_cases.rb → phone_number_case.rb} +0 -0
  443. data/tracks/ruby/exercises/phone-number/{example.rb → .meta/solutions/phone_number.rb} +0 -0
  444. data/tracks/ruby/exercises/pig-latin/.meta/generator/{pig_latin_cases.rb → pig_latin_case.rb} +0 -0
  445. data/tracks/ruby/exercises/pig-latin/{example.rb → .meta/solutions/pig_latin.rb} +0 -0
  446. data/tracks/ruby/exercises/point-mutations/{example.rb → .meta/solutions/point_mutations.rb} +0 -0
  447. data/tracks/ruby/exercises/poker/{example.rb → .meta/solutions/poker.rb} +0 -0
  448. data/tracks/ruby/exercises/prime-factors/{example.rb → .meta/solutions/prime_factors.rb} +0 -0
  449. data/tracks/ruby/exercises/protein-translation/{example.rb → .meta/solutions/protein_translation.rb} +0 -0
  450. data/tracks/ruby/exercises/proverb/{example.rb → .meta/solutions/proverb.rb} +0 -0
  451. data/tracks/ruby/exercises/pythagorean-triplet/{example.rb → .meta/solutions/pythagorean_triplet.rb} +0 -0
  452. data/tracks/ruby/exercises/queen-attack/.meta/generator/{queen_attack_cases.rb → queen_attack_case.rb} +0 -0
  453. data/tracks/ruby/exercises/queen-attack/{example.rb → .meta/solutions/queen_attack.rb} +0 -0
  454. data/tracks/ruby/exercises/rail-fence-cipher/{example.rb → .meta/solutions/rail_fence_cipher.rb} +0 -0
  455. data/tracks/ruby/exercises/raindrops/.meta/generator/{raindrops_cases.rb → raindrops_case.rb} +0 -0
  456. data/tracks/ruby/exercises/raindrops/{example.rb → .meta/solutions/raindrops.rb} +0 -0
  457. data/tracks/ruby/exercises/rna-transcription/.meta/generator/{rna_transcription_cases.rb → rna_transcription_case.rb} +0 -0
  458. data/tracks/ruby/exercises/rna-transcription/{example.rb → .meta/solutions/rna_transcription.rb} +0 -0
  459. data/tracks/ruby/exercises/robot-name/.meta/solutions/robot_name.rb +21 -0
  460. data/tracks/ruby/exercises/robot-name/HINTS.md +7 -0
  461. data/tracks/ruby/exercises/robot-name/robot_name_test.rb +63 -27
  462. data/tracks/ruby/exercises/robot-simulator/{example.rb → .meta/solutions/robot_simulator.rb} +0 -0
  463. data/tracks/ruby/exercises/roman-numerals/.meta/generator/{roman_numerals_cases.rb → roman_numerals_case.rb} +0 -0
  464. data/tracks/ruby/exercises/roman-numerals/{example.rb → .meta/solutions/roman_numerals.rb} +0 -0
  465. data/tracks/ruby/exercises/run-length-encoding/.meta/generator/{run_length_encoding_cases.rb → run_length_encoding_case.rb} +0 -0
  466. data/tracks/ruby/exercises/run-length-encoding/{example.rb → .meta/solutions/run_length_encoding.rb} +0 -0
  467. data/tracks/ruby/exercises/saddle-points/{example.rb → .meta/solutions/saddle_points.rb} +0 -0
  468. data/tracks/ruby/exercises/say/.meta/generator/{say_cases.rb → say_case.rb} +0 -0
  469. data/tracks/ruby/exercises/say/{example.rb → .meta/solutions/say.rb} +0 -0
  470. data/tracks/ruby/exercises/scale-generator/{example.rb → .meta/solutions/scale_generator.rb} +0 -0
  471. data/tracks/ruby/exercises/scrabble-score/{example.rb → .meta/solutions/scrabble_score.rb} +0 -0
  472. data/tracks/ruby/exercises/secret-handshake/{example.rb → .meta/solutions/secret_handshake.rb} +0 -0
  473. data/tracks/ruby/exercises/series/{example.rb → .meta/solutions/series.rb} +0 -0
  474. data/tracks/ruby/exercises/sieve/.meta/generator/{sieve_cases.rb → sieve_case.rb} +0 -0
  475. data/tracks/ruby/exercises/sieve/{example.rb → .meta/solutions/sieve.rb} +0 -0
  476. data/tracks/ruby/exercises/simple-cipher/{example.rb → .meta/solutions/simple_cipher.rb} +0 -0
  477. data/tracks/ruby/exercises/simple-linked-list/{example.rb → .meta/solutions/simple_linked_list.rb} +0 -0
  478. data/tracks/ruby/exercises/space-age/{example.rb → .meta/solutions/space_age.rb} +0 -0
  479. data/tracks/ruby/exercises/strain/{example.rb → .meta/solutions/strain.rb} +0 -0
  480. data/tracks/ruby/exercises/sum-of-multiples/{example.rb → .meta/solutions/sum_of_multiples.rb} +0 -0
  481. data/tracks/ruby/exercises/tournament/.meta/generator/{tournament_cases.rb → tournament_case.rb} +0 -0
  482. data/tracks/ruby/exercises/tournament/{example.rb → .meta/solutions/tournament.rb} +0 -0
  483. data/tracks/ruby/exercises/transpose/.meta/generator/{transpose_cases.rb → transpose_case.rb} +0 -0
  484. data/tracks/ruby/exercises/transpose/{example.rb → .meta/solutions/transpose.rb} +0 -0
  485. data/tracks/ruby/exercises/triangle/.meta/generator/{triangle_cases.rb → triangle_case.rb} +0 -0
  486. data/tracks/ruby/exercises/triangle/{example.rb → .meta/solutions/triangle.rb} +0 -0
  487. data/tracks/ruby/exercises/trinary/{example.rb → .meta/solutions/trinary.rb} +0 -0
  488. data/tracks/ruby/exercises/twelve-days/{example.rb → .meta/solutions/twelve_days.rb} +0 -0
  489. data/tracks/ruby/exercises/two-bucket/.meta/generator/{two_bucket_cases.rb → two_bucket_case.rb} +0 -0
  490. data/tracks/ruby/exercises/two-bucket/{example.rb → .meta/solutions/two_bucket.rb} +0 -0
  491. data/tracks/ruby/exercises/word-count/.meta/generator/{word_count_cases.rb → word_count_case.rb} +0 -0
  492. data/tracks/ruby/exercises/word-count/{example.rb → .meta/solutions/word_count.rb} +0 -0
  493. data/tracks/ruby/exercises/wordy/.meta/generator/{wordy_cases.rb → wordy_case.rb} +0 -0
  494. data/tracks/ruby/exercises/wordy/{example.rb → .meta/solutions/wordy.rb} +0 -0
  495. data/tracks/ruby/lib/generator.rb +2 -2
  496. data/tracks/ruby/lib/generator/case_values.rb +2 -5
  497. data/tracks/ruby/lib/generator/command_line.rb +20 -86
  498. data/tracks/ruby/lib/generator/command_line/generator_optparser.rb +90 -0
  499. data/tracks/ruby/lib/generator/exercise_case.rb +2 -2
  500. data/tracks/ruby/lib/generator/files.rb +0 -12
  501. data/tracks/ruby/lib/generator/files/generator_cases.rb +28 -17
  502. data/tracks/ruby/lib/generator/files/metadata_files.rb +1 -3
  503. data/tracks/ruby/lib/generator/files/track_files.rb +22 -24
  504. data/tracks/ruby/lib/generator/{repository.rb → implementation.rb} +17 -13
  505. data/tracks/ruby/lib/generator/template_values.rb +9 -5
  506. data/tracks/ruby/lib/generator/test_template.erb +2 -2
  507. data/tracks/ruby/lib/tasks/exercise.rb +12 -20
  508. data/tracks/ruby/lib/tasks/exercise_tests_runner.rb +1 -1
  509. data/tracks/ruby/test/fixtures/xruby/exercises/{beta/example.tt → alpha-beta/.meta/generator/test_template.erb} +4 -6
  510. data/tracks/ruby/test/fixtures/xruby/exercises/alpha/.meta/generator/alpha_case.rb +9 -0
  511. data/tracks/ruby/test/fixtures/xruby/exercises/alpha/.meta/generator/test_template.erb +2 -2
  512. data/tracks/ruby/test/fixtures/xruby/exercises/alpha/.meta/solutions/alpha.rb +1 -1
  513. data/tracks/ruby/test/fixtures/xruby/exercises/beta/.meta/generator/{beta_cases.rb → beta_case.rb} +0 -0
  514. data/tracks/ruby/test/fixtures/xruby/lib/generator/test_template.erb +2 -2
  515. data/tracks/ruby/test/generator/case_values_test.rb +3 -3
  516. data/tracks/ruby/test/generator/command_line/generator_optparser_test.rb +122 -0
  517. data/tracks/ruby/test/generator/command_line_test.rb +13 -3
  518. data/tracks/ruby/test/generator/exercise_case_test.rb +2 -2
  519. data/tracks/ruby/test/generator/files/generate_cases_test.rb +18 -26
  520. data/tracks/ruby/test/generator/files/metadata_files_test.rb +2 -2
  521. data/tracks/ruby/test/generator/files/track_files_test.rb +8 -14
  522. data/tracks/ruby/test/generator/files_test.rb +0 -20
  523. data/tracks/ruby/test/generator/implementation_test.rb +145 -0
  524. data/tracks/ruby/test/generator/template_values_test.rb +5 -6
  525. data/tracks/ruby/test/generator_test.rb +10 -10
  526. data/tracks/ruby/test/tasks/exercise_test.rb +8 -12
  527. data/tracks/ruby/test/tasks/exercise_tests_runner_test.rb +2 -2
  528. data/tracks/ruby/test/test_helper.rb +13 -10
  529. data/tracks/ruby/test/wordy_cases_test.rb +1 -1
  530. data/tracks/rust/config.json +1 -0
  531. data/tracks/rust/exercises/bracket-push/Cargo.toml +1 -1
  532. data/tracks/rust/exercises/bracket-push/tests/bracket-push.rs +6 -0
  533. data/tracks/rust/exercises/dominoes/Cargo.toml +1 -1
  534. data/tracks/rust/exercises/dominoes/tests/dominoes.rs +1 -1
  535. data/tracks/rust/exercises/luhn-from/.meta/description.md +9 -0
  536. data/tracks/rust/exercises/luhn-from/.meta/metadata.yml +3 -0
  537. data/tracks/rust/exercises/luhn-trait/.meta/description.md +17 -0
  538. data/tracks/rust/exercises/luhn-trait/.meta/metadata.yml +3 -0
  539. data/tracks/rust/exercises/rectangles/Cargo.toml +1 -1
  540. data/tracks/rust/exercises/rectangles/tests/rectangles.rs +31 -0
  541. data/tracks/rust/exercises/tournament/Cargo.toml +1 -1
  542. data/tracks/rust/exercises/tournament/example.rs +6 -6
  543. data/tracks/rust/exercises/tournament/tests/tournament.rs +116 -30
  544. metadata +190 -140
  545. data/tracks/haskell/exercises/pythagorean-triplet/.meta/DONT-TEST-STUB +0 -2
  546. data/tracks/java/exercises/acronym/src/main/java/.keep +0 -0
  547. data/tracks/java/exercises/raindrops/src/main/java/.keep +0 -0
  548. data/tracks/java/exercises/scrabble-score/src/main/java/.keep +0 -0
  549. data/tracks/java/exercises/space-age/src/main/java/.keep +0 -0
  550. data/tracks/ruby/exercises/robot-name/example.rb +0 -43
  551. data/tracks/ruby/test/fixtures/xruby/exercises/alpha/.meta/generator/alpha_cases.rb +0 -20
  552. data/tracks/ruby/test/fixtures/xruby/exercises/beta/example.rb +0 -5
  553. data/tracks/ruby/test/generator/repository_test.rb +0 -90
  554. data/tracks/ruby/test/tasks/exercise_tests_runner_legacy_test.rb +0 -64
@@ -0,0 +1,13 @@
1
+ exercise: AtbashCipher
2
+ version: 1
3
+ plan: 4
4
+ imports: '&encode &decode'
5
+ tests: |
6
+ for @($c-data<cases>) {
7
+ my $test = .<description> ~~ 'encode' ?? 'encode' !! 'decode';
8
+ subtest $test => {
9
+ my @cases = |.<cases>;
10
+ plan +@cases;
11
+ is &::($test)(.<phrase>), |.<expected description> for @cases;
12
+ }
13
+ }
@@ -0,0 +1,13 @@
1
+ exercise: Grains
2
+ version: 1
3
+ plan: 13
4
+ imports: '&grains-on-square &total-grains'
5
+ tests: |
6
+ for @($c-data<cases>[0]<cases>) {
7
+ if .<expected> == -1 {
8
+ throws-like { grains-on-square(.<input>) }, Exception, .<description>;
9
+ } else {
10
+ is grains-on-square(.<input>), |.<expected description>;
11
+ }
12
+ }
13
+ is total-grains, |$c-data<cases>[1]<expected description>;
@@ -7,10 +7,11 @@ use JSON::Tiny;
7
7
  my $exercise = 'Grains';
8
8
  my $version = v1;
9
9
  my $module = %*ENV<EXERCISM> ?? 'Example' !! $exercise;
10
- plan 14;
10
+ plan 13;
11
11
 
12
12
  use-ok $module or bail-out;
13
13
  require ::($module);
14
+
14
15
  if ::($exercise).^ver !~~ $version {
15
16
  warn "\nExercise version mismatch. Further tests may fail!"
16
17
  ~ "\n$exercise is $(::($exercise).^ver.gist). "
@@ -18,112 +19,108 @@ if ::($exercise).^ver !~~ $version {
18
19
  bail-out 'Example version must match test version.' if %*ENV<EXERCISM>;
19
20
  }
20
21
 
21
- my @subs;
22
- BEGIN { @subs = <&grains-on-square &total-grains> };
23
- subtest 'Subroutine(s)', {
24
- plan 2;
25
- eval-lives-ok "use $module; ::('$_').defined or die '$_ is not defined.'", $_ for @subs;
26
- } or bail-out 'All subroutines must be defined and exported.';
27
- require ::($module) @subs.eager;
22
+ require ::($module) <&grains-on-square &total-grains>;
28
23
 
29
- for @(my $c-data.<cases>.[0].<cases>) {
24
+ my $c-data;
25
+ for @($c-data<cases>[0]<cases>) {
30
26
  if .<expected> == -1 {
31
27
  throws-like { grains-on-square(.<input>) }, Exception, .<description>;
32
28
  } else {
33
29
  is grains-on-square(.<input>), |.<expected description>;
34
30
  }
35
31
  }
32
+ is total-grains, |$c-data<cases>[1]<expected description>;
36
33
 
37
- is total-grains, |$c-data.<cases>.[1].<expected description>;
38
-
39
- if %*ENV<EXERCISM> && (my $c-data-file = "$dir/../../x-common/exercises/{$dir.IO.basename}/canonical-data.json".IO.resolve) ~~ :f {
40
- is-deeply $c-data, from-json($c-data-file.slurp), 'canonical-data'
41
- } else { skip }
34
+ if %*ENV<EXERCISM> && (my $c-data-file =
35
+ "$dir/../../x-common/exercises/{$dir.IO.resolve.basename}/canonical-data.json".IO.resolve) ~~ :f
36
+ { is-deeply $c-data, from-json($c-data-file.slurp), 'canonical-data' } else { skip }
42
37
 
43
38
  done-testing;
44
39
 
45
40
  INIT {
46
- $c-data := from-json
41
+ $c-data := from-json q:to/END/;
42
+
43
+ {
44
+ "exercise": "grains",
45
+ "version": "1.0.0",
46
+ "comments": [
47
+ "The final tests of square test error conditions",
48
+ "The expection for these tests is -1, indicating an error",
49
+ "In these cases you should expect an error as is idiomatic for your language"
50
+ ],
51
+ "cases": [
47
52
  {
48
- "exercise": "grains",
49
- "version": "1.0.0",
50
- "comments": [
51
- "The final tests of square test error conditions",
52
- "The expection for these tests is -1, indicating an error",
53
- "In these cases you should expect an error as is idiomatic for your language"
54
- ],
53
+ "description": "returns the number of grains on the square",
55
54
  "cases": [
56
55
  {
57
- "description": "returns the number of grains on the square",
58
- "cases": [
59
- {
60
- "description": "1",
61
- "property": "square",
62
- "input": 1,
63
- "expected": 1
64
- },
65
- {
66
- "description": "2",
67
- "property": "square",
68
- "input": 2,
69
- "expected": 2
70
- },
71
- {
72
- "description": "3",
73
- "property": "square",
74
- "input": 3,
75
- "expected": 4
76
- },
77
- {
78
- "description": "4",
79
- "property": "square",
80
- "input": 4,
81
- "expected": 8
82
- },
83
- {
84
- "description": "16",
85
- "property": "square",
86
- "input": 16,
87
- "expected": 32768
88
- },
89
- {
90
- "description": "32",
91
- "property": "square",
92
- "input": 32,
93
- "expected": 2147483648
94
- },
95
- {
96
- "description": "64",
97
- "property": "square",
98
- "input": 64,
99
- "expected": 9223372036854775808
100
- },
101
- {
102
- "description": "square 0 raises an exception",
103
- "property": "square",
104
- "input": 0,
105
- "expected": -1
106
- },
107
- {
108
- "description": "negative square raises an exception",
109
- "property": "square",
110
- "input": -1,
111
- "expected": -1
112
- },
113
- {
114
- "description": "square greater than 64 raises an exception",
115
- "property": "square",
116
- "input": 65,
117
- "expected": -1
118
- }
119
- ]
56
+ "description": "1",
57
+ "property": "square",
58
+ "input": 1,
59
+ "expected": 1
60
+ },
61
+ {
62
+ "description": "2",
63
+ "property": "square",
64
+ "input": 2,
65
+ "expected": 2
66
+ },
67
+ {
68
+ "description": "3",
69
+ "property": "square",
70
+ "input": 3,
71
+ "expected": 4
72
+ },
73
+ {
74
+ "description": "4",
75
+ "property": "square",
76
+ "input": 4,
77
+ "expected": 8
78
+ },
79
+ {
80
+ "description": "16",
81
+ "property": "square",
82
+ "input": 16,
83
+ "expected": 32768
120
84
  },
121
85
  {
122
- "description": "returns the total number of grains on the board",
123
- "property": "total",
124
- "expected": 18446744073709551615
86
+ "description": "32",
87
+ "property": "square",
88
+ "input": 32,
89
+ "expected": 2147483648
90
+ },
91
+ {
92
+ "description": "64",
93
+ "property": "square",
94
+ "input": 64,
95
+ "expected": 9223372036854775808
96
+ },
97
+ {
98
+ "description": "square 0 raises an exception",
99
+ "property": "square",
100
+ "input": 0,
101
+ "expected": -1
102
+ },
103
+ {
104
+ "description": "negative square raises an exception",
105
+ "property": "square",
106
+ "input": -1,
107
+ "expected": -1
108
+ },
109
+ {
110
+ "description": "square greater than 64 raises an exception",
111
+ "property": "square",
112
+ "input": 65,
113
+ "expected": -1
125
114
  }
126
115
  ]
116
+ },
117
+ {
118
+ "description": "returns the total number of grains on the board",
119
+ "property": "total",
120
+ "expected": 18446744073709551615
127
121
  }
128
-
122
+ ]
123
+ }
124
+
125
+ END
129
126
  }
@@ -0,0 +1,81 @@
1
+ exercise: LinkedList
2
+ version: 1
3
+ plan: 7
4
+ modules:
5
+ - use: JSON::Tiny
6
+ methods: 'push-list pop-list shift-list unshift-list'
7
+ tests: |
8
+ for my @cases -> $case {
9
+ subtest $case.<name>, sub {
10
+ my $linkedlist = ::($exercise).new;
11
+ for |$case.<set> -> %set {
12
+ for %set {
13
+ my $value = $_.value;
14
+ given $_.key {
15
+ when 'push' { $linkedlist.?push-list( $value ) }
16
+ when 'unshift' { $linkedlist.?unshift-list( $value ) }
17
+ when 'pop' { is $linkedlist.?pop-list, $value, 'pop' }
18
+ when 'shift' { is $linkedlist.?shift-list, $value, 'shift' }
19
+ }
20
+ }
21
+ }
22
+ }
23
+ }
24
+ after_done_testing: |
25
+ INIT {
26
+ @cases := from-json 「
27
+ [
28
+ {
29
+ "set" : [
30
+ { "push" : 10 },
31
+ { "push" : 20 },
32
+ { "pop" : 20 },
33
+ { "pop" : 10 }
34
+ ],
35
+ "name" : "push_pop"
36
+ },
37
+ {
38
+ "set" : [
39
+ { "push" : 10 },
40
+ { "push" : 20 },
41
+ { "shift" : 10 },
42
+ { "shift" : 20 }
43
+ ],
44
+ "name" : "push_shift"
45
+ },
46
+ {
47
+ "set" : [
48
+ { "unshift" : 10 },
49
+ { "unshift" : 20 },
50
+ { "shift" : 20 },
51
+ { "shift" : 10 }
52
+ ],
53
+ "name" : "unshift_shift"
54
+ },
55
+ {
56
+ "set" : [
57
+ { "unshift" : 10 },
58
+ { "unshift" : 20 },
59
+ { "pop" : 10 },
60
+ { "pop" : 20 }
61
+ ],
62
+ "name" : "unshift_pop"
63
+ },
64
+ {
65
+ "set" : [
66
+ { "push" : 10 },
67
+ { "push" : 20 },
68
+ { "pop" : 20 },
69
+ { "push" : 30 },
70
+ { "shift" : 10 },
71
+ { "unshift" : 40 },
72
+ { "push" : 50 },
73
+ { "shift" : 40 },
74
+ { "pop" : 50 },
75
+ { "shift" : 30 }
76
+ ],
77
+ "name" : "example"
78
+ }
79
+ ]
80
+
81
+ }
@@ -11,6 +11,7 @@ plan 7;
11
11
 
12
12
  use-ok $module or bail-out;
13
13
  require ::($module);
14
+
14
15
  if ::($exercise).^ver !~~ $version {
15
16
  warn "\nExercise version mismatch. Further tests may fail!"
16
17
  ~ "\n$exercise is $(::($exercise).^ver.gist). "
@@ -18,9 +19,8 @@ if ::($exercise).^ver !~~ $version {
18
19
  bail-out 'Example version must match test version.' if %*ENV<EXERCISM>;
19
20
  }
20
21
 
21
- subtest "Class method(s)", {
22
- plan 4;
23
- ok ::($exercise).can($_), $_ for <push-list pop-list shift-list unshift-list>;
22
+ subtest 'Class methods', {
23
+ ok ::($exercise).can($_), $_ for <push-list pop-list shift-list unshift-list>;
24
24
  }
25
25
 
26
26
  for my @cases -> $case {
@@ -99,3 +99,4 @@ INIT {
99
99
  ]
100
100
 
101
101
  }
102
+
@@ -0,0 +1,12 @@
1
+ exercise: Raindrops
2
+ version: 1
3
+ plan: 20
4
+ imports: '&convert'
5
+ tests: |
6
+ for @($c-data<cases>) {
7
+ subtest {
8
+ plan 2;
9
+ is .<number>.&convert, |.<expected description>;
10
+ isa-ok .<number>.&convert, Str;
11
+ }
12
+ }
@@ -7,7 +7,7 @@ use JSON::Tiny;
7
7
  my $exercise = 'Raindrops';
8
8
  my $version = v1;
9
9
  my $module = %*ENV<EXERCISM> ?? 'Example' !! $exercise;
10
- plan 21;
10
+ plan 20;
11
11
 
12
12
  use-ok $module or bail-out;
13
13
  require ::($module);
@@ -19,15 +19,10 @@ if ::($exercise).^ver !~~ $version {
19
19
  bail-out 'Example version must match test version.' if %*ENV<EXERCISM>;
20
20
  }
21
21
 
22
- my @subs;
23
- BEGIN { @subs = <&convert> };
24
- subtest 'Subroutine(s)', {
25
- plan 1;
26
- eval-lives-ok "use $module; ::('$_').defined or die '$_ is not defined.'", $_ for @subs;
27
- } or bail-out 'All subroutines must be defined and exported.';
28
- require ::($module) @subs.eager;
22
+ require ::($module) <&convert>;
29
23
 
30
- for @(my $c-data.<cases>) {
24
+ my $c-data;
25
+ for @($c-data<cases>) {
31
26
  subtest {
32
27
  plan 2;
33
28
  is .<number>.&convert, |.<expected description>;
@@ -35,127 +30,129 @@ for @(my $c-data.<cases>) {
35
30
  }
36
31
  }
37
32
 
38
- if %*ENV<EXERCISM> && (my $c-data-file = "$dir/../../x-common/exercises/{$dir.IO.basename}/canonical-data.json".IO.resolve) ~~ :f {
39
- is-deeply $c-data, from-json($c-data-file.slurp), 'canonical-data'
40
- } else { skip }
33
+ if %*ENV<EXERCISM> && (my $c-data-file =
34
+ "$dir/../../x-common/exercises/{$dir.IO.resolve.basename}/canonical-data.json".IO.resolve) ~~ :f
35
+ { is-deeply $c-data, from-json($c-data-file.slurp), 'canonical-data' } else { skip }
41
36
 
42
37
  done-testing;
43
38
 
44
39
  INIT {
45
- $c-data := from-json
46
- {
47
- "exercise": "raindrops",
48
- "version": "1.0.0",
49
- "cases": [
50
- {
51
- "description": "the sound for 1 is 1",
52
- "property": "convert",
53
- "number": 1,
54
- "expected": "1"
55
- },
56
- {
57
- "description": "the sound for 3 is Pling",
58
- "property": "convert",
59
- "number": 3,
60
- "expected": "Pling"
61
- },
62
- {
63
- "description": "the sound for 5 is Plang",
64
- "property": "convert",
65
- "number": 5,
66
- "expected": "Plang"
67
- },
68
- {
69
- "description": "the sound for 7 is Plong",
70
- "property": "convert",
71
- "number": 7,
72
- "expected": "Plong"
73
- },
74
- {
75
- "description": "the sound for 6 is Pling as it has a factor 3",
76
- "property": "convert",
77
- "number": 6,
78
- "expected": "Pling"
79
- },
80
- {
81
- "description": "2 to the power 3 does not make a raindrop sound as 3 is the exponent not the base",
82
- "property": "convert",
83
- "number": 8,
84
- "expected": "8"
85
- },
86
- {
87
- "description": "the sound for 9 is Pling as it has a factor 3",
88
- "property": "convert",
89
- "number": 9,
90
- "expected": "Pling"
91
- },
92
- {
93
- "description": "the sound for 10 is Plang as it has a factor 5",
94
- "property": "convert",
95
- "number": 10,
96
- "expected": "Plang"
97
- },
98
- {
99
- "description": "the sound for 14 is Plong as it has a factor of 7",
100
- "property": "convert",
101
- "number": 14,
102
- "expected": "Plong"
103
- },
104
- {
105
- "description": "the sound for 15 is PlingPlang as it has factors 3 and 5",
106
- "property": "convert",
107
- "number": 15,
108
- "expected": "PlingPlang"
109
- },
110
- {
111
- "description": "the sound for 21 is PlingPlong as it has factors 3 and 7",
112
- "property": "convert",
113
- "number": 21,
114
- "expected": "PlingPlong"
115
- },
116
- {
117
- "description": "the sound for 25 is Plang as it has a factor 5",
118
- "property": "convert",
119
- "number": 25,
120
- "expected": "Plang"
121
- },
122
- {
123
- "description": "the sound for 27 is Pling as it has a factor 3",
124
- "property": "convert",
125
- "number": 27,
126
- "expected": "Pling"
127
- },
128
- {
129
- "description": "the sound for 35 is PlangPlong as it has factors 5 and 7",
130
- "property": "convert",
131
- "number": 35,
132
- "expected": "PlangPlong"
133
- },
134
- {
135
- "description": "the sound for 49 is Plong as it has a factor 7",
136
- "property": "convert",
137
- "number": 49,
138
- "expected": "Plong"
139
- },
140
- {
141
- "description": "the sound for 52 is 52",
142
- "property": "convert",
143
- "number": 52,
144
- "expected": "52"
145
- },
146
- {
147
- "description": "the sound for 105 is PlingPlangPlong as it has factors 3, 5 and 7",
148
- "property": "convert",
149
- "number": 105,
150
- "expected": "PlingPlangPlong"
151
- },
152
- {
153
- "description": "the sound for 3125 is Plang as it has a factor 5",
154
- "property": "convert",
155
- "number": 3125,
156
- "expected": "Plang"
157
- }
158
- ]
40
+ $c-data := from-json q:to/END/;
41
+
42
+ {
43
+ "exercise": "raindrops",
44
+ "version": "1.0.0",
45
+ "cases": [
46
+ {
47
+ "description": "the sound for 1 is 1",
48
+ "property": "convert",
49
+ "number": 1,
50
+ "expected": "1"
51
+ },
52
+ {
53
+ "description": "the sound for 3 is Pling",
54
+ "property": "convert",
55
+ "number": 3,
56
+ "expected": "Pling"
57
+ },
58
+ {
59
+ "description": "the sound for 5 is Plang",
60
+ "property": "convert",
61
+ "number": 5,
62
+ "expected": "Plang"
63
+ },
64
+ {
65
+ "description": "the sound for 7 is Plong",
66
+ "property": "convert",
67
+ "number": 7,
68
+ "expected": "Plong"
69
+ },
70
+ {
71
+ "description": "the sound for 6 is Pling as it has a factor 3",
72
+ "property": "convert",
73
+ "number": 6,
74
+ "expected": "Pling"
75
+ },
76
+ {
77
+ "description": "2 to the power 3 does not make a raindrop sound as 3 is the exponent not the base",
78
+ "property": "convert",
79
+ "number": 8,
80
+ "expected": "8"
81
+ },
82
+ {
83
+ "description": "the sound for 9 is Pling as it has a factor 3",
84
+ "property": "convert",
85
+ "number": 9,
86
+ "expected": "Pling"
87
+ },
88
+ {
89
+ "description": "the sound for 10 is Plang as it has a factor 5",
90
+ "property": "convert",
91
+ "number": 10,
92
+ "expected": "Plang"
93
+ },
94
+ {
95
+ "description": "the sound for 14 is Plong as it has a factor of 7",
96
+ "property": "convert",
97
+ "number": 14,
98
+ "expected": "Plong"
99
+ },
100
+ {
101
+ "description": "the sound for 15 is PlingPlang as it has factors 3 and 5",
102
+ "property": "convert",
103
+ "number": 15,
104
+ "expected": "PlingPlang"
105
+ },
106
+ {
107
+ "description": "the sound for 21 is PlingPlong as it has factors 3 and 7",
108
+ "property": "convert",
109
+ "number": 21,
110
+ "expected": "PlingPlong"
111
+ },
112
+ {
113
+ "description": "the sound for 25 is Plang as it has a factor 5",
114
+ "property": "convert",
115
+ "number": 25,
116
+ "expected": "Plang"
117
+ },
118
+ {
119
+ "description": "the sound for 27 is Pling as it has a factor 3",
120
+ "property": "convert",
121
+ "number": 27,
122
+ "expected": "Pling"
123
+ },
124
+ {
125
+ "description": "the sound for 35 is PlangPlong as it has factors 5 and 7",
126
+ "property": "convert",
127
+ "number": 35,
128
+ "expected": "PlangPlong"
129
+ },
130
+ {
131
+ "description": "the sound for 49 is Plong as it has a factor 7",
132
+ "property": "convert",
133
+ "number": 49,
134
+ "expected": "Plong"
135
+ },
136
+ {
137
+ "description": "the sound for 52 is 52",
138
+ "property": "convert",
139
+ "number": 52,
140
+ "expected": "52"
141
+ },
142
+ {
143
+ "description": "the sound for 105 is PlingPlangPlong as it has factors 3, 5 and 7",
144
+ "property": "convert",
145
+ "number": 105,
146
+ "expected": "PlingPlangPlong"
147
+ },
148
+ {
149
+ "description": "the sound for 3125 is Plang as it has a factor 5",
150
+ "property": "convert",
151
+ "number": 3125,
152
+ "expected": "Plang"
159
153
  }
160
-
154
+ ]
155
+ }
156
+
157
+ END
161
158
  }