trackler 2.2.1.44 → 2.2.1.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (452) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/isbn-verifier/canonical-data.json +88 -0
  4. data/problem-specifications/exercises/isbn-verifier/description.md +35 -0
  5. data/problem-specifications/exercises/isbn-verifier/metadata.yml +4 -0
  6. data/problem-specifications/exercises/robot-simulator/canonical-data.json +125 -32
  7. data/problem-specifications/exercises/sum-of-multiples/description.md +0 -3
  8. data/problem-specifications/exercises/two-bucket/canonical-data.json +3 -3
  9. data/tracks/c/config.json +235 -237
  10. data/tracks/c/exercises/acronym/README.md +0 -1
  11. data/tracks/c/exercises/all-your-base/README.md +1 -1
  12. data/tracks/c/exercises/allergies/README.md +0 -1
  13. data/tracks/c/exercises/atbash-cipher/README.md +2 -1
  14. data/tracks/c/exercises/beer-song/README.md +1 -1
  15. data/tracks/c/exercises/binary/README.md +2 -0
  16. data/tracks/c/exercises/grains/README.md +0 -1
  17. data/tracks/c/exercises/isogram/README.md +2 -1
  18. data/tracks/c/exercises/leap/README.md +1 -1
  19. data/tracks/c/exercises/meetup/README.md +1 -2
  20. data/tracks/c/exercises/nucleotide-count/README.md +8 -22
  21. data/tracks/c/exercises/palindrome-products/README.md +12 -6
  22. data/tracks/c/exercises/pangram/README.md +1 -1
  23. data/tracks/c/exercises/pascals-triangle/README.md +1 -1
  24. data/tracks/c/exercises/perfect-numbers/README.md +2 -2
  25. data/tracks/c/exercises/phone-number/README.md +3 -2
  26. data/tracks/c/exercises/roman-numerals/README.md +1 -1
  27. data/tracks/c/exercises/scrabble-score/README.md +3 -1
  28. data/tracks/c/exercises/space-age/README.md +2 -1
  29. data/tracks/c/exercises/triangle/README.md +9 -6
  30. data/tracks/c/exercises/word-count/README.md +1 -2
  31. data/tracks/csharp/exercises/accumulate/Accumulate.csproj +2 -2
  32. data/tracks/csharp/exercises/acronym/Acronym.csproj +2 -2
  33. data/tracks/csharp/exercises/all-your-base/AllYourBase.csproj +2 -2
  34. data/tracks/csharp/exercises/allergies/Allergies.csproj +2 -2
  35. data/tracks/csharp/exercises/alphametics/Alphametics.csproj +2 -2
  36. data/tracks/csharp/exercises/anagram/Anagram.csproj +2 -2
  37. data/tracks/csharp/exercises/atbash-cipher/AtbashCipher.csproj +2 -2
  38. data/tracks/csharp/exercises/bank-account/BankAccount.csproj +2 -2
  39. data/tracks/csharp/exercises/beer-song/BeerSong.csproj +2 -2
  40. data/tracks/csharp/exercises/binary-search/BinarySearch.csproj +2 -2
  41. data/tracks/csharp/exercises/binary-search-tree/BinarySearchTree.csproj +2 -2
  42. data/tracks/csharp/exercises/bob/Bob.csproj +2 -2
  43. data/tracks/csharp/exercises/book-store/BookStore.csproj +2 -2
  44. data/tracks/csharp/exercises/bowling/Bowling.csproj +2 -2
  45. data/tracks/csharp/exercises/bracket-push/BracketPush.csproj +2 -2
  46. data/tracks/csharp/exercises/change/Change.csproj +2 -2
  47. data/tracks/csharp/exercises/circular-buffer/CircularBuffer.csproj +2 -2
  48. data/tracks/csharp/exercises/clock/Clock.csproj +2 -2
  49. data/tracks/csharp/exercises/collatz-conjecture/CollatzConjecture.csproj +2 -2
  50. data/tracks/csharp/exercises/complex-numbers/ComplexNumbers.csproj +2 -2
  51. data/tracks/csharp/exercises/connect/Connect.cs +1 -1
  52. data/tracks/csharp/exercises/connect/Connect.csproj +2 -2
  53. data/tracks/csharp/exercises/connect/ConnectTest.cs +120 -85
  54. data/tracks/csharp/exercises/connect/Example.cs +11 -7
  55. data/tracks/csharp/exercises/crypto-square/CryptoSquare.csproj +2 -2
  56. data/tracks/csharp/exercises/custom-set/CustomSet.csproj +2 -2
  57. data/tracks/csharp/exercises/diamond/Diamond.csproj +2 -2
  58. data/tracks/csharp/exercises/difference-of-squares/DifferenceOfSquares.csproj +2 -2
  59. data/tracks/csharp/exercises/diffie-hellman/DiffieHellman.csproj +2 -2
  60. data/tracks/csharp/exercises/dominoes/Dominoes.csproj +2 -2
  61. data/tracks/csharp/exercises/dot-dsl/DotDsl.csproj +2 -2
  62. data/tracks/csharp/exercises/error-handling/ErrorHandling.csproj +2 -2
  63. data/tracks/csharp/exercises/etl/Etl.csproj +2 -2
  64. data/tracks/csharp/exercises/flatten-array/FlattenArray.csproj +2 -2
  65. data/tracks/csharp/exercises/food-chain/FoodChain.csproj +2 -2
  66. data/tracks/csharp/exercises/forth/Forth.csproj +2 -2
  67. data/tracks/csharp/exercises/gigasecond/Gigasecond.csproj +2 -2
  68. data/tracks/csharp/exercises/go-counting/GoCounting.csproj +2 -2
  69. data/tracks/csharp/exercises/grade-school/GradeSchool.csproj +2 -2
  70. data/tracks/csharp/exercises/grains/Grains.csproj +2 -2
  71. data/tracks/csharp/exercises/grep/Grep.csproj +2 -2
  72. data/tracks/csharp/exercises/hamming/Hamming.csproj +2 -2
  73. data/tracks/csharp/exercises/hangman/Hangman.csproj +2 -2
  74. data/tracks/csharp/exercises/hello-world/HelloWorld.csproj +2 -2
  75. data/tracks/csharp/exercises/house/House.csproj +2 -2
  76. data/tracks/csharp/exercises/isogram/Isogram.csproj +2 -2
  77. data/tracks/csharp/exercises/kindergarten-garden/KindergartenGarden.csproj +2 -2
  78. data/tracks/csharp/exercises/largest-series-product/LargestSeriesProduct.csproj +2 -2
  79. data/tracks/csharp/exercises/leap/Leap.csproj +2 -2
  80. data/tracks/csharp/exercises/ledger/Ledger.csproj +2 -2
  81. data/tracks/csharp/exercises/linked-list/LinkedList.csproj +2 -2
  82. data/tracks/csharp/exercises/list-ops/ListOps.csproj +2 -2
  83. data/tracks/csharp/exercises/luhn/Luhn.csproj +2 -2
  84. data/tracks/csharp/exercises/markdown/Markdown.csproj +2 -2
  85. data/tracks/csharp/exercises/matrix/Matrix.csproj +2 -2
  86. data/tracks/csharp/exercises/meetup/Meetup.csproj +2 -2
  87. data/tracks/csharp/exercises/minesweeper/Minesweeper.csproj +2 -2
  88. data/tracks/csharp/exercises/nth-prime/NthPrime.csproj +2 -2
  89. data/tracks/csharp/exercises/nucleotide-count/NucleotideCount.csproj +2 -2
  90. data/tracks/csharp/exercises/ocr-numbers/OcrNumbers.csproj +2 -2
  91. data/tracks/csharp/exercises/palindrome-products/PalindromeProducts.csproj +2 -2
  92. data/tracks/csharp/exercises/pangram/Pangram.csproj +2 -2
  93. data/tracks/csharp/exercises/parallel-letter-frequency/ParallelLetterFrequency.csproj +2 -2
  94. data/tracks/csharp/exercises/pascals-triangle/PascalsTriangle.csproj +2 -2
  95. data/tracks/csharp/exercises/perfect-numbers/PerfectNumbers.csproj +2 -2
  96. data/tracks/csharp/exercises/phone-number/PhoneNumber.csproj +2 -2
  97. data/tracks/csharp/exercises/pig-latin/PigLatin.csproj +2 -2
  98. data/tracks/csharp/exercises/poker/Poker.csproj +2 -2
  99. data/tracks/csharp/exercises/pov/Pov.csproj +2 -2
  100. data/tracks/csharp/exercises/prime-factors/PrimeFactors.csproj +2 -2
  101. data/tracks/csharp/exercises/protein-translation/ProteinTranslation.csproj +2 -2
  102. data/tracks/csharp/exercises/proverb/Proverb.csproj +2 -2
  103. data/tracks/csharp/exercises/pythagorean-triplet/PythagoreanTriplet.csproj +2 -2
  104. data/tracks/csharp/exercises/queen-attack/QueenAttack.csproj +2 -2
  105. data/tracks/csharp/exercises/rail-fence-cipher/RailFenceCipher.csproj +2 -2
  106. data/tracks/csharp/exercises/raindrops/Raindrops.csproj +2 -2
  107. data/tracks/csharp/exercises/react/React.csproj +2 -2
  108. data/tracks/csharp/exercises/rectangles/Rectangles.csproj +2 -2
  109. data/tracks/csharp/exercises/rna-transcription/RnaTranscription.csproj +2 -2
  110. data/tracks/csharp/exercises/robot-name/RobotName.csproj +2 -2
  111. data/tracks/csharp/exercises/robot-simulator/RobotSimulator.csproj +2 -2
  112. data/tracks/csharp/exercises/roman-numerals/RomanNumerals.csproj +2 -2
  113. data/tracks/csharp/exercises/rotational-cipher/RotationalCipher.csproj +2 -2
  114. data/tracks/csharp/exercises/run-length-encoding/RunLengthEncoding.csproj +2 -2
  115. data/tracks/csharp/exercises/saddle-points/SaddlePoints.csproj +2 -2
  116. data/tracks/csharp/exercises/say/Say.csproj +2 -2
  117. data/tracks/csharp/exercises/scale-generator/ScaleGenerator.csproj +2 -2
  118. data/tracks/csharp/exercises/scrabble-score/ScrabbleScore.csproj +2 -2
  119. data/tracks/csharp/exercises/secret-handshake/SecretHandshake.csproj +2 -2
  120. data/tracks/csharp/exercises/series/Series.csproj +2 -2
  121. data/tracks/csharp/exercises/series/SeriesTest.cs +17 -17
  122. data/tracks/csharp/exercises/sgf-parsing/SgfParsing.csproj +2 -2
  123. data/tracks/csharp/exercises/sieve/Sieve.csproj +2 -2
  124. data/tracks/csharp/exercises/simple-cipher/SimpleCipher.csproj +2 -2
  125. data/tracks/csharp/exercises/simple-linked-list/SimpleLinkedList.csproj +2 -2
  126. data/tracks/csharp/exercises/space-age/SpaceAge.csproj +2 -2
  127. data/tracks/csharp/exercises/spiral-matrix/SpiralMatrix.csproj +2 -2
  128. data/tracks/csharp/exercises/strain/Strain.csproj +2 -2
  129. data/tracks/csharp/exercises/sublist/Sublist.csproj +2 -2
  130. data/tracks/csharp/exercises/sum-of-multiples/SumOfMultiples.csproj +2 -2
  131. data/tracks/csharp/exercises/tournament/Tournament.csproj +2 -2
  132. data/tracks/csharp/exercises/transpose/Transpose.csproj +2 -2
  133. data/tracks/csharp/exercises/tree-building/TreeBuilding.csproj +2 -2
  134. data/tracks/csharp/exercises/triangle/Triangle.cs +0 -11
  135. data/tracks/csharp/exercises/triangle/Triangle.csproj +2 -2
  136. data/tracks/csharp/exercises/triangle/TriangleTest.cs +17 -17
  137. data/tracks/csharp/exercises/twelve-days/TwelveDays.csproj +2 -2
  138. data/tracks/csharp/exercises/two-bucket/TwoBucket.csproj +2 -2
  139. data/tracks/csharp/exercises/two-fer/TwoFer.csproj +2 -2
  140. data/tracks/csharp/exercises/variable-length-quantity/VariableLengthQuantity.csproj +2 -2
  141. data/tracks/csharp/exercises/word-count/WordCount.csproj +2 -2
  142. data/tracks/csharp/exercises/word-search/WordSearch.csproj +2 -2
  143. data/tracks/csharp/exercises/wordy/Wordy.csproj +2 -2
  144. data/tracks/csharp/exercises/zebra-puzzle/ZebraPuzzle.csproj +2 -2
  145. data/tracks/csharp/exercises/zipper/Zipper.csproj +2 -2
  146. data/tracks/csharp/generators/Exercises/Connect.cs +47 -0
  147. data/tracks/csharp/generators/Exercises/Triangle.cs +1 -1
  148. data/tracks/dart/config/maintainers.json +27 -1
  149. data/tracks/dart/pubspec.yaml +3 -0
  150. data/tracks/dart/tool/create-exercise +144 -5
  151. data/tracks/elm/.gitattributes +1 -0
  152. data/tracks/elm/bin/install-elm-format +9 -3
  153. data/tracks/elm/config.json +30 -0
  154. data/tracks/elm/exercises/all-your-base/AllYourBase.elm +1 -0
  155. data/tracks/elm/exercises/all-your-base/AllYourBase.example.elm +68 -0
  156. data/tracks/elm/exercises/all-your-base/README.md +65 -0
  157. data/tracks/elm/exercises/all-your-base/elm-package.json +15 -0
  158. data/tracks/elm/exercises/all-your-base/tests/Tests.elm +53 -0
  159. data/tracks/elm/exercises/all-your-base/tests/elm-package.json +16 -0
  160. data/tracks/elm/exercises/collatz-conjecture/CollatzConjecture.elm +2 -0
  161. data/tracks/elm/exercises/collatz-conjecture/CollatzConjecture.example.elm +19 -0
  162. data/tracks/elm/exercises/collatz-conjecture/elm-package.json +15 -0
  163. data/tracks/elm/exercises/collatz-conjecture/package.json +14 -0
  164. data/tracks/elm/exercises/collatz-conjecture/tests/Tests.elm +38 -0
  165. data/tracks/elm/exercises/collatz-conjecture/tests/elm-package.json +16 -0
  166. data/tracks/elm/exercises/isogram/Isogram.elm +1 -0
  167. data/tracks/elm/exercises/isogram/Isogram.example.elm +76 -0
  168. data/tracks/elm/exercises/isogram/README.md +50 -0
  169. data/tracks/elm/exercises/isogram/elm-package.json +14 -0
  170. data/tracks/elm/exercises/isogram/package.json +14 -0
  171. data/tracks/elm/exercises/isogram/tests/Tests.elm +46 -0
  172. data/tracks/elm/exercises/isogram/tests/elm-package.json +16 -0
  173. data/tracks/fsharp/.gitignore +2 -1
  174. data/tracks/fsharp/exercises/accumulate/Accumulate.fsproj +3 -2
  175. data/tracks/fsharp/exercises/acronym/Acronym.fs +1 -1
  176. data/tracks/fsharp/exercises/acronym/Acronym.fsproj +3 -2
  177. data/tracks/fsharp/exercises/acronym/AcronymTest.fs +13 -38
  178. data/tracks/fsharp/exercises/acronym/Example.fs +1 -1
  179. data/tracks/fsharp/exercises/all-your-base/AllYourBase.fsproj +3 -2
  180. data/tracks/fsharp/exercises/all-your-base/AllYourBaseTest.fs +64 -61
  181. data/tracks/fsharp/exercises/all-your-base/Example.fs +4 -1
  182. data/tracks/fsharp/exercises/allergies/Allergies.fs +2 -2
  183. data/tracks/fsharp/exercises/allergies/Allergies.fsproj +3 -2
  184. data/tracks/fsharp/exercises/allergies/AllergiesTest.fs +28 -37
  185. data/tracks/fsharp/exercises/allergies/Example.fs +3 -3
  186. data/tracks/fsharp/exercises/alphametics/Alphametics.fsproj +3 -2
  187. data/tracks/fsharp/exercises/anagram/Anagram.fsproj +3 -2
  188. data/tracks/fsharp/exercises/atbash-cipher/AtbashCipher.fs +4 -2
  189. data/tracks/fsharp/exercises/atbash-cipher/AtbashCipher.fsproj +3 -2
  190. data/tracks/fsharp/exercises/atbash-cipher/AtbashCipherTest.fs +38 -42
  191. data/tracks/fsharp/exercises/atbash-cipher/Example.fs +5 -3
  192. data/tracks/fsharp/exercises/bank-account/BankAccount.fsproj +3 -2
  193. data/tracks/fsharp/exercises/beer-song/BeerSong.fsproj +3 -2
  194. data/tracks/fsharp/exercises/beer-song/BeerSongTest.fs +36 -32
  195. data/tracks/fsharp/exercises/beer-song/Example.fs +2 -2
  196. data/tracks/fsharp/exercises/binary-search/BinarySearch.fsproj +3 -2
  197. data/tracks/fsharp/exercises/binary-search-tree/BinarySearchTree.fsproj +3 -2
  198. data/tracks/fsharp/exercises/bob/Bob.fs +1 -1
  199. data/tracks/fsharp/exercises/bob/Bob.fsproj +3 -2
  200. data/tracks/fsharp/exercises/bob/BobTest.fs +64 -20
  201. data/tracks/fsharp/exercises/bob/Example.fs +3 -4
  202. data/tracks/fsharp/exercises/book-store/BookStore.fs +1 -1
  203. data/tracks/fsharp/exercises/book-store/BookStore.fsproj +3 -2
  204. data/tracks/fsharp/exercises/book-store/BookStoreTest.fs +32 -25
  205. data/tracks/fsharp/exercises/book-store/Example.fs +1 -1
  206. data/tracks/fsharp/exercises/bowling/Bowling.fsproj +3 -2
  207. data/tracks/fsharp/exercises/bracket-push/BracketPush.fs +1 -1
  208. data/tracks/fsharp/exercises/bracket-push/BracketPush.fsproj +3 -2
  209. data/tracks/fsharp/exercises/bracket-push/BracketPushTest.fs +24 -25
  210. data/tracks/fsharp/exercises/bracket-push/Example.fs +1 -1
  211. data/tracks/fsharp/exercises/change/Change.fs +1 -1
  212. data/tracks/fsharp/exercises/change/Change.fsproj +3 -2
  213. data/tracks/fsharp/exercises/change/ChangeTest.fs +42 -18
  214. data/tracks/fsharp/exercises/change/Example.fs +7 -4
  215. data/tracks/fsharp/exercises/circular-buffer/CircularBuffer.fsproj +3 -2
  216. data/tracks/fsharp/exercises/clock/Clock.fsproj +3 -2
  217. data/tracks/fsharp/exercises/connect/Connect.fsproj +3 -2
  218. data/tracks/fsharp/exercises/crypto-square/CryptoSquare.fs +1 -40
  219. data/tracks/fsharp/exercises/crypto-square/CryptoSquare.fsproj +3 -2
  220. data/tracks/fsharp/exercises/crypto-square/CryptoSquareTest.fs +16 -40
  221. data/tracks/fsharp/exercises/crypto-square/Example.fs +13 -16
  222. data/tracks/fsharp/exercises/custom-set/CustomSet.fs +12 -12
  223. data/tracks/fsharp/exercises/custom-set/CustomSet.fsproj +3 -2
  224. data/tracks/fsharp/exercises/diamond/Diamond.fsproj +3 -2
  225. data/tracks/fsharp/exercises/difference-of-squares/DifferenceOfSquares.fs +2 -2
  226. data/tracks/fsharp/exercises/difference-of-squares/DifferenceOfSquares.fsproj +3 -2
  227. data/tracks/fsharp/exercises/difference-of-squares/DifferenceOfSquaresTest.fs +24 -20
  228. data/tracks/fsharp/exercises/difference-of-squares/Example.fs +3 -3
  229. data/tracks/fsharp/exercises/diffie-hellman/DiffieHellman.fsproj +3 -2
  230. data/tracks/fsharp/exercises/dominoes/Dominoes.fsproj +3 -2
  231. data/tracks/fsharp/exercises/dot-dsl/DotDsl.fsproj +3 -2
  232. data/tracks/fsharp/exercises/error-handling/ErrorHandling.fsproj +3 -2
  233. data/tracks/fsharp/exercises/etl/Etl.fsproj +3 -2
  234. data/tracks/fsharp/exercises/food-chain/FoodChain.fsproj +3 -2
  235. data/tracks/fsharp/exercises/forth/Forth.fsproj +3 -2
  236. data/tracks/fsharp/exercises/gigasecond/Example.fs +1 -3
  237. data/tracks/fsharp/exercises/gigasecond/Gigasecond.fs +1 -1
  238. data/tracks/fsharp/exercises/gigasecond/Gigasecond.fsproj +3 -2
  239. data/tracks/fsharp/exercises/gigasecond/GigasecondTest.fs +21 -12
  240. data/tracks/fsharp/exercises/go-counting/GoCounting.fsproj +3 -2
  241. data/tracks/fsharp/exercises/grade-school/GradeSchool.fsproj +3 -2
  242. data/tracks/fsharp/exercises/grains/Grains.fsproj +3 -2
  243. data/tracks/fsharp/exercises/grep/Grep.fsproj +3 -2
  244. data/tracks/fsharp/exercises/hamming/Hamming.fsproj +3 -2
  245. data/tracks/fsharp/exercises/hangman/Hangman.fsproj +3 -2
  246. data/tracks/fsharp/exercises/hello-world/HelloWorld.fsproj +3 -2
  247. data/tracks/fsharp/exercises/hello-world/HelloWorldTest.fs +6 -3
  248. data/tracks/fsharp/exercises/house/House.fsproj +3 -2
  249. data/tracks/fsharp/exercises/isogram/Example.fs +1 -1
  250. data/tracks/fsharp/exercises/isogram/Isogram.fs +1 -1
  251. data/tracks/fsharp/exercises/isogram/Isogram.fsproj +3 -2
  252. data/tracks/fsharp/exercises/isogram/IsogramTest.fs +16 -40
  253. data/tracks/fsharp/exercises/kindergarten-garden/Example.fs +6 -4
  254. data/tracks/fsharp/exercises/kindergarten-garden/KindergartenGarden.fs +3 -5
  255. data/tracks/fsharp/exercises/kindergarten-garden/KindergartenGarden.fsproj +3 -2
  256. data/tracks/fsharp/exercises/kindergarten-garden/KindergartenGardenTest.fs +100 -47
  257. data/tracks/fsharp/exercises/largest-series-product/LargestSeriesProduct.fsproj +3 -2
  258. data/tracks/fsharp/exercises/leap/Example.fs +2 -2
  259. data/tracks/fsharp/exercises/leap/Leap.fs +2 -2
  260. data/tracks/fsharp/exercises/leap/Leap.fsproj +3 -2
  261. data/tracks/fsharp/exercises/leap/LeapTest.fs +19 -15
  262. data/tracks/fsharp/exercises/ledger/Ledger.fsproj +3 -2
  263. data/tracks/fsharp/exercises/lens-person/LensPerson.fsproj +3 -2
  264. data/tracks/fsharp/exercises/linked-list/LinkedList.fsproj +3 -2
  265. data/tracks/fsharp/exercises/list-ops/ListOps.fsproj +3 -2
  266. data/tracks/fsharp/exercises/luhn/Luhn.fsproj +3 -2
  267. data/tracks/fsharp/exercises/luhn/LuhnTest.fs +30 -65
  268. data/tracks/fsharp/exercises/markdown/Markdown.fsproj +3 -2
  269. data/tracks/fsharp/exercises/matrix/Matrix.fsproj +3 -2
  270. data/tracks/fsharp/exercises/meetup/Meetup.fsproj +3 -2
  271. data/tracks/fsharp/exercises/minesweeper/Example.fs +9 -11
  272. data/tracks/fsharp/exercises/minesweeper/Minesweeper.fsproj +3 -2
  273. data/tracks/fsharp/exercises/minesweeper/MinesweeperTest.fs +117 -80
  274. data/tracks/fsharp/exercises/nth-prime/NthPrime.fsproj +3 -2
  275. data/tracks/fsharp/exercises/nucleotide-count/NucleotideCount.fsproj +3 -2
  276. data/tracks/fsharp/exercises/ocr-numbers/OcrNumbers.fsproj +3 -2
  277. data/tracks/fsharp/exercises/palindrome-products/PalindromeProducts.fsproj +3 -2
  278. data/tracks/fsharp/exercises/pangram/Pangram.fsproj +3 -2
  279. data/tracks/fsharp/exercises/pangram/PangramTest.fs +15 -27
  280. data/tracks/fsharp/exercises/parallel-letter-frequency/ParallelLetterFrequency.fsproj +3 -2
  281. data/tracks/fsharp/exercises/pascals-triangle/PascalsTriangle.fsproj +3 -2
  282. data/tracks/fsharp/exercises/perfect-numbers/PerfectNumbers.fsproj +3 -2
  283. data/tracks/fsharp/exercises/phone-number/PhoneNumber.fsproj +3 -2
  284. data/tracks/fsharp/exercises/pig-latin/Example.fs +1 -1
  285. data/tracks/fsharp/exercises/pig-latin/PigLatin.fsproj +3 -2
  286. data/tracks/fsharp/exercises/pig-latin/PigLatinTest.fs +64 -26
  287. data/tracks/fsharp/exercises/poker/Poker.fsproj +3 -2
  288. data/tracks/fsharp/exercises/pov/Pov.fsproj +3 -2
  289. data/tracks/fsharp/exercises/prime-factors/PrimeFactors.fsproj +3 -2
  290. data/tracks/fsharp/exercises/protein-translation/ProteinTranslation.fsproj +3 -2
  291. data/tracks/fsharp/exercises/proverb/Proverb.fsproj +3 -2
  292. data/tracks/fsharp/exercises/pythagorean-triplet/PythagoreanTriplet.fsproj +3 -2
  293. data/tracks/fsharp/exercises/queen-attack/Example.fs +3 -1
  294. data/tracks/fsharp/exercises/queen-attack/QueenAttack.fs +2 -0
  295. data/tracks/fsharp/exercises/queen-attack/QueenAttack.fsproj +3 -2
  296. data/tracks/fsharp/exercises/queen-attack/QueenAttackTest.fs +50 -20
  297. data/tracks/fsharp/exercises/rail-fence-cipher/RailFenceCipher.fsproj +3 -2
  298. data/tracks/fsharp/exercises/raindrops/Raindrops.fsproj +3 -2
  299. data/tracks/fsharp/exercises/raindrops/RaindropsTest.fs +77 -37
  300. data/tracks/fsharp/exercises/react/React.fsproj +3 -2
  301. data/tracks/fsharp/exercises/rectangles/Rectangles.fsproj +3 -2
  302. data/tracks/fsharp/exercises/rna-transcription/Example.fs +15 -7
  303. data/tracks/fsharp/exercises/rna-transcription/RnaTranscription.fs +2 -2
  304. data/tracks/fsharp/exercises/rna-transcription/RnaTranscription.fsproj +3 -2
  305. data/tracks/fsharp/exercises/rna-transcription/RnaTranscriptionTest.fs +29 -14
  306. data/tracks/fsharp/exercises/robot-name/RobotName.fsproj +3 -2
  307. data/tracks/fsharp/exercises/robot-simulator/RobotSimulator.fsproj +3 -2
  308. data/tracks/fsharp/exercises/roman-numerals/Example.fs +2 -2
  309. data/tracks/fsharp/exercises/roman-numerals/RomanNumerals.fs +2 -2
  310. data/tracks/fsharp/exercises/roman-numerals/RomanNumerals.fsproj +3 -2
  311. data/tracks/fsharp/exercises/roman-numerals/RomanNumeralsTest.fs +79 -26
  312. data/tracks/fsharp/exercises/run-length-encoding/RunLengthEncoding.fsproj +3 -2
  313. data/tracks/fsharp/exercises/saddle-points/SaddlePoints.fsproj +3 -2
  314. data/tracks/fsharp/exercises/say/Say.fsproj +3 -2
  315. data/tracks/fsharp/exercises/scale-generator/ScaleGenerator.fsproj +3 -2
  316. data/tracks/fsharp/exercises/scrabble-score/ScrabbleScore.fsproj +3 -2
  317. data/tracks/fsharp/exercises/scrabble-score/ScrabbleScoreTest.fs +33 -17
  318. data/tracks/fsharp/exercises/secret-handshake/SecretHandshake.fsproj +3 -2
  319. data/tracks/fsharp/exercises/series/Series.fsproj +3 -2
  320. data/tracks/fsharp/exercises/sgf-parsing/SgfParsing.fsproj +3 -2
  321. data/tracks/fsharp/exercises/sieve/Sieve.fsproj +3 -2
  322. data/tracks/fsharp/exercises/simple-cipher/SimpleCipher.fsproj +3 -2
  323. data/tracks/fsharp/exercises/simple-linked-list/SimpleLinkedList.fsproj +3 -2
  324. data/tracks/fsharp/exercises/space-age/SpaceAge.fsproj +3 -2
  325. data/tracks/fsharp/exercises/strain/Strain.fsproj +3 -2
  326. data/tracks/fsharp/exercises/sublist/Sublist.fsproj +3 -2
  327. data/tracks/fsharp/exercises/sum-of-multiples/SumOfMultiples.fsproj +3 -2
  328. data/tracks/fsharp/exercises/tournament/Tournament.fsproj +3 -2
  329. data/tracks/fsharp/exercises/transpose/Transpose.fsproj +3 -2
  330. data/tracks/fsharp/exercises/tree-building/TreeBuilding.fsproj +3 -2
  331. data/tracks/fsharp/exercises/triangle/Triangle.fsproj +3 -2
  332. data/tracks/fsharp/exercises/twelve-days/TwelveDays.fsproj +3 -2
  333. data/tracks/fsharp/exercises/two-bucket/TwoBucket.fsproj +3 -2
  334. data/tracks/fsharp/exercises/two-fer/TwoFer.fsproj +3 -2
  335. data/tracks/fsharp/exercises/variable-length-quantity/VariableLengthQuantity.fsproj +3 -2
  336. data/tracks/fsharp/exercises/word-count/WordCount.fsproj +3 -2
  337. data/tracks/fsharp/exercises/word-search/WordSearch.fsproj +3 -2
  338. data/tracks/fsharp/exercises/wordy/Wordy.fsproj +3 -2
  339. data/tracks/fsharp/exercises/zebra-puzzle/ZebraPuzzle.fsproj +3 -2
  340. data/tracks/fsharp/exercises/zipper/Zipper.fsproj +3 -2
  341. data/tracks/fsharp/generators/Common.fs +96 -0
  342. data/tracks/fsharp/generators/Exercise.fs +250 -0
  343. data/tracks/fsharp/generators/Generators.fs +210 -0
  344. data/tracks/fsharp/generators/Generators.fsproj +32 -0
  345. data/tracks/fsharp/generators/Generators.sln +24 -0
  346. data/tracks/fsharp/generators/Input.fs +99 -0
  347. data/tracks/fsharp/generators/Options.fs +31 -0
  348. data/tracks/fsharp/generators/Output.fs +224 -0
  349. data/tracks/fsharp/generators/Program.fs +35 -0
  350. data/tracks/fsharp/generators/Properties/launchSettings.json +8 -0
  351. data/tracks/fsharp/generators/Templates/_AssertEmpty.liquid +1 -0
  352. data/tracks/fsharp/generators/Templates/_AssertEqual.liquid +1 -0
  353. data/tracks/fsharp/generators/Templates/_TestClass.liquid +13 -0
  354. data/tracks/fsharp/generators/Templates/_TestMethod.liquid +3 -0
  355. data/tracks/fsharp/generators/Templates/_TestMethodBody.liquid +4 -0
  356. data/tracks/go/.travis.yml +3 -3
  357. data/tracks/groovy/CONTRIBUTING.md +2 -2
  358. data/tracks/groovy/config.json +12 -0
  359. data/tracks/groovy/exercises/scrabble-score/Example.groovy +18 -0
  360. data/tracks/groovy/exercises/scrabble-score/README.md +63 -0
  361. data/tracks/groovy/exercises/scrabble-score/ScrabbleScore.groovy +7 -0
  362. data/tracks/groovy/exercises/scrabble-score/ScrabbleScoreSpec.groovy +45 -0
  363. data/tracks/groovy/exercises/two-fer/TwoFer.groovy +2 -2
  364. data/tracks/haskell/exercises/change/README.md +1 -1
  365. data/tracks/haskell/exercises/lens-person/README.md +1 -1
  366. data/tracks/haskell/exercises/palindrome-products/README.md +5 -12
  367. data/tracks/haskell/exercises/sum-of-multiples/README.md +0 -3
  368. data/tracks/idris/config.json +12 -0
  369. data/tracks/idris/exercises/accumulate/Accumulate.ipkg +5 -0
  370. data/tracks/idris/exercises/accumulate/Makefile +23 -0
  371. data/tracks/idris/exercises/accumulate/README.md +32 -0
  372. data/tracks/idris/exercises/accumulate/src/Example.idr +6 -0
  373. data/tracks/idris/exercises/accumulate/src/Test/Accumulate.idr +35 -0
  374. data/tracks/java/config/maintainers.json +4 -7
  375. data/tracks/java/config.json +99 -22
  376. data/tracks/java/exercises/binary-search-tree/.meta/src/reference/java/{BST.java → BinarySearchTree.java} +1 -1
  377. data/tracks/java/exercises/binary-search-tree/src/test/java/{BSTTest.java → BinarySearchTreeTest.java} +34 -36
  378. data/tracks/java/exercises/robot-simulator/src/main/java/GridPosition.java +19 -15
  379. data/tracks/java/exercises/saddle-points/.meta/src/reference/java/MatrixCoordinate.java +7 -1
  380. data/tracks/java/exercises/saddle-points/src/main/java/MatrixCoordinate.java +7 -1
  381. data/tracks/java/exercises/settings.gradle +1 -0
  382. data/tracks/java/exercises/tournament/.meta/src/reference/java/Result.java +5 -0
  383. data/tracks/java/exercises/tournament/.meta/src/reference/java/TeamResult.java +41 -0
  384. data/tracks/java/exercises/tournament/.meta/src/reference/java/Tournament.java +62 -0
  385. data/tracks/java/exercises/tournament/README.md +78 -0
  386. data/tracks/java/exercises/tournament/build.gradle +18 -0
  387. data/tracks/java/{.Rhistory → exercises/tournament/src/main/java/.keep} +0 -0
  388. data/tracks/java/exercises/tournament/src/test/java/TournamentTest.java +160 -0
  389. data/tracks/php/config.json +14 -0
  390. data/tracks/php/exercises/collatz-conjecture/collatz-conjecture_test.php +44 -0
  391. data/tracks/php/exercises/collatz-conjecture/example.php +18 -0
  392. data/tracks/python/exercises/circular-buffer/circular_buffer.py +1 -1
  393. data/tracks/python/exercises/clock/clock.py +1 -1
  394. data/tracks/python/exercises/etl/etl.py +1 -1
  395. data/tracks/python/exercises/grade-school/grade_school.py +1 -1
  396. data/tracks/python/exercises/grains/grains.py +2 -2
  397. data/tracks/python/exercises/kindergarten-garden/kindergarten_garden.py +1 -1
  398. data/tracks/python/exercises/linked-list/linked_list.py +1 -1
  399. data/tracks/python/exercises/rectangles/rectangles.py +1 -1
  400. data/tracks/python/exercises/sum-of-multiples/sum_of_multiples.py +1 -1
  401. data/tracks/rust/exercises/bob/tests/bob.rs +1 -0
  402. data/tracks/rust/exercises/crypto-square/tests/crypto-square.rs +7 -0
  403. data/tracks/rust/exercises/gigasecond/tests/gigasecond.rs +1 -1
  404. data/tracks/rust/exercises/phone-number/Cargo.lock +1 -1
  405. data/tracks/rust/exercises/phone-number/Cargo.toml +1 -1
  406. data/tracks/rust/exercises/phone-number/example.rs +17 -23
  407. data/tracks/rust/exercises/phone-number/tests/phone-number.rs +31 -40
  408. data/tracks/rust/exercises/say/tests/say.rs +2 -0
  409. data/tracks/rust/exercises/sum-of-multiples/README.md +0 -3
  410. data/tracks/scala/config.json +11 -0
  411. data/tracks/scala/exercises/collatz-conjecture/README.md +43 -0
  412. data/tracks/scala/exercises/collatz-conjecture/build.sbt +3 -0
  413. data/tracks/scala/exercises/collatz-conjecture/example.scala +17 -0
  414. data/tracks/scala/exercises/collatz-conjecture/src/main/scala/.keep +0 -0
  415. data/tracks/scala/exercises/collatz-conjecture/src/test/scala/CollatzConjectureTest.scala +34 -0
  416. data/tracks/scala/testgen/src/main/scala/CollatzConjectureTestGenerator.scala +35 -0
  417. data/tracks/scheme/config.json +8 -0
  418. data/tracks/scheme/exercises/word-count/README.md +19 -0
  419. data/tracks/scheme/exercises/word-count/example.scm +27 -0
  420. data/tracks/scheme/exercises/word-count/word-count-test.scm +90 -0
  421. data/tracks/scheme/exercises/word-count/word-count.scm +5 -0
  422. data/tracks/sml/README.md +20 -1
  423. data/tracks/sml/bin/generate +74 -20
  424. data/tracks/sml/exercises/binary/README.md +23 -5
  425. data/tracks/sml/exercises/binary/binary.sml +2 -0
  426. data/tracks/sml/exercises/binary/example.sml +10 -21
  427. data/tracks/sml/exercises/binary/test.sml +55 -30
  428. data/tracks/sml/exercises/binary/testlib.sml +159 -0
  429. data/tracks/sml/exercises/flatten-array/HINTS.md +8 -0
  430. data/tracks/sml/exercises/flatten-array/README.md +31 -6
  431. data/tracks/sml/exercises/flatten-array/example.sml +3 -4
  432. data/tracks/sml/exercises/flatten-array/flatten-array.sml +4 -5
  433. data/tracks/sml/exercises/flatten-array/test.sml +76 -52
  434. data/tracks/sml/exercises/flatten-array/testlib.sml +159 -0
  435. data/tracks/sml/exercises/nth-prime/HINTS.md +9 -0
  436. data/tracks/sml/exercises/nth-prime/README.md +32 -5
  437. data/tracks/sml/exercises/nth-prime/example.sml +28 -46
  438. data/tracks/sml/exercises/nth-prime/nth-prime.sml +1 -1
  439. data/tracks/sml/exercises/nth-prime/test.sml +19 -63
  440. data/tracks/sml/exercises/nth-prime/testlib.sml +159 -0
  441. data/tracks/sml/exercises/raindrops/README.md +21 -5
  442. data/tracks/typescript/config.json +14 -0
  443. data/tracks/typescript/exercises/triangle/README.md +55 -0
  444. data/tracks/typescript/exercises/triangle/package.json +36 -0
  445. data/tracks/typescript/exercises/triangle/triangle.example.ts +56 -0
  446. data/tracks/typescript/exercises/triangle/triangle.test.ts +79 -0
  447. data/tracks/typescript/exercises/triangle/triangle.ts +12 -0
  448. data/tracks/typescript/exercises/triangle/tsconfig.json +22 -0
  449. data/tracks/typescript/exercises/triangle/tslint.json +127 -0
  450. data/tracks/typescript/exercises/triangle/yarn.lock +2305 -0
  451. metadata +85 -6
  452. data/tracks/d/exercises/crypto-square/.dub/dub.json +0 -6
