trackler 2.1.0.53 → 2.1.0.54

Sign up to get free protection for your applications and to get access to all the features.
Files changed (1051) hide show
  1. checksums.yaml +4 -4
  2. data/bin/update +1 -1
  3. data/lib/trackler/version.rb +1 -1
  4. data/tracks/c/.travis.yml +1 -1
  5. data/tracks/c/config.json +9 -0
  6. data/tracks/c/exercises/all-your-base/makefile +15 -0
  7. data/tracks/c/exercises/all-your-base/src/all_your_base.h +6 -0
  8. data/tracks/c/exercises/all-your-base/src/example.c +41 -0
  9. data/tracks/c/exercises/all-your-base/src/example.h +12 -0
  10. data/tracks/c/exercises/all-your-base/test/test_all_your_base.c +202 -0
  11. data/tracks/c/exercises/all-your-base/test/vendor/unity.c +1300 -0
  12. data/tracks/c/exercises/all-your-base/test/vendor/unity.h +274 -0
  13. data/tracks/c/exercises/all-your-base/test/vendor/unity_internals.h +701 -0
  14. data/tracks/ceylon/.travis.yml +1 -1
  15. data/tracks/clojure/.travis.yml +1 -1
  16. data/tracks/clojure/exercises/rotational-cipher/src/example.clj +21 -15
  17. data/tracks/clojure/exercises/rotational-cipher/test/rotational_cipher_test.clj +14 -1
  18. data/tracks/cpp/.travis.yml +1 -1
  19. data/tracks/crystal/.gitignore +7 -2
  20. data/tracks/crystal/.travis.yml +1 -1
  21. data/tracks/crystal/Makefile +27 -10
  22. data/tracks/crystal/README.md +6 -6
  23. data/tracks/crystal/config.json +7 -0
  24. data/tracks/crystal/exercises/flatten-array/spec/flatten_array_spec.cr +28 -0
  25. data/tracks/crystal/exercises/flatten-array/src/example.cr +7 -0
  26. data/tracks/crystal/generator/generator.cr +20 -0
  27. data/tracks/crystal/generator/shard.lock +6 -0
  28. data/tracks/crystal/generator/shard.yml +9 -0
  29. data/tracks/crystal/{src/generator → generator}/spec/exercise_generator_spec.cr +2 -2
  30. data/tracks/crystal/{src/generator → generator}/spec/exercise_test_case_spec.cr +1 -1
  31. data/tracks/crystal/generator/spec/remote_data_file_spec.cr +58 -0
  32. data/tracks/crystal/{src/generator/exercises → generator/src}/exercise_generator.cr +10 -2
  33. data/tracks/crystal/{src/generator/exercises → generator/src}/exercise_test_case.cr +0 -0
  34. data/tracks/crystal/{src/generator/exercises → generator/src/generators}/acronym.cr +2 -2
  35. data/tracks/crystal/{src/generator/exercises → generator/src/generators}/binary.cr +2 -2
  36. data/tracks/crystal/{src/generator/exercises → generator/src/generators}/difference_of_squares.cr +2 -2
  37. data/tracks/crystal/generator/src/generators/flatten_array.cr +43 -0
  38. data/tracks/crystal/{src/generator/exercises → generator/src/generators}/forth.cr +2 -2
  39. data/tracks/crystal/{src/generator/exercises → generator/src/generators}/hello_world.cr +2 -2
  40. data/tracks/crystal/{src/generator/exercises → generator/src/generators}/pascals-triangle.cr +2 -2
  41. data/tracks/crystal/{src/generator/exercises → generator/src/generators}/run_length_encoding.cr +2 -2
  42. data/tracks/crystal/generator/src/remote_data_file.cr +57 -0
  43. data/tracks/crystal/{src/generator/exercises → generator/src}/templates/example.tt +0 -0
  44. data/tracks/csharp/.travis.yml +1 -1
  45. data/tracks/csharp/circle.yml +2 -2
  46. data/tracks/csharp/exercises/all-your-base/AllYourBaseTest.cs +14 -13
  47. data/tracks/csharp/exercises/allergies/Allergies.cs +1 -1
  48. data/tracks/csharp/exercises/allergies/AllergiesTest.cs +49 -46
  49. data/tracks/csharp/exercises/allergies/Example.cs +1 -1
  50. data/tracks/csharp/exercises/alphametics/AlphameticsTest.cs +9 -7
  51. data/tracks/csharp/exercises/anagram/Anagram.cs +2 -2
  52. data/tracks/csharp/exercises/anagram/AnagramTest.cs +100 -44
  53. data/tracks/csharp/exercises/anagram/Example.cs +6 -6
  54. data/tracks/csharp/exercises/binary-search/BinarySearch.cs +7 -2
  55. data/tracks/csharp/exercises/binary-search/BinarySearchTest.cs +47 -28
  56. data/tracks/csharp/exercises/binary-search/Example.cs +14 -18
  57. data/tracks/csharp/exercises/bracket-push/BracketPush.cs +16 -3
  58. data/tracks/csharp/exercises/bracket-push/BracketPushTest.cs +41 -25
  59. data/tracks/csharp/exercises/bracket-push/Example.cs +3 -3
  60. data/tracks/csharp/exercises/crypto-square/CryptoSquare.cs +8 -24
  61. data/tracks/csharp/exercises/crypto-square/CryptoSquareTest.cs +49 -64
  62. data/tracks/csharp/exercises/crypto-square/Example.cs +20 -38
  63. data/tracks/csharp/exercises/nth-prime/NthPrimeTest.cs +2 -1
  64. data/tracks/csharp/exercises/perfect-numbers/PerfectNumbersTest.cs +3 -2
  65. data/tracks/csharp/exercises/wordy/WordyTest.cs +3 -2
  66. data/tracks/csharp/generators/.gitignore +2 -0
  67. data/tracks/csharp/generators/ExerciseCollection.cs +6 -6
  68. data/tracks/csharp/generators/Exercises/AllYourBase.cs +11 -2
  69. data/tracks/csharp/generators/Exercises/Allergies.cs +57 -0
  70. data/tracks/csharp/generators/Exercises/Alphametics.cs +33 -0
  71. data/tracks/csharp/generators/Exercises/Anagram.cs +26 -0
  72. data/tracks/csharp/generators/Exercises/BeerSong.cs +1 -1
  73. data/tracks/csharp/generators/Exercises/BinarySearch.cs +23 -0
  74. data/tracks/csharp/generators/Exercises/BookStore.cs +7 -3
  75. data/tracks/csharp/generators/Exercises/BracketPush.cs +14 -0
  76. data/tracks/csharp/generators/Exercises/CryptoSquare.cs +19 -0
  77. data/tracks/csharp/generators/Exercises/FoodChain.cs +1 -1
  78. data/tracks/csharp/generators/Exercises/NthPrime.cs +9 -0
  79. data/tracks/csharp/generators/Exercises/PerfectNumbers.cs +8 -0
  80. data/tracks/csharp/generators/Exercises/Transpose.cs +7 -3
  81. data/tracks/csharp/generators/Exercises/Wordy.cs +9 -0
  82. data/tracks/csharp/generators/Generators.csproj +2 -0
  83. data/tracks/csharp/generators/Input/CanonicalDataCase.cs +12 -3
  84. data/tracks/csharp/generators/Input/CanonicalDataCaseJsonConverter.cs +2 -5
  85. data/tracks/csharp/generators/Input/CanonicalDataFile.cs +28 -0
  86. data/tracks/csharp/generators/Input/CanonicalDataParser.cs +3 -13
  87. data/tracks/csharp/generators/Options.cs +12 -0
  88. data/tracks/csharp/generators/Output/BooleanTestMethodGenerator.cs +1 -1
  89. data/tracks/csharp/generators/Output/EqualityTestMethodGenerator.cs +18 -1
  90. data/tracks/csharp/generators/Output/ExceptionTestMethodGenerator.cs +6 -3
  91. data/tracks/csharp/generators/Output/TestClassFile.cs +1 -1
  92. data/tracks/csharp/generators/Output/TestMethod.cs +2 -0
  93. data/tracks/csharp/generators/Output/TestMethodGenerator.cs +23 -24
  94. data/tracks/csharp/generators/Output/ValueFormatter.cs +14 -16
  95. data/tracks/csharp/generators/Program.cs +6 -7
  96. data/tracks/dart/.travis.yml +1 -1
  97. data/tracks/dart/README.md +1 -1
  98. data/tracks/dart/tool/create-exercise +0 -0
  99. data/tracks/delphi/.travis.yml +1 -1
  100. data/tracks/delphi/config.json +9 -0
  101. data/tracks/delphi/docs/TESTS.md +2 -2
  102. data/tracks/delphi/exercises/wordy/Wordy.dpr +60 -0
  103. data/tracks/delphi/exercises/wordy/uWordyExample.pas +130 -0
  104. data/tracks/delphi/exercises/wordy/uWordyTests.pas +184 -0
  105. data/tracks/ecmascript/.travis.yml +1 -1
  106. data/tracks/ecmascript/Makefile +1 -1
  107. data/tracks/ecmascript/README.md +1 -1
  108. data/tracks/ecmascript/config.json +7 -0
  109. data/tracks/ecmascript/docs/EXERCISE_README_INSERT.md +3 -3
  110. data/tracks/ecmascript/docs/TESTS.md +3 -4
  111. data/tracks/ecmascript/exercises/accumulate/accumulate.spec.js +5 -5
  112. data/tracks/ecmascript/exercises/accumulate/package.json +8 -3
  113. data/tracks/ecmascript/exercises/acronym/acronym.spec.js +6 -6
  114. data/tracks/ecmascript/exercises/acronym/package.json +8 -3
  115. data/tracks/ecmascript/exercises/all-your-base/all-your-base.spec.js +25 -25
  116. data/tracks/ecmascript/exercises/all-your-base/package.json +8 -3
  117. data/tracks/ecmascript/exercises/allergies/allergies.spec.js +12 -12
  118. data/tracks/ecmascript/exercises/allergies/package.json +8 -3
  119. data/tracks/ecmascript/exercises/alphametics/alphametics.spec.js +95 -95
  120. data/tracks/ecmascript/exercises/alphametics/package.json +8 -3
  121. data/tracks/ecmascript/exercises/anagram/anagram.spec.js +11 -11
  122. data/tracks/ecmascript/exercises/anagram/package.json +8 -3
  123. data/tracks/ecmascript/exercises/atbash-cipher/atbash-cipher.spec.js +8 -8
  124. data/tracks/ecmascript/exercises/atbash-cipher/package.json +8 -3
  125. data/tracks/ecmascript/exercises/beer-song/beer-song.spec.js +6 -6
  126. data/tracks/ecmascript/exercises/beer-song/package.json +8 -3
  127. data/tracks/ecmascript/exercises/binary-search-tree/binary-search-tree.spec.js +9 -9
  128. data/tracks/ecmascript/exercises/binary-search-tree/package.json +8 -3
  129. data/tracks/ecmascript/exercises/binary-search/binary-search.spec.js +3 -3
  130. data/tracks/ecmascript/exercises/binary-search/package.json +8 -3
  131. data/tracks/ecmascript/exercises/binary/binary.spec.js +10 -10
  132. data/tracks/ecmascript/exercises/binary/package.json +8 -3
  133. data/tracks/ecmascript/exercises/bob/bob.spec.js +17 -17
  134. data/tracks/ecmascript/exercises/bob/package.json +8 -3
  135. data/tracks/ecmascript/exercises/bracket-push/bracket-push.spec.js +8 -8
  136. data/tracks/ecmascript/exercises/bracket-push/package.json +8 -3
  137. data/tracks/ecmascript/exercises/circular-buffer/circular-buffer.spec.js +11 -11
  138. data/tracks/ecmascript/exercises/circular-buffer/package.json +8 -3
  139. data/tracks/ecmascript/exercises/clock/clock.spec.js +50 -50
  140. data/tracks/ecmascript/exercises/clock/package.json +8 -3
  141. data/tracks/ecmascript/exercises/connect/connect.spec.js +10 -10
  142. data/tracks/ecmascript/exercises/connect/package.json +8 -3
  143. data/tracks/ecmascript/exercises/crypto-square/crypto-square.spec.js +10 -10
  144. data/tracks/ecmascript/exercises/crypto-square/package.json +8 -3
  145. data/tracks/ecmascript/exercises/custom-set/custom-set.spec.js +11 -11
  146. data/tracks/ecmascript/exercises/custom-set/package.json +8 -3
  147. data/tracks/ecmascript/exercises/diamond/diamond.spec.js +3 -3
  148. data/tracks/ecmascript/exercises/diamond/package.json +8 -3
  149. data/tracks/ecmascript/exercises/difference-of-squares/difference-of-squares.spec.js +9 -9
  150. data/tracks/ecmascript/exercises/difference-of-squares/package.json +8 -3
  151. data/tracks/ecmascript/exercises/diffie-hellman/diffie-hellman.spec.js +94 -0
  152. data/tracks/ecmascript/exercises/diffie-hellman/example.js +37 -0
  153. data/tracks/ecmascript/exercises/{package.json → diffie-hellman/package.json} +67 -14
  154. data/tracks/ecmascript/exercises/etl/etl.spec.js +4 -4
  155. data/tracks/ecmascript/exercises/etl/package.json +8 -3
  156. data/tracks/ecmascript/exercises/flatten-array/flatten-array.spec.js +9 -9
  157. data/tracks/ecmascript/exercises/flatten-array/package.json +67 -14
  158. data/tracks/ecmascript/exercises/food-chain/food-chain.spec.js +10 -10
  159. data/tracks/ecmascript/exercises/food-chain/package.json +8 -3
  160. data/tracks/ecmascript/exercises/gigasecond/gigasecond.spec.js +4 -4
  161. data/tracks/ecmascript/exercises/gigasecond/package.json +8 -3
  162. data/tracks/ecmascript/exercises/grade-school/grade-school.spec.js +9 -9
  163. data/tracks/ecmascript/exercises/grade-school/package.json +8 -3
  164. data/tracks/ecmascript/exercises/grains/big-integer.spec.js +5 -5
  165. data/tracks/ecmascript/exercises/grains/grains.spec.js +8 -8
  166. data/tracks/ecmascript/exercises/grains/package.json +8 -3
  167. data/tracks/ecmascript/exercises/hamming/hamming.spec.js +8 -8
  168. data/tracks/ecmascript/exercises/hamming/package.json +8 -3
  169. data/tracks/ecmascript/exercises/hello-world/hello-world.spec.js +1 -1
  170. data/tracks/ecmascript/exercises/hello-world/package.json +8 -3
  171. data/tracks/ecmascript/exercises/hexadecimal/hexadecimal.spec.js +10 -10
  172. data/tracks/ecmascript/exercises/hexadecimal/package.json +8 -3
  173. data/tracks/ecmascript/exercises/isogram/isogram.spec.js +10 -10
  174. data/tracks/ecmascript/exercises/isogram/package.json +8 -3
  175. data/tracks/ecmascript/exercises/kindergarten-garden/kindergarten-garden.spec.js +21 -21
  176. data/tracks/ecmascript/exercises/kindergarten-garden/package.json +8 -3
  177. data/tracks/ecmascript/exercises/largest-series-product/largest-series-product.spec.js +12 -12
  178. data/tracks/ecmascript/exercises/largest-series-product/package.json +8 -3
  179. data/tracks/ecmascript/exercises/leap/leap.spec.js +4 -4
  180. data/tracks/ecmascript/exercises/leap/package.json +8 -3
  181. data/tracks/ecmascript/exercises/linked-list/linked-list.spec.js +11 -11
  182. data/tracks/ecmascript/exercises/linked-list/package.json +8 -3
  183. data/tracks/ecmascript/exercises/list-ops/list-ops.spec.js +17 -17
  184. data/tracks/ecmascript/exercises/list-ops/package.json +67 -14
  185. data/tracks/ecmascript/exercises/luhn/luhn.spec.js +6 -6
  186. data/tracks/ecmascript/exercises/luhn/package.json +8 -3
  187. data/tracks/ecmascript/exercises/matrix/matrix.spec.js +3 -3
  188. data/tracks/ecmascript/exercises/matrix/package.json +8 -3
  189. data/tracks/ecmascript/exercises/meetup/meetup.spec.js +13 -13
  190. data/tracks/ecmascript/exercises/meetup/package.json +8 -3
  191. data/tracks/ecmascript/exercises/nth-prime/nth-prime.spec.js +5 -5
  192. data/tracks/ecmascript/exercises/nth-prime/package.json +8 -3
  193. data/tracks/ecmascript/exercises/ocr-numbers/ocr-numbers.spec.js +16 -16
  194. data/tracks/ecmascript/exercises/ocr-numbers/package.json +8 -3
  195. data/tracks/ecmascript/exercises/octal/octal.spec.js +10 -10
  196. data/tracks/ecmascript/exercises/octal/package.json +8 -3
  197. data/tracks/ecmascript/exercises/palindrome-products/package.json +8 -3
  198. data/tracks/ecmascript/exercises/palindrome-products/palindrome-products.spec.js +5 -5
  199. data/tracks/ecmascript/exercises/pangram/package.json +8 -3
  200. data/tracks/ecmascript/exercises/pangram/pangram.spec.js +9 -9
  201. data/tracks/ecmascript/exercises/pascals-triangle/package.json +8 -3
  202. data/tracks/ecmascript/exercises/pascals-triangle/pascals-triangle.spec.js +6 -6
  203. data/tracks/ecmascript/exercises/perfect-numbers/package.json +8 -3
  204. data/tracks/ecmascript/exercises/perfect-numbers/perfect-numbers.spec.js +13 -13
  205. data/tracks/ecmascript/exercises/phone-number/package.json +8 -3
  206. data/tracks/ecmascript/exercises/phone-number/phone-number.spec.js +10 -10
  207. data/tracks/ecmascript/exercises/pig-latin/package.json +8 -3
  208. data/tracks/ecmascript/exercises/pig-latin/pig-latin.spec.js +11 -11
  209. data/tracks/ecmascript/exercises/prime-factors/package.json +8 -3
  210. data/tracks/ecmascript/exercises/prime-factors/prime-factors.spec.js +11 -11
  211. data/tracks/ecmascript/exercises/pythagorean-triplet/package.json +8 -3
  212. data/tracks/ecmascript/exercises/pythagorean-triplet/pythagorean-triplet.spec.js +7 -7
  213. data/tracks/ecmascript/exercises/queen-attack/package.json +8 -3
  214. data/tracks/ecmascript/exercises/queen-attack/queen-attack.spec.js +12 -12
  215. data/tracks/ecmascript/exercises/raindrops/package.json +8 -3
  216. data/tracks/ecmascript/exercises/raindrops/raindrops.spec.js +16 -16
  217. data/tracks/ecmascript/exercises/rna-transcription/package.json +8 -3
  218. data/tracks/ecmascript/exercises/rna-transcription/rna-transcription.spec.js +8 -8
  219. data/tracks/ecmascript/exercises/robot-name/package.json +8 -3
  220. data/tracks/ecmascript/exercises/robot-name/robot-name.spec.js +10 -10
  221. data/tracks/ecmascript/exercises/robot-simulator/package.json +8 -3
  222. data/tracks/ecmascript/exercises/robot-simulator/robot-simulator.spec.js +23 -23
  223. data/tracks/ecmascript/exercises/roman-numerals/package.json +8 -3
  224. data/tracks/ecmascript/exercises/roman-numerals/roman-numerals.spec.js +18 -18
  225. data/tracks/ecmascript/exercises/saddle-points/package.json +8 -3
  226. data/tracks/ecmascript/exercises/saddle-points/saddle-points.spec.js +8 -8
  227. data/tracks/ecmascript/exercises/say/package.json +8 -3
  228. data/tracks/ecmascript/exercises/say/say.spec.js +16 -16
  229. data/tracks/ecmascript/exercises/scrabble-score/package.json +8 -3
  230. data/tracks/ecmascript/exercises/scrabble-score/scrabble-score.spec.js +6 -6
  231. data/tracks/ecmascript/exercises/secret-handshake/package.json +8 -3
  232. data/tracks/ecmascript/exercises/secret-handshake/secret-handshake.spec.js +8 -8
  233. data/tracks/ecmascript/exercises/series/package.json +8 -3
  234. data/tracks/ecmascript/exercises/series/series.spec.js +11 -11
  235. data/tracks/ecmascript/exercises/sieve/package.json +8 -3
  236. data/tracks/ecmascript/exercises/sieve/sieve.spec.js +3 -3
  237. data/tracks/ecmascript/exercises/simple-cipher/package.json +8 -3
  238. data/tracks/ecmascript/exercises/simple-cipher/simple-cipher.spec.js +13 -13
  239. data/tracks/ecmascript/exercises/space-age/package.json +8 -3
  240. data/tracks/ecmascript/exercises/space-age/space-age.spec.js +10 -10
  241. data/tracks/ecmascript/exercises/strain/package.json +8 -3
  242. data/tracks/ecmascript/exercises/strain/strain.spec.js +12 -12
  243. data/tracks/ecmascript/exercises/sum-of-multiples/package.json +8 -3
  244. data/tracks/ecmascript/exercises/sum-of-multiples/sum-of-multiples.spec.js +9 -9
  245. data/tracks/ecmascript/exercises/triangle/package.json +8 -3
  246. data/tracks/ecmascript/exercises/triangle/triangle.spec.js +15 -15
  247. data/tracks/ecmascript/exercises/trinary/package.json +8 -3
  248. data/tracks/ecmascript/exercises/trinary/trinary.spec.js +10 -10
  249. data/tracks/ecmascript/exercises/two-bucket/package.json +8 -3
  250. data/tracks/ecmascript/exercises/two-bucket/two-bucket.spec.js +4 -4
  251. data/tracks/ecmascript/exercises/word-count/package.json +8 -3
  252. data/tracks/ecmascript/exercises/word-count/word-count.spec.js +12 -12
  253. data/tracks/ecmascript/exercises/wordy/package.json +8 -3
  254. data/tracks/ecmascript/exercises/wordy/wordy.spec.js +16 -16
  255. data/tracks/ecmascript/package.json +8 -3
  256. data/tracks/elisp/.travis.yml +1 -1
  257. data/tracks/elixir/.travis.yml +1 -1
  258. data/tracks/elixir/config.json +11 -0
  259. data/tracks/elixir/exercises/dominoes/dominoes.exs +12 -0
  260. data/tracks/elixir/exercises/dominoes/dominoes_test.exs +80 -0
  261. data/tracks/elixir/exercises/dominoes/example.exs +40 -0
  262. data/tracks/elm/.travis.yml +1 -1
  263. data/tracks/elm/README.md +2 -0
  264. data/tracks/elm/bin/build.sh +1 -1
  265. data/tracks/elm/config.json +7 -0
  266. data/tracks/elm/docs/EXERCISE_README_INSERT.md +9 -0
  267. data/tracks/elm/docs/TESTS.md +8 -0
  268. data/tracks/elm/exercises/accumulate/package.json +1 -0
  269. data/tracks/elm/exercises/accumulate/tests/Tests.elm +13 -10
  270. data/tracks/elm/exercises/allergies/package.json +1 -0
  271. data/tracks/elm/exercises/allergies/tests/Tests.elm +37 -26
  272. data/tracks/elm/exercises/anagram/package.json +1 -0
  273. data/tracks/elm/exercises/anagram/tests/Tests.elm +95 -76
  274. data/tracks/elm/exercises/atbash-cipher/package.json +1 -0
  275. data/tracks/elm/exercises/atbash-cipher/tests/Tests.elm +31 -22
  276. data/tracks/elm/exercises/bob/package.json +1 -0
  277. data/tracks/elm/exercises/bob/tests/Tests.elm +114 -95
  278. data/tracks/elm/exercises/difference-of-squares/package.json +1 -0
  279. data/tracks/elm/exercises/difference-of-squares/tests/Tests.elm +27 -18
  280. data/tracks/elm/exercises/etl/Etl.elm +1 -0
  281. data/tracks/elm/exercises/etl/Etl.example.elm +15 -0
  282. data/tracks/elm/exercises/etl/elm-package.json +15 -0
  283. data/tracks/elm/exercises/etl/package.json +14 -0
  284. data/tracks/elm/exercises/etl/tests/Tests.elm +97 -0
  285. data/tracks/elm/exercises/etl/tests/elm-package.json +16 -0
  286. data/tracks/elm/exercises/gigasecond/package.json +1 -0
  287. data/tracks/elm/exercises/gigasecond/tests/Tests.elm +16 -12
  288. data/tracks/elm/exercises/grade-school/package.json +1 -0
  289. data/tracks/elm/exercises/grade-school/tests/Tests.elm +46 -41
  290. data/tracks/elm/exercises/grains/package.json +1 -0
  291. data/tracks/elm/exercises/grains/tests/Tests.elm +21 -14
  292. data/tracks/elm/exercises/hamming/package.json +1 -0
  293. data/tracks/elm/exercises/hamming/tests/Tests.elm +39 -26
  294. data/tracks/elm/exercises/hello-world/package.json +1 -0
  295. data/tracks/elm/exercises/hello-world/tests/Tests.elm +12 -6
  296. data/tracks/elm/exercises/largest-series-product/package.json +1 -0
  297. data/tracks/elm/exercises/largest-series-product/tests/Tests.elm +48 -32
  298. data/tracks/elm/exercises/leap/package.json +1 -0
  299. data/tracks/elm/exercises/leap/tests/Tests.elm +18 -12
  300. data/tracks/elm/exercises/list-ops/package.json +1 -0
  301. data/tracks/elm/exercises/list-ops/tests/Tests.elm +57 -38
  302. data/tracks/elm/exercises/nucleotide-count/package.json +1 -0
  303. data/tracks/elm/exercises/nucleotide-count/tests/Tests.elm +10 -8
  304. data/tracks/elm/exercises/pangram/package.json +1 -0
  305. data/tracks/elm/exercises/pangram/tests/Tests.elm +45 -36
  306. data/tracks/elm/exercises/phone-number/package.json +1 -0
  307. data/tracks/elm/exercises/phone-number/tests/Tests.elm +33 -22
  308. data/tracks/elm/exercises/raindrops/package.json +1 -0
  309. data/tracks/elm/exercises/raindrops/tests/Tests.elm +42 -28
  310. data/tracks/elm/exercises/rna-transcription/package.json +1 -0
  311. data/tracks/elm/exercises/rna-transcription/tests/Tests.elm +18 -12
  312. data/tracks/elm/exercises/robot-simulator/package.json +1 -0
  313. data/tracks/elm/exercises/robot-simulator/tests/Tests.elm +65 -47
  314. data/tracks/elm/exercises/roman-numerals/package.json +1 -0
  315. data/tracks/elm/exercises/roman-numerals/tests/Tests.elm +85 -68
  316. data/tracks/elm/exercises/run-length-encoding/package.json +1 -0
  317. data/tracks/elm/exercises/run-length-encoding/tests/Tests.elm +29 -22
  318. data/tracks/elm/exercises/say/package.json +1 -0
  319. data/tracks/elm/exercises/say/tests/Tests.elm +86 -70
  320. data/tracks/elm/exercises/scrabble-score/package.json +1 -0
  321. data/tracks/elm/exercises/scrabble-score/tests/Tests.elm +30 -20
  322. data/tracks/elm/exercises/series/package.json +1 -0
  323. data/tracks/elm/exercises/series/tests/Tests.elm +35 -28
  324. data/tracks/elm/exercises/space-age/package.json +1 -0
  325. data/tracks/elm/exercises/space-age/tests/Tests.elm +21 -14
  326. data/tracks/elm/exercises/strain/package.json +1 -0
  327. data/tracks/elm/exercises/strain/tests/Tests.elm +55 -44
  328. data/tracks/elm/exercises/sublist/package.json +1 -0
  329. data/tracks/elm/exercises/sublist/tests/Tests.elm +51 -34
  330. data/tracks/elm/exercises/sum-of-multiples/package.json +1 -0
  331. data/tracks/elm/exercises/sum-of-multiples/tests/Tests.elm +15 -10
  332. data/tracks/elm/exercises/triangle/package.json +1 -0
  333. data/tracks/elm/exercises/triangle/tests/Tests.elm +43 -28
  334. data/tracks/elm/exercises/word-count/package.json +1 -0
  335. data/tracks/elm/exercises/word-count/tests/Tests.elm +25 -20
  336. data/tracks/elm/package.json +0 -1
  337. data/tracks/erlang/.travis.yml +1 -1
  338. data/tracks/erlang/README.md +2 -2
  339. data/tracks/erlang/bin/journey-test.sh +1 -1
  340. data/tracks/erlang/config.json +7 -0
  341. data/tracks/erlang/docs/EXERCISE_README_INSERT.md +1 -1
  342. data/tracks/erlang/exercises/accumulate/.meta/readme.go.tmpl +17 -0
  343. data/tracks/erlang/exercises/accumulate/README.md +79 -0
  344. data/tracks/erlang/exercises/all-your-base/.meta/readme.go.tmpl +17 -0
  345. data/tracks/erlang/exercises/all-your-base/README.md +79 -0
  346. data/tracks/erlang/exercises/allergies/.meta/readme.go.tmpl +17 -0
  347. data/tracks/erlang/exercises/allergies/README.md +81 -0
  348. data/tracks/erlang/exercises/anagram/.meta/readme.go.tmpl +17 -0
  349. data/tracks/erlang/exercises/anagram/README.md +57 -0
  350. data/tracks/erlang/exercises/atbash-cipher/.meta/readme.go.tmpl +17 -0
  351. data/tracks/erlang/exercises/atbash-cipher/README.md +78 -0
  352. data/tracks/erlang/exercises/bank-account/.meta/readme.go.tmpl +17 -0
  353. data/tracks/erlang/exercises/bank-account/README.md +74 -0
  354. data/tracks/erlang/exercises/beer-song/.meta/readme.go.tmpl +17 -0
  355. data/tracks/erlang/exercises/beer-song/README.md +371 -0
  356. data/tracks/erlang/exercises/bob/.meta/readme.go.tmpl +17 -0
  357. data/tracks/erlang/exercises/bob/README.md +62 -0
  358. data/tracks/erlang/exercises/circular-buffer/.meta/readme.go.tmpl +17 -0
  359. data/tracks/erlang/exercises/circular-buffer/README.md +94 -0
  360. data/tracks/erlang/exercises/clock/.meta/readme.go.tmpl +17 -0
  361. data/tracks/erlang/exercises/clock/README.md +57 -0
  362. data/tracks/erlang/exercises/collatz-conjecture/.meta/readme.go.tmpl +17 -0
  363. data/tracks/erlang/exercises/collatz-conjecture/README.md +77 -0
  364. data/tracks/erlang/exercises/difference-of-squares/.meta/readme.go.tmpl +17 -0
  365. data/tracks/erlang/exercises/difference-of-squares/README.md +63 -0
  366. data/tracks/erlang/exercises/etl/.meta/readme.go.tmpl +17 -0
  367. data/tracks/erlang/exercises/etl/README.md +95 -0
  368. data/tracks/erlang/exercises/gigasecond/.meta/readme.go.tmpl +17 -0
  369. data/tracks/erlang/exercises/gigasecond/README.md +55 -0
  370. data/tracks/erlang/exercises/grade-school/.meta/readme.go.tmpl +17 -0
  371. data/tracks/erlang/exercises/grade-school/README.md +86 -0
  372. data/tracks/erlang/exercises/grains/.meta/readme.go.tmpl +17 -0
  373. data/tracks/erlang/exercises/grains/README.md +78 -0
  374. data/tracks/erlang/exercises/hamming/.meta/readme.go.tmpl +17 -0
  375. data/tracks/erlang/exercises/hamming/README.md +86 -0
  376. data/tracks/erlang/exercises/hello-world/.meta/readme.go.tmpl +17 -0
  377. data/tracks/erlang/exercises/hello-world/README.md +65 -0
  378. data/tracks/erlang/exercises/largest-series-product/.meta/readme.go.tmpl +17 -0
  379. data/tracks/erlang/exercises/largest-series-product/README.md +64 -0
  380. data/tracks/erlang/exercises/leap/.meta/readme.go.tmpl +17 -0
  381. data/tracks/erlang/exercises/leap/README.md +77 -0
  382. data/tracks/erlang/exercises/luhn/.meta/readme.go.tmpl +17 -0
  383. data/tracks/erlang/exercises/luhn/README.md +115 -0
  384. data/tracks/erlang/exercises/meetup/.meta/readme.go.tmpl +17 -0
  385. data/tracks/erlang/exercises/meetup/README.md +74 -0
  386. data/tracks/erlang/exercises/nucleotide-count/.meta/readme.go.tmpl +17 -0
  387. data/tracks/erlang/exercises/nucleotide-count/README.md +77 -0
  388. data/tracks/erlang/exercises/parallel-letter-frequency/.meta/readme.go.tmpl +17 -0
  389. data/tracks/erlang/exercises/parallel-letter-frequency/README.md +55 -0
  390. data/tracks/erlang/exercises/phone-number/.meta/readme.go.tmpl +17 -0
  391. data/tracks/erlang/exercises/phone-number/README.md +78 -0
  392. data/tracks/erlang/exercises/rna-transcription/.meta/readme.go.tmpl +17 -0
  393. data/tracks/erlang/exercises/rna-transcription/README.md +69 -0
  394. data/tracks/erlang/exercises/robot-simulator/.meta/readme.go.tmpl +17 -0
  395. data/tracks/erlang/exercises/robot-simulator/README.md +89 -0
  396. data/tracks/erlang/exercises/roman-numerals/.meta/readme.go.tmpl +17 -0
  397. data/tracks/erlang/exercises/roman-numerals/README.md +93 -0
  398. data/tracks/erlang/exercises/rotational-cipher/.meta/readme.go.tmpl +17 -0
  399. data/tracks/erlang/exercises/rotational-cipher/README.md +80 -0
  400. data/tracks/erlang/exercises/rotational-cipher/test/rotational_cipher_tests.erl +2 -2
  401. data/tracks/erlang/exercises/scrabble-score/.meta/readme.go.tmpl +17 -0
  402. data/tracks/erlang/exercises/scrabble-score/README.md +88 -0
  403. data/tracks/erlang/exercises/series/.meta/readme.go.tmpl +17 -0
  404. data/tracks/erlang/exercises/series/README.md +71 -0
  405. data/tracks/erlang/exercises/space-age/.meta/readme.go.tmpl +17 -0
  406. data/tracks/erlang/exercises/space-age/README.md +68 -0
  407. data/tracks/erlang/exercises/spiral-matrix/.meta/readme.go.tmpl +17 -0
  408. data/tracks/erlang/exercises/spiral-matrix/README.md +74 -0
  409. data/tracks/erlang/exercises/spiral-matrix/include/exercism.hrl +11 -0
  410. data/tracks/erlang/exercises/spiral-matrix/rebar.config +30 -0
  411. data/tracks/erlang/exercises/spiral-matrix/src/example.erl +26 -0
  412. data/tracks/erlang/exercises/spiral-matrix/src/spiral_matrix.app.src +9 -0
  413. data/tracks/erlang/exercises/spiral-matrix/test/spiral_matrix_tests.erl +43 -0
  414. data/tracks/erlang/exercises/strain/.meta/readme.go.tmpl +17 -0
  415. data/tracks/erlang/exercises/strain/README.md +84 -0
  416. data/tracks/erlang/exercises/sum-of-multiples/.meta/readme.go.tmpl +17 -0
  417. data/tracks/erlang/exercises/sum-of-multiples/README.md +62 -0
  418. data/tracks/erlang/exercises/triangle/.meta/readme.go.tmpl +17 -0
  419. data/tracks/erlang/exercises/triangle/README.md +70 -0
  420. data/tracks/erlang/exercises/word-count/.meta/readme.go.tmpl +17 -0
  421. data/tracks/erlang/exercises/word-count/README.md +63 -0
  422. data/tracks/erlang/exercises/zipper/.meta/readme.go.tmpl +17 -0
  423. data/tracks/erlang/exercises/zipper/README.md +75 -0
  424. data/tracks/factor/.travis.yml +1 -1
  425. data/tracks/fsharp/.travis.yml +2 -2
  426. data/tracks/go/config.json +4 -2
  427. data/tracks/go/exercises/clock/.meta/gen.go +6 -1
  428. data/tracks/go/exercises/clock/cases_test.go +20 -13
  429. data/tracks/go/exercises/clock/clock_test.go +6 -0
  430. data/tracks/groovy/.travis.yml +1 -1
  431. data/tracks/haskell/.travis.yml +2 -2
  432. data/tracks/haskell/exercises/accumulate/stack.yaml +1 -1
  433. data/tracks/haskell/exercises/acronym/stack.yaml +1 -1
  434. data/tracks/haskell/exercises/all-your-base/stack.yaml +1 -1
  435. data/tracks/haskell/exercises/allergies/stack.yaml +1 -1
  436. data/tracks/haskell/exercises/alphametics/stack.yaml +1 -1
  437. data/tracks/haskell/exercises/anagram/stack.yaml +1 -1
  438. data/tracks/haskell/exercises/atbash-cipher/stack.yaml +1 -1
  439. data/tracks/haskell/exercises/bank-account/stack.yaml +1 -1
  440. data/tracks/haskell/exercises/beer-song/stack.yaml +1 -1
  441. data/tracks/haskell/exercises/binary-search-tree/stack.yaml +1 -1
  442. data/tracks/haskell/exercises/binary/stack.yaml +1 -1
  443. data/tracks/haskell/exercises/bob/stack.yaml +1 -1
  444. data/tracks/haskell/exercises/bowling/stack.yaml +1 -1
  445. data/tracks/haskell/exercises/bracket-push/stack.yaml +1 -1
  446. data/tracks/haskell/exercises/change/stack.yaml +1 -1
  447. data/tracks/haskell/exercises/clock/stack.yaml +1 -1
  448. data/tracks/haskell/exercises/connect/stack.yaml +1 -1
  449. data/tracks/haskell/exercises/crypto-square/stack.yaml +1 -1
  450. data/tracks/haskell/exercises/custom-set/stack.yaml +1 -1
  451. data/tracks/haskell/exercises/difference-of-squares/stack.yaml +1 -1
  452. data/tracks/haskell/exercises/dominoes/stack.yaml +1 -1
  453. data/tracks/haskell/exercises/etl/stack.yaml +1 -1
  454. data/tracks/haskell/exercises/food-chain/stack.yaml +1 -1
  455. data/tracks/haskell/exercises/forth/stack.yaml +1 -1
  456. data/tracks/haskell/exercises/gigasecond/stack.yaml +1 -1
  457. data/tracks/haskell/exercises/go-counting/stack.yaml +1 -1
  458. data/tracks/haskell/exercises/grade-school/stack.yaml +1 -1
  459. data/tracks/haskell/exercises/grains/stack.yaml +1 -1
  460. data/tracks/haskell/exercises/hamming/stack.yaml +1 -1
  461. data/tracks/haskell/exercises/hello-world/stack.yaml +1 -1
  462. data/tracks/haskell/exercises/hexadecimal/stack.yaml +1 -1
  463. data/tracks/haskell/exercises/house/stack.yaml +1 -1
  464. data/tracks/haskell/exercises/kindergarten-garden/stack.yaml +1 -1
  465. data/tracks/haskell/exercises/largest-series-product/stack.yaml +1 -1
  466. data/tracks/haskell/exercises/leap/stack.yaml +1 -1
  467. data/tracks/haskell/exercises/lens-person/stack.yaml +1 -1
  468. data/tracks/haskell/exercises/linked-list/stack.yaml +1 -1
  469. data/tracks/haskell/exercises/list-ops/stack.yaml +1 -1
  470. data/tracks/haskell/exercises/luhn/stack.yaml +1 -1
  471. data/tracks/haskell/exercises/matrix/stack.yaml +1 -1
  472. data/tracks/haskell/exercises/meetup/stack.yaml +1 -1
  473. data/tracks/haskell/exercises/minesweeper/stack.yaml +1 -1
  474. data/tracks/haskell/exercises/nth-prime/stack.yaml +1 -1
  475. data/tracks/haskell/exercises/nucleotide-count/stack.yaml +1 -1
  476. data/tracks/haskell/exercises/ocr-numbers/stack.yaml +1 -1
  477. data/tracks/haskell/exercises/octal/stack.yaml +1 -1
  478. data/tracks/haskell/exercises/palindrome-products/stack.yaml +1 -1
  479. data/tracks/haskell/exercises/pangram/stack.yaml +1 -1
  480. data/tracks/haskell/exercises/parallel-letter-frequency/stack.yaml +1 -1
  481. data/tracks/haskell/exercises/pascals-triangle/stack.yaml +1 -1
  482. data/tracks/haskell/exercises/phone-number/stack.yaml +1 -1
  483. data/tracks/haskell/exercises/pig-latin/stack.yaml +1 -1
  484. data/tracks/haskell/exercises/pov/stack.yaml +1 -1
  485. data/tracks/haskell/exercises/prime-factors/stack.yaml +1 -1
  486. data/tracks/haskell/exercises/pythagorean-triplet/stack.yaml +1 -1
  487. data/tracks/haskell/exercises/queen-attack/stack.yaml +1 -1
  488. data/tracks/haskell/exercises/raindrops/stack.yaml +1 -1
  489. data/tracks/haskell/exercises/rna-transcription/stack.yaml +1 -1
  490. data/tracks/haskell/exercises/robot-name/stack.yaml +1 -1
  491. data/tracks/haskell/exercises/robot-simulator/stack.yaml +1 -1
  492. data/tracks/haskell/exercises/roman-numerals/stack.yaml +1 -1
  493. data/tracks/haskell/exercises/run-length-encoding/stack.yaml +1 -1
  494. data/tracks/haskell/exercises/saddle-points/stack.yaml +1 -1
  495. data/tracks/haskell/exercises/say/stack.yaml +1 -1
  496. data/tracks/haskell/exercises/scrabble-score/stack.yaml +1 -1
  497. data/tracks/haskell/exercises/secret-handshake/stack.yaml +1 -1
  498. data/tracks/haskell/exercises/series/stack.yaml +1 -1
  499. data/tracks/haskell/exercises/sgf-parsing/stack.yaml +1 -1
  500. data/tracks/haskell/exercises/sieve/stack.yaml +1 -1
  501. data/tracks/haskell/exercises/simple-cipher/stack.yaml +1 -1
  502. data/tracks/haskell/exercises/simple-linked-list/stack.yaml +1 -1
  503. data/tracks/haskell/exercises/space-age/stack.yaml +1 -1
  504. data/tracks/haskell/exercises/spiral-matrix/stack.yaml +1 -1
  505. data/tracks/haskell/exercises/strain/stack.yaml +1 -1
  506. data/tracks/haskell/exercises/sublist/stack.yaml +1 -1
  507. data/tracks/haskell/exercises/sum-of-multiples/stack.yaml +1 -1
  508. data/tracks/haskell/exercises/triangle/stack.yaml +1 -1
  509. data/tracks/haskell/exercises/trinary/stack.yaml +1 -1
  510. data/tracks/haskell/exercises/word-count/stack.yaml +1 -1
  511. data/tracks/haskell/exercises/wordy/stack.yaml +1 -1
  512. data/tracks/haskell/exercises/zebra-puzzle/stack.yaml +1 -1
  513. data/tracks/haskell/exercises/zipper/stack.yaml +1 -1
  514. data/tracks/idris/.travis.yml +1 -1
  515. data/tracks/java/.travis.yml +4 -2
  516. data/tracks/java/CONTRIBUTING.md +117 -0
  517. data/tracks/java/POLICIES.md +13 -11
  518. data/tracks/java/README.md +1 -111
  519. data/tracks/java/bin/README.md +3 -0
  520. data/tracks/java/bin/journey-test.sh +25 -12
  521. data/tracks/java/bin/unit-tests.sh +1 -2
  522. data/tracks/java/config.json +39 -7
  523. data/tracks/java/docs/RESOURCES.md +6 -0
  524. data/tracks/java/exercises/accumulate/.meta/readme.go.tmpl +17 -0
  525. data/tracks/java/exercises/accumulate/README.md +47 -0
  526. data/tracks/java/exercises/acronym/.meta/readme.go.tmpl +17 -0
  527. data/tracks/java/exercises/acronym/README.md +27 -0
  528. data/tracks/java/exercises/all-your-base/.meta/readme.go.tmpl +17 -0
  529. data/tracks/java/exercises/all-your-base/README.md +47 -0
  530. data/tracks/java/exercises/{binary-search/src/test → all-your-base/src/main}/java/.keep +0 -0
  531. data/tracks/java/exercises/all-your-base/src/test/java/BaseConverterTest.java +0 -4
  532. data/tracks/java/exercises/allergies/.meta/readme.go.tmpl +17 -0
  533. data/tracks/java/exercises/allergies/README.md +49 -0
  534. data/tracks/java/exercises/anagram/.meta/readme.go.tmpl +17 -0
  535. data/tracks/java/exercises/anagram/README.md +25 -0
  536. data/tracks/java/exercises/{book-store/src/test → anagram/src/main}/java/.keep +0 -0
  537. data/tracks/java/exercises/atbash-cipher/.meta/readme.go.tmpl +17 -0
  538. data/tracks/java/exercises/atbash-cipher/README.md +46 -0
  539. data/tracks/java/exercises/bank-account/.meta/readme.go.tmpl +17 -0
  540. data/tracks/java/exercises/bank-account/README.md +54 -0
  541. data/tracks/java/exercises/beer-song/.meta/readme.go.tmpl +17 -0
  542. data/tracks/java/exercises/beer-song/README.md +339 -0
  543. data/tracks/java/exercises/{list-ops → beer-song}/src/main/java/.keep +0 -0
  544. data/tracks/java/exercises/binary-search-tree/.meta/readme.go.tmpl +17 -0
  545. data/tracks/java/exercises/binary-search-tree/README.md +72 -0
  546. data/tracks/java/exercises/binary-search-tree/src/test/java/BSTTest.java +8 -8
  547. data/tracks/java/exercises/binary-search/.meta/readme.go.tmpl +17 -0
  548. data/tracks/java/exercises/binary-search/README.md +53 -0
  549. data/tracks/java/exercises/{sieve → binary-search}/src/main/java/.keep +0 -0
  550. data/tracks/java/exercises/binary/.meta/readme.go.tmpl +17 -0
  551. data/tracks/java/exercises/binary/README.md +47 -0
  552. data/tracks/java/exercises/bob/.meta/readme.go.tmpl +17 -0
  553. data/tracks/java/exercises/bob/README.md +30 -0
  554. data/tracks/java/exercises/book-store/.meta/readme.go.tmpl +17 -0
  555. data/tracks/java/exercises/book-store/README.md +86 -0
  556. data/tracks/java/exercises/bowling/.meta/readme.go.tmpl +17 -0
  557. data/tracks/java/exercises/bowling/README.md +65 -0
  558. data/tracks/java/exercises/bowling/build.gradle +18 -0
  559. data/tracks/java/exercises/bowling/src/example/java/BowlingGame.java +84 -0
  560. data/tracks/java/exercises/{twelve-days → bowling}/src/main/java/.keep +0 -0
  561. data/tracks/java/exercises/bowling/src/test/java/BowlingTest.java +291 -0
  562. data/tracks/java/exercises/bracket-push/.meta/readme.go.tmpl +17 -0
  563. data/tracks/java/exercises/bracket-push/README.md +22 -0
  564. data/tracks/java/exercises/bracket-push/src/main/java/.keep +0 -0
  565. data/tracks/java/exercises/change/.meta/readme.go.tmpl +17 -0
  566. data/tracks/java/exercises/change/README.md +35 -0
  567. data/tracks/java/exercises/change/src/main/java/.keep +0 -0
  568. data/tracks/java/exercises/change/src/test/java/ChangeCalculatorTest.java +0 -4
  569. data/tracks/java/exercises/circular-buffer/.meta/readme.go.tmpl +17 -0
  570. data/tracks/java/exercises/circular-buffer/README.md +62 -0
  571. data/tracks/java/exercises/circular-buffer/build.gradle +18 -0
  572. data/tracks/java/exercises/circular-buffer/src/example/java/BufferIOException.java +6 -0
  573. data/tracks/java/exercises/circular-buffer/src/example/java/CircularBuffer.java +41 -0
  574. data/tracks/java/exercises/circular-buffer/src/main/java/BufferIOException.java +6 -0
  575. data/tracks/java/exercises/circular-buffer/src/test/java/CircularBufferTest.java +163 -0
  576. data/tracks/java/exercises/clock/.meta/readme.go.tmpl +17 -0
  577. data/tracks/java/exercises/clock/README.md +30 -0
  578. data/tracks/java/exercises/collatz-conjecture/.meta/readme.go.tmpl +17 -0
  579. data/tracks/java/exercises/collatz-conjecture/README.md +45 -0
  580. data/tracks/java/exercises/collatz-conjecture/src/main/java/.keep +0 -0
  581. data/tracks/java/exercises/complex-numbers/.meta/readme.go.tmpl +17 -0
  582. data/tracks/java/exercises/complex-numbers/README.md +23 -0
  583. data/tracks/java/exercises/complex-numbers/build.gradle +18 -0
  584. data/tracks/java/exercises/complex-numbers/src/example/java/ComplexNumber.java +57 -0
  585. data/tracks/java/exercises/complex-numbers/src/main/java/.keep +0 -0
  586. data/tracks/java/exercises/complex-numbers/src/test/java/ComplexNumberTest.java +262 -0
  587. data/tracks/java/exercises/crypto-square/.meta/readme.go.tmpl +17 -0
  588. data/tracks/java/exercises/crypto-square/README.md +86 -0
  589. data/tracks/java/exercises/custom-set/.meta/readme.go.tmpl +17 -0
  590. data/tracks/java/exercises/custom-set/README.md +23 -0
  591. data/tracks/java/exercises/custom-set/src/test/java/CustomSetTest.java +36 -36
  592. data/tracks/java/exercises/diamond/.meta/readme.go.tmpl +17 -0
  593. data/tracks/java/exercises/diamond/README.md +71 -0
  594. data/tracks/java/exercises/diamond/src/main/java/.keep +0 -0
  595. data/tracks/java/exercises/difference-of-squares/.meta/readme.go.tmpl +17 -0
  596. data/tracks/java/exercises/difference-of-squares/README.md +31 -0
  597. data/tracks/java/exercises/etl/.meta/readme.go.tmpl +17 -0
  598. data/tracks/java/exercises/etl/README.md +63 -0
  599. data/tracks/java/exercises/etl/src/main/java/Etl.java +1 -1
  600. data/tracks/java/exercises/flatten-array/.meta/readme.go.tmpl +17 -0
  601. data/tracks/java/exercises/flatten-array/README.md +30 -0
  602. data/tracks/java/exercises/flatten-array/src/main/java/.keep +0 -0
  603. data/tracks/java/exercises/food-chain/.meta/readme.go.tmpl +17 -0
  604. data/tracks/java/exercises/food-chain/README.md +82 -0
  605. data/tracks/java/exercises/gigasecond/.meta/readme.go.tmpl +17 -0
  606. data/tracks/java/exercises/gigasecond/README.md +23 -0
  607. data/tracks/java/exercises/grade-school/.meta/readme.go.tmpl +17 -0
  608. data/tracks/java/exercises/grade-school/README.md +54 -0
  609. data/tracks/java/exercises/hamming/.meta/readme.go.tmpl +17 -0
  610. data/tracks/java/exercises/hamming/HINTS.md +12 -0
  611. data/tracks/java/exercises/hamming/README.md +68 -0
  612. data/tracks/java/exercises/hello-world/.meta/readme.go.tmpl +17 -0
  613. data/tracks/java/exercises/hello-world/README.md +39 -0
  614. data/tracks/java/exercises/hexadecimal/.meta/readme.go.tmpl +17 -0
  615. data/tracks/java/exercises/hexadecimal/README.md +26 -0
  616. data/tracks/java/exercises/isogram/.meta/readme.go.tmpl +17 -0
  617. data/tracks/java/exercises/isogram/README.md +42 -0
  618. data/tracks/java/exercises/kindergarten-garden/.meta/readme.go.tmpl +17 -0
  619. data/tracks/java/exercises/kindergarten-garden/README.md +78 -0
  620. data/tracks/java/exercises/largest-series-product/.meta/readme.go.tmpl +17 -0
  621. data/tracks/java/exercises/largest-series-product/README.md +32 -0
  622. data/tracks/java/exercises/largest-series-product/src/test/java/LargestSeriesProductCalculatorTest.java +0 -4
  623. data/tracks/java/exercises/linked-list/.meta/readme.go.tmpl +17 -0
  624. data/tracks/java/exercises/linked-list/README.md +46 -0
  625. data/tracks/java/exercises/list-ops/.meta/readme.go.tmpl +17 -0
  626. data/tracks/java/exercises/list-ops/HINTS.md +3 -0
  627. data/tracks/java/exercises/list-ops/README.md +27 -0
  628. data/tracks/java/exercises/list-ops/src/example/java/ListOps.java +43 -25
  629. data/tracks/java/exercises/list-ops/src/main/java/ListOps.java +44 -0
  630. data/tracks/java/exercises/list-ops/src/test/java/ListOpsTest.java +119 -249
  631. data/tracks/java/exercises/luhn/.meta/readme.go.tmpl +17 -0
  632. data/tracks/java/exercises/luhn/README.md +83 -0
  633. data/tracks/java/exercises/matrix/.meta/readme.go.tmpl +17 -0
  634. data/tracks/java/exercises/matrix/README.md +57 -0
  635. data/tracks/java/exercises/meetup/.meta/readme.go.tmpl +17 -0
  636. data/tracks/java/exercises/meetup/README.md +42 -0
  637. data/tracks/java/exercises/meetup/src/test/java/MeetupTest.java +1 -2
  638. data/tracks/java/exercises/minesweeper/.meta/readme.go.tmpl +17 -0
  639. data/tracks/java/exercises/minesweeper/README.md +42 -0
  640. data/tracks/java/exercises/minesweeper/src/main/java/.keep +0 -0
  641. data/tracks/java/exercises/nth-prime/.meta/readme.go.tmpl +17 -0
  642. data/tracks/java/exercises/nth-prime/README.md +27 -0
  643. data/tracks/java/exercises/nth-prime/src/test/java/PrimeCalculatorTest.java +4 -4
  644. data/tracks/java/exercises/nucleotide-count/.meta/readme.go.tmpl +17 -0
  645. data/tracks/java/exercises/nucleotide-count/README.md +45 -0
  646. data/tracks/java/exercises/nucleotide-count/src/main/java/.keep +0 -0
  647. data/tracks/java/exercises/nucleotide-count/src/test/java/NucleotideTest.java +3 -3
  648. data/tracks/java/exercises/ocr-numbers/.meta/readme.go.tmpl +17 -0
  649. data/tracks/java/exercises/ocr-numbers/README.md +97 -0
  650. data/tracks/java/exercises/ocr-numbers/src/main/java/.keep +0 -0
  651. data/tracks/java/exercises/ocr-numbers/src/test/java/OpticalCharacterReaderTest.java +0 -4
  652. data/tracks/java/exercises/octal/.meta/readme.go.tmpl +17 -0
  653. data/tracks/java/exercises/octal/README.md +61 -0
  654. data/tracks/java/exercises/palindrome-products/.meta/readme.go.tmpl +17 -0
  655. data/tracks/java/exercises/palindrome-products/README.md +52 -0
  656. data/tracks/java/exercises/palindrome-products/src/test/java/PalindromeCalculatorTest.java +4 -4
  657. data/tracks/java/exercises/pangram/.meta/readme.go.tmpl +17 -0
  658. data/tracks/java/exercises/pangram/README.md +27 -0
  659. data/tracks/java/exercises/pascals-triangle/.meta/readme.go.tmpl +17 -0
  660. data/tracks/java/exercises/pascals-triangle/README.md +33 -0
  661. data/tracks/java/exercises/pascals-triangle/src/test/java/PascalsTriangleGeneratorTest.java +2 -2
  662. data/tracks/java/exercises/perfect-numbers/.meta/readme.go.tmpl +17 -0
  663. data/tracks/java/exercises/perfect-numbers/README.md +36 -0
  664. data/tracks/java/exercises/perfect-numbers/src/test/java/NaturalNumberTest.java +0 -4
  665. data/tracks/java/exercises/phone-number/.meta/readme.go.tmpl +17 -0
  666. data/tracks/java/exercises/phone-number/README.md +46 -0
  667. data/tracks/java/exercises/pig-latin/.meta/readme.go.tmpl +17 -0
  668. data/tracks/java/exercises/pig-latin/README.md +36 -0
  669. data/tracks/java/exercises/poker/.meta/readme.go.tmpl +17 -0
  670. data/tracks/java/exercises/poker/README.md +24 -0
  671. data/tracks/java/exercises/poker/src/example/java/Card.java +20 -20
  672. data/tracks/java/exercises/poker/src/example/java/Hand.java +96 -91
  673. data/tracks/java/exercises/poker/src/example/java/Poker.java +27 -20
  674. data/tracks/java/exercises/poker/src/main/java/.keep +0 -0
  675. data/tracks/java/exercises/poker/src/test/java/PokerTest.java +33 -34
  676. data/tracks/java/exercises/prime-factors/.meta/readme.go.tmpl +17 -0
  677. data/tracks/java/exercises/prime-factors/README.md +48 -0
  678. data/tracks/java/exercises/pythagorean-triplet/.meta/readme.go.tmpl +17 -0
  679. data/tracks/java/exercises/pythagorean-triplet/README.md +36 -0
  680. data/tracks/java/exercises/pythagorean-triplet/src/main/java/.keep +0 -0
  681. data/tracks/java/exercises/pythagorean-triplet/src/test/java/PythagoreanTripletTest.java +6 -6
  682. data/tracks/java/exercises/queen-attack/.meta/readme.go.tmpl +17 -0
  683. data/tracks/java/exercises/queen-attack/README.md +45 -0
  684. data/tracks/java/exercises/queen-attack/src/main/java/.keep +0 -0
  685. data/tracks/java/exercises/queen-attack/src/test/java/QueenAttackCalculatorTest.java +0 -4
  686. data/tracks/java/exercises/raindrops/.meta/readme.go.tmpl +17 -0
  687. data/tracks/java/exercises/raindrops/README.md +36 -0
  688. data/tracks/java/exercises/rectangles/.meta/readme.go.tmpl +17 -0
  689. data/tracks/java/exercises/rectangles/README.md +79 -0
  690. data/tracks/java/exercises/rectangles/src/main/java/.keep +0 -0
  691. data/tracks/java/exercises/rna-transcription/.meta/readme.go.tmpl +17 -0
  692. data/tracks/java/exercises/rna-transcription/README.md +37 -0
  693. data/tracks/java/exercises/robot-name/.meta/readme.go.tmpl +17 -0
  694. data/tracks/java/exercises/robot-name/README.md +34 -0
  695. data/tracks/java/exercises/robot-simulator/.meta/readme.go.tmpl +17 -0
  696. data/tracks/java/exercises/robot-simulator/README.md +46 -0
  697. data/tracks/java/exercises/roman-numerals/.meta/readme.go.tmpl +17 -0
  698. data/tracks/java/exercises/roman-numerals/README.md +61 -0
  699. data/tracks/java/exercises/run-length-encoding/.meta/readme.go.tmpl +17 -0
  700. data/tracks/java/exercises/run-length-encoding/README.md +42 -0
  701. data/tracks/java/exercises/run-length-encoding/src/main/java/.keep +0 -0
  702. data/tracks/java/exercises/saddle-points/.meta/readme.go.tmpl +17 -0
  703. data/tracks/java/exercises/saddle-points/README.md +45 -0
  704. data/tracks/java/exercises/scrabble-score/.meta/readme.go.tmpl +17 -0
  705. data/tracks/java/exercises/scrabble-score/README.md +56 -0
  706. data/tracks/java/exercises/secret-handshake/.meta/readme.go.tmpl +17 -0
  707. data/tracks/java/exercises/secret-handshake/README.md +47 -0
  708. data/tracks/java/exercises/series/.meta/readme.go.tmpl +17 -0
  709. data/tracks/java/exercises/series/README.md +39 -0
  710. data/tracks/java/exercises/series/src/main/java/.keep +0 -0
  711. data/tracks/java/exercises/series/src/test/java/SeriesTest.java +14 -14
  712. data/tracks/java/exercises/settings.gradle +5 -1
  713. data/tracks/java/exercises/sieve/.meta/readme.go.tmpl +17 -0
  714. data/tracks/java/exercises/sieve/README.md +46 -0
  715. data/tracks/java/exercises/sieve/src/main/java/Sieve.java +11 -0
  716. data/tracks/java/exercises/simple-cipher/.meta/readme.go.tmpl +17 -0
  717. data/tracks/java/exercises/simple-cipher/README.md +109 -0
  718. data/tracks/java/exercises/simple-linked-list/.meta/readme.go.tmpl +17 -0
  719. data/tracks/java/exercises/simple-linked-list/README.md +40 -0
  720. data/tracks/java/exercises/simple-linked-list/src/test/java/SimpleLinkedListTest.java +2 -2
  721. data/tracks/java/exercises/space-age/.meta/readme.go.tmpl +17 -0
  722. data/tracks/java/exercises/space-age/README.md +36 -0
  723. data/tracks/java/exercises/spiral-matrix/.meta/readme.go.tmpl +17 -0
  724. data/tracks/java/exercises/spiral-matrix/README.md +42 -0
  725. data/tracks/java/exercises/spiral-matrix/build.gradle +18 -0
  726. data/tracks/java/exercises/spiral-matrix/src/example/java/Coordinate.java +31 -0
  727. data/tracks/java/exercises/spiral-matrix/src/example/java/Direction.java +29 -0
  728. data/tracks/java/exercises/spiral-matrix/src/example/java/SpiralMatrixBuilder.java +29 -0
  729. data/tracks/java/exercises/spiral-matrix/src/main/java/.keep +0 -0
  730. data/tracks/java/exercises/spiral-matrix/src/test/java/SpiralMatrixBuilderTest.java +86 -0
  731. data/tracks/java/exercises/strain/.meta/readme.go.tmpl +17 -0
  732. data/tracks/java/exercises/strain/README.md +52 -0
  733. data/tracks/java/exercises/sublist/.meta/readme.go.tmpl +17 -0
  734. data/tracks/java/exercises/sublist/README.md +33 -0
  735. data/tracks/java/exercises/sum-of-multiples/.meta/readme.go.tmpl +17 -0
  736. data/tracks/java/exercises/sum-of-multiples/README.md +30 -0
  737. data/tracks/java/exercises/sum-of-multiples/src/test/java/SumOfMultiplesTest.java +12 -12
  738. data/tracks/java/exercises/transpose/.meta/readme.go.tmpl +17 -0
  739. data/tracks/java/exercises/transpose/README.md +77 -0
  740. data/tracks/java/exercises/transpose/src/test/java/TransposeTest.java +11 -11
  741. data/tracks/java/exercises/triangle/.meta/readme.go.tmpl +17 -0
  742. data/tracks/java/exercises/triangle/README.md +38 -0
  743. data/tracks/java/exercises/triangle/src/test/java/TriangleTest.java +6 -6
  744. data/tracks/java/exercises/trinary/.meta/readme.go.tmpl +17 -0
  745. data/tracks/java/exercises/trinary/README.md +40 -0
  746. data/tracks/java/exercises/twelve-days/.meta/readme.go.tmpl +17 -0
  747. data/tracks/java/exercises/twelve-days/README.md +47 -0
  748. data/tracks/java/exercises/twelve-days/src/main/java/TwelveDays.java +9 -0
  749. data/tracks/java/exercises/two-fer/.meta/readme.go.tmpl +17 -0
  750. data/tracks/java/exercises/two-fer/README.md +100 -0
  751. data/tracks/java/exercises/two-fer/src/test/java/TwoferTest.java +3 -3
  752. data/tracks/java/exercises/word-count/.meta/readme.go.tmpl +17 -0
  753. data/tracks/java/exercises/word-count/README.md +31 -0
  754. data/tracks/java/exercises/word-count/src/main/java/.keep +0 -0
  755. data/tracks/java/exercises/word-search/.meta/readme.go.tmpl +17 -0
  756. data/tracks/java/exercises/word-search/README.md +42 -0
  757. data/tracks/java/exercises/wordy/.meta/readme.go.tmpl +17 -0
  758. data/tracks/java/exercises/wordy/README.md +75 -0
  759. data/tracks/java/exercises/wordy/src/main/java/.keep +0 -0
  760. data/tracks/java/exercises/wordy/src/test/java/WordProblemSolverTest.java +0 -4
  761. data/tracks/java/gradle/wrapper/gradle-wrapper.jar +0 -0
  762. data/tracks/java/gradle/wrapper/gradle-wrapper.properties +2 -2
  763. data/tracks/javascript/.travis.yml +1 -1
  764. data/tracks/javascript/config.json +9 -0
  765. data/tracks/javascript/exercises/bob/bob.spec.js +59 -30
  766. data/tracks/javascript/exercises/bob/example.js +2 -1
  767. data/tracks/javascript/exercises/list-ops/example.js +76 -0
  768. data/tracks/javascript/exercises/list-ops/list-ops.spec.js +168 -0
  769. data/tracks/kotlin/bin/README.md +3 -0
  770. data/tracks/kotlin/bin/journey-test.sh +1 -3
  771. data/tracks/kotlin/bin/unit-tests.sh +5 -1
  772. data/tracks/kotlin/config.json +63 -0
  773. data/tracks/kotlin/exercises/complex-numbers/build.gradle +28 -0
  774. data/tracks/kotlin/exercises/complex-numbers/src/example/kotlin/ComplexNumber.kt +28 -0
  775. data/tracks/kotlin/exercises/complex-numbers/src/main/kotlin/ComplexNumber.kt +1 -0
  776. data/tracks/kotlin/exercises/complex-numbers/src/test/kotlin/ComplexNumberTest.kt +266 -0
  777. data/tracks/kotlin/exercises/grains/build.gradle +28 -0
  778. data/tracks/kotlin/exercises/grains/src/example/kotlin/Board.kt +21 -0
  779. data/tracks/kotlin/exercises/grains/src/main/kotlin/.keep +0 -0
  780. data/tracks/kotlin/exercises/grains/src/test/kotlin/BoardTest.kt +91 -0
  781. data/tracks/kotlin/exercises/minesweeper/build.gradle +28 -0
  782. data/tracks/kotlin/exercises/minesweeper/src/example/kotlin/MinesweeperBoard.kt +54 -0
  783. data/tracks/kotlin/exercises/minesweeper/src/main/kotlin/.keep +0 -0
  784. data/tracks/kotlin/exercises/minesweeper/src/test/kotlin/MinesweeperBoardTest.kt +241 -0
  785. data/tracks/kotlin/exercises/prime-factors/build.gradle +28 -0
  786. data/tracks/kotlin/exercises/prime-factors/src/example/kotlin/PrimeFactorCalculator.kt +24 -0
  787. data/tracks/kotlin/exercises/prime-factors/src/main/kotlin/.keep +0 -0
  788. data/tracks/kotlin/exercises/prime-factors/src/test/kotlin/PrimeFactorCalculatorTest.kt +51 -0
  789. data/tracks/kotlin/exercises/robot-simulator/build.gradle +28 -0
  790. data/tracks/kotlin/exercises/robot-simulator/src/example/kotlin/GridPosition.kt +1 -0
  791. data/tracks/kotlin/exercises/robot-simulator/src/example/kotlin/Orientation.kt +1 -0
  792. data/tracks/kotlin/exercises/robot-simulator/src/example/kotlin/Robot.kt +34 -0
  793. data/tracks/kotlin/exercises/robot-simulator/src/main/kotlin/GridPosition.kt +1 -0
  794. data/tracks/kotlin/exercises/robot-simulator/src/main/kotlin/Orientation.kt +5 -0
  795. data/tracks/kotlin/exercises/robot-simulator/src/starterSource/kotlin/.keep +0 -0
  796. data/tracks/kotlin/exercises/robot-simulator/src/test/kotlin/RobotTest.kt +213 -0
  797. data/tracks/kotlin/exercises/saddle-points/build.gradle +28 -0
  798. data/tracks/kotlin/exercises/saddle-points/src/example/kotlin/Matrix.kt +31 -0
  799. data/tracks/kotlin/exercises/saddle-points/src/example/kotlin/MatrixCoordinate.kt +1 -0
  800. data/tracks/kotlin/exercises/saddle-points/src/main/kotlin/MatrixCoordinate.kt +1 -0
  801. data/tracks/kotlin/exercises/saddle-points/src/test/kotlin/MatrixTest.kt +80 -0
  802. data/tracks/kotlin/exercises/secret-handshake/build.gradle +28 -0
  803. data/tracks/kotlin/exercises/secret-handshake/src/example/kotlin/HandshakeCalculator.kt +21 -0
  804. data/tracks/kotlin/exercises/secret-handshake/src/example/kotlin/Signal.kt +1 -0
  805. data/tracks/kotlin/exercises/secret-handshake/src/main/kotlin/Signal.kt +5 -0
  806. data/tracks/kotlin/exercises/secret-handshake/src/test/kotlin/HandshakeCalculatorTest.kt +105 -0
  807. data/tracks/kotlin/exercises/settings.gradle +9 -0
  808. data/tracks/kotlin/exercises/spiral-matrix/build.gradle +28 -0
  809. data/tracks/kotlin/exercises/spiral-matrix/src/example/kotlin/SpiralMatrix.kt +48 -0
  810. data/tracks/kotlin/exercises/spiral-matrix/src/main/kotlin/.keep +0 -0
  811. data/tracks/kotlin/exercises/spiral-matrix/src/test/kotlin/SpiralMatrixTest.kt +77 -0
  812. data/tracks/kotlin/exercises/sublist/build.gradle +28 -0
  813. data/tracks/kotlin/exercises/sublist/src/example/kotlin/Relationship.kt +5 -0
  814. data/tracks/kotlin/exercises/sublist/src/example/kotlin/Sublist.kt +19 -0
  815. data/tracks/kotlin/exercises/sublist/src/main/kotlin/Relationship.kt +5 -0
  816. data/tracks/kotlin/exercises/sublist/src/test/kotlin/SublistTest.kt +147 -0
  817. data/tracks/kotlin/gradle/wrapper/gradle-wrapper.jar +0 -0
  818. data/tracks/kotlin/gradle/wrapper/gradle-wrapper.properties +2 -2
  819. data/tracks/kotlin/gradlew +3 -3
  820. data/tracks/lfe/.travis.yml +1 -1
  821. data/tracks/lisp/.travis.yml +1 -1
  822. data/tracks/lisp/bin/xlisp-test.lisp +14 -12
  823. data/tracks/objective-c/.travis.yml +1 -1
  824. data/tracks/objective-c/config.json +11 -0
  825. data/tracks/objective-c/exercises/rna-transcription/RNATranscriptionExample.h +5 -0
  826. data/tracks/objective-c/exercises/rna-transcription/RNATranscriptionExample.m +46 -0
  827. data/tracks/objective-c/exercises/rna-transcription/RNATranscriptionTest.m +47 -0
  828. data/tracks/objective-c/xcodeProject/ObjectiveC.xcodeproj/project.pbxproj +19 -0
  829. data/tracks/ocaml/.travis.yml +1 -1
  830. data/tracks/perl5/.travis.yml +1 -1
  831. data/tracks/perl5/bin/cpanfile +0 -1
  832. data/tracks/perl5/bin/exercise-gen.pl +12 -4
  833. data/tracks/perl6/.travis.yml +1 -1
  834. data/tracks/perl6/bin/exercise-gen.pl6 +11 -3
  835. data/tracks/php/.travis.yml +1 -1
  836. data/tracks/powershell/.travis.yml +1 -1
  837. data/tracks/purescript/.travis.yml +1 -1
  838. data/tracks/purescript/exercises/accumulate/test/Main.purs +2 -2
  839. data/tracks/purescript/exercises/hamming/src/Hamming.purs +3 -0
  840. data/tracks/python/README.md +1 -1
  841. data/tracks/r/.travis.yml +1 -1
  842. data/tracks/r/config.json +7 -0
  843. data/tracks/r/exercises/beer-song/beer-song.R +7 -0
  844. data/tracks/r/exercises/beer-song/example.R +32 -0
  845. data/tracks/r/exercises/beer-song/test_beer-song.R +288 -0
  846. data/tracks/racket/.travis.yml +1 -1
  847. data/tracks/racket/README.md +1 -1
  848. data/tracks/ruby/.travis.yml +0 -1
  849. data/tracks/ruby/bin/local-status-check +2 -3
  850. data/tracks/ruby/docs/EXERCISE_README_INSERT.md +0 -5
  851. data/tracks/ruby/exercises/accumulate/accumulate_test.rb +0 -1
  852. data/tracks/ruby/exercises/acronym/acronym_test.rb +0 -1
  853. data/tracks/ruby/exercises/all-your-base/all_your_base_test.rb +0 -1
  854. data/tracks/ruby/exercises/allergies/allergies_test.rb +0 -1
  855. data/tracks/ruby/exercises/alphametics/.meta/generator/test_template.erb +0 -1
  856. data/tracks/ruby/exercises/alphametics/alphametics_test.rb +0 -1
  857. data/tracks/ruby/exercises/anagram/anagram_test.rb +0 -1
  858. data/tracks/ruby/exercises/atbash-cipher/atbash_cipher_test.rb +0 -1
  859. data/tracks/ruby/exercises/beer-song/beer_song_test.rb +0 -1
  860. data/tracks/ruby/exercises/binary-search-tree/binary_search_tree_test.rb +0 -1
  861. data/tracks/ruby/exercises/binary-search/binary_search_test.rb +0 -1
  862. data/tracks/ruby/exercises/binary/binary_test.rb +0 -1
  863. data/tracks/ruby/exercises/bob/bob_test.rb +0 -1
  864. data/tracks/ruby/exercises/bowling/.meta/generator/test_template.erb +0 -1
  865. data/tracks/ruby/exercises/bowling/bowling_test.rb +0 -1
  866. data/tracks/ruby/exercises/bracket-push/bracket_push_test.rb +0 -1
  867. data/tracks/ruby/exercises/circular-buffer/circular_buffer_test.rb +0 -1
  868. data/tracks/ruby/exercises/clock/clock_test.rb +0 -1
  869. data/tracks/ruby/exercises/collatz-conjecture/collatz_conjecture_test.rb +0 -1
  870. data/tracks/ruby/exercises/connect/.meta/generator/test_template.erb +0 -1
  871. data/tracks/ruby/exercises/connect/connect_test.rb +0 -1
  872. data/tracks/ruby/exercises/crypto-square/crypto_square_test.rb +0 -1
  873. data/tracks/ruby/exercises/custom-set/custom_set_test.rb +0 -1
  874. data/tracks/ruby/exercises/diamond/diamond_test.rb +0 -1
  875. data/tracks/ruby/exercises/difference-of-squares/difference_of_squares_test.rb +0 -1
  876. data/tracks/ruby/exercises/dominoes/.meta/generator/dominoes_case.rb +1 -1
  877. data/tracks/ruby/exercises/dominoes/.meta/generator/test_template.erb +0 -1
  878. data/tracks/ruby/exercises/dominoes/dominoes_test.rb +1 -2
  879. data/tracks/ruby/exercises/etl/etl_test.rb +0 -1
  880. data/tracks/ruby/exercises/flatten-array/flatten_array_test.rb +0 -1
  881. data/tracks/ruby/exercises/food-chain/food_chain_test.rb +0 -1
  882. data/tracks/ruby/exercises/gigasecond/gigasecond_test.rb +0 -1
  883. data/tracks/ruby/exercises/grade-school/grade_school_test.rb +0 -1
  884. data/tracks/ruby/exercises/grains/grains_test.rb +0 -1
  885. data/tracks/ruby/exercises/hamming/hamming_test.rb +0 -1
  886. data/tracks/ruby/exercises/hello-world/.meta/generator/test_template.erb +0 -1
  887. data/tracks/ruby/exercises/hello-world/hello_world_test.rb +0 -1
  888. data/tracks/ruby/exercises/hexadecimal/hexadecimal_test.rb +0 -1
  889. data/tracks/ruby/exercises/house/house_test.rb +0 -1
  890. data/tracks/ruby/exercises/isogram/isogram_test.rb +0 -1
  891. data/tracks/ruby/exercises/kindergarten-garden/kindergarten_garden_test.rb +0 -1
  892. data/tracks/ruby/exercises/largest-series-product/largest_series_product_test.rb +0 -1
  893. data/tracks/ruby/exercises/leap/.meta/generator/test_template.erb +0 -1
  894. data/tracks/ruby/exercises/leap/leap_test.rb +0 -1
  895. data/tracks/ruby/exercises/linked-list/linked_list_test.rb +0 -1
  896. data/tracks/ruby/exercises/list-ops/list_ops_test.rb +0 -0
  897. data/tracks/ruby/exercises/luhn/luhn_test.rb +0 -1
  898. data/tracks/ruby/exercises/matrix/matrix_test.rb +0 -1
  899. data/tracks/ruby/exercises/meetup/meetup_test.rb +0 -1
  900. data/tracks/ruby/exercises/minesweeper/minesweeper_test.rb +0 -1
  901. data/tracks/ruby/exercises/nth-prime/nth_prime_test.rb +0 -1
  902. data/tracks/ruby/exercises/nucleotide-count/nucleotide_count_test.rb +0 -1
  903. data/tracks/ruby/exercises/ocr-numbers/ocr_numbers_test.rb +0 -1
  904. data/tracks/ruby/exercises/octal/octal_test.rb +0 -1
  905. data/tracks/ruby/exercises/palindrome-products/palindrome_products_test.rb +0 -1
  906. data/tracks/ruby/exercises/pangram/pangram_test.rb +0 -1
  907. data/tracks/ruby/exercises/pascals-triangle/pascals_triangle_test.rb +0 -1
  908. data/tracks/ruby/exercises/perfect-numbers/perfect_numbers_test.rb +0 -0
  909. data/tracks/ruby/exercises/phone-number/phone_number_test.rb +0 -1
  910. data/tracks/ruby/exercises/pig-latin/pig_latin_test.rb +0 -1
  911. data/tracks/ruby/exercises/point-mutations/point_mutations_test.rb +0 -1
  912. data/tracks/ruby/exercises/poker/poker_test.rb +0 -1
  913. data/tracks/ruby/exercises/prime-factors/prime_factors_test.rb +0 -1
  914. data/tracks/ruby/exercises/protein-translation/protein_translation_test.rb +0 -1
  915. data/tracks/ruby/exercises/proverb/proverb_test.rb +0 -1
  916. data/tracks/ruby/exercises/pythagorean-triplet/pythagorean_triplet_test.rb +0 -1
  917. data/tracks/ruby/exercises/queen-attack/queen_attack_test.rb +0 -1
  918. data/tracks/ruby/exercises/rail-fence-cipher/rail_fence_cipher_test.rb +0 -0
  919. data/tracks/ruby/exercises/raindrops/raindrops_test.rb +0 -1
  920. data/tracks/ruby/exercises/rna-transcription/rna_transcription_test.rb +0 -1
  921. data/tracks/ruby/exercises/robot-name/robot_name_test.rb +0 -2
  922. data/tracks/ruby/exercises/robot-simulator/robot_simulator_test.rb +0 -1
  923. data/tracks/ruby/exercises/roman-numerals/roman_numerals_test.rb +0 -1
  924. data/tracks/ruby/exercises/run-length-encoding/run_length_encoding_test.rb +0 -1
  925. data/tracks/ruby/exercises/saddle-points/saddle_points_test.rb +0 -1
  926. data/tracks/ruby/exercises/say/say_test.rb +0 -1
  927. data/tracks/ruby/exercises/scale-generator/scale_generator_test.rb +0 -1
  928. data/tracks/ruby/exercises/scrabble-score/scrabble_score_test.rb +0 -1
  929. data/tracks/ruby/exercises/secret-handshake/secret_handshake_test.rb +0 -1
  930. data/tracks/ruby/exercises/series/series_test.rb +1 -2
  931. data/tracks/ruby/exercises/sieve/sieve_test.rb +0 -1
  932. data/tracks/ruby/exercises/simple-cipher/simple_cipher_test.rb +0 -1
  933. data/tracks/ruby/exercises/simple-linked-list/simple_linked_list_test.rb +0 -0
  934. data/tracks/ruby/exercises/space-age/.meta/generator/test_template.erb +0 -1
  935. data/tracks/ruby/exercises/space-age/space_age_test.rb +0 -1
  936. data/tracks/ruby/exercises/strain/strain_test.rb +0 -1
  937. data/tracks/ruby/exercises/sum-of-multiples/sum_of_multiples_test.rb +0 -1
  938. data/tracks/ruby/exercises/tournament/tournament_test.rb +0 -1
  939. data/tracks/ruby/exercises/transpose/transpose_test.rb +0 -1
  940. data/tracks/ruby/exercises/triangle/triangle_test.rb +1 -2
  941. data/tracks/ruby/exercises/trinary/trinary_test.rb +0 -1
  942. data/tracks/ruby/exercises/twelve-days/twelve_days_test.rb +0 -1
  943. data/tracks/ruby/exercises/two-bucket/two_bucket_test.rb +0 -1
  944. data/tracks/ruby/exercises/word-count/word_count_test.rb +0 -1
  945. data/tracks/ruby/exercises/wordy/wordy_test.rb +0 -1
  946. data/tracks/ruby/lib/generator/test_template.erb +0 -1
  947. data/tracks/ruby/test/fixtures/xruby/exercises/alpha-beta/.meta/generator/test_template.erb +0 -1
  948. data/tracks/ruby/test/fixtures/xruby/exercises/alpha/.meta/generator/test_template.erb +0 -1
  949. data/tracks/ruby/test/fixtures/xruby/lib/generator/test_template.erb +0 -1
  950. data/tracks/ruby/test/generator/implementation_test.rb +0 -1
  951. data/tracks/scala/.travis.yml +1 -1
  952. data/tracks/scala/config.json +7 -0
  953. data/tracks/scala/exercises/spiral-matrix/build.sbt +3 -0
  954. data/tracks/scala/exercises/spiral-matrix/example.scala +48 -0
  955. data/tracks/scala/exercises/spiral-matrix/src/main/scala/.keep +0 -0
  956. data/tracks/scala/exercises/spiral-matrix/src/test/scala/SpiralMatrixTest.scala +52 -0
  957. data/tracks/scala/testgen/src/main/scala/SpiralMatrixTestGenerator.scala +17 -0
  958. data/tracks/scheme/.travis.yml +1 -1
  959. data/tracks/smalltalk/.travis.yml +1 -1
  960. data/tracks/sml/.github/stale.yml +21 -0
  961. data/tracks/sml/.travis.yml +1 -1
  962. data/tracks/sml/SETUP.md +43 -0
  963. data/tracks/sml/docs/EXERCISE_README_INSERT.md +9 -26
  964. data/tracks/sml/docs/INSTALLATION.md +30 -0
  965. data/tracks/sml/docs/RESOURCES.md +33 -0
  966. data/tracks/sml/docs/TESTS.md +5 -0
  967. data/tracks/sml/exercises/accumulate/accumulate.sml +10 -0
  968. data/tracks/sml/exercises/accumulate/example.sml +2 -10
  969. data/tracks/sml/exercises/accumulate/test_accumulate.sml +53 -10
  970. data/tracks/sml/exercises/allergies/allergies.sml +17 -0
  971. data/tracks/sml/exercises/allergies/example.sml +23 -21
  972. data/tracks/sml/exercises/allergies/test_allergies.sml +129 -23
  973. data/tracks/sml/exercises/anagram/anagram.sml +6 -0
  974. data/tracks/sml/exercises/anagram/test_anagram.sml +49 -11
  975. data/tracks/sml/exercises/flatten-array/example.sml +4 -4
  976. data/tracks/sml/exercises/flatten-array/flatten-array.sml +6 -0
  977. data/tracks/sml/exercises/flatten-array/test_flatten_array.sml +53 -6
  978. data/tracks/sml/exercises/hamming/hamming.sml +3 -0
  979. data/tracks/sml/exercises/hamming/test_hamming.sml +57 -19
  980. data/tracks/sml/exercises/nth-prime/example.sml +7 -6
  981. data/tracks/sml/exercises/nth-prime/nth-prime.sml +2 -0
  982. data/tracks/sml/exercises/nth-prime/test_nth_prime.sml +67 -10
  983. data/tracks/swift/.gitignore +4 -0
  984. data/tracks/swift/.travis.yml +4 -4
  985. data/tracks/swift/Dangerfile +1 -1
  986. data/tracks/swift/allProjects.xcworkspace.source/contents.xcworkspacedata +4 -0
  987. data/tracks/swift/allProjects.xcworkspace.source/xcshareddata/xcschemes/AllTest.xcscheme +46 -0
  988. data/tracks/swift/allProjectsPopulateWorkspace.sh +35 -0
  989. data/tracks/swift/exercises/acronym/Sources/AcronymExample.swift +2 -4
  990. data/tracks/swift/exercises/crypto-square/Sources/CryptoSquareExample.swift +2 -4
  991. data/tracks/swift/exercises/custom-set/Sources/CustomSetExample.swift +2 -2
  992. data/tracks/swift/exercises/hamming/Sources/HammingExample.swift +2 -4
  993. data/tracks/swift/exercises/luhn/Sources/LuhnExample.swift +1 -1
  994. data/tracks/swift/exercises/nth-prime/Sources/NthPrimeExample.swift +2 -4
  995. data/tracks/swift/exercises/ocr-numbers/Sources/OcrNumbersExample.swift +1 -1
  996. data/tracks/swift/exercises/palindrome-products/Sources/PalindromeProductsExample.swift +1 -2
  997. data/tracks/swift/exercises/phone-number/Sources/PhoneNumberExample.swift +1 -1
  998. data/tracks/swift/exercises/poker/Sources/PokerExample.swift +11 -9
  999. data/tracks/swift/exercises/pythagorean-triplet/Sources/PythagoreanTripletExample.swift +1 -1
  1000. data/tracks/swift/exercises/pythagorean-triplet/Tests/PythagoreanTripletTests/PythagoreanTripletTests.swift +3 -3
  1001. data/tracks/swift/exercises/rna-transcription/Sources/RnaTranscriptionExample.swift +11 -3
  1002. data/tracks/swift/exercises/rna-transcription/Tests/RnaTranscriptionTests/RnaTranscriptionTests.swift +35 -5
  1003. data/tracks/swift/exercises/scrabble-score/Tests/ScrabbleScoreTests/ScrabbleScoreTests.swift +2 -2
  1004. data/tracks/swift/exercises/secret-handshake/Sources/SecretHandshakeExample.swift +2 -4
  1005. data/tracks/swift/exercises/series/Sources/SeriesExample.swift +5 -7
  1006. data/tracks/swift/exercises/sum-of-multiples/Sources/SumOfMultiplesExample.swift +3 -7
  1007. data/tracks/swift/exercises/transpose/Sources/TransposeExample.swift +1 -1
  1008. data/tracks/swift/exercises/triangle/Sources/TriangleExample.swift +2 -2
  1009. data/tracks/swift/exercises/word-count/Sources/WordCountExample.swift +2 -4
  1010. data/tracks/tcl/.travis.yml +1 -1
  1011. data/tracks/teco/.travis.yml +1 -1
  1012. data/tracks/typescript/.travis.yml +1 -1
  1013. data/tracks/vbnet/.travis.yml +1 -1
  1014. data/tracks/vimscript/.travis.yml +1 -1
  1015. data/tracks/vimscript/README.md +48 -4
  1016. data/tracks/vimscript/config.json +7 -0
  1017. data/tracks/vimscript/docs/EXERCISE_README_INSERT.md +5 -108
  1018. data/tracks/vimscript/exercises/pangram/example.vim +11 -0
  1019. data/tracks/vimscript/exercises/pangram/pangram.vader +52 -0
  1020. data/tracks/vimscript/exercises/pangram/pangram.vim +19 -0
  1021. data/tracks/vimscript/lib/generate.vim +13 -2
  1022. metadata +420 -49
  1023. data/tracks/crystal/src/generator/generate.cr +0 -15
  1024. data/tracks/csharp/generators/Properties/launchSettings.json +0 -7
  1025. data/tracks/java/exercises/all-your-base/src/main/java/BaseConverter.java +0 -5
  1026. data/tracks/java/exercises/anagram/src/main/java/Anagram.java +0 -2
  1027. data/tracks/java/exercises/beer-song/src/main/java/BeerSong.java +0 -3
  1028. data/tracks/java/exercises/binary-search/src/main/java/BinarySearch.java +0 -4
  1029. data/tracks/java/exercises/bracket-push/src/main/java/BracketChecker.java +0 -5
  1030. data/tracks/java/exercises/change/src/main/java/ChangeCalculator.java +0 -5
  1031. data/tracks/java/exercises/collatz-conjecture/src/main/java/CollatzCalculator.java +0 -7
  1032. data/tracks/java/exercises/diamond/src/main/java/DiamondPrinter.java +0 -5
  1033. data/tracks/java/exercises/flatten-array/src/main/java/Flattener.java +0 -5
  1034. data/tracks/java/exercises/kindergarten-garden/src/main/java/KindergartenGarden.java +0 -15
  1035. data/tracks/java/exercises/minesweeper/src/main/java/MinesweeperBoard.java +0 -5
  1036. data/tracks/java/exercises/nucleotide-count/src/main/java/DNA.java +0 -2
  1037. data/tracks/java/exercises/ocr-numbers/src/main/java/OpticalCharacterReader.java +0 -5
  1038. data/tracks/java/exercises/poker/src/main/java/Poker.java +0 -2
  1039. data/tracks/java/exercises/pythagorean-triplet/src/main/java/PythagoreanTriplet.java +0 -3
  1040. data/tracks/java/exercises/queen-attack/src/main/java/BoardCoordinate.java +0 -5
  1041. data/tracks/java/exercises/queen-attack/src/main/java/QueenAttackCalculator.java +0 -5
  1042. data/tracks/java/exercises/rectangles/src/main/java/RectangleCounter.java +0 -5
  1043. data/tracks/java/exercises/robot-simulator/src/main/java/Robot.java +0 -5
  1044. data/tracks/java/exercises/run-length-encoding/src/main/java/RunLengthEncoding.java +0 -9
  1045. data/tracks/java/exercises/saddle-points/src/main/java/Matrix.java +0 -5
  1046. data/tracks/java/exercises/series/src/main/java/Series.java +0 -3
  1047. data/tracks/java/exercises/sublist/src/main/java/RelationshipComputer.java +0 -5
  1048. data/tracks/java/exercises/word-count/src/main/java/WordCount.java +0 -2
  1049. data/tracks/java/exercises/wordy/src/main/java/WordProblemSolver.java +0 -5
  1050. data/tracks/ruby/bin/enable-executable +0 -19
  1051. data/tracks/ruby/bin/executable-tests-check +0 -14
