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
@@ -2,4 +2,6 @@
2
2
 
3
3
  Each problem will have a script named something like `test_problem.R` (e.g. `test_hello-world.R`). In RStudio, you can simply run this script to test your solution. What this will do is load your solution code through the `source` command on the first line, and then the suite of `testthat` tests below.
4
4
 
5
+ That can be conveniently done with [testthat's `auto_test` function](https://www.rdocumentation.org/packages/testthat/topics/auto_test). Because exercism code and tests are in the same folder, use this same path for both `code_path` and `test_path` parameters.
6
+
5
7
  If you prefer, you can also run the tests on the command line with `Rscript test_problem.R` (e.g. `Rscript test_hello-world.R`).
@@ -5,4 +5,4 @@ See [this guide](https://github.com/exercism/xr/blob/master/docs/INSTALLATION.md
5
5
  In each problem folder, there is a file named `<exercise_name>.R` containing a function that returns a `NULL` value. Place your implementation inside the body of the function.
6
6
 
7
7
  ## How to run tests
8
- Inside of RStudio, simply execute the `test_<exercise_name>.R` script. On the command-line, you can also run `Rscript test_<exercise_name>.R`.
8
+ Inside of RStudio, simply execute the `test_<exercise_name>.R` script. This can be conveniently done with [testthat's `auto_test` function](https://www.rdocumentation.org/packages/testthat/topics/auto_test). Because exercism code and tests are in the same folder, use this same path for both `code_path` and `test_path` parameters. On the command-line, you can also run `Rscript test_<exercise_name>.R`.
@@ -1,17 +1,27 @@
1
1
  Please reference Racket's [Getting Started](http://docs.racket-lang.org/getting-started/) page for instructions on downloading and installing Racket.
2
2
 
3
- For *nix variants, you can also install Racket using your OS' package manager:
3
+ Alternative installation options and further notes for specific OSes follow.
4
4
 
5
- **OS X**
5
+ ## macOS
6
6
 
7
7
  Install via Homebrew:
8
8
 
9
9
  ```
10
10
  brew update
11
+ brew install minimal-racket
12
+ ```
13
+ The `minimal-racket` package will probably work for solving the problems, but it does not include the graphical interface IDE, DrRacket. If you want that, you have to install the full racket distribution from cask:
14
+
15
+ ```
16
+ brew tap caskroom/cask
11
17
  brew install racket
12
18
  ```
13
19
 
14
- **Linux**
20
+ ### macOS official installer
21
+ Note that on macOS, the official installer puts the files under `/Applications`, and as a result the `racket` and `raco` executables are not accessible on command-line terminals. You have to add the `bin` subdirectory below the Racket installation location (e.g., `/Applications/Racket v6.8/bin` for version 6.8) to the `$PATH`.
22
+
23
+
24
+ ## Linux
15
25
 
16
26
  Debian:
17
27
  ```
@@ -12,19 +12,24 @@ the language, so you're all set.
12
12
 
13
13
  ## Anatomy of an Exercise
14
14
 
15
- The files for an exercise live in `exercises/<exercise_name>` (where
16
- `<exercise_name>` is the slug for the exercise, e.g. `clock` or
17
- `atbash-cipher`). All exercises have:
15
+ The files for an exercise live in `exercises/<slug>`. The slug for an exercise
16
+ is a unique nickname composed of a-z (lowercase) and -, e.g. `clock` or
17
+ `atbash-cipher`. Inside its directory, each exercise has:
18
18
 
19
19
  * a test suite, `<exercise_name>_test.rb`
20
- * an example solution, `example.rb`
20
+ * an example solution, `.meta/solutions/<exercise_name>.rb`
21
21
 
22
- Tests with a test generator will also have:
22
+ where `<exercise_name>` is the underscored version of the exercise's slug, e.g.,
23
+ `clock` or `atbash_cipher`.
23
24
 
24
- * a `.version`
25
- * the test generator, `<exercise_name>_cases.rb`, in `.meta/generator`
25
+ If the exercise has a test generator, the directory will also contain:
26
26
 
27
- A few tests have other custom files which are discussed below.
27
+ * `.version`
28
+ * the test generator, `.meta/generator/<exercise_name>_case.rb`
29
+
30
+ A few exercises use a custom test template:
31
+
32
+ * `.meta/generator/test_template.erb`
28
33
 
29
34
  ### Canonical Data
30
35
 
@@ -45,6 +50,7 @@ rake test:clock
45
50
 
46
51
  To pass arguments to the test command, like `-p` for example, you can run
47
52
  the following:
53
+
48
54
  ```sh
49
55
  rake test:clock -- -p
50
56
  ```
@@ -91,13 +97,11 @@ tree -L 1 ~/code/exercism
91
97
 
92
98
  From within the xruby directory, run the following command:
93
99
 
94
- ```
95
- bin/generate <exercise_name>
96
- ```
100
+ bin/generate <slug>
97
101
 
98
102
  #### Changing a Generated Exercise
99
103
 
100
- Do not edit `<exercise_name>/<exercise_name>_test.rb`. Any changes you make will
104
+ Do not edit `<slug>/<exercise_name>_test.rb`. Any changes you make will
101
105
  be overwritten when the test suite is regenerated.
102
106
 
103
107
  There are two reasons why a test suite might change:
@@ -109,7 +113,7 @@ In the first case, the changes need to be made to the `canonical-data.json` file
109
113
  the exercise, which lives in the x-common repository.
110
114
 
111
115
  ```
112
- ../x-common/exercises/<exercise_name>/
116
+ ../x-common/exercises/<slug>/
113
117
  ├── canonical-data.json
114
118
  ├── description.md
115
119
  └── metadata.yml
@@ -122,20 +126,20 @@ exercise.
122
126
  Changes that don't have to do directly with the test inputs and outputs should
123
127
  be made to the exercise's test case generator, discussed
124
128
  in [implementing a new generator](#implementing-a-generator), next. Then you
125
- can regenerate the exercise with `bin/generate <exercise_name>`.
129
+ can regenerate the exercise with `bin/generate <slug>`.
126
130
 
127
131
  #### Implementing a Generator
128
132
 
129
133
  An exercise's test case generator class produces the code that goes inside
130
134
  the minitest `test_<whatever>` methods. An exercise's generator lives in
131
- `exercises/<exercise_name>/.meta/generator/<exercise_name>_cases.rb`.
135
+ `exercises/<slug>/.meta/generator/<exercise_name>_case.rb`.
132
136
 
133
137
  The test case generator is a derived class of `ExerciseCase` (in
134
138
  `lib/generator/exercise_case.rb`). `ExerciseCase` does most of the work of
135
139
  extracting the canonical data. The derived class wraps the JSON for a single
136
140
  test case. The default version looks something like this:
137
141
 
138
- ```
142
+ ```ruby
139
143
  require 'generator/exercise_case'
140
144
 
141
145
  class <ExerciseName>Case < Generator::ExerciseCase
@@ -148,9 +152,9 @@ class <ExerciseName>Case < Generator::ExerciseCase
148
152
  end
149
153
  ```
150
154
 
151
- where `<ExerciseName>` is the <exercise_name> slug in CamelCase. This is
152
- important, since the generator script will infer the name of the class from the
153
- <exercise_name> slug.
155
+ where `<ExerciseName>` is the CamelCased version of the exercise's slug. This is
156
+ important, since the generator script will infer the name of the class from
157
+ `<slug>`.
154
158
 
155
159
  This class must provide the methods used by the test
156
160
  template. A
@@ -160,8 +164,10 @@ base class provides methods for the default template for everything except
160
164
  `#workload`.
161
165
 
162
166
  `#workload` generates the code for the body of a test, including the assertion
163
- and any setup required. The base class provides a variety of assertion and
164
- helper methods. Beyond that, you can implement any helper methods that you need
167
+ and any setup required. The base class provides a variety of
168
+ [assertion](https://github.com/exercism/xruby/blob/master/lib/generator/exercise_case/assertion.rb) and
169
+ [helper](https://github.com/exercism/xruby/blob/master/lib/generator/exercise_case.rb) methods.
170
+ Beyond that, you can implement any helper methods that you need
165
171
  as private methods in your derived class. See below for more information
166
172
  about [the intention of #workload](#workload-philosophy)
167
173
 
@@ -5,7 +5,7 @@ require 'generator'
5
5
 
6
6
  paths = Generator::Paths.new(track: XRUBY_ROOT, metadata: METADATA_REPOSITORY_PATH)
7
7
 
8
- generator = Generator::CommandLine.new(paths).parse(ARGV)
9
- exit 1 unless generator
8
+ generators = Generator::CommandLine.new(paths).parse(ARGV)
9
+ exit 1 unless generators
10
10
 
11
- generator.call
11
+ generators.map(&:call)
@@ -4,6 +4,7 @@
4
4
  "repository": "https://github.com/exercism/xruby",
5
5
  "active": true,
6
6
  "gitter": "xruby",
7
+ "solution_pattern": "[Ee]xample|\\.meta/solutions/[^/]*\\.rb",
7
8
  "exercises": [
8
9
  {
9
10
  "slug": "hello-world",
@@ -59,12 +60,6 @@
59
60
  "topics": [
60
61
  ]
61
62
  },
62
- {
63
- "slug": "robot-name",
64
- "difficulty": 1,
65
- "topics": [
66
- ]
67
- },
68
63
  {
69
64
  "slug": "nth-prime",
70
65
  "difficulty": 1,
@@ -257,6 +252,12 @@
257
252
  "topics": [
258
253
  ]
259
254
  },
255
+ {
256
+ "slug": "robot-name",
257
+ "difficulty": 6,
258
+ "topics": [
259
+ ]
260
+ },
260
261
  {
261
262
  "slug": "queen-attack",
262
263
  "difficulty": 1,
@@ -4,11 +4,11 @@ require_relative 'alphametics'
4
4
 
5
5
  # Common test data version: <%= canonical_data_version %> <%= abbreviated_commit_hash %>
6
6
  class AlphameticsTest < Minitest::Test
7
- <% test_cases.each do |test_case| %>
7
+ <% test_cases.each_with_index do |test_case, idx| %>
8
8
 
9
9
  <%= test_case.runtime_comment %>
10
10
  def <%= test_case.name %>
11
- <%= test_case.skipped %>
11
+ <%= test_case.skipped(idx) %>
12
12
  <%= test_case.workload %>
13
13
  end
14
14
  <% end %>
@@ -12,9 +12,9 @@ class BowlingTest < Minitest::Test
12
12
  rolls.each { |pins| @game.roll(pins) }
13
13
  end
14
14
 
15
- <% test_cases.each do |test_case| %>
15
+ <% test_cases.each_with_index do |test_case, idx| %>
16
16
  def <%= test_case.name %>
17
- <%= test_case.skipped %>
17
+ <%= test_case.skipped(idx) %>
18
18
  <%= test_case.workload %>
19
19
  end
20
20
 
@@ -4,9 +4,9 @@ require_relative 'connect'
4
4
 
5
5
  # Common test data version: <%= canonical_data_version %> <%= abbreviated_commit_hash %>
6
6
  class ConnectTest < Minitest::Test
7
- <% test_cases.each do |test_case| %>
7
+ <% test_cases.each_with_index do |test_case, idx| %>
8
8
  <%= test_case.ignore_method_length%>def <%= test_case.name %>
9
- <%= test_case.skipped %><% test_case.test_body.each do |line| %>
9
+ <%= test_case.skipped(idx) %><% test_case.test_body.each do |line| %>
10
10
  <%= line %><% end %>
11
11
  end
12
12
 
@@ -4,9 +4,9 @@ require_relative 'dominoes'
4
4
 
5
5
  # Common test data version: <%= canonical_data_version %> <%= abbreviated_commit_hash %>
6
6
  class DominoesTest < Minitest::Test
7
- <% test_cases.each do |test_case| %>
7
+ <% test_cases.each_with_index do |test_case, idx| %>
8
8
  def <%= test_case.name %>
9
- <%= test_case.skipped %>
9
+ <%= test_case.skipped(idx) %>
10
10
  <%= test_case.workload %>
11
11
  end
12
12
 
@@ -2,7 +2,7 @@
2
2
  require 'minitest/autorun'
3
3
  require_relative 'dominoes'
4
4
 
5
- # Common test data version: 1.0.0 89a5281
5
+ # Common test data version: 1.0.1 33f20d3
6
6
  class DominoesTest < Minitest::Test
7
7
  def test_empty_input_empty_output
8
8
  # skip
@@ -81,7 +81,7 @@ class DominoesTest < Minitest::Test
81
81
  assert_correct_chain(input_dominoes, output_chain)
82
82
  end
83
83
 
84
- def test_ten_elements
84
+ def test_nine_elements
85
85
  skip
86
86
  input_dominoes = [[1, 2], [5, 3], [3, 1], [1, 2], [2, 4], [1, 6], [2, 3], [3, 4], [5, 6]]
87
87
  output_chain = Dominoes.chain(input_dominoes)
@@ -14,9 +14,9 @@ end
14
14
 
15
15
  # Common test data version: <%= canonical_data_version %> <%= abbreviated_commit_hash %>
16
16
  class HelloWorldTest < Minitest::Test
17
- <% test_cases.each do |test_case| %>
17
+ <% test_cases.each_with_index do |test_case, idx| %>
18
18
  def <%= test_case.name %>
19
- <%= test_case.skipped %>
19
+ <%= test_case.skipped(idx) %>
20
20
  <%= test_case.workload %>
21
21
  end
22
22
  <% end %>
@@ -13,9 +13,9 @@ class Date
13
13
  end
14
14
 
15
15
  class YearTest < Minitest::Test
16
- <% test_cases.each do |test_case| %>
16
+ <% test_cases.each_with_index do |test_case, idx| %>
17
17
  def <%= test_case.name %>
18
- <%= test_case.skipped %>
18
+ <%= test_case.skipped(idx) %>
19
19
  <%= test_case.workload %>, "<%= test_case.failure_message %>"
20
20
  end
21
21