@@ -10,8 +10,8 @@
10
10
 
11
11
  <ItemGroup>
12
12
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
13
- <PackageReference Include="xunit" Version="2.2.0" />
14
- <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
13
+ <PackageReference Include="xunit" Version="2.3.0" />
14
+ <PackageReference Include="xunit.runner.visualstudio" Version="2.3.0" />
15
15
  </ItemGroup>
16
16
 
17
17
  </Project>
@@ -10,8 +10,8 @@
10
10
 
11
11
  <ItemGroup>
12
12
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
13
- <PackageReference Include="xunit" Version="2.2.0" />
14
- <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
13
+ <PackageReference Include="xunit" Version="2.3.0" />
14
+ <PackageReference Include="xunit.runner.visualstudio" Version="2.3.0" />
15
15
  </ItemGroup>
16
16
 
17
17
  </Project>
@@ -10,8 +10,8 @@
10
10
 
11
11
  <ItemGroup>
12
12
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
13
- <PackageReference Include="xunit" Version="2.2.0" />
14
- <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
13
+ <PackageReference Include="xunit" Version="2.3.0" />
14
+ <PackageReference Include="xunit.runner.visualstudio" Version="2.3.0" />
15
15
  </ItemGroup>
16
16
 
17
17
  </Project>
@@ -10,8 +10,8 @@
10
10
 