@@ -1,6 +1,5 @@
1
1
  using System;
2
2
  using System.Collections.Generic;
3
- using System.Linq;
4
3
  using Newtonsoft.Json;
5
4
  using Newtonsoft.Json.Linq;
6
5
 
@@ -21,20 +20,18 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist
21
20
 
22
21
  canonicalDataCase.Properties = jToken.ToObject<IDictionary<string, object>>();
23
22
  canonicalDataCase.Input = GetInputProperty(jToken);
23
+ canonicalDataCase.ConstructorInput = new Dictionary<string, object>();
24
24
 
25
25
  return canonicalDataCase;
26
26
  }
27
27
 
28
- private static object GetInputProperty(JToken jToken)
28
+ private static IDictionary<string, object> GetInputProperty(JToken jToken)
29
29
  {
30
30
  var allProperties = jToken.ToObject<IDictionary<string, object>>();
31
31
 
32
32
  foreach (var nonInputProperty in NonInputProperties)
33
33
  allProperties.Remove(nonInputProperty);
34
34
 
35
- if (allProperties.Keys.Count == 1)
36
- return allProperties[allProperties.Keys.First()];
37
-
38
35
  return allProperties;
39
36
  }
40
37
 
@@ -0,0 +1,28 @@
1
+ using System.IO;
2
+ using System.Linq;
3
+ using LibGit2Sharp;
4
+
5
+ namespace Generators.Input
6
+ {
7
+ public static class CanonicalDataFile
8
+ {
9
+ private const string CacheDir = "./.cache";
10
+ private const string ProblemSpecificationsGitUrl = "https://github.com/exercism/problem-specifications.git";
11
+ private const string RemoteName = "origin";
12
+
13
+ static CanonicalDataFile()
14
+ {
15
+ if (!Directory.Exists(CacheDir))
16
+ Repository.Clone(ProblemSpecificationsGitUrl, CacheDir);
17
+
18
+ using (var repository = new Repository(CacheDir))
19
+ Commands.Fetch(repository, RemoteName, Enumerable.Empty<string>(), new FetchOptions(), null);
20
+ }
21
+
22
+ public static string Contents(string exercise)
23
+ {
24
+ var exerciseCanonicalDataPath = Path.Combine(CacheDir, "exercises", exercise, "canonical-data.json");
25
+ return File.ReadAllText(exerciseCanonicalDataPath);
26
+ }
27
+ }
28
+ }
@@ -1,28 +1,18 @@
1
- using System;
2
- using System.ComponentModel.DataAnnotations;
3
- using System.Net.Http;
1
+ using System.ComponentModel.DataAnnotations;
4
2
  using Newtonsoft.Json;
