trackler 2.0.6.28 → 2.0.6.29

Sign up to get free protection for your applications and to get access to all the features.
Files changed (323) hide show
  1. checksums.yaml +4 -4
  2. data/common/exercises/all-your-base/metadata.yml +1 -1
  3. data/common/exercises/allergies/metadata.yml +1 -1
  4. data/common/exercises/anagram/metadata.yml +1 -1
  5. data/common/exercises/beer-song/metadata.yml +1 -1
  6. data/common/exercises/binary-search-tree/metadata.yml +1 -1
  7. data/common/exercises/binary-search/metadata.yml +1 -1
  8. data/common/exercises/binary/metadata.yml +1 -1
  9. data/common/exercises/change/description.md +3 -3
  10. data/common/exercises/change/metadata.yml +1 -1
  11. data/common/exercises/crypto-square/description.md +1 -2
  12. data/common/exercises/etl/description.md +2 -2
  13. data/common/exercises/flatten-array/metadata.yml +1 -1
  14. data/common/exercises/food-chain/description.md +4 -5
  15. data/common/exercises/food-chain/metadata.yml +1 -1
  16. data/common/exercises/gigasecond/metadata.yml +1 -1
  17. data/common/exercises/grade-school/metadata.yml +1 -1
  18. data/common/exercises/grains/description.md +1 -1
  19. data/common/exercises/grains/metadata.yml +1 -1
  20. data/common/exercises/hamming/metadata.yml +1 -1
  21. data/common/exercises/hello-world/metadata.yml +1 -1
  22. data/common/exercises/hexadecimal/metadata.yml +1 -1
  23. data/common/exercises/house/metadata.yml +1 -1
  24. data/common/exercises/kindergarten-garden/metadata.yml +1 -1
  25. data/common/exercises/largest-series-product/metadata.yml +1 -1
  26. data/common/exercises/leap/metadata.yml +1 -1
  27. data/common/exercises/luhn/description.md +1 -1
  28. data/common/exercises/luhn/metadata.yml +1 -1
  29. data/common/exercises/matrix/metadata.yml +1 -1
  30. data/common/exercises/minesweeper/metadata.yml +1 -1
  31. data/common/exercises/nth-prime/metadata.yml +1 -1
  32. data/common/exercises/ocr-numbers/metadata.yml +1 -1
  33. data/common/exercises/octal/metadata.yml +1 -1
  34. data/common/exercises/paasio/metadata.yml +1 -1
  35. data/common/exercises/palindrome-products/description.md +30 -2
  36. data/common/exercises/palindrome-products/metadata.yml +1 -1
  37. data/common/exercises/parallel-letter-frequency/metadata.yml +1 -1
  38. data/common/exercises/pascals-triangle/metadata.yml +1 -1
  39. data/common/exercises/phone-number/metadata.yml +1 -1
  40. data/common/exercises/point-mutations/metadata.yml +1 -1
  41. data/common/exercises/protein-translation/description.md +1 -1
  42. data/common/exercises/protein-translation/metadata.yml +1 -1
  43. data/common/exercises/proverb/metadata.yml +1 -1
  44. data/common/exercises/queen-attack/metadata.yml +1 -1
  45. data/common/exercises/raindrops/metadata.yml +1 -1
  46. data/common/exercises/rna-transcription/metadata.yml +1 -1
  47. data/common/exercises/robot-name/metadata.yml +1 -1
  48. data/common/exercises/saddle-points/metadata.yml +1 -1
  49. data/common/exercises/say/metadata.yml +1 -1
  50. data/common/exercises/scale-generator/description.md +3 -4
  51. data/common/exercises/scale-generator/metadata.yml +1 -1
  52. data/common/exercises/scrabble-score/metadata.yml +1 -1
  53. data/common/exercises/secret-handshake/metadata.yml +1 -1
  54. data/common/exercises/series/metadata.yml +1 -1
  55. data/common/exercises/sieve/metadata.yml +1 -1
  56. data/common/exercises/space-age/metadata.yml +1 -1
  57. data/common/exercises/sum-of-multiples/description.md +2 -2
  58. data/common/exercises/sum-of-multiples/metadata.yml +1 -1
  59. data/common/exercises/transpose/description.md +1 -1
  60. data/common/exercises/transpose/metadata.yml +1 -1
  61. data/common/exercises/triangle/metadata.yml +1 -1
  62. data/common/exercises/trinary/metadata.yml +1 -1
  63. data/common/exercises/twelve-days/metadata.yml +1 -1
  64. data/common/exercises/two-bucket/description.md +1 -1
  65. data/common/exercises/two-bucket/metadata.yml +1 -1
  66. data/common/exercises/word-count/metadata.yml +1 -1
  67. data/common/exercises/zebra-puzzle/metadata.yml +1 -1
  68. data/lib/trackler/version.rb +1 -1
  69. data/tracks/erlang/.gitignore +2 -0
  70. data/tracks/erlang/.travis.yml +8 -4
  71. data/tracks/erlang/Makefile +16 -0
  72. data/tracks/erlang/README.md +77 -1
  73. data/tracks/erlang/_test/bootstrap.sh +17 -4
  74. data/tracks/erlang/_test/check-exercises.escript +64 -24
  75. data/tracks/erlang/config.json +63 -63
  76. data/tracks/erlang/docs/INSTALLATION.md +18 -0
  77. data/tracks/erlang/docs/TESTS.md +1 -3
  78. data/tracks/erlang/exercises/accumulate/include/exercism.hrl +6 -0
  79. data/tracks/erlang/exercises/accumulate/rebar.conf +30 -0
  80. data/tracks/erlang/exercises/accumulate/src/accumulate.app.src +9 -0
  81. data/tracks/erlang/exercises/accumulate/{example.erl → src/example.erl} +3 -2
  82. data/tracks/erlang/exercises/accumulate/test/accumulate_tests.erl +27 -0
  83. data/tracks/erlang/exercises/allergies/include/exercism.hrl +6 -0
  84. data/tracks/erlang/exercises/allergies/rebar.conf +30 -0
  85. data/tracks/erlang/exercises/allergies/src/allergies.app.src +9 -0
  86. data/tracks/erlang/exercises/allergies/{example.erl → src/example.erl} +9 -10
  87. data/tracks/erlang/exercises/allergies/{allergies_tests.erl → test/allergies_tests.erl} +17 -20
  88. data/tracks/erlang/exercises/anagram/include/exercism.hrl +6 -0
  89. data/tracks/erlang/exercises/anagram/rebar.conf +32 -0
  90. data/tracks/erlang/exercises/anagram/src/anagram.app.src +9 -0
  91. data/tracks/erlang/exercises/anagram/{example.erl → src/example.erl} +2 -1
  92. data/tracks/erlang/exercises/anagram/test/anagram_tests.erl +43 -0
  93. data/tracks/erlang/exercises/atbash-cipher/include/exercism.hrl +6 -0
  94. data/tracks/erlang/exercises/atbash-cipher/rebar.conf +30 -0
  95. data/tracks/erlang/exercises/atbash-cipher/src/atbash_cipher.app.src +9 -0
  96. data/tracks/erlang/exercises/atbash-cipher/{example.erl → src/example.erl} +1 -1
  97. data/tracks/erlang/exercises/atbash-cipher/{atbash_cipher_tests.erl → test/atbash_cipher_tests.erl} +6 -2
  98. data/tracks/erlang/exercises/bank-account/include/exercism.hrl +6 -0
  99. data/tracks/erlang/exercises/bank-account/rebar.conf +30 -0
  100. data/tracks/erlang/exercises/bank-account/src/bank_account.app.src +9 -0
  101. data/tracks/erlang/exercises/bank-account/{example.erl → src/example.erl} +1 -1
  102. data/tracks/erlang/exercises/bank-account/test/bank_account_tests.erl +98 -0
  103. data/tracks/erlang/exercises/beer-song/include/exercism.hrl +6 -0
  104. data/tracks/erlang/exercises/beer-song/rebar.conf +30 -0
  105. data/tracks/erlang/exercises/beer-song/src/beer_song.app.src +9 -0
  106. data/tracks/erlang/exercises/beer-song/{example.erl → src/example.erl} +1 -1
  107. data/tracks/erlang/exercises/beer-song/{beer_song_tests.erl → test/beer_song_tests.erl} +9 -9
  108. data/tracks/erlang/exercises/binary/include/exercism.hrl +6 -0
  109. data/tracks/erlang/exercises/binary/rebar.conf +30 -0
  110. data/tracks/erlang/exercises/binary/src/binary.app.src +9 -0
  111. data/tracks/erlang/exercises/binary/{example.erl → src/example.erl} +1 -1
  112. data/tracks/erlang/exercises/binary/{binary_string_tests.erl → test/binary_string_tests.erl} +7 -3
  113. data/tracks/erlang/exercises/bob/include/exercism.hrl +6 -0
  114. data/tracks/erlang/exercises/bob/rebar.conf +30 -0
  115. data/tracks/erlang/exercises/bob/src/bob.app.src +9 -0
  116. data/tracks/erlang/exercises/bob/{example.erl → src/example.erl} +1 -1
  117. data/tracks/erlang/exercises/bob/{bob_tests.erl → test/bob_tests.erl} +4 -4
  118. data/tracks/erlang/exercises/circular-buffer/include/exercism.hrl +6 -0
  119. data/tracks/erlang/exercises/circular-buffer/rebar.conf +30 -0
  120. data/tracks/erlang/exercises/circular-buffer/src/circular_buffer.app.src +9 -0
  121. data/tracks/erlang/exercises/circular-buffer/{example.erl → src/example.erl} +1 -34
  122. data/tracks/erlang/exercises/circular-buffer/test/circular_buffer_tests.erl +58 -0
  123. data/tracks/erlang/exercises/clock/include/exercism.hrl +6 -0
  124. data/tracks/erlang/exercises/clock/rebar.conf +30 -0
  125. data/tracks/erlang/exercises/clock/src/clock.app.src +9 -0
  126. data/tracks/erlang/exercises/clock/{example.erl → src/example.erl} +1 -1
  127. data/tracks/erlang/exercises/clock/{clock_tests.erl → test/clock_tests.erl} +51 -48
  128. data/tracks/erlang/exercises/difference-of-squares/include/exercism.hrl +6 -0
  129. data/tracks/erlang/exercises/difference-of-squares/rebar.conf +30 -0
  130. data/tracks/erlang/exercises/difference-of-squares/src/difference_of_squares.app.src +9 -0
  131. data/tracks/erlang/exercises/difference-of-squares/{example.erl → src/example.erl} +1 -1
  132. data/tracks/erlang/exercises/difference-of-squares/{difference_of_squares_tests.erl → test/difference_of_squares_tests.erl} +7 -3
  133. data/tracks/erlang/exercises/etl/include/exercism.hrl +6 -0
  134. data/tracks/erlang/exercises/etl/rebar.conf +30 -0
  135. data/tracks/erlang/exercises/etl/src/etl.app.src +9 -0
  136. data/tracks/erlang/exercises/etl/{example.erl → src/example.erl} +1 -2
  137. data/tracks/erlang/exercises/etl/{etl_tests.erl → test/etl_tests.erl} +3 -4
  138. data/tracks/erlang/exercises/gigasecond/include/exercism.hrl +6 -0
  139. data/tracks/erlang/exercises/gigasecond/rebar.conf +30 -0
  140. data/tracks/erlang/exercises/gigasecond/{example.erl → src/example.erl} +1 -2
  141. data/tracks/erlang/exercises/gigasecond/src/gigasecond.app.src +9 -0
  142. data/tracks/erlang/exercises/gigasecond/test/gigasecond_tests.erl +22 -0
  143. data/tracks/erlang/exercises/grade-school/include/exercism.hrl +6 -0
  144. data/tracks/erlang/exercises/grade-school/rebar.conf +30 -0
  145. data/tracks/erlang/exercises/grade-school/{example.erl → src/example.erl} +1 -1
  146. data/tracks/erlang/exercises/grade-school/src/grade_school.app.src +9 -0
  147. data/tracks/erlang/exercises/grade-school/test/grade_school_tests.erl +47 -0
  148. data/tracks/erlang/exercises/grains/include/exercism.hrl +6 -0
  149. data/tracks/erlang/exercises/grains/rebar.conf +30 -0
  150. data/tracks/erlang/exercises/grains/{example.erl → src/example.erl} +1 -2
  151. data/tracks/erlang/exercises/grains/src/grains.app.src +9 -0
  152. data/tracks/erlang/exercises/grains/test/grains_tests.erl +32 -0
  153. data/tracks/erlang/exercises/hamming/include/exercism.hrl +6 -0
  154. data/tracks/erlang/exercises/hamming/rebar.conf +30 -0
  155. data/tracks/erlang/exercises/hamming/{example.erl → src/example.erl} +1 -1
  156. data/tracks/erlang/exercises/hamming/src/hamming.app.src +9 -0
  157. data/tracks/erlang/exercises/hamming/test/hamming_tests.erl +24 -0
  158. data/tracks/erlang/exercises/hello-world/include/exercism.hrl +6 -0
  159. data/tracks/erlang/exercises/hello-world/rebar.conf +30 -0
  160. data/tracks/erlang/exercises/hello-world/{example.erl → src/example.erl} +1 -1
  161. data/tracks/erlang/exercises/hello-world/src/hello_world.app.src +9 -0
  162. data/tracks/erlang/exercises/hello-world/test/hello_world_tests.erl +18 -0
  163. data/tracks/erlang/exercises/largest-series-product/include/exercism.hrl +6 -0
  164. data/tracks/erlang/exercises/largest-series-product/rebar.conf +30 -0
  165. data/tracks/erlang/exercises/largest-series-product/{example.erl → src/example.erl} +1 -1
  166. data/tracks/erlang/exercises/largest-series-product/src/largest_series_product.app.src +9 -0
  167. data/tracks/erlang/exercises/largest-series-product/test/largest_series_product_tests.erl +57 -0
  168. data/tracks/erlang/exercises/leap/include/exercism.hrl +6 -0
  169. data/tracks/erlang/exercises/leap/rebar.conf +30 -0
  170. data/tracks/erlang/exercises/leap/{example.erl → src/example.erl} +1 -1
  171. data/tracks/erlang/exercises/leap/src/leap.app.src +9 -0
  172. data/tracks/erlang/exercises/leap/test/leap_tests.erl +18 -0
  173. data/tracks/erlang/exercises/luhn/include/exercism.hrl +6 -0
  174. data/tracks/erlang/exercises/luhn/rebar.conf +30 -0
  175. data/tracks/erlang/exercises/luhn/{example.erl → src/example.erl} +1 -1
  176. data/tracks/erlang/exercises/luhn/src/luhn.app.src +9 -0
  177. data/tracks/erlang/exercises/luhn/test/luhn_tests.erl +18 -0
  178. data/tracks/erlang/exercises/meetup/include/exercism.hrl +6 -0
  179. data/tracks/erlang/exercises/meetup/rebar.conf +30 -0
  180. data/tracks/erlang/exercises/meetup/{example.erl → src/example.erl} +1 -2
  181. data/tracks/erlang/exercises/meetup/src/meetup.app.src +9 -0
  182. data/tracks/erlang/exercises/meetup/{meetup_tests.erl → test/meetup_tests.erl} +94 -95
  183. data/tracks/erlang/exercises/nucleotide-count/include/exercism.hrl +6 -0
  184. data/tracks/erlang/exercises/nucleotide-count/rebar.conf +30 -0
  185. data/tracks/erlang/exercises/nucleotide-count/{example.erl → src/example.erl} +1 -1
  186. data/tracks/erlang/exercises/nucleotide-count/src/nucleotide_count.app.src +9 -0
  187. data/tracks/erlang/exercises/nucleotide-count/test/dna_tests.erl +30 -0
  188. data/tracks/erlang/exercises/parallel-letter-frequency/include/exercism.hrl +6 -0
  189. data/tracks/erlang/exercises/parallel-letter-frequency/rebar.conf +30 -0
  190. data/tracks/erlang/exercises/parallel-letter-frequency/{example.erl → src/example.erl} +1 -1
  191. data/tracks/erlang/exercises/parallel-letter-frequency/src/parallel_letter_frequency.app.src +9 -0
  192. data/tracks/erlang/exercises/parallel-letter-frequency/{parallel_letter_frequency_tests.erl → test/parallel_letter_frequency_tests.erl} +6 -2
  193. data/tracks/erlang/exercises/phone-number/include/exercism.hrl +6 -0
  194. data/tracks/erlang/exercises/phone-number/rebar.conf +30 -0
  195. data/tracks/erlang/exercises/phone-number/{example.erl → src/example.erl} +1 -1
  196. data/tracks/erlang/exercises/phone-number/src/phone_number.app.src +9 -0
  197. data/tracks/erlang/exercises/phone-number/test/phone_tests.erl +28 -0
  198. data/tracks/erlang/exercises/rna-transcription/include/exercism.hrl +6 -0
  199. data/tracks/erlang/exercises/rna-transcription/rebar.conf +30 -0
  200. data/tracks/erlang/exercises/rna-transcription/{example.erl → src/example.erl} +1 -1
  201. data/tracks/erlang/exercises/rna-transcription/src/rna_transcription.app.src +9 -0
  202. data/tracks/erlang/exercises/rna-transcription/test/rna_transcription_tests.erl +24 -0
  203. data/tracks/erlang/exercises/robot-simulator/include/exercism.hrl +6 -0
  204. data/tracks/erlang/exercises/robot-simulator/rebar.conf +30 -0
  205. data/tracks/erlang/exercises/robot-simulator/{example.erl → src/example.erl} +1 -1
  206. data/tracks/erlang/exercises/robot-simulator/src/robot_simulator.app.src +9 -0
  207. data/tracks/erlang/exercises/robot-simulator/test/robot_simulator_tests.erl +100 -0
  208. data/tracks/erlang/exercises/roman-numerals/include/exercism.hrl +6 -0
  209. data/tracks/erlang/exercises/roman-numerals/rebar.conf +30 -0
  210. data/tracks/erlang/exercises/roman-numerals/{example.erl → src/example.erl} +1 -1
  211. data/tracks/erlang/exercises/roman-numerals/src/roman_numerals.app.src +9 -0
  212. data/tracks/erlang/exercises/roman-numerals/{roman_numerals_tests.erl → test/roman_numerals_tests.erl} +3 -4
  213. data/tracks/erlang/exercises/scrabble-score/include/exercism.hrl +6 -0
  214. data/tracks/erlang/exercises/scrabble-score/rebar.conf +30 -0
  215. data/tracks/erlang/exercises/scrabble-score/{example.erl → src/example.erl} +2 -2
  216. data/tracks/erlang/exercises/scrabble-score/src/scrabble_score.app.src +9 -0
  217. data/tracks/erlang/exercises/scrabble-score/{scrabble_score_tests.erl → test/scrabble_score_tests.erl} +5 -1
  218. data/tracks/erlang/exercises/series/include/exercism.hrl +6 -0
  219. data/tracks/erlang/exercises/series/rebar.conf +30 -0
  220. data/tracks/erlang/exercises/series/{example.erl → src/example.erl} +1 -1
  221. data/tracks/erlang/exercises/series/src/series.app.src +9 -0
  222. data/tracks/erlang/exercises/series/test/series_tests.erl +10 -0
  223. data/tracks/erlang/exercises/space-age/include/exercism.hrl +6 -0
  224. data/tracks/erlang/exercises/space-age/rebar.conf +30 -0
  225. data/tracks/erlang/exercises/space-age/{example.erl → src/example.erl} +1 -1
  226. data/tracks/erlang/exercises/space-age/src/space_age.app.src +9 -0
  227. data/tracks/erlang/exercises/space-age/test/space_age_tests.erl +51 -0
  228. data/tracks/erlang/exercises/strain/include/exercism.hrl +6 -0
  229. data/tracks/erlang/exercises/strain/rebar.conf +30 -0
  230. data/tracks/erlang/exercises/strain/{example.erl → src/example.erl} +1 -1
  231. data/tracks/erlang/exercises/strain/src/strain.app.src +9 -0
  232. data/tracks/erlang/exercises/strain/test/strain_tests.erl +52 -0
  233. data/tracks/erlang/exercises/sum-of-multiples/include/exercism.hrl +6 -0
  234. data/tracks/erlang/exercises/sum-of-multiples/rebar.conf +30 -0
  235. data/tracks/erlang/exercises/sum-of-multiples/{example.erl → src/example.erl} +1 -1
  236. data/tracks/erlang/exercises/sum-of-multiples/src/sum_of_multiples.app.src +9 -0
  237. data/tracks/erlang/exercises/sum-of-multiples/test/sum_of_multiples_tests.erl +39 -0
  238. data/tracks/erlang/exercises/triangle/include/exercism.hrl +6 -0
  239. data/tracks/erlang/exercises/triangle/rebar.conf +30 -0
  240. data/tracks/erlang/exercises/triangle/{example.erl → src/example.erl} +1 -1
  241. data/tracks/erlang/exercises/triangle/src/triangle.app.src +9 -0
  242. data/tracks/erlang/exercises/triangle/{triangle_tests.erl → test/triangle_tests.erl} +19 -18
  243. data/tracks/erlang/exercises/trinary/include/exercism.hrl +6 -0
  244. data/tracks/erlang/exercises/trinary/rebar.conf +30 -0
  245. data/tracks/erlang/exercises/trinary/{example.erl → src/example.erl} +1 -2
  246. data/tracks/erlang/exercises/trinary/src/trinary.app.src +9 -0
  247. data/tracks/erlang/exercises/trinary/test/trinary_tests.erl +36 -0
  248. data/tracks/erlang/exercises/word-count/include/exercism.hrl +6 -0
  249. data/tracks/erlang/exercises/word-count/rebar.conf +30 -0
  250. data/tracks/erlang/exercises/word-count/{example.erl → src/example.erl} +1 -1
  251. data/tracks/erlang/exercises/word-count/src/word_count.app.src +9 -0
  252. data/tracks/erlang/exercises/word-count/{word_count_tests.erl → test/word_count_tests.erl} +4 -2
  253. data/tracks/erlang/exercises/zipper/include/exercism.hrl +6 -0
  254. data/tracks/erlang/exercises/zipper/rebar.conf +30 -0
  255. data/tracks/erlang/exercises/zipper/{example.erl → src/example.erl} +1 -1
  256. data/tracks/erlang/exercises/zipper/src/zipper.app.src +9 -0
  257. data/tracks/erlang/exercises/zipper/test/zipper_tests.erl +100 -0
  258. data/tracks/go/config.json +14 -4
  259. data/tracks/go/exercises/acronym/acronym_test.go +1 -1
  260. data/tracks/go/exercises/all-your-base/all_your_base_test.go +8 -8
  261. data/tracks/go/exercises/luhn/luhn_test.go +6 -6
  262. data/tracks/go/exercises/word-search/word_search_test.go +4 -1
  263. data/tracks/go/exercises/wordy/example.go +2 -0
  264. data/tracks/go/exercises/wordy/wordy_test.go +8 -0
  265. data/tracks/haskell/.travis.yml +3 -57
  266. data/tracks/haskell/README.md +13 -10
  267. data/tracks/haskell/bin/test-all-examples +20 -0
  268. data/tracks/haskell/bin/test-example +73 -0
  269. data/tracks/haskell/bin/test-stub +43 -0
  270. data/tracks/haskell/config.json +0 -1
  271. data/tracks/haskell/exercises/accumulate/examples/fail-reverse/package.yaml +16 -0
  272. data/tracks/haskell/exercises/accumulate/examples/fail-reverse/src/Accumulate.hs +7 -0
  273. data/tracks/haskell/exercises/accumulate/examples/success-standard/src/Accumulate.hs +0 -7
  274. data/tracks/haskell/exercises/atbash-cipher/test/Tests.hs +1 -5
  275. data/tracks/haskell/exercises/forth/test/Tests.hs +1 -4
  276. data/tracks/haskell/exercises/leap/examples/error-nosig/package.yaml +16 -0
  277. data/tracks/haskell/exercises/leap/examples/error-nosig/src/LeapYear.hs +4 -0
  278. data/tracks/haskell/exercises/nucleotide-count/examples/success-standard/src/DNA.hs +2 -5
  279. data/tracks/haskell/exercises/nucleotide-count/src/DNA.hs +1 -4
  280. data/tracks/haskell/exercises/nucleotide-count/test/Tests.hs +3 -22
  281. data/tracks/haskell/exercises/prime-factors/test/Tests.hs +9 -15
  282. data/tracks/haskell/exercises/scrabble-score/test/Tests.hs +1 -5
  283. data/tracks/haskell/exercises/secret-handshake/examples/success-standard/src/SecretHandshake.hs +3 -21
  284. data/tracks/haskell/exercises/secret-handshake/src/SecretHandshake.hs +1 -0
  285. data/tracks/haskell/exercises/secret-handshake/test/Tests.hs +20 -23
  286. data/tracks/haskell/exercises/strain/examples/fail-reverse/package.yaml +16 -0
  287. data/tracks/haskell/exercises/strain/examples/fail-reverse/src/Strain.hs +9 -0
  288. data/tracks/haskell/exercises/triangle/test/Tests.hs +6 -1
  289. data/tracks/julia/config.json +20 -2
  290. data/tracks/julia/exercises/raindrops/example.jl +16 -0
  291. data/tracks/julia/exercises/raindrops/raindrops.jl +3 -0
  292. data/tracks/julia/exercises/raindrops/runtests.jl +72 -0
  293. data/tracks/julia/exercises/secret-handshake/example.jl +12 -0
  294. data/tracks/julia/exercises/secret-handshake/runtests.jl +51 -0
  295. data/tracks/julia/exercises/secret-handshake/secret-handshake.jl +3 -0
  296. metadata +198 -79
  297. data/tracks/erlang/exercises/accumulate/accumulate_tests.erl +0 -28
  298. data/tracks/erlang/exercises/anagram/anagram_tests.erl +0 -39
  299. data/tracks/erlang/exercises/bank-account/bank_account_tests.erl +0 -95
  300. data/tracks/erlang/exercises/circular-buffer/circular_buffer_tests.erl +0 -54
  301. data/tracks/erlang/exercises/clock/clock.erl +0 -14
  302. data/tracks/erlang/exercises/gigasecond/gigasecond_tests.erl +0 -29
  303. data/tracks/erlang/exercises/grade-school/grade_school_tests.erl +0 -49
  304. data/tracks/erlang/exercises/grains/grains_tests.erl +0 -31
  305. data/tracks/erlang/exercises/hamming/dna_tests.erl +0 -21
  306. data/tracks/erlang/exercises/hello-world/hello_world_tests.erl +0 -19
  307. data/tracks/erlang/exercises/largest-series-product/largest_series_product.erl +0 -5
  308. data/tracks/erlang/exercises/largest-series-product/largest_series_product_tests.erl +0 -54
  309. data/tracks/erlang/exercises/leap/leap_tests.erl +0 -20
  310. data/tracks/erlang/exercises/luhn/luhn_tests.erl +0 -19
  311. data/tracks/erlang/exercises/nucleotide-count/dna_tests.erl +0 -27
  312. data/tracks/erlang/exercises/phone-number/phone_tests.erl +0 -29
  313. data/tracks/erlang/exercises/rna-transcription/rna_transcription_tests.erl +0 -24
  314. data/tracks/erlang/exercises/robot-simulator/robot_simulator_tests.erl +0 -96
  315. data/tracks/erlang/exercises/roman-numerals/roman_numerals.erl +0 -6
  316. data/tracks/erlang/exercises/series/series_tests.erl +0 -6
  317. data/tracks/erlang/exercises/space-age/space_age_tests.erl +0 -48
  318. data/tracks/erlang/exercises/strain/strain_tests.erl +0 -49
  319. data/tracks/erlang/exercises/sum-of-multiples/sum_of_multiples_tests.erl +0 -37
  320. data/tracks/erlang/exercises/trinary/trinary_tests.erl +0 -37
  321. data/tracks/erlang/exercises/zipper/zipper_tests.erl +0 -103
  322. data/tracks/haskell/exercises/secret-handshake/.meta/DONT-TEST-STUB +0 -1
  323. data/tracks/haskell/exercises/secret-handshake/HINTS.md +0 -6