11
11
  <ItemGroup>
12
12
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
13
- <PackageReference Include="xunit" Version="2.2.0" />
14
- <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
13
+ <PackageReference Include="xunit" Version="2.3.0" />
14
+ <PackageReference Include="xunit.runner.visualstudio" Version="2.3.0" />
15
15
  </ItemGroup>
16
16
 
17
17
  </Project>
@@ -10,8 +10,8 @@
10
10
 
11
11
  <ItemGroup>
12
12
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
13
- <PackageReference Include="xunit" Version="2.2.0" />
14
- <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
13
+ <PackageReference Include="xunit" Version="2.3.0" />
14
+ <PackageReference Include="xunit.runner.visualstudio" Version="2.3.0" />
15
15
  </ItemGroup>
16
16
 
17
17
  </Project>
@@ -1,12 +1,5 @@
1
1
  using System;
2
2
 
3
- public enum TriangleKind
4
- {
5
- Equilateral,
6
- Isosceles,
7
- Scalene
8
- }
9
-
10
3
  public static class Triangle
11
4
  {
12
5
  public static bool IsScalene(double side1, double side2, double side3)
@@ -24,10 +17,6 @@ public static class Triangle
24
17
  throw new NotImplementedException("You need to implement this function.");
25
18
  }
26
19
 