5
3
 
6
4
  namespace Generators.Input
7
5
  {
8
6
  public static class CanonicalDataParser
9
7
  {
10
- private static readonly HttpClient HttpClient = new HttpClient();
11
-
12
8
  public static CanonicalData Parse(string exercise)
13
9
  {
14
- var canonicalDataJson = DownloadCanonicalDataJson(exercise);
10
+ var canonicalDataJson = CanonicalDataFile.Contents(exercise);
15
11
  var canonicalData = JsonConvert.DeserializeObject<CanonicalData>(canonicalDataJson);
16
-
12
+
17
13
  Validator.ValidateObject(canonicalData, new ValidationContext(canonicalData));
18
14
 
19
15
  return canonicalData;
20
16
  }
21
-
22
- private static string DownloadCanonicalDataJson(string exercise)
23
- => HttpClient.GetStringAsync(GetCanonicalDataUrl(exercise)).GetAwaiter().GetResult();
24
-
25
- private static Uri GetCanonicalDataUrl(string exercise)
26
- => new Uri($"https://raw.githubusercontent.com/exercism/x-common/master/exercises/{exercise}/canonical-data.json");
27
17
  }
28
18
  }
@@ -0,0 +1,12 @@
1
+ using System.Collections.Generic;
2
+ using CommandLine;
3
+
4
+ namespace Generators
5
+ {
6
+ public class Options
7
+ {
8
+ [Option('e', "exercises", Required = false,
9
+ HelpText = "Exercises to generate (if not specified, defaults to all exercises).")]
10
+ public IEnumerable<string> Exercises { get; set; }
11
+ }
12
+ }
@@ -6,7 +6,7 @@ namespace Generators.Output
6
6
  {
7
7
  public class BooleanTestMethodGenerator : TestMethodGenerator
8
8
  {
9
- protected override IEnumerable<string> Body => Variables.Append($"Assert.{BooleanAssertMethod}({TestedMethodInvocation});");
9
+ protected override IEnumerable<string> Body => Variables.Append($"Assert.{BooleanAssertMethod}({TestedValue});");
10
10
 
11
11
  private string BooleanAssertMethod => Convert.ToBoolean(CanonicalDataCase.Expected).ToString();
12
12
  }
@@ -1,3 +1,4 @@
1
+ using System.Collections;
1
2
  using System.Collections.Generic;
2
3
  using System.Linq;
3
4
 
@@ -5,6 +6,22 @@ namespace Generators.Output
5
6
  {
6
7
  public class EqualityTestMethodGenerator : TestMethodGenerator
7
8
  {
8
- protected override IEnumerable<string> Body => Variables.Append($"Assert.Equal({ExpectedParameter}, {TestedMethodInvocation});");
9
+ protected override IEnumerable<string> Body
10
+ {
11
+ get
12
+ {
13
+ if (ExpectedIsEmptyEnumerable)
14
+ return Variables.Append($"Assert.Empty({TestedValue});");
15
+
16
+ return Variables.Append($"Assert.Equal({ExpectedParameter}, {TestedValue});");
17
+ }
18
+ }
19
+
20
+ protected override bool UseVariableForExpected => base.UseVariableForExpected && !ExpectedIsEmptyEnumerable;
21
+
22
+ private bool ExpectedIsEmptyEnumerable =>
23
+ !(CanonicalDataCase.Expected is string) &&
24
+ CanonicalDataCase.Expected is IEnumerable enumerable
25
+ && enumerable.GetEnumerator().MoveNext() == false;
9
26
  }
10
27
  }
@@ -5,8 +5,11 @@ namespace Generators.Output
5
5
  {
6
6
  public class ExceptionTestMethodGenerator : TestMethodGenerator
7
7
  {
8
- protected override IEnumerable<string> Body => Variables.Append($"Assert.Throws<{ExceptionType}>(() => {TestedMethodInvocation});");
9
-
10
- private string ExceptionType => CanonicalDataCase.ExceptionThrown.FullName;
8
+ protected override IEnumerable<string> Body => Variables.Append($"Assert.Throws<{ExceptionType}>(() => {TestedValue});");
9
+
10
+ protected override bool UseVariableForExpected => false;
11
+ protected override bool UseVariableForTested => false;
12
+
13
+ private string ExceptionType => CanonicalDataCase.ExceptionThrown.Name;
11
14
  }
12
15
  }
@@ -12,7 +12,7 @@ public static void Write(Exercise exercise, string contents)
12
12
  Directory.CreateDirectory(Path.GetDirectoryName(testClassFilePath));
13
13
  File.WriteAllText(testClassFilePath, contents);
14
14
 
15
- Log.Information("Generated tests for {Exercise} exercise in {TestFile}.", exercise.Name, testClassFilePath);
15
+ Log.Information("Generated tests for {Exercise} exercise in {TestFile}", exercise.Name, testClassFilePath);
16
16
  }