@@ -0,0 +1,100 @@
1
+ -module(zipper_tests).
2
+
3
+ -include("exercism.hrl").
4
+ -include_lib("eunit/include/eunit.hrl").
5
+
6
+ -define(TESTED_MODULE, (sut(zipper))).
7
+
8
+ %% Fixtures and helpers
9
+
10
+ bt(V, L, R) -> ?TESTED_MODULE:new_tree(V, L, R).
11
+ empty() -> ?TESTED_MODULE:empty().
12
+ leaf(V) -> ?TESTED_MODULE:new_tree(V, empty(), empty()).
13
+
14
+
15
+ t1() -> bt(1, bt(2, empty(), leaf(3)), leaf(4)).
16
+ t2() -> bt(1, bt(5, empty(), leaf(3)), leaf(4)).
17
+ t3() -> bt(1, bt(2, leaf(5), leaf(3)), leaf(4)).
18
+ t4() -> bt(1, leaf(2), leaf(4)).
19
+ t5() -> bt(1, bt(2, empty(), leaf(3)), bt(6, leaf(7), leaf(8))).
20
+ t6() -> bt(1, bt(2, empty(), leaf(5)), leaf(4)).
21
+
22
+ data_is_retained_test() ->
23
+ Exp = t1(),
24
+ ?assertMatch(Exp, ?TESTED_MODULE:to_tree(?TESTED_MODULE:from_tree(t1()))).
25
+
26
+ left_right_and_value_test() ->
27
+ ?assertMatch(3, ?TESTED_MODULE:value(?TESTED_MODULE:right(?TESTED_MODULE:left(?TESTED_MODULE:from_tree(t1()))))).
28
+
29
+ dead_end_test() ->
30
+ Exp = empty(),
31
+ ?assertMatch(Exp, ?TESTED_MODULE:left(?TESTED_MODULE:left(?TESTED_MODULE:from_tree(t1())))).
32
+
33
+ tree_from_deep_focus_test() ->
34
+ Exp = t1(),
35
+ Zipper = ?TESTED_MODULE:right(?TESTED_MODULE:left(?TESTED_MODULE:from_tree(t1()))),
36
+ ?assertMatch(Exp, ?TESTED_MODULE:to_tree(Zipper)).
37
+
38
+ traversing_up_from_top_test() ->
39
+ Exp = empty(),
40
+ ?assertMatch(Exp, ?TESTED_MODULE:up(?TESTED_MODULE:from_tree(t1()))).
41
+
42
+ left_right_and_up_test() ->
43
+ Act0 = ?TESTED_MODULE:from_tree(t1()),
44
+ Act1 = ?TESTED_MODULE:left(Act0),
45
+ Act2 = ?TESTED_MODULE:up(Act1),
46
+ Act3 = ?TESTED_MODULE:right(Act2),
47
+ Act4 = ?TESTED_MODULE:up(Act3),
48
+ Act5 = ?TESTED_MODULE:left(Act4),
49
+ Act6 = ?TESTED_MODULE:right(Act5),
50
+ ?assertMatch(3, ?TESTED_MODULE:value(Act6)).
51
+
52
+ set_value_test() ->
53
+ Exp = t2(),
54
+ Act0 = ?TESTED_MODULE:from_tree(t1()),
55
+ Act1 = ?TESTED_MODULE:left(Act0),
56
+ Act2 = ?TESTED_MODULE:set_value(Act1, 5),
57
+ Act3 = ?TESTED_MODULE:to_tree(Act2),
58
+ ?assertMatch(Exp, Act3).
59
+
60
+ set_value_after_traversiing_up_test() ->
61
+ Exp = t2(),
62
+ Act0 = ?TESTED_MODULE:from_tree(t1()),
63
+ Act1 = ?TESTED_MODULE:left(Act0),
64
+ Act2 = ?TESTED_MODULE:right(Act1),
65
+ Act3 = ?TESTED_MODULE:up(Act2),
66
+ Act4 = ?TESTED_MODULE:set_value(Act3, 5),
67
+ Act5 = ?TESTED_MODULE:to_tree(Act4),
68
+ ?assertMatch(Exp, Act5).
69
+
70
+ set_left_with_leaf_test() ->
71
+ Exp = t3(),
72
+ Act0 = ?TESTED_MODULE:from_tree(t1()),
73
+ Act1 = ?TESTED_MODULE:left(Act0),
74
+ Act2 = ?TESTED_MODULE:set_left(Act1, leaf(5)),
75
+ Act3 = ?TESTED_MODULE:to_tree(Act2),
76
+ ?assertMatch(Exp, Act3).
77
+
78
+ set_right_with_empty_test() ->
79
+ Exp = t4(),
80
+ Act0 = ?TESTED_MODULE:from_tree(t1()),
81
+ Act1 = ?TESTED_MODULE:left(Act0),
82
+ Act2 = ?TESTED_MODULE:set_right(Act1, empty()),
83
+ Act3 = ?TESTED_MODULE:to_tree(Act2),
84
+ ?assertMatch(Exp, Act3).
85
+
86
+ set_right_with_subtree_test() ->
87
+ Exp = t5(),
88
+ Act0 = ?TESTED_MODULE:from_tree(t1()),
89
+ Act1 = ?TESTED_MODULE:set_right(Act0, bt(6, leaf(7), leaf(8))),
90
+ Act2 = ?TESTED_MODULE:to_tree(Act1),
91
+ ?assertMatch(Exp, Act2).
92
+
93
+ set_value_from_deep_focus_test() ->
94
+ Exp = t6(),
95
+ Act0 = ?TESTED_MODULE:from_tree(t1()),
96
+ Act1 = ?TESTED_MODULE:left(Act0),
97
+ Act2 = ?TESTED_MODULE:right(Act1),
98
+ Act3 = ?TESTED_MODULE:set_value(Act2, 5),
99
+ Act4 = ?TESTED_MODULE:to_tree(Act3),
100
+ ?assertMatch(Exp, Act4).
@@ -106,14 +106,24 @@
106
106
  ]