27
- private static TriangleKind Kind(double side1, double side2, double side3)
28
- {
29
- throw new NotImplementedException("You need to implement this function.");
30
- }
31
20
  }
32
21
 
33
22
  public class TriangleException : Exception { }
@@ -10,8 +10,8 @@
10
10
 
11
11
  <ItemGroup>
12
12
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
13
- <PackageReference Include="xunit" Version="2.2.0" />
14
- <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
13
+ <PackageReference Include="xunit" Version="2.3.0" />
14
+ <PackageReference Include="xunit.runner.visualstudio" Version="2.3.0" />
15
15
  </ItemGroup>
16
16
 
17
17
  </Project>
@@ -7,102 +7,102 @@ public class TriangleTest
7
7
  [Fact]
8
8
  public void Returns_true_if_the_triangle_is_equilateral_true_if_all_sides_are_equal()
9
9
  {
10
- Assert.True(Triangle.IsEquilateral(2,2,2));
10
+ Assert.True(Triangle.IsEquilateral(2, 2, 2));
11
11
  }
12
12
 
13
13
  [Fact(Skip = "Remove to run test")]
14
14
  public void Returns_true_if_the_triangle_is_equilateral_false_if_any_side_is_unequal()
15
15
  {
16
- Assert.False(Triangle.IsEquilateral(2,3,2));
16
+ Assert.False(Triangle.IsEquilateral(2, 3, 2));
17
17
  }