17
17
 
18
18
  private static string TestClassFilePath(Exercise exercise) => Path.Combine("..", "exercises", exercise.Name, TestClassFileName(exercise));
@@ -1,4 +1,5 @@
1
1
  using System.Collections.Generic;
2
+ using Generators.Input;
2
3
 
3
4
  namespace Generators.Output
4
5
  {
@@ -6,5 +7,6 @@ public class TestMethod
6
7
  {
7
8
  public string MethodName { get; set; }
8
9
  public IEnumerable<string> Body { get; set; }
10
+ public CanonicalDataCase GeneratedFrom { get; set; }
9
11
  }
10
12
  }
@@ -8,7 +8,7 @@ namespace Generators.Output
8
8
  public abstract class TestMethodGenerator
9
9
  {
10
10
  protected const string SutVariableName = "sut";
11
- protected const string InputVariableName = "input";
11
+ protected const string TestedVariableName = "actual";
12
12
  protected const string ExpectedVariableName = "expected";
13
13
 
14
14
  public TestMethod Create(CanonicalDataCase canonicalDataCase, Exercise exercise)
@@ -16,7 +16,7 @@ public TestMethod Create(CanonicalDataCase canonicalDataCase, Exercise exercise)
16
16
  CanonicalDataCase = canonicalDataCase;
17
17
  CanonicalData = exercise.CanonicalData;
18
18
 
19
- return new TestMethod { MethodName = TestMethodName, Body = Body };
19
+ return new TestMethod { MethodName = TestMethodName, Body = Body, GeneratedFrom = CanonicalDataCase };
20
20
  }