107
107
  },
108
108
  {
109
- "difficulty": 1,
109
+ "difficulty": 3,
110
110
  "slug": "triangle",
111
- "topics": []
111
+ "topics": [
112
+ "Control-flow (conditionals)",
113
+ "Booleans",
114
+ "Logic"
115
+ ]
112
116
  },
113
117
  {
114
- "difficulty": 1,
118
+ "difficulty": 4,
115
119
  "slug": "twelve-days",
116
- "topics": []
120
+ "topics": [
121
+ "Strings",
122
+ "Sequences",
123
+ "Algorithms",
124
+ "Pattern recognition",
125
+ "Text formatting"
126
+ ]
117
127
  },
118
128
  {
119
129
  "difficulty": 1,
@@ -22,7 +22,7 @@ var stringTestCases = []testCase{
22
22
 
23
23
  func TestTestVersion(t *testing.T) {
24
24
  if testVersion != targetTestVersion {
25
- t.Errorf("Found testVersion = %v, want %v.", testVersion, targetTestVersion)
25
+ t.Fatalf("Found testVersion = %v, want %v.", testVersion, targetTestVersion)
26
26
  }
27
27
  }
28
28
 
@@ -2,6 +2,8 @@ package allyourbase
2
2
 
3
3
  import "testing"
4
4
 
5
+ const targetTestVersion = 1
6
+
5
7
  // Note: ConvertToBase should accept leading zeroes in its input,
6
8
  // but never emit leading zeroes in its output.
7
9
  // Exception: If the value of the output is zero, represent it with a single zero.
@@ -154,6 +156,12 @@ func digitsEqual(a, b []uint64) bool {
154
156
  return true
155
157
  }
156
158
 
159
+ func TestTestVersion(t *testing.T) {
160
+ if testVersion != targetTestVersion {
161
+ t.Fatalf("Found testVersion = %v, want %v.", testVersion, targetTestVersion)
162
+ }
163
+ }
164
+
157
165
  func TestConvertToBase(t *testing.T) {
158
166
  for _, c := range testCases {
159
167
  output, err := ConvertToBase(c.inputBase, c.inputDigits, c.outputBase)
@@ -175,11 +183,3 @@ func TestConvertToBase(t *testing.T) {
175
183
  }
176
184
  }
177
185
  }
178
-
179
- const targetTestVersion = 1
180
-
181
- func TestTestVersion(t *testing.T) {
182
- if testVersion != targetTestVersion {
183
- t.Errorf("Found testVersion = %v, want %v.", testVersion, targetTestVersion)
184
- }
185
- }
@@ -17,6 +17,12 @@ var testCases = []struct {
17
17
  {"827a 1232 7352 0569", "strings that contain non-digits are not valid", false},
18
18
  }
19
19
 
20
+ func TestTestVersion(t *testing.T) {
21
+ if testVersion != targetTestVersion {
22
+ t.Errorf("Found testVersion = %v, want %v", testVersion, targetTestVersion)
23
+ }
24
+ }
25
+
20
26
  func TestValid(t *testing.T) {
21
27
  for _, test := range testCases {
22
28
  if ok := Valid(test.input); ok != test.ok {
@@ -30,9 +36,3 @@ func BenchmarkValid(b *testing.B) {
30
36
  Valid("2323 2005 7766 3554")
31
37
  }
32
38
  }
33
-
34
- func TestTestVersion(t *testing.T) {
35
- if testVersion != targetTestVersion {
36
- t.Errorf("Found testVersion = %v, want %v", testVersion, targetTestVersion)
37
- }
38
- }
@@ -45,10 +45,13 @@ var positions = map[string][2][2]int{
45
45
  "scheme": {{0, 6}, {5, 6}},
46
46
  }
47
47
 
48
- func TestSolve(t *testing.T) {
48
+ func TestTestVersion(t *testing.T) {
49
49
  if testVersion != targetTestVersion {
50
50
  t.Fatalf("Found testVersion = %v, want %v", testVersion, targetTestVersion)
51
51
  }
52
+ }
53
+
54
+ func TestSolve(t *testing.T) {
52
55
  actual, err := Solve(words, puzzle)
53
56
  if err != nil {
54
57
  var _ error = err
@@ -5,6 +5,8 @@ import (
5
5
  "strings"
6
6
  )
7
7
 
8
+ const testVersion = 1
9
+
8
10
  func Answer(q string) (a int, ok bool) {
9
11
  w := strings.Fields(q)
10
12
  if len(w) < 3 { // length check for first two words and last word
@@ -2,6 +2,8 @@ package wordy
2
2
 
3
3
  import "testing"
4
4
 
5
+ const targetTestVersion = 1
6
+
5
7
  var tests = []struct {
6
8
  q string
7
9
  a int
@@ -25,6 +27,12 @@ var tests = []struct {
25
27
  {"Who is the president of the United States?", 0, false},
26
28
  }
27
29
 
30
+ func TestTestVersion(t *testing.T) {
31
+ if testVersion != targetTestVersion {
32
+ t.Fatalf("Found testVersion = %v, want %v", testVersion, targetTestVersion)
33
+ }
34
+ }
35
+
28
36
  func TestAnswer(t *testing.T) {
29
37
  for _, test := range tests {
30
38
  switch a, ok := Answer(test.q); {
@@ -39,64 +39,10 @@ script:
39
39
 
40
40
  # Explicit set exercises' resolver only if it's not the current one.
41
41
  if [ "${CURRENT}" != "YES" ]; then
42
- SET_RESOLVER="--resolver ${RESOLVER}"
42
+ export SET_RESOLVER="--resolver ${RESOLVER}"
43
43
  fi
44
44
 
45
- test_exercise () {
46
- stack test ${SET_RESOLVER} `# Select the correct resolver. `\
47
- --install-ghc `# Download GHC if not in cache.`\
48
- --no-terminal `# Terminal detection is broken.`\
49
- --pedantic `# Enable -Wall and -Werror. `
50
- }
51
-
52
45
  for exercise in ${TRAVIS_BUILD_DIR}/exercises/*/ ; do
53
- exercisename=$(basename "$exercise")
54
- pushd ${exercise}
55
-
56
- examplename="stub"
57
- buildfolder="${TRAVIS_BUILD_DIR}/build/${exercisename}/${examplename}"
58
- mkdir -p "${buildfolder}"
59
- cp -rL stack.yaml package.yaml src test "${buildfolder}"
60
-
61
- pushd $buildfolder
62
-
63
- examplecache="${HOME}/.foldercache/${exercisename}/${examplename}/.stack-work"
64
- mkdir -p "$examplecache"
65
- ln -f -s "$examplecache"
66
-
67
- if [ -f "${exercise}/.meta/DONT-TEST-STUB" ]; then
68
- echo "only building stub"
69
- stack build ${SET_RESOLVER} --install-ghc --no-terminal
70
- else
71
- echo "testing stub"
72
- stack test ${SET_RESOLVER} --install-ghc --no-terminal --no-run-tests
73
- fi
74
-
75
- popd
76
-
77
- if ! stat -t examples/*/ > /dev/null 2>&1; then
78
- echo "No examples for ${exercise}!"
79
- exit 1
80
- else
81
- for example in examples/*/ ; do
82
- examplename=$(basename "$example")
83
-
84
- buildfolder="${TRAVIS_BUILD_DIR}/build/${exercisename}/${examplename}"
85
- mkdir -p "${buildfolder}"
86
- cp -rL stack.yaml test ${example}/* "${buildfolder}"
87
-
88
- pushd $buildfolder
89
-
90
- examplecache="${HOME}/.foldercache/${exercisename}/${examplename}/.stack-work"
91
- mkdir -p "$examplecache"
92
- ln -f -s "$examplecache"
93
-
94
- echo "testing ${example}"
95
- test_exercise
96
-
97
- popd
98
- done
99
- fi
100
-
101
- popd
46
+ bin/test-stub $exercise
47
+ bin/test-all-examples $exercise
102
48
  done
@@ -127,6 +127,14 @@ The first condition is always enforced and cannot be circumvented.
127
127
  ### Example solution
128
128
  The example solution could be inspiration for other language implementors. It doesn't need to be perfect or very elegant. But it should be efficient enough for the test suite to finish in only a few seconds.
129
129
 
130
+ Examples are named `<type>-<name>`.
131
+ There are three possible types of examples:
132
+
133
+ * success: The example is expected to pass the tests.
134
+ There should be at least one of these per exercise.
135
+ * fail: The example is expected to build, but fail the tests.
136
+ * error: The example is expected to fail to build.
137
+
130
138
  ### Test suite
131
139
  The test suite should be derived from the respective `x-common/exercises/<exercise-name>/canonical-data.json` and comply to some formatting and coding standards (to get an idea you may look at some of the existing tests).
132
140
 
@@ -138,17 +146,12 @@ a few seconds.
138
146
 
139
147
  First you need to provide an [example solution](#example-solution).
140
148
 
141
- Running `stack test --pedantic` compiles and runs the tests with
142
- `-Wall -Werror`, but unfortunately it doesn't recompile unchanged
143
- source code already compiled with warnings.
144
-
145
- To be really sure that everything compiles correctly without
146
- warnings, your must first run `stack clean`.
149
+ We provide three scripts in the `bin` directory of this repository to run the tests.
150
+ These are the same scripts as those used by Travis CI.
147
151
 
148
- ```bash
149
- stack clean
150
- stack test --pedantic
151
- ```
152
+ * `test-example path/to/example/dir` runs the tests on a single example.
153
+ * `test-all-examples path/to/exercise/dir` runs the tests on all examples for an exercise.
154
+ * `test-stub path/to/exercise/dir` checks that the stub for the given exercise compiles.
152
155
 
153
156
  ### Running HLint
154
157
  All code in this repository should be as idiomatic as possible, so we
@@ -0,0 +1,20 @@
1
+ #!/bin/sh
2
+
3
+ set -e
4
+
5
+ if [ $# -eq 0 ]; then
6
+ echo "usage: $0 /path/to/exercise"
7
+ exit 1
8
+ fi
9
+
10
+ exercisedir=$1
11
+
12
+ if ! stat -t ${exercisedir}/examples/*/ > /dev/null 2>&1; then
13
+ echo "No examples for ${exercisedir}!"
14
+ exit 1
15
+ else
16
+ mydir=$(dirname $0)
17
+ for example in ${exercisedir}/examples/*/ ; do
18
+ $mydir/test-example $example
19
+ done
20
+ fi
@@ -0,0 +1,73 @@
1
+ #!/bin/sh
2
+
3
+ if [ $# -eq 0 ]; then
4
+ echo "usage: $0 /path/to/exercise/example"
5
+ exit 1
6
+ fi
7
+
8
+ exampledir=$(cd "$1" && pwd)
9
+
10
+ examplename=$(basename "$exampledir")
11
+ exercisedir=$(cd "$exampledir/../.." && pwd)
12
+ exercisename=$(basename "$exercisedir")
13
+ xhaskell=$(cd "$(dirname "$0")/.." && pwd)
14
+
15
+ # We would ideally use a tmpdir here,
16
+ # but stack will invalidate its cache if the path changes,
17
+ # so the best alternative seems to be to put it in xhaskell.
18
+ buildfolder="${xhaskell}/build/${exercisename}/${examplename}"
19
+ mkdir -p "${buildfolder}"
20
+ cleanup() {
21
+ rm -r "${xhaskell}/build"
22
+ }
23
+ trap cleanup EXIT INT TERM
24
+
25
+ cp -R -L ${exercisedir}/stack.yaml ${exercisedir}/test ${exampledir}/* "${buildfolder}"
26
+
27
+ cd $buildfolder
28
+
29
+ if [ -n "$TRAVIS" ]; then
30
+ cachedir="$HOME"
31
+ else
32
+ cachedir="$xhaskell"
33
+ fi
34
+ examplecache="${cachedir}/.foldercache/${exercisename}/${examplename}/.stack-work"
35
+ mkdir -p "$examplecache"
36
+ ln -f -s "$examplecache"
37
+
38
+ exampletype=$(echo "$examplename" | cut -d- -f1)
39
+
40
+ runstack () {
41
+ # SET_RESOLVER passed by .travis.yml - sets --resolver if not current.
42
+ stack "$@" ${SET_RESOLVER} `# Select the correct resolver. `\
43
+ --install-ghc `# Download GHC if not in cache.`\
44
+ --no-terminal `# Terminal detection is broken.`\
45
+ --pedantic `# Enable -Wall and -Werror. `
46
+ }
47
+
48
+ if [ "$exampletype" = "success" ]; then
49
+ echo "testing ${exampledir} - should succeed"
50
+ # Implicit exit value: this is last thing in this path,
51
+ # so the script's exit value = stack's exit value.
52
+ # If statements are reordered, please preserve this property.
53
+ runstack "test"
54
+ elif [ "$exampletype" = "fail" ]; then
55
+ echo "testing ${exampledir} - should build, but fail tests"
56
+ if ! runstack "build"; then
57
+ echo "${exampledir} build failed unexpectedly"
58
+ exit 1
59
+ fi
60
+ if runstack "test"; then
61
+ echo "${exampledir} test succeeded unexpectedly"
62
+ exit 1
63
+ fi
64
+ elif [ "$exampletype" = "error" ]; then
65
+ echo "testing ${exampledir} - should fail to build"
66
+ if runstack "test" "--no-run-tests"; then
67
+ echo "${exampledir} build succeeded unexpectedly"
68
+ exit 1
69
+ fi
70
+ else
71
+ echo "unknown example type: ${exampledir}"
72
+ exit 1
73
+ fi
@@ -0,0 +1,43 @@
1
+ #!/bin/sh
2
+
3
+ if [ $# -eq 0 ]; then
4
+ echo "usage: $0 /path/to/exercise"
5
+ exit 1
6
+ fi
7
+
8
+ exercisedir=$(cd "$1" && pwd)
9
+ exercisename=$(basename "$exercisedir")
10
+ examplename="stub"
11
+ xhaskell=$(cd "$(dirname "$0")/.." && pwd)
12
+
13
+ # We would ideally use a tmpdir here,
14
+ # but stack will invalidate its cache if the path changes,
15
+ # so the best alternative seems to be to put it in xhaskell.
16
+ buildfolder="${xhaskell}/build/${exercisename}/${examplename}"
17
+ mkdir -p "${buildfolder}"
18
+ cleanup() {
19
+ rm -r "${xhaskell}/build"
20
+ }
21
+ trap cleanup EXIT INT TERM
22
+
23
+ cp -R -L ${exercisedir}/stack.yaml ${exercisedir}/package.yaml ${exercisedir}/src ${exercisedir}/test "${buildfolder}"
24
+
25
+ cd $buildfolder
26
+
27
+ if [ -n "$TRAVIS" ]; then
28
+ cachedir="$HOME"
29
+ else
30
+ cachedir="$xhaskell"
31
+ fi
32
+ examplecache="${cachedir}/.foldercache/${exercisename}/${examplename}/.stack-work"
33
+ mkdir -p "$examplecache"
34
+ ln -f -s "$examplecache"
35
+
36
+ # SET_RESOLVER passed by .travis.yml - sets --resolver if not current.
37
+ if [ -f "${exercisedir}/.meta/DONT-TEST-STUB" ]; then
38
+ echo "only building stub"
39
+ stack build ${SET_RESOLVER} --install-ghc --no-terminal
40
+ else
41
+ echo "testing stub"
42
+ stack test ${SET_RESOLVER} --install-ghc --no-terminal --no-run-tests
43
+ fi