18
18
 
19
19
  [Fact(Skip = "Remove to run test")]
20
20
  public void Returns_true_if_the_triangle_is_equilateral_false_if_no_sides_are_equal()
21
21
  {
22
- Assert.False(Triangle.IsEquilateral(5,4,6));
22
+ Assert.False(Triangle.IsEquilateral(5, 4, 6));
23
23
  }
24
24
 
25
25
  [Fact(Skip = "Remove to run test")]
26
26
  public void Returns_true_if_the_triangle_is_equilateral_all_zero_sides_are_illegal_so_the_triangle_is_not_equilateral()
27
27
  {
28
- Assert.False(Triangle.IsEquilateral(0,0,0));
28
+ Assert.False(Triangle.IsEquilateral(0, 0, 0));
29
29
  }
30
30
 
31
31
  [Fact(Skip = "Remove to run test")]
32
32
  public void Returns_true_if_the_triangle_is_equilateral_sides_may_be_floats()
33
33
  {
34
- Assert.True(Triangle.IsEquilateral(0.5,0.5,0.5));
34
+ Assert.True(Triangle.IsEquilateral(0.5, 0.5, 0.5));
35
35
  }
36
36
 
37
37
  [Fact(Skip = "Remove to run test")]
38
38
  public void Returns_true_if_the_triangle_is_isosceles_true_if_last_two_sides_are_equal()