21
21
 
22
22
  protected abstract IEnumerable<string> Body { get; }
@@ -30,31 +30,24 @@ public TestMethod Create(CanonicalDataCase canonicalDataCase, Exercise exercise)
30
30
 
31
31
  protected object Input => ValueFormatter.Format(CanonicalDataCase.Input);
32
32
  protected object Expected => ValueFormatter.Format(CanonicalDataCase.Expected);
33
+ protected object ConstructorInput => ValueFormatter.Format(CanonicalDataCase.ConstructorInput);
33
34
 
34
- protected object InputParameters => UseVariablesForInput ? string.Join(", ", InputVariableNames) : Input;
35
+ protected object InputParameters => UseVariablesForInput ? string.Join(", ", CanonicalDataCase.Input.Keys.Select(key => key.ToVariableName())) : Input;
35
36
  protected object ExpectedParameter => UseVariableForExpected ? ExpectedVariableName : Expected;
37
+ protected object ConstructorParameters => UseVariablesForConstructorParameters ? string.Join(", ", CanonicalDataCase.ConstructorInput.Keys.Select(key => key.ToVariableName())) : ConstructorInput;
38
+ protected object TestedValue => UseVariableForTested ? TestedVariableName : TestedMethodInvocation;
36
39
 
37
- protected IEnumerable<string> InputVariablesDeclaration => ValueFormatter.FormatVariables(CanonicalDataCase.Input, InputVariableNames);
40
+ protected IEnumerable<string> InputVariablesDeclaration => ValueFormatter.FormatVariables(CanonicalDataCase.Input);
38
41
  protected IEnumerable<string> ExpectedVariableDeclaration => ValueFormatter.FormatVariable(CanonicalDataCase.Expected, ExpectedVariableName);
39
- protected IEnumerable<string> SutVariableDeclaration => new [] {$"var {SutVariableName} = new {TestedClassName}();" };
42
+ protected IEnumerable<string> ConstructorVariablesDeclaration => ValueFormatter.FormatVariables(CanonicalDataCase.ConstructorInput);
43
+ protected IEnumerable<string> SutVariableDeclaration => new [] {$"var {SutVariableName} = new {TestedClassName}({ConstructorParameters});" };
44
+ protected IEnumerable<string> ActualVariableDeclaration => new [] {$"var {TestedVariableName} = {TestedMethodInvocation};" };
40
45
 
41
- protected bool UseVariablesForInput => CanonicalDataCase.UseInputParameters;
42
- protected bool UseVariableForExpected => CanonicalDataCase.UseExpectedParameter;
46
+ protected virtual bool UseVariablesForInput => CanonicalDataCase.UseVariablesForInput;
47
+ protected virtual bool UseVariablesForConstructorParameters => CanonicalDataCase.UseVariablesForConstructorParameters;
48
+ protected virtual bool UseVariableForExpected => CanonicalDataCase.UseVariableForExpected;
49
+ protected virtual bool UseVariableForTested => CanonicalDataCase.UseVariableForTested;
43
50
 
44
- protected IEnumerable<string> InputVariableNames
45
- {
46
- get
47
- {
48
- switch (CanonicalDataCase.Input)
49
- {
50
- case IDictionary<string, object> dict:
51
- return dict.Keys.Select(key => key.ToVariableName());
52
- default:
53
- return new [] { InputVariableName };
54
- }
55
- }
56
- }
57
-
58
51
  protected IEnumerable<string> Variables