39
39
  {
40
- Assert.True(Triangle.IsIsosceles(3,4,4));
40
+ Assert.True(Triangle.IsIsosceles(3, 4, 4));
41
41
  }
42
42
 
43
43
  [Fact(Skip = "Remove to run test")]
44
44
  public void Returns_true_if_the_triangle_is_isosceles_true_if_first_two_sides_are_equal()
45
45
  {
46
- Assert.True(Triangle.IsIsosceles(4,4,3));
46
+ Assert.True(Triangle.IsIsosceles(4, 4, 3));
47
47
  }
48
48
 
49
49
  [Fact(Skip = "Remove to run test")]
50
50
  public void Returns_true_if_the_triangle_is_isosceles_true_if_first_and_last_sides_are_equal()
51
51
  {
52
- Assert.True(Triangle.IsIsosceles(4,3,4));
52
+ Assert.True(Triangle.IsIsosceles(4, 3, 4));
53
53
  }
54
54
 
55
55
  [Fact(Skip = "Remove to run test")]
56
56
  public void Returns_true_if_the_triangle_is_isosceles_equilateral_triangles_are_also_isosceles()
57
57
  {
58
- Assert.True(Triangle.IsIsosceles(4,4,4));
58
+ Assert.True(Triangle.IsIsosceles(4, 4, 4));
59
59
  }
60
60
 
61
61
  [Fact(Skip = "Remove to run test")]
62
62
  public void Returns_true_if_the_triangle_is_isosceles_false_if_no_sides_are_equal()
63
63
  {
64
- Assert.False(Triangle.IsIsosceles(2,3,4));
64
+ Assert.False(Triangle.IsIsosceles(2, 3, 4));
65
65
  }
66
66
 
67
67
  [Fact(Skip = "Remove to run test")]
68
68
  public void Returns_true_if_the_triangle_is_isosceles_sides_that_violate_triangle_inequality_are_not_isosceles_even_if_two_are_equal()
69
69
  {
70
- Assert.False(Triangle.IsIsosceles(1,1,3));
70
+ Assert.False(Triangle.IsIsosceles(1, 1, 3));
71
71
  }
72
72
 
73
73
  [Fact(Skip = "Remove to run test")]
74
74
  public void Returns_true_if_the_triangle_is_isosceles_sides_may_be_floats()
75
75
  {
76
- Assert.True(Triangle.IsIsosceles(0.5,0.4,0.5));
76
+ Assert.True(Triangle.IsIsosceles(0.5, 0.4, 0.5));
77
77
  }
78
78
 
79
79
  [Fact(Skip = "Remove to run test")]
80
80
  public void Returns_true_if_the_triangle_is_scalene_true_if_no_sides_are_equal()
81
81
  {
82
- Assert.True(Triangle.IsScalene(5,4,6));
82
+ Assert.True(Triangle.IsScalene(5, 4, 6));
83
83
  }
84
84
 
85
85
  [Fact(Skip = "Remove to run test")]
86
86
  public void Returns_true_if_the_triangle_is_scalene_false_if_all_sides_are_equal()
87
87
  {
88
- Assert.False(Triangle.IsScalene(4,4,4));
88
+ Assert.False(Triangle.IsScalene(4, 4, 4));
89
89
  }
90
90
 
91
91
  [Fact(Skip = "Remove to run test")]
92
92
  public void Returns_true_if_the_triangle_is_scalene_false_if_two_sides_are_equal()
93
93
  {
94
- Assert.False(Triangle.IsScalene(4,4,3));
94
+ Assert.False(Triangle.IsScalene(4, 4, 3));
95
95
  }
96
96
 
97
97
  [Fact(Skip = "Remove to run test")]
98
98
  public void Returns_true_if_the_triangle_is_scalene_sides_that_violate_triangle_inequality_are_not_scalene_even_if_they_are_all_different()
99
99
  {
100
- Assert.False(Triangle.IsScalene(7,3,2));
100
+ Assert.False(Triangle.IsScalene(7, 3, 2));
101
101
  }
102
102
 
103
103
  [Fact(Skip = "Remove to run test")]
104
104
  public void Returns_true_if_the_triangle_is_scalene_sides_may_be_floats()
105
105
  {
106
- Assert.True(Triangle.IsScalene(0.5,0.4,0.6));
106
+ Assert.True(Triangle.IsScalene(0.5, 0.4, 0.6));
107
107
  }
108
108
  }
@@ -10,8 +10,8 @@
10
10
 
11
11
  <ItemGroup>
12
12
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
13
- <PackageReference Include="xunit" Version="2.2.0" />
14
- <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
13
+ <PackageReference Include="xunit" Version="2.3.0" />
14
+ <PackageReference Include="xunit.runner.visualstudio" Version="2.3.0" />
15
15
  </ItemGroup>