59
52
  {
60
53
  get
@@ -63,13 +56,19 @@ protected IEnumerable<string> Variables
63
56
 
64
57
  if (UseVariablesForInput)
65
58
  lines.AddRange(InputVariablesDeclaration);
66
-
67
- if (UseVariableForExpected)
68
- lines.AddRange(ExpectedVariableDeclaration);
59
+
60
+ if (UseVariablesForConstructorParameters)
61
+ lines.AddRange(ConstructorVariablesDeclaration);
69
62
 
70
63
  if (CanonicalDataCase.TestedMethodType == TestedMethodType.Instance)
71
64
  lines.AddRange(SutVariableDeclaration);
72
65
 
66
+ if (UseVariableForTested)
67
+ lines.AddRange(ActualVariableDeclaration);
68
+
69
+ if (UseVariableForExpected)
70
+ lines.AddRange(ExpectedVariableDeclaration);
71
+
73
72
  return lines;
74
73
  }
75
74
  }
@@ -14,6 +14,8 @@ public static object Format(object val)
14
14
  {
15
15
  case IDictionary<string, object> dict:
16
16
  return string.Join(", ", dict.Values.Select(Format));
17
+ case IDictionary<char, int> dict:
18
+ return $"new Dictionary<char, int> {{ {string.Join(", ", dict.Keys.Select(key => $"[{Format(key)}] = {Format(dict[key])}"))} }}";
17
19
  case Enum enumeration:
18
20
  return $"{enumeration.GetType().Name}.{enumeration}";
19
21
  case JArray jArray:
@@ -23,26 +25,20 @@ public static object Format(object val)
23
25
  case IEnumerable<int> ints:
24
26
  return ints.Any() ? $"new[] {{ {string.Join(", ", ints)} }}" : "new int[0]";
25
27
  case IEnumerable<string> strings:
26
- return strings.Any() ? $"new[] {{ {string.Join(", ", strings)} }}" : "new string[0]";
28
+ return strings.Any() ? $"new[] {{ {string.Join(", ", strings.Select(Format) )} }}" : "new string[0]";
27
29
  case double dbl:
28
30
  return dbl.ToString(CultureInfo.InvariantCulture);
29
31
  case float flt:
30
32
  return flt.ToString(CultureInfo.InvariantCulture);
33
+ case char c:
34
+ return $"'{c}'";
31
35
  default:
32
36
  return val;
33
37
  }