16
16
 
17
17
  </Project>
@@ -10,8 +10,8 @@
10
10
 
11
11
  <ItemGroup>
12
12
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
13
- <PackageReference Include="xunit" Version="2.2.0" />
14
- <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
13
+ <PackageReference Include="xunit" Version="2.3.0" />
14
+ <PackageReference Include="xunit.runner.visualstudio" Version="2.3.0" />
15
15
  </ItemGroup>
16
16
 
17
17
  </Project>
@@ -10,8 +10,8 @@
10
10
 
11
11
  <ItemGroup>
12
12
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
13
- <PackageReference Include="xunit" Version="2.2.0" />
14
- <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
13
+ <PackageReference Include="xunit" Version="2.3.0" />
14
+ <PackageReference Include="xunit.runner.visualstudio" Version="2.3.0" />
15
15
  </ItemGroup>
16
16
 
17
17
  </Project>
@@ -10,8 +10,8 @@
10
10
 
11
11
  <ItemGroup>
12
12
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
13
- <PackageReference Include="xunit" Version="2.2.0" />
14
- <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
13
+ <PackageReference Include="xunit" Version="2.3.0" />
14
+ <PackageReference Include="xunit.runner.visualstudio" Version="2.3.0" />
15
15
  </ItemGroup>
16
16
 
17
17
  </Project>
@@ -10,8 +10,8 @@
10
10
 
11
11
  <ItemGroup>
12
12
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
13
- <PackageReference Include="xunit" Version="2.2.0" />
14
- <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
13
+ <PackageReference Include="xunit" Version="2.3.0" />
14
+ <PackageReference Include="xunit.runner.visualstudio" Version="2.3.0" />
15
15
  </ItemGroup>
16
16
 
17
17
  </Project>
@@ -10,8 +10,8 @@
10
10
 
11
11
  <ItemGroup>
12
12
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
13
- <PackageReference Include="xunit" Version="2.2.0" />
14
- <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
13
+ <PackageReference Include="xunit" Version="2.3.0" />
14
+ <PackageReference Include="xunit.runner.visualstudio" Version="2.3.0" />
15
15
  </ItemGroup>
16
16
 
17
17
  </Project>
@@ -10,8 +10,8 @@
10
10
 
11
11
  <ItemGroup>
12
12
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
13
- <PackageReference Include="xunit" Version="2.2.0" />
14
- <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
13
+ <PackageReference Include="xunit" Version="2.3.0" />
14
+ <PackageReference Include="xunit.runner.visualstudio" Version="2.3.0" />
15
15
  </ItemGroup>
16
16
 
17
17
  </Project>
@@ -10,8 +10,8 @@
10
10
 
11
11
  <ItemGroup>
12
12
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
13
- <PackageReference Include="xunit" Version="2.2.0" />
14
- <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
13
+ <PackageReference Include="xunit" Version="2.3.0" />
14
+ <PackageReference Include="xunit.runner.visualstudio" Version="2.3.0" />
15
15
  </ItemGroup>
16
16
 
17
17
  </Project>
@@ -10,8 +10,8 @@
10
10
 
11
11
  <ItemGroup>
12
12
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
13
- <PackageReference Include="xunit" Version="2.2.0" />
14
- <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
13
+ <PackageReference Include="xunit" Version="2.3.0" />
14
+ <PackageReference Include="xunit.runner.visualstudio" Version="2.3.0" />
15
15
  </ItemGroup>
16
16
 
17
17
  </Project>
@@ -0,0 +1,47 @@
1
+ using System;
2
+ using System.Collections.Generic;
3
+ using Generators.Input;
4
+ using Generators.Output;
5
+
6
+ namespace Generators.Exercises
7
+ {
8
+ public class Connect : Exercise
9
+ {
10
+ protected override void UpdateCanonicalData(CanonicalData canonicalData)
11
+ {
12
+ foreach (var canonicalDataCase in canonicalData.Cases)
13
+ {
14
+ canonicalDataCase.UseVariablesForConstructorParameters = true;
15
+ canonicalDataCase.SetConstructorInputParameters("board");
16
+ canonicalDataCase.Property = "result";
17
+ canonicalDataCase.Properties["board"] = ToMultiLineString(canonicalDataCase.Properties["board"]);
18
+
19
+ //convert to enum
20
+ switch (canonicalDataCase.Properties["expected"])
21
+ {
22
+ case "X":
23
+ canonicalDataCase.Properties["expected"] = new UnescapedValue("ConnectWinner.Black");
24
+ break;
25
+ case "O":
26
+ canonicalDataCase.Properties["expected"] = new UnescapedValue("ConnectWinner.White");
27
+ break;
28
+ case "":
29
+ canonicalDataCase.Properties["expected"] = new UnescapedValue("ConnectWinner.None");
30
+ break;
31
+ }
32
+ }
33
+ }
34
+
35
+ private UnescapedValue ToMultiLineString(string[] input)
36
+ {
37
+ const string template =
38
+ @"new []
39
+ {
40
+ {% if input.size == 0 %}string.Empty{% else %}{% for item in {{input}} %}{% if forloop.length == 1 %}""{{item}}""{% break %}{% endif %}""{{item}}""{% if forloop.last == false %},{% else %}{{string.Empty}}{% endif %}
41
+ {% endfor %}{% endif %}
42
+ }";
43
+
44
+ return new UnescapedValue(TemplateRenderer.RenderInline(template, new { input }));
45
+ }
46
+ }
47
+ }
@@ -26,7 +26,7 @@ namespace Generators.Exercises
26
26
 
27
27
  private UnescapedValue SplitArrayToValues(IEnumerable input)
28
28
  {
29
- const string template = "{% for item in {{input}} %}{{item}}{% if forloop.last == false %},{% endif %}{% endfor %}";
29
+ const string template = "{% for item in {{input}} %}{{item}}{% if forloop.last == false %}, {% endif %}{% endfor %}";
30
30
 
31
31
  return new UnescapedValue(TemplateRenderer.RenderInline(template, new { input }));
32
32
  }
@@ -2,7 +2,6 @@
2
2
  "docs_url": "https://github.com/exercism/docs/blob/master/maintaining-a-track/maintainer-configuration.md",
3
3
  "maintainers": [
4
4
  {
5
- "alumnus": false,
6
5
  "avatar_url": null,
7
6
  "bio": null,
8
7
  "github_username": "SuperPaintman",
@@ -10,6 +9,33 @@
10
9
  "link_url": null,
11
10
  "name": null,
12
11
  "show_on_website": false
12
+ },
13
+ {
14
+ "avatar_url": "https://avatars0.githubusercontent.com/u/7527155?v=4&s=460",
15
+ "bio": null,
16
+ "github_username": "Stargator",
17
+ "link_text": null,
18
+ "link_url": null,
19
+ "name": null,
20
+ "show_on_website": true
21
+ },
22
+ {
23
+ "avatar_url": "https://avatars3.githubusercontent.com/u/190414?v=4&s=460",
24
+ "bio": null,
25
+ "github_username": "fwip",
26
+ "link_text": null,
27
+ "link_url": null,
28
+ "name": null,
29
+ "show_on_website": false
30
+ },
31
+ {
32
+ "avatar_url": "https://avatars1.githubusercontent.com/u/18462563?v=4&s=460",
33
+ "bio": null,
34
+ "github_username": "kabiir",
35
+ "link_text": null,
36
+ "link_url": null,
37
+ "name": null,
38
+ "show_on_website": true
13
39
  }
14
40
  ]
15
41
  }
@@ -1,6 +1,9 @@
1
1
  name: exercism_dart
2
2
  authors:
3
3
  - SuperPaintman <SuperPaintmanDeveloper@gmail.com>
4
+ - Stargator <wildbug@linuxmail.org>
5
+ - fwip
6
+ - kabiir
4
7
  dev_dependencies:
5
8
  args: '0.13.7'
6
9
  dart_style: '>=1.0.8 <2.0.0'
@@ -3,12 +3,15 @@
3
3
 
4
4
  import "dart:io";
5
5
  import "dart:async";
6
+ import "dart:convert";
6
7
  import "package:args/args.dart";
7
8
 
8
9
  /** Constants */
9
10
  const ME = "create-exercise";
10
11
 
11
- final parser = new ArgParser()..addSeparator("Usage: $ME <slug>");
12
+ final parser = new ArgParser()
13
+ ..addSeparator("Usage: $ME <slug> [--spec-path path]")
14
+ ..addOption("spec-path", help: "The location of the problem-specifications directory.", valueHelp: 'path');
12
15
 