34
38
  }
35
39
 
36
- public static string[] FormatVariables(object val, IEnumerable<string> names)
37
- {
38
- switch (val)
39
- {
40
- case IDictionary<string, object> dict:
41
- return dict.Keys.SelectMany((key, i) => FormatVariable(dict[key], names.ElementAt(i))).ToArray();
42
- default:
43
- return FormatVariable(val, names.First());
44
- }
45
- }
40
+ public static string[] FormatVariables(IDictionary<string, object> dict)
41
+ => dict.Keys.SelectMany((key, i) => FormatVariable(dict[key], key.ToVariableName())).ToArray();
46
42
 
47
43
  public static string[] FormatVariable(object val, string name)
48
44
  {
@@ -54,6 +50,8 @@ public static string[] FormatVariable(object val, string name)
54
50
  return FormatMultiLineEnumerable(ints.Select(x => x.ToString(CultureInfo.InvariantCulture)), name);
55
51
  case string[] strings when strings.Any():
56
52
  return FormatMultiLineEnumerable(strings, name);
53
+ case IDictionary<char, int> dict:
54
+ return FormatMultiLineEnumerable(dict.Keys.Select((key, i) => $"[{Format(key)}] = {Format(dict[key])}" + (i < dict.Keys.Count - 1 ? "," : "")), name, "new Dictionary<char, int>");
57
55
  default:
58
56
  return new[] {$"var {name} = {Format(val)};"};
59
57
  }
@@ -72,13 +70,13 @@ private static string[] FormatMultiLineString(string name, string str)
72
70
  return FormatMultiLineVariable(formattedStrings, name);
73
71
  }
74
72
 
75
- private static string[] FormatMultiLineEnumerable(IEnumerable<string> enumerable, string name)
76
- => FormatMultiLineVariable(enumerable.Prepend("{").Append("}"), name);
73
+ private static string[] FormatMultiLineEnumerable(IEnumerable<string> enumerable, string name, string constructor = null)
74
+ => FormatMultiLineVariable(enumerable.Prepend("{").Append("}"), name, constructor);
77
75
 
78
- private static string[] FormatMultiLineVariable(IEnumerable<string> enumerable, string name)
79
- => enumerable.Select(line => line.Indent())
76
+ private static string[] FormatMultiLineVariable(IEnumerable<string> enumerable, string name, string constructor = null)
77
+ => enumerable.Select(line => line == "{" || line == "}" ? line : line.Indent())
80
78
  .AddTrailingSemicolon()
81
- .Prepend($"var {name} = ")
79
+ .Prepend($"var {name} = {constructor}")
82
80
  .ToArray();
83
81
 
84
82
  private static string EscapeControlCharacters(this string s)
@@ -1,4 +1,4 @@
1
- using Generators.Input;
1
+ using CommandLine;
2
2
  using Serilog;
3
3
 
4
4
  namespace Generators
@@ -8,7 +8,9 @@ public static class Program
8
8
  public static void Main(string[] args)
9
9
  {
10
10
  SetupLogger();
11
- Generate(args);
11
+
12
+ Parser.Default.ParseArguments<Options>(args)
13
+ .WithParsed(Generate);
12
14
  }
13
15
 
14
16
  private static void SetupLogger()
@@ -18,17 +20,14 @@ private static void SetupLogger()
18
20
  .CreateLogger();
19
21
  }
20
22
 
21
- private static void Generate(string[] exerciseNames)
23
+ private static void Generate(Options options)
22
24
  {
23
25
  Log.Information("Generating tests...");
24
26
 
25
- foreach (var exercise in GetExercises(exerciseNames))
27
+ foreach (var exercise in new ExerciseCollection(options.Exercises))
26
28
  exercise.Generate();
27
29
 
28
30
  Log.Information("Generated tests.");
29
31
  }
30
-
31
- private static ExerciseCollection GetExercises(string[] exerciseNames)
32
- => exerciseNames.Length == 0 ? new ExerciseCollection() : new ExerciseCollection(exerciseNames);
33
32
  }
34
33
  }
@@ -24,4 +24,4 @@ before_script:
24
24
 
25
25
  script:
26
26
  - bin/fetch-configlet
27
- - bin/configlet .
27
+ - bin/configlet lint .
@@ -1,6 +1,6 @@
1
1
  # Exercism Dart Track
2
2
 
3
- ![build status](https://travis-ci.org/exercism/dartlang.svg?branch=master)
3
+ ![build status](https://travis-ci.org/exercism/dart.svg?branch=master)
4
4
 
5
5
  Exercism exercises in Dart.
6
6
 
File without changes
@@ -2,4 +2,4 @@ language: bash
2
2
 
3
3
  script:
4
4
  - bin/fetch-configlet
5
- - bin/configlet .
5
+ - bin/configlet lint .
@@ -200,6 +200,15 @@
200
200
  "slug": "book-store",
201
201
  "difficulty": 6
202
202
  },
203
+ {
204
+ "slug": "wordy",
205
+ "difficulty": 7,
206
+ "topics": [
207
+ "Parsing",
208
+ "Strings",
209
+ "Transforming"
210
+ ]
211
+ },
203
212
  {
204
213
  "slug": "poker",
205
214
  "difficulty": 7,
@@ -1,6 +1,6 @@
1
- ## Running The Tests
1
+ ## Running The Tests
2
2
 
3
- Exercises that have been fetched using the Exercism.io [command line client](http://www.exercism.io/cli) are delivered with a minimum of three files: a `readme.md` file, a `.dpr` file, and a `.pas` file. The `.dpr` file is the Delphi project file and the `.pas` file is the test runner. Load the Delphi project by either double clicking on the `.dpr` file or by opening the project from with in Delphi. You will be responsible for creating a new `.pas` file that will contain your solution code that the tests will be run against. Refer to the `readme.md` file for instruction on how to compile and execute your code.
3
+ Exercises that have been fetched using the [Exercism command line client](http://www.exercism.io/cli) are delivered with a minimum of three files: a `readme.md` file, a `.dpr` file, and a `.pas` file. The `.dpr` file is the Delphi project file and the `.pas` file is the test runner. Load the Delphi project by either double clicking on the `.dpr` file or by opening the project from within Delphi. You will be responsible for creating a new `.pas` file that will contain your solution code that the tests will be run against. Refer to the `readme.md` file for instruction on how to compile and execute your code.
4
4
 
5
5
  All tests have been ignored except the first one for you to work on. To continue, just comment the `[Ignore]` attribute on the test to start working on it.
6
6
 
@@ -0,0 +1,60 @@
1
+ program Wordy;
2
+
3
+ {$IFNDEF TESTINSIGHT}
4
+ {$APPTYPE CONSOLE}
5
+ {$ENDIF}{$STRONGLINKTYPES ON}
6
+ uses
7
+ System.SysUtils,
8
+ {$IFDEF TESTINSIGHT}
9
+ TestInsight.DUnitX,
10
+ {$ENDIF }
11
+ DUnitX.Loggers.Console,
12
+ DUnitX.Loggers.Xml.NUnit,
13
+ DUnitX.TestFramework,
14
+ uWordyTests in 'uWordyTests.pas',
15
+ uWordy in 'uWordy.pas';
16
+
17
+ var
18
+ runner : ITestRunner;
19
+ results : IRunResults;
20
+ logger : ITestLogger;
21
+ nunitLogger : ITestLogger;
22
+ begin
23
+ {$IFDEF TESTINSIGHT}
24
+ TestInsight.DUnitX.RunRegisteredTests;
25
+ exit;
26
+ {$ENDIF}
27
+ try
28
+ //Check command line options, will exit if invalid
29
+ TDUnitX.CheckCommandLine;
30
+ //Create the test runner
31
+ runner := TDUnitX.CreateRunner;
32
+ //Tell the runner to use RTTI to find Fixtures
33
+ runner.UseRTTI := True;
34
+ //tell the runner how we will log things
35
+ //Log to the console window
36
+ logger := TDUnitXConsoleLogger.Create(true);
37
+ runner.AddLogger(logger);
38
+ //Generate an NUnit compatible XML File
39
+ nunitLogger := TDUnitXXMLNUnitFileLogger.Create(TDUnitX.Options.XMLOutputFile);
40
+ runner.AddLogger(nunitLogger);
41
+ runner.FailsOnNoAsserts := False; //When true, Assertions must be made during tests;
42
+
43
+ //Run tests
44
+ results := runner.Execute;
45
+ if not results.AllPassed then
46
+ System.ExitCode := EXIT_ERRORS;
47
+
48
+ {$IFNDEF CI}
49
+ //We don't want this happening when running under CI.
50
+ if TDUnitX.Options.ExitBehavior = TDUnitXExitBehavior.Pause then
51
+ begin
52
+ System.Write('Done.. press <Enter> key to quit.');
53
+ System.Readln;
54
+ end;
55
+ {$ENDIF}
56
+ except
57
+ on E: Exception do
58
+ System.Writeln(E.ClassName, ': ', E.Message);
59
+ end;
60
+ end.