13
16
  /** Helpers */
14
17
  List<String> words(String str) {
@@ -54,6 +57,11 @@ class ${pascalCase(name)} {
54
57
  }
55
58
  """;
56
59
 
60
+ String testCasesString = """
61
+ test("should work", () {
62
+ // TODO
63
+ });""";
64
+
57
65
  String testTemplate(String name) => """
58
66
  import "package:test/test.dart";
59
67
  import "package:${snakeCase(name)}/${snakeCase(name)}.dart";
@@ -62,9 +70,7 @@ void main() {
62
70
  final ${camelCase(name)} = new ${pascalCase(name)}();
63
71
 
64
72
  group("${pascalCase(name)}", () {
65
- test("should work", () {
66
- // TODO
67
- });
73
+ $testCasesString
68
74
  });
69
75
  }
70
76
  """;
@@ -75,6 +81,103 @@ dev_dependencies:
75
81
  test: '<0.13.0'
76
82
  """;
77
83
 
84
+ String testCaseTemplate(String name, Map<String, Object> testCase, {bool firstTest = true}) {
85
+ if (testCase['cases'] != null) {
86
+ // We have a group, not a case
87
+ String description = testCase['description'];
88
+
89
+ // Build the tests up recursively, only first test should be skipped
90
+ List<String> testList = [];
91
+ for (Map<String, Object> c in testCase['cases']) {
92
+ testList.add(testCaseTemplate(name, c, firstTest: firstTest));
93
+ firstTest = false;
94
+ }
95
+ String tests = testList.join("\n");
96
+
97
+ if (description == null) {
98
+ return tests;
99
+ }
100
+
101
+ return """
102
+ group("$description", () {
103
+ $tests
104
+ });
105
+ """;
106
+ }
107
+
108
+ String description = repr(testCase['description']);
109
+ String resultType = getFriendlyType(testCase['expected']);
110
+ String object = camelCase(name);
111
+ String method = camelCase(testCase['property']);
112
+ String expected = repr(testCase['expected']);
113
+
114
+ List<String> inputKeys = testCase.keys.toList()..remove("expected")..remove("description")..remove("property");
115
+ String arguments = inputKeys.map((k) => repr(testCase[k])).join(", ");
116
+
117
+ return """
118
+ test($description, () {
119
+ final $resultType result = $object.$method($arguments);
120
+ expect(result, equals($expected));
121
+ }, skip: ${!firstTest});
122
+ """;
123
+ }
124
+
125
+ /// `repr` takes in any object and tries to coerce it to a String in such a way that it is suitable to include in code.
126
+ /// Based on the python `repr` function, but only works for basic types: String, Iterable, Map, and primitive types
127
+ String repr(Object x) {
128
+ if (x is String) {
129
+ x = x.replaceAll('"', r'\"').replaceAll("\n", r"\n").replaceAll(r"$", r"\$");
130
+ return '"$x"';
131
+ }
132
+
133
+ if (x is Iterable) {
134
+ return '[${x.map(repr).join(", ")}]';
135
+ }
136
+
137
+ if (x is Map) {
138
+ List<String> pairs = [];
139
+ for (var k in x.keys) {
140
+ pairs.add("${repr(k)}: ${repr(x[k])}");
141
+ }
142
+
143
+ return "{${pairs.join(', ')}}";
144
+ }
145
+
146
+ return "$x";
147
+ }
148
+
149
+ /// A helper method to get the inside type of an iterable
150
+ String getIterableType(Object iter) {
151
+ Set<String> types = iter.map(getFriendlyType).toSet();
152
+
153
+ if (types.length == 1) {
154
+ return types.first;
155
+ }
156
+
157
+ return "Object";
158
+ }
159
+
160
+ /// Get a human-friendly type of a variable
161
+ String getFriendlyType(Object x) {
162
+ if (x is String) {
163
+ return "String";
164
+ }
165
+
166
+ if (x is Iterable) {
167
+ return "List<${getIterableType(x)}>";
168
+ }
169
+
170
+ if (x is Map) {
171
+ return "Map<${getIterableType(x.keys)}, ${getIterableType(x.values)}>";
172
+ }
173
+
174
+ if (x is num) {
175
+ return "num";
176
+ }
177
+
178
+ return x.runtimeType;
179
+ }
180
+
78
181
  Future main(args) async {
79
182
  final arguments = parser.parse(args);
80
183
  final restArgs = arguments.rest;
@@ -91,6 +194,22 @@ Future main(args) async {
91
194
  final exerciseDir = new Directory("exercises/${kebabCase(name)}");
92
195
  final filename = snakeCase(name);
93
196
 
197
+ // Get test cases from canonical-data.json, format tests
198
+ if (arguments["spec-path"] != null) {
199
+ String filename = "${arguments['spec-path']}/exercises/$name/canonical-data.json";
200
+ try {
201
+ File file = new File(filename);
202
+ final specification = JSON.decode(await file.readAsString());
203
+ testCasesString = testCaseTemplate(name, specification);
204
+ } on FileSystemException {
205
+ stderr.write("Could not open file '$filename', exiting.\n");
206
+ exit(1);
207
+ } on FormatException {
208
+ stderr.write("File '$filename' is not valid JSON, exiting.\n");
209
+ exit(1);
210
+ }
211
+ }
212
+
94
213
  if (await exerciseDir.exists()) {
95
214
  stderr.write("$name already exist");
96
215
  exit(1);
@@ -100,11 +219,31 @@ Future main(args) async {
100
219
  await new Directory("${exerciseDir.path}/test").create(recursive: true);
101
220
 
102
221
  // Create files
222
+ String testFileName = "${exerciseDir.path}/test/${filename}_test.dart";
103
223
  await new File("${exerciseDir.path}/lib/example.dart").writeAsString(exampleTemplate(name));
104
224
  await new File("${exerciseDir.path}/lib/${filename}.dart").writeAsString(mainTemplate(name));
105
- await new File("${exerciseDir.path}/test/${filename}_test.dart").writeAsString(testTemplate(name));
225
+ await new File(testFileName).writeAsString(testTemplate(name));
106
226
  await new File("${exerciseDir.path}/pubspec.yaml").writeAsString(pubTemplate(name));
107
227
 
228
+ if (arguments["spec-path"] != null) {
229
+ // The output from test generation is not always well-formatted, use dartfmt to clean it up
230
+ final res = await Process.run("dartfmt", ["-l", "120", "-w", testFileName], runInShell: true);
231
+ if (!res.stdout.toString().isEmpty) {
232
+ stdout.write(res.stdout);
233
+ }
234
+
235
+ if (!res.stderr.toString().isEmpty) {
236
+ stderr.write(res.stderr);
237
+ }
238
+
239
+ if (res.exitCode != 0) {
240
+ stderr.write("Warning: dartfmt exited with a code of ${res.exitCode}, '$testFileName' is likely malformed.\n");
241
+ } else {
242
+ stdout.write("Successfully created a rough-draft of tests at '$testFileName'.\n");
243
+ stdout.write("You should check this over and fix or refine as necessary.\n");
244
+ }
245
+ }
246
+
108
247
  // Install deps
109
248
  Directory.current = exerciseDir;
110
249
 
@@ -0,0 +1 @@
1
+ * text=auto
@@ -8,12 +8,18 @@ case $(uname) in
8
8
  echo "linux";;
9
9
  (Windows*)
10
10
  echo "windows";;
11
+ (MINGW*)
12
+ echo "windows";;
11
13
  (*)
12
14
  echo "linux";;
13
15
  esac)
14
16
 
15
- URL=https://github.com/avh4/elm-format/releases/download/0.6.1-alpha/elm-format-0.18-0.6.1-alpha-$OS-x64.tgz
16
-
17
- curl -L $URL | tar -xvzO > bin/elm-format
17
+ if [ "$OS" == "windows" ]; then
18
+ URL=https://github.com/avh4/elm-format/releases/download/0.6.1-alpha/elm-format-0.18-0.6.1-alpha-win-i386.zip
19
+ curl -L $URL | funzip > bin/elm-format
20
+ else
21
+ URL=https://github.com/avh4/elm-format/releases/download/0.6.1-alpha/elm-format-0.18-0.6.1-alpha-$OS-x64.tgz
22
+ curl -L $URL | tar -xvzO > bin/elm-format
23
+ fi
18
24
 
19
25
  chmod u+x bin/elm-format