trackler 2.2.1.64 → 2.2.1.65

Sign up to get free protection for your applications and to get access to all the features.
Files changed (393) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/all-your-base/canonical-data.json +7 -7
  4. data/tracks/c/config.json +1 -1
  5. data/tracks/csharp/config.json +10 -0
  6. data/tracks/csharp/docs/GENERATORS.md +3 -3
  7. data/tracks/csharp/exercises/Exercises.sln +8 -2
  8. data/tracks/csharp/exercises/accumulate/Accumulate.csproj +3 -3
  9. data/tracks/csharp/exercises/acronym/Acronym.csproj +3 -3
  10. data/tracks/csharp/exercises/all-your-base/AllYourBase.csproj +3 -3
  11. data/tracks/csharp/exercises/allergies/Allergies.csproj +3 -3
  12. data/tracks/csharp/exercises/alphametics/Alphametics.csproj +3 -3
  13. data/tracks/csharp/exercises/anagram/Anagram.csproj +3 -3
  14. data/tracks/csharp/exercises/atbash-cipher/AtbashCipher.csproj +3 -3
  15. data/tracks/csharp/exercises/bank-account/BankAccount.csproj +3 -3
  16. data/tracks/csharp/exercises/beer-song/BeerSong.csproj +3 -3
  17. data/tracks/csharp/exercises/binary-search-tree/BinarySearchTree.csproj +3 -3
  18. data/tracks/csharp/exercises/binary-search/BinarySearch.csproj +3 -3
  19. data/tracks/csharp/exercises/bob/Bob.csproj +3 -3
  20. data/tracks/csharp/exercises/book-store/BookStore.csproj +3 -3
  21. data/tracks/csharp/exercises/bowling/Bowling.csproj +3 -3
  22. data/tracks/csharp/exercises/bracket-push/BracketPush.csproj +3 -3
  23. data/tracks/csharp/exercises/change/Change.csproj +3 -3
  24. data/tracks/csharp/exercises/circular-buffer/CircularBuffer.csproj +3 -3
  25. data/tracks/csharp/exercises/clock/Clock.csproj +3 -3
  26. data/tracks/csharp/exercises/collatz-conjecture/CollatzConjecture.csproj +3 -3
  27. data/tracks/csharp/exercises/complex-numbers/ComplexNumbers.csproj +3 -3
  28. data/tracks/csharp/exercises/connect/Connect.csproj +3 -3
  29. data/tracks/csharp/exercises/crypto-square/CryptoSquare.csproj +3 -3
  30. data/tracks/csharp/exercises/custom-set/CustomSet.csproj +3 -3
  31. data/tracks/csharp/exercises/diamond/Diamond.csproj +3 -3
  32. data/tracks/csharp/exercises/difference-of-squares/DifferenceOfSquares.csproj +3 -3
  33. data/tracks/csharp/exercises/diffie-hellman/DiffieHellman.csproj +3 -3
  34. data/tracks/csharp/exercises/dominoes/Dominoes.csproj +3 -3
  35. data/tracks/csharp/exercises/dot-dsl/DotDsl.csproj +3 -3
  36. data/tracks/csharp/exercises/error-handling/ErrorHandling.csproj +3 -3
  37. data/tracks/csharp/exercises/etl/Etl.csproj +3 -3
  38. data/tracks/csharp/exercises/flatten-array/FlattenArray.csproj +3 -3
  39. data/tracks/csharp/exercises/food-chain/FoodChain.csproj +3 -3
  40. data/tracks/csharp/exercises/forth/Forth.csproj +3 -3
  41. data/tracks/csharp/exercises/gigasecond/Gigasecond.csproj +3 -3
  42. data/tracks/csharp/exercises/go-counting/GoCounting.csproj +3 -3
  43. data/tracks/csharp/exercises/grade-school/GradeSchool.csproj +3 -3
  44. data/tracks/csharp/exercises/grains/Grains.csproj +3 -3
  45. data/tracks/csharp/exercises/grep/Grep.csproj +3 -3
  46. data/tracks/csharp/exercises/hamming/Hamming.csproj +3 -3
  47. data/tracks/csharp/exercises/hangman/Hangman.csproj +3 -3
  48. data/tracks/csharp/exercises/hello-world/HelloWorld.csproj +3 -3
  49. data/tracks/csharp/exercises/house/House.csproj +3 -3
  50. data/tracks/csharp/exercises/isbn-verifier/IsbnVerifier.csproj +1 -1
  51. data/tracks/csharp/exercises/isogram/Isogram.csproj +3 -3
  52. data/tracks/csharp/exercises/kindergarten-garden/KindergartenGarden.csproj +3 -3
  53. data/tracks/csharp/exercises/largest-series-product/LargestSeriesProduct.csproj +3 -3
  54. data/tracks/csharp/exercises/leap/Leap.csproj +3 -3
  55. data/tracks/csharp/exercises/ledger/Ledger.csproj +3 -3
  56. data/tracks/csharp/exercises/linked-list/LinkedList.csproj +3 -3
  57. data/tracks/csharp/exercises/list-ops/ListOps.csproj +3 -3
  58. data/tracks/csharp/exercises/luhn/Luhn.csproj +3 -3
  59. data/tracks/csharp/exercises/markdown/Markdown.csproj +3 -3
  60. data/tracks/csharp/exercises/matrix/Matrix.csproj +3 -3
  61. data/tracks/csharp/exercises/meetup/Meetup.csproj +3 -3
  62. data/tracks/csharp/exercises/minesweeper/Minesweeper.csproj +3 -3
  63. data/tracks/csharp/exercises/nth-prime/NthPrime.csproj +3 -3
  64. data/tracks/csharp/exercises/nucleotide-count/NucleotideCount.csproj +3 -3
  65. data/tracks/csharp/exercises/ocr-numbers/OcrNumbers.csproj +3 -3
  66. data/tracks/csharp/exercises/palindrome-products/PalindromeProducts.csproj +3 -3
  67. data/tracks/csharp/exercises/pangram/Pangram.csproj +3 -3
  68. data/tracks/csharp/exercises/parallel-letter-frequency/ParallelLetterFrequency.csproj +3 -3
  69. data/tracks/csharp/exercises/pascals-triangle/PascalsTriangle.csproj +3 -3
  70. data/tracks/csharp/exercises/perfect-numbers/PerfectNumbers.csproj +3 -3
  71. data/tracks/csharp/exercises/phone-number/PhoneNumber.csproj +3 -3
  72. data/tracks/csharp/exercises/pig-latin/PigLatin.csproj +3 -3
  73. data/tracks/csharp/exercises/poker/Poker.csproj +3 -3
  74. data/tracks/csharp/exercises/pov/Pov.csproj +3 -3
  75. data/tracks/csharp/exercises/prime-factors/PrimeFactors.csproj +3 -3
  76. data/tracks/csharp/exercises/protein-translation/ProteinTranslation.csproj +3 -3
  77. data/tracks/csharp/exercises/proverb/Proverb.csproj +3 -3
  78. data/tracks/csharp/exercises/pythagorean-triplet/PythagoreanTriplet.csproj +3 -3
  79. data/tracks/csharp/exercises/queen-attack/QueenAttack.csproj +3 -3
  80. data/tracks/csharp/exercises/rail-fence-cipher/RailFenceCipher.csproj +3 -3
  81. data/tracks/csharp/exercises/raindrops/Raindrops.csproj +3 -3
  82. data/tracks/csharp/exercises/react/React.csproj +3 -3
  83. data/tracks/csharp/exercises/rectangles/Rectangles.csproj +3 -3
  84. data/tracks/csharp/exercises/reverse-string/Example.cs +10 -0
  85. data/tracks/csharp/exercises/reverse-string/README.md +3 -0
  86. data/tracks/csharp/exercises/reverse-string/ReverseString.cs +9 -0
  87. data/tracks/csharp/exercises/reverse-string/ReverseString.csproj +17 -0
  88. data/tracks/csharp/exercises/reverse-string/ReverseStringTest.cs +36 -0
  89. data/tracks/csharp/exercises/rna-transcription/RnaTranscription.csproj +3 -3
  90. data/tracks/csharp/exercises/robot-name/RobotName.csproj +3 -3
  91. data/tracks/csharp/exercises/robot-simulator/RobotSimulator.csproj +3 -3
  92. data/tracks/csharp/exercises/roman-numerals/RomanNumerals.csproj +3 -3
  93. data/tracks/csharp/exercises/rotational-cipher/RotationalCipher.csproj +3 -3
  94. data/tracks/csharp/exercises/run-length-encoding/RunLengthEncoding.csproj +3 -3
  95. data/tracks/csharp/exercises/saddle-points/SaddlePoints.csproj +3 -3
  96. data/tracks/csharp/exercises/say/Say.csproj +3 -3
  97. data/tracks/csharp/exercises/scale-generator/ScaleGenerator.csproj +3 -3
  98. data/tracks/csharp/exercises/scrabble-score/ScrabbleScore.csproj +3 -3
  99. data/tracks/csharp/exercises/secret-handshake/SecretHandshake.csproj +3 -3
  100. data/tracks/csharp/exercises/series/Series.csproj +3 -3
  101. data/tracks/csharp/exercises/sgf-parsing/SgfParsing.csproj +3 -3
  102. data/tracks/csharp/exercises/sieve/Sieve.csproj +3 -3
  103. data/tracks/csharp/exercises/simple-cipher/SimpleCipher.csproj +3 -3
  104. data/tracks/csharp/exercises/simple-linked-list/SimpleLinkedList.csproj +3 -3
  105. data/tracks/csharp/exercises/space-age/SpaceAge.csproj +3 -3
  106. data/tracks/csharp/exercises/spiral-matrix/SpiralMatrix.csproj +3 -3
  107. data/tracks/csharp/exercises/strain/Strain.csproj +3 -3
  108. data/tracks/csharp/exercises/sublist/Sublist.csproj +3 -3
  109. data/tracks/csharp/exercises/sum-of-multiples/SumOfMultiples.csproj +3 -3
  110. data/tracks/csharp/exercises/tournament/Tournament.csproj +3 -3
  111. data/tracks/csharp/exercises/transpose/Transpose.csproj +3 -3
  112. data/tracks/csharp/exercises/tree-building/TreeBuilding.csproj +3 -3
  113. data/tracks/csharp/exercises/triangle/Triangle.csproj +3 -3
  114. data/tracks/csharp/exercises/twelve-days/TwelveDays.csproj +3 -3
  115. data/tracks/csharp/exercises/two-bucket/TwoBucket.csproj +3 -3
  116. data/tracks/csharp/exercises/two-fer/TwoFer.csproj +3 -3
  117. data/tracks/csharp/exercises/variable-length-quantity/VariableLengthQuantity.csproj +3 -3
  118. data/tracks/csharp/exercises/word-count/WordCount.csproj +3 -3
  119. data/tracks/csharp/exercises/word-search/WordSearch.csproj +3 -3
  120. data/tracks/csharp/exercises/wordy/Wordy.csproj +3 -3
  121. data/tracks/csharp/exercises/zebra-puzzle/ZebraPuzzle.csproj +3 -3
  122. data/tracks/csharp/exercises/zipper/Zipper.csproj +3 -3
  123. data/tracks/csharp/generators/CustomExercise.cs +9 -0
  124. data/tracks/csharp/generators/Exercise.cs +3 -110
  125. data/tracks/csharp/generators/ExerciseCollection.cs +33 -14
  126. data/tracks/csharp/generators/Exercises/Acronym.cs +1 -1
  127. data/tracks/csharp/generators/Exercises/AllYourBase.cs +1 -1
  128. data/tracks/csharp/generators/Exercises/Allergies.cs +1 -1
  129. data/tracks/csharp/generators/Exercises/Alphametics.cs +1 -1
  130. data/tracks/csharp/generators/Exercises/Anagram.cs +1 -1
  131. data/tracks/csharp/generators/Exercises/AtbashCipher.cs +1 -1
  132. data/tracks/csharp/generators/Exercises/BeerSong.cs +1 -1
  133. data/tracks/csharp/generators/Exercises/BinarySearch.cs +1 -1
  134. data/tracks/csharp/generators/Exercises/Bob.cs +1 -1
  135. data/tracks/csharp/generators/Exercises/BookStore.cs +1 -1
  136. data/tracks/csharp/generators/Exercises/Bowling.cs +1 -2
  137. data/tracks/csharp/generators/Exercises/BracketPush.cs +1 -1
  138. data/tracks/csharp/generators/Exercises/Clock.cs +1 -1
  139. data/tracks/csharp/generators/Exercises/CollatzConjecture.cs +1 -1
  140. data/tracks/csharp/generators/Exercises/ComplexNumbers.cs +1 -1
  141. data/tracks/csharp/generators/Exercises/Connect.cs +2 -4
  142. data/tracks/csharp/generators/Exercises/CryptoSquare.cs +1 -1
  143. data/tracks/csharp/generators/Exercises/Diamond.cs +9 -0
  144. data/tracks/csharp/generators/Exercises/DifferenceOfSquares.cs +1 -2
  145. data/tracks/csharp/generators/Exercises/Dominoes.cs +1 -1
  146. data/tracks/csharp/generators/Exercises/Etl.cs +1 -1
  147. data/tracks/csharp/generators/Exercises/FlattenArray.cs +1 -2
  148. data/tracks/csharp/generators/Exercises/FoodChain.cs +1 -1
  149. data/tracks/csharp/generators/Exercises/Gigasecond.cs +1 -1
  150. data/tracks/csharp/generators/Exercises/Grains.cs +1 -1
  151. data/tracks/csharp/generators/Exercises/Hamming.cs +1 -1
  152. data/tracks/csharp/generators/Exercises/HelloWorld.cs +1 -1
  153. data/tracks/csharp/generators/Exercises/House.cs +1 -1
  154. data/tracks/csharp/generators/Exercises/IsbnVerifier.cs +2 -4
  155. data/tracks/csharp/generators/Exercises/Isogram.cs +1 -1
  156. data/tracks/csharp/generators/Exercises/KindergartenGarden.cs +1 -1
  157. data/tracks/csharp/generators/Exercises/LargestSeriesProduct.cs +1 -1
  158. data/tracks/csharp/generators/Exercises/Leap.cs +1 -1
  159. data/tracks/csharp/generators/Exercises/Luhn.cs +1 -1
  160. data/tracks/csharp/generators/Exercises/Meetup.cs +1 -1
  161. data/tracks/csharp/generators/Exercises/Minesweeper.cs +1 -1
  162. data/tracks/csharp/generators/Exercises/NthPrime.cs +1 -1
  163. data/tracks/csharp/generators/Exercises/NucleotideCount.cs +1 -1
  164. data/tracks/csharp/generators/Exercises/OcrNumbers.cs +1 -1
  165. data/tracks/csharp/generators/Exercises/Pangram.cs +1 -1
  166. data/tracks/csharp/generators/Exercises/PascalsTriangle.cs +1 -1
  167. data/tracks/csharp/generators/Exercises/PerfectNumbers.cs +1 -1
  168. data/tracks/csharp/generators/Exercises/PhoneNumber.cs +1 -1
  169. data/tracks/csharp/generators/Exercises/PigLatin.cs +1 -1
  170. data/tracks/csharp/generators/Exercises/Poker.cs +1 -1
  171. data/tracks/csharp/generators/Exercises/PrimeFactors.cs +1 -1
  172. data/tracks/csharp/generators/Exercises/QueenAttack.cs +1 -1
  173. data/tracks/csharp/generators/Exercises/RailFenceCipher.cs +1 -1
  174. data/tracks/csharp/generators/Exercises/Raindrops.cs +1 -1
  175. data/tracks/csharp/generators/Exercises/ReverseString.cs +6 -0
  176. data/tracks/csharp/generators/Exercises/RnaTranscription.cs +1 -1
  177. data/tracks/csharp/generators/Exercises/RomanNumerals.cs +1 -1
  178. data/tracks/csharp/generators/Exercises/RotationalCipher.cs +1 -1
  179. data/tracks/csharp/generators/Exercises/RunLengthEncoding.cs +1 -1
  180. data/tracks/csharp/generators/Exercises/SaddlePoints.cs +1 -1
  181. data/tracks/csharp/generators/Exercises/Say.cs +1 -1
  182. data/tracks/csharp/generators/Exercises/ScrabbleScore.cs +1 -1
  183. data/tracks/csharp/generators/Exercises/SecretHandshake.cs +1 -1
  184. data/tracks/csharp/generators/Exercises/Sieve.cs +1 -1
  185. data/tracks/csharp/generators/Exercises/SpaceAge.cs +1 -1
  186. data/tracks/csharp/generators/Exercises/SumOfMultiples.cs +1 -1
  187. data/tracks/csharp/generators/Exercises/Tournament.cs +1 -1
  188. data/tracks/csharp/generators/Exercises/Transpose.cs +1 -1
  189. data/tracks/csharp/generators/Exercises/Triangle.cs +1 -2
  190. data/tracks/csharp/generators/Exercises/TwoBucket.cs +1 -1
  191. data/tracks/csharp/generators/Exercises/TwoFer.cs +1 -1
  192. data/tracks/csharp/generators/Exercises/WordCount.cs +1 -1
  193. data/tracks/csharp/generators/Exercises/Wordy.cs +1 -1
  194. data/tracks/csharp/generators/GeneratorExercise.cs +114 -0
  195. data/tracks/csharp/generators/GeneratorStatus.cs +11 -0
  196. data/tracks/csharp/generators/Generators.csproj +1 -1
  197. data/tracks/csharp/generators/Input/CanonicalDataFile.cs +11 -9
  198. data/tracks/csharp/generators/Input/CanonicalDataParser.cs +5 -6
  199. data/tracks/csharp/generators/Input/ConfigFile.cs +29 -0
  200. data/tracks/csharp/generators/MissingDataExercise.cs +9 -0
  201. data/tracks/csharp/generators/Options.cs +18 -5
  202. data/tracks/csharp/generators/Output/ExerciseWriter.cs +5 -8
  203. data/tracks/csharp/generators/Output/NameExtensions.cs +3 -1
  204. data/tracks/csharp/generators/Program.cs +54 -15
  205. data/tracks/csharp/generators/UnimplementedExercise.cs +9 -0
  206. data/tracks/dart/README.md +6 -0
  207. data/tracks/dart/config.json +1 -1
  208. data/tracks/fsharp/config.json +24 -0
  209. data/tracks/fsharp/exercises/Exercises.sln +12 -0
  210. data/tracks/fsharp/exercises/accumulate/Accumulate.fsproj +4 -4
  211. data/tracks/fsharp/exercises/acronym/Acronym.fsproj +4 -4
  212. data/tracks/fsharp/exercises/all-your-base/AllYourBase.fsproj +4 -4
  213. data/tracks/fsharp/exercises/all-your-base/AllYourBaseTest.fs +5 -5
  214. data/tracks/fsharp/exercises/all-your-base/Example.fs +9 -7
  215. data/tracks/fsharp/exercises/allergies/Allergies.fsproj +4 -4
  216. data/tracks/fsharp/exercises/alphametics/Alphametics.fsproj +4 -4
  217. data/tracks/fsharp/exercises/alphametics/AlphameticsTest.fs +32 -32
  218. data/tracks/fsharp/exercises/anagram/Anagram.fsproj +4 -4
  219. data/tracks/fsharp/exercises/atbash-cipher/AtbashCipher.fsproj +4 -4
  220. data/tracks/fsharp/exercises/bank-account/BankAccount.fsproj +4 -4
  221. data/tracks/fsharp/exercises/beer-song/BeerSong.fsproj +4 -4
  222. data/tracks/fsharp/exercises/binary-search-tree/BinarySearchTree.fsproj +4 -4
  223. data/tracks/fsharp/exercises/binary-search/BinarySearch.fsproj +4 -4
  224. data/tracks/fsharp/exercises/bob/Bob.fsproj +4 -4
  225. data/tracks/fsharp/exercises/book-store/BookStore.fsproj +4 -4
  226. data/tracks/fsharp/exercises/bowling/Bowling.fsproj +4 -4
  227. data/tracks/fsharp/exercises/bracket-push/BracketPush.fsproj +4 -4
  228. data/tracks/fsharp/exercises/change/Change.fsproj +4 -4
  229. data/tracks/fsharp/exercises/circular-buffer/CircularBuffer.fsproj +4 -4
  230. data/tracks/fsharp/exercises/clock/Clock.fsproj +4 -4
  231. data/tracks/fsharp/exercises/collatz-conjecture/CollatzConjecture.fs +3 -0
  232. data/tracks/fsharp/exercises/collatz-conjecture/CollatzConjecture.fsproj +23 -0
  233. data/tracks/fsharp/exercises/collatz-conjecture/CollatzConjectureTest.fs +33 -0
  234. data/tracks/fsharp/exercises/collatz-conjecture/Example.fs +15 -0
  235. data/tracks/fsharp/exercises/collatz-conjecture/Program.fs +1 -0
  236. data/tracks/fsharp/exercises/collatz-conjecture/README.md +32 -0
  237. data/tracks/fsharp/exercises/connect/Connect.fsproj +4 -4
  238. data/tracks/fsharp/exercises/connect/ConnectTest.fs +35 -35
  239. data/tracks/fsharp/exercises/crypto-square/CryptoSquare.fsproj +4 -4
  240. data/tracks/fsharp/exercises/custom-set/CustomSet.fsproj +4 -4
  241. data/tracks/fsharp/exercises/diamond/Diamond.fsproj +4 -4
  242. data/tracks/fsharp/exercises/difference-of-squares/DifferenceOfSquares.fsproj +4 -4
  243. data/tracks/fsharp/exercises/diffie-hellman/DiffieHellman.fsproj +4 -4
  244. data/tracks/fsharp/exercises/dominoes/Dominoes.fsproj +4 -4
  245. data/tracks/fsharp/exercises/dot-dsl/DotDsl.fsproj +4 -4
  246. data/tracks/fsharp/exercises/error-handling/ErrorHandling.fsproj +4 -4
  247. data/tracks/fsharp/exercises/etl/Etl.fsproj +4 -4
  248. data/tracks/fsharp/exercises/etl/EtlTest.fs +39 -39
  249. data/tracks/fsharp/exercises/food-chain/FoodChain.fsproj +4 -4
  250. data/tracks/fsharp/exercises/forth/Forth.fsproj +4 -4
  251. data/tracks/fsharp/exercises/gigasecond/Gigasecond.fsproj +4 -4
  252. data/tracks/fsharp/exercises/go-counting/GoCounting.fsproj +4 -4
  253. data/tracks/fsharp/exercises/grade-school/GradeSchool.fsproj +4 -4
  254. data/tracks/fsharp/exercises/grains/Grains.fsproj +4 -4
  255. data/tracks/fsharp/exercises/grep/Grep.fsproj +4 -4
  256. data/tracks/fsharp/exercises/hamming/Hamming.fsproj +4 -4
  257. data/tracks/fsharp/exercises/hangman/Hangman.fsproj +4 -4
  258. data/tracks/fsharp/exercises/hello-world/HelloWorld.fsproj +4 -4
  259. data/tracks/fsharp/exercises/house/House.fsproj +4 -4
  260. data/tracks/fsharp/exercises/isogram/Isogram.fsproj +4 -4
  261. data/tracks/fsharp/exercises/kindergarten-garden/KindergartenGarden.fsproj +4 -4
  262. data/tracks/fsharp/exercises/largest-series-product/LargestSeriesProduct.fsproj +4 -4
  263. data/tracks/fsharp/exercises/leap/Leap.fsproj +4 -4
  264. data/tracks/fsharp/exercises/ledger/Ledger.fsproj +4 -4
  265. data/tracks/fsharp/exercises/lens-person/LensPerson.fsproj +4 -4
  266. data/tracks/fsharp/exercises/linked-list/LinkedList.fsproj +4 -4
  267. data/tracks/fsharp/exercises/list-ops/ListOps.fsproj +4 -4
  268. data/tracks/fsharp/exercises/luhn/Luhn.fsproj +4 -4
  269. data/tracks/fsharp/exercises/markdown/Markdown.fsproj +4 -4
  270. data/tracks/fsharp/exercises/matrix/Matrix.fsproj +4 -4
  271. data/tracks/fsharp/exercises/meetup/Meetup.fsproj +4 -4
  272. data/tracks/fsharp/exercises/minesweeper/Minesweeper.fsproj +4 -4
  273. data/tracks/fsharp/exercises/minesweeper/MinesweeperTest.fs +50 -50
  274. data/tracks/fsharp/exercises/nth-prime/NthPrime.fsproj +4 -4
  275. data/tracks/fsharp/exercises/nucleotide-count/NucleotideCount.fsproj +4 -4
  276. data/tracks/fsharp/exercises/nucleotide-count/NucleotideCountTest.fs +12 -12
  277. data/tracks/fsharp/exercises/ocr-numbers/OcrNumbers.fsproj +4 -4
  278. data/tracks/fsharp/exercises/ocr-numbers/OcrNumbersTest.fs +58 -58
  279. data/tracks/fsharp/exercises/palindrome-products/PalindromeProducts.fsproj +4 -4
  280. data/tracks/fsharp/exercises/pangram/Pangram.fsproj +4 -4
  281. data/tracks/fsharp/exercises/parallel-letter-frequency/ParallelLetterFrequency.fsproj +4 -4
  282. data/tracks/fsharp/exercises/pascals-triangle/PascalsTriangle.fsproj +4 -4
  283. data/tracks/fsharp/exercises/pascals-triangle/PascalsTriangleTest.fs +64 -7
  284. data/tracks/fsharp/exercises/perfect-numbers/PerfectNumbers.fsproj +4 -4
  285. data/tracks/fsharp/exercises/phone-number/PhoneNumber.fsproj +4 -4
  286. data/tracks/fsharp/exercises/pig-latin/PigLatin.fsproj +4 -4
  287. data/tracks/fsharp/exercises/poker/Poker.fsproj +4 -4
  288. data/tracks/fsharp/exercises/pov/Pov.fsproj +4 -4
  289. data/tracks/fsharp/exercises/prime-factors/PrimeFactors.fsproj +4 -4
  290. data/tracks/fsharp/exercises/protein-translation/ProteinTranslation.fsproj +4 -4
  291. data/tracks/fsharp/exercises/proverb/Proverb.fsproj +4 -4
  292. data/tracks/fsharp/exercises/pythagorean-triplet/PythagoreanTriplet.fsproj +4 -4
  293. data/tracks/fsharp/exercises/queen-attack/QueenAttack.fsproj +4 -4
  294. data/tracks/fsharp/exercises/rail-fence-cipher/RailFenceCipher.fsproj +4 -4
  295. data/tracks/fsharp/exercises/raindrops/Raindrops.fsproj +4 -4
  296. data/tracks/fsharp/exercises/react/React.fsproj +4 -4
  297. data/tracks/fsharp/exercises/rectangles/Rectangles.fsproj +4 -4
  298. data/tracks/fsharp/exercises/reverse-string/Example.fs +5 -0
  299. data/tracks/fsharp/exercises/reverse-string/Program.fs +1 -0
  300. data/tracks/fsharp/exercises/reverse-string/README.md +3 -0
  301. data/tracks/fsharp/exercises/reverse-string/ReverseString.fs +3 -0
  302. data/tracks/fsharp/exercises/reverse-string/ReverseString.fsproj +23 -0
  303. data/tracks/fsharp/exercises/reverse-string/ReverseStringTest.fs +29 -0
  304. data/tracks/fsharp/exercises/rna-transcription/RnaTranscription.fsproj +4 -4
  305. data/tracks/fsharp/exercises/robot-name/RobotName.fsproj +4 -4
  306. data/tracks/fsharp/exercises/robot-simulator/RobotSimulator.fsproj +4 -4
  307. data/tracks/fsharp/exercises/roman-numerals/RomanNumerals.fsproj +4 -4
  308. data/tracks/fsharp/exercises/run-length-encoding/RunLengthEncoding.fsproj +4 -4
  309. data/tracks/fsharp/exercises/saddle-points/SaddlePoints.fsproj +4 -4
  310. data/tracks/fsharp/exercises/say/Say.fsproj +4 -4
  311. data/tracks/fsharp/exercises/scale-generator/ScaleGenerator.fsproj +4 -4
  312. data/tracks/fsharp/exercises/scrabble-score/ScrabbleScore.fsproj +4 -4
  313. data/tracks/fsharp/exercises/secret-handshake/SecretHandshake.fsproj +4 -4
  314. data/tracks/fsharp/exercises/series/Series.fsproj +4 -4
  315. data/tracks/fsharp/exercises/sgf-parsing/SgfParsing.fsproj +4 -4
  316. data/tracks/fsharp/exercises/sieve/Sieve.fsproj +4 -4
  317. data/tracks/fsharp/exercises/simple-cipher/SimpleCipher.fsproj +4 -4
  318. data/tracks/fsharp/exercises/simple-linked-list/SimpleLinkedList.fsproj +4 -4
  319. data/tracks/fsharp/exercises/space-age/SpaceAge.fsproj +4 -4
  320. data/tracks/fsharp/exercises/strain/Strain.fsproj +4 -4
  321. data/tracks/fsharp/exercises/sublist/Sublist.fsproj +4 -4
  322. data/tracks/fsharp/exercises/sum-of-multiples/SumOfMultiples.fsproj +4 -4
  323. data/tracks/fsharp/exercises/tournament/Tournament.fsproj +4 -4
  324. data/tracks/fsharp/exercises/transpose/Transpose.fsproj +4 -4
  325. data/tracks/fsharp/exercises/tree-building/TreeBuilding.fsproj +4 -4
  326. data/tracks/fsharp/exercises/triangle/Triangle.fsproj +4 -4
  327. data/tracks/fsharp/exercises/twelve-days/TwelveDays.fsproj +4 -4
  328. data/tracks/fsharp/exercises/two-bucket/TwoBucket.fsproj +4 -4
  329. data/tracks/fsharp/exercises/two-fer/TwoFer.fsproj +4 -4
  330. data/tracks/fsharp/exercises/variable-length-quantity/VariableLengthQuantity.fsproj +4 -4
  331. data/tracks/fsharp/exercises/word-count/WordCount.fsproj +4 -4
  332. data/tracks/fsharp/exercises/word-search/WordSearch.fsproj +4 -4
  333. data/tracks/fsharp/exercises/wordy/Wordy.fsproj +4 -4
  334. data/tracks/fsharp/exercises/zebra-puzzle/ZebraPuzzle.fsproj +4 -4
  335. data/tracks/fsharp/exercises/zipper/Zipper.fsproj +4 -4
  336. data/tracks/fsharp/generators/Common.fs +4 -1
  337. data/tracks/fsharp/generators/Generators.fs +29 -6
  338. data/tracks/fsharp/generators/Generators.fsproj +1 -1
  339. data/tracks/go/exercises/book-store/.meta/gen.go +54 -0
  340. data/tracks/go/exercises/book-store/book_store_test.go +0 -67
  341. data/tracks/go/exercises/book-store/cases_test.go +77 -0
  342. data/tracks/go/exercises/forth/cases_test.go +41 -6
  343. data/tracks/go/exercises/hamming/.meta/gen.go +16 -6
  344. data/tracks/go/exercises/hamming/cases_test.go +7 -7
  345. data/tracks/go/exercises/isbn-verifier/.meta/gen.go +44 -0
  346. data/tracks/go/exercises/isbn-verifier/cases_test.go +25 -0
  347. data/tracks/go/exercises/isbn-verifier/example.go +2 -2
  348. data/tracks/go/exercises/isbn-verifier/isbn_verifier_test.go +3 -22
  349. data/tracks/go/exercises/perfect-numbers/.meta/gen.go +88 -0
  350. data/tracks/go/exercises/perfect-numbers/.meta/hints.md +19 -0
  351. data/tracks/go/exercises/perfect-numbers/README.md +23 -2
  352. data/tracks/go/exercises/perfect-numbers/cases_test.go +89 -0
  353. data/tracks/go/exercises/perfect-numbers/example.go +4 -4
  354. data/tracks/go/exercises/perfect-numbers/perfect_numbers_test.go +13 -18
  355. data/tracks/go/exercises/wordy/.meta/gen.go +76 -0
  356. data/tracks/go/exercises/wordy/cases_test.go +111 -0
  357. data/tracks/go/exercises/wordy/wordy_test.go +7 -29
  358. data/tracks/groovy/config.json +4 -4
  359. data/tracks/haskell/exercises/all-your-base/package.yaml +1 -1
  360. data/tracks/haskell/exercises/all-your-base/test/Tests.hs +2 -2
  361. data/tracks/haskell/exercises/beer-song/README.md +1 -1
  362. data/tracks/haskell/exercises/forth/package.yaml +1 -1
  363. data/tracks/haskell/exercises/forth/test/Tests.hs +21 -3
  364. data/tracks/haskell/exercises/isbn-verifier/package.yaml +1 -1
  365. data/tracks/haskell/exercises/meetup/README.md +16 -12
  366. data/tracks/haskell/exercises/sum-of-multiples/README.md +3 -3
  367. data/tracks/javascript/exercises/bowling/README.md +6 -6
  368. data/tracks/javascript/exercises/bowling/bowling.spec.js +14 -14
  369. data/tracks/javascript/exercises/saddle-points/README.md +1 -1
  370. data/tracks/javascript/exercises/sum-of-multiples/README.md +1 -1
  371. data/tracks/javascript/exercises/two-bucket/two-bucket.spec.js +2 -2
  372. data/tracks/julia/config.json +6 -6
  373. data/tracks/python/.gitignore +2 -0
  374. data/tracks/python/config.json +14 -0
  375. data/tracks/python/exercises/binary-search-tree/README.md +71 -0
  376. data/tracks/python/exercises/binary-search-tree/binary_search_tree.py +14 -0
  377. data/tracks/python/exercises/binary-search-tree/binary_search_tree_test.py +58 -0
  378. data/tracks/python/exercises/binary-search-tree/example.py +61 -0
  379. data/tracks/python/exercises/go-counting/go_counting_test.py +23 -23
  380. data/tracks/python/exercises/minesweeper/example.py +10 -14
  381. data/tracks/python/exercises/minesweeper/minesweeper_test.py +108 -119
  382. data/tracks/rust/config.json +12 -0
  383. data/tracks/rust/exercises/beer-song/README.md +1 -1
  384. data/tracks/rust/exercises/proverb/README.md +5 -2
  385. data/tracks/rust/exercises/reverse-string/.gitignore +3 -0
  386. data/tracks/rust/exercises/reverse-string/Cargo.toml +6 -0
  387. data/tracks/rust/exercises/reverse-string/README.md +46 -0
  388. data/tracks/rust/exercises/reverse-string/example.rs +7 -0
  389. data/tracks/rust/exercises/reverse-string/src/lib.rs +3 -0
  390. data/tracks/rust/exercises/reverse-string/tests/reverse-string.rs +57 -0
  391. data/tracks/rust/exercises/sum-of-multiples/README.md +3 -3
  392. metadata +46 -3
  393. data/tracks/csharp/generators/Input/CanonicalDataOptions.cs +0 -8
@@ -21,7 +21,7 @@
21
21
 
22
22
  <ItemGroup>
23
23
  <PackageReference Include="CommandLineParser" Version="2.1.1-beta" />
24
- <PackageReference Include="DotLiquid" Version="2.0.183" />
24
+ <PackageReference Include="DotLiquid" Version="2.0.200" />
25
25
  <PackageReference Include="Humanizer" Version="2.2.0" />
26
26
  <PackageReference Include="LibGit2Sharp.Portable" Version="0.24.10" />
27
27
  <PackageReference Include="Newtonsoft.Json" Version="10.0.3" />
@@ -0,0 +1,54 @@
1
+ package main
2
+
3
+ import (
4
+ "log"
5
+ "text/template"
6
+
7
+ "../../../gen"
8
+ )
9
+
10
+ func main() {
11
+ t, err := template.New("").Parse(tmpl)
12
+ if err != nil {
13
+ log.Fatal(err)
14
+ }
15
+ var j js
16
+ if err := gen.Gen("book-store", &j, t); err != nil {
17
+ log.Fatal(err)
18
+ }
19
+ }
20
+
21
+ // The JSON structure we expect to be able to unmarshal into
22
+ type js struct {
23
+ Cases []OneCase
24
+ Groups []TestGroup `json:"cases"`
25
+ }
26
+
27
+ type TestGroup struct {
28
+ Description string
29
+ Cases []OneCase
30
+ }
31
+
32
+ type OneCase struct {
33
+ Description string
34
+ Basket []int
35
+ Expected float64
36
+ }
37
+
38
+ // template applied to above data structure generates the Go test cases
39
+ var tmpl = `package bookstore
40
+
41
+ {{.Header}}
42
+
43
+ var testCases = []struct {
44
+ description string
45
+ basket []int
46
+ expected float64
47
+ }{{range .J.Groups}}{
48
+ {{range .Cases}} {
49
+ description: "{{.Description}}",
50
+ basket: {{printf "%#v" .Basket}},
51
+ expected: {{printf "%.2f" .Expected}},
52
+ },
53
+ {{end}}}{{end}}
54
+ `
@@ -4,73 +4,6 @@ import (
4
4
  "testing"
5
5
  )
6
6
 
7
- var testCases = []struct {
8
- description string
9
- basket []int
10
- expected float64
11
- }{
12
- {
13
- description: "only a single book",
14
- basket: []int{1},
15
- expected: 8.00,
16
- },
17
- {
18
- description: "two of the same book",
19
- basket: []int{2, 2},
20
- expected: 16.00,
21
- },
22
- {
23
- description: "empty basket",
24
- basket: []int{},
25
- expected: 0.00,
26
- },
27
- {
28
- description: "two different books",
29
- basket: []int{1, 2},
30
- expected: 15.20,
31
- },
32
- {
33
- description: "four different books",
34
- basket: []int{1, 2, 3, 4},
35
- expected: 25.60,
36
- },
37
- {
38
- description: "five different books",
39
- basket: []int{1, 2, 3, 4, 5},
40
- expected: 30.00,
41
- },
42
- {
43
- description: "two groups of four is cheaper than group of five plus group of three",
44
- basket: []int{1, 1, 2, 2, 3, 3, 4, 5},
45
- expected: 51.20,
46
- },
47
- {
48
- description: "groups of four plus group of two is is cheaper than two groups of three",
49
- basket: []int{1, 1, 2, 2, 3, 4},
50
- expected: 40.80,
51
- },
52
- {
53
- description: "two each of first 4 books and 1 copy of each of rest",
54
- basket: []int{1, 1, 2, 2, 3, 3, 4, 4, 5},
55
- expected: 55.60,
56
- },
57
- {
58
- description: "two copies of each book",
59
- basket: []int{1, 1, 2, 2, 3, 3, 4, 4, 5, 5},
60
- expected: 60.00,
61
- },
62
- {
63
- description: "three copies of first book and 2 each fo remaining",
64
- basket: []int{1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 1},
65
- expected: 68.00,
66
- },
67
- {
68
- description: "three each of first 2 books and 2 each of remaining books",
69
- basket: []int{1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 1, 2},
70
- expected: 75.20,
71
- },
72
- }
73
-
74
7
  func TestCost(t *testing.T) {
75
8
  for _, testCase := range testCases {
76
9
  cost := Cost(testCase.basket)
@@ -0,0 +1,77 @@
1
+ package bookstore
2
+
3
+ // Source: exercism/problem-specifications
4
+ // Commit: 087ad69 book-store: Add missing trailing zero
5
+ // Problem Specifications Version: 1.0.1
6
+
7
+ var testCases = []struct {
8
+ description string
9
+ basket []int
10
+ expected float64
11
+ }{
12
+ {
13
+ description: "Only a single book",
14
+ basket: []int{1},
15
+ expected: 8.00,
16
+ },
17
+ {
18
+ description: "Two of the same book",
19
+ basket: []int{2, 2},
20
+ expected: 16.00,
21
+ },
22
+ {
23
+ description: "Empty basket",
24
+ basket: []int{},
25
+ expected: 0.00,
26
+ },
27
+ {
28
+ description: "Two different books",
29
+ basket: []int{1, 2},
30
+ expected: 15.20,
31
+ },
32
+ {
33
+ description: "Three different books",
34
+ basket: []int{1, 2, 3},
35
+ expected: 21.60,
36
+ },
37
+ {
38
+ description: "Four different books",
39
+ basket: []int{1, 2, 3, 4},
40
+ expected: 25.60,
41
+ },
42
+ {
43
+ description: "Five different books",
44
+ basket: []int{1, 2, 3, 4, 5},
45
+ expected: 30.00,
46
+ },
47
+ {
48
+ description: "Two groups of four is cheaper than group of five plus group of three",
49
+ basket: []int{1, 1, 2, 2, 3, 3, 4, 5},
50
+ expected: 51.20,
51
+ },
52
+ {
53
+ description: "Group of four plus group of two is cheaper than two groups of three",
54
+ basket: []int{1, 1, 2, 2, 3, 4},
55
+ expected: 40.80,
56
+ },
57
+ {
58
+ description: "Two each of first 4 books and 1 copy each of rest",
59
+ basket: []int{1, 1, 2, 2, 3, 3, 4, 4, 5},
60
+ expected: 55.60,
61
+ },
62
+ {
63
+ description: "Two copies of each book",
64
+ basket: []int{1, 1, 2, 2, 3, 3, 4, 4, 5, 5},
65
+ expected: 60.00,
66
+ },
67
+ {
68
+ description: "Three copies of first book and 2 each of remaining",
69
+ basket: []int{1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 1},
70
+ expected: 68.00,
71
+ },
72
+ {
73
+ description: "Three each of first 2 books and 2 each of remaining books",
74
+ basket: []int{1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 1, 2},
75
+ expected: 75.20,
76
+ },
77
+ }
@@ -1,8 +1,8 @@
1
1
  package forth
2
2
 
3
3
  // Source: exercism/problem-specifications
4
- // Commit: 3cb5e76 forth: Remove test for empty input (#976)
5
- // Problem Specifications Version: 1.3.0
4
+ // Commit: 9bf041b forth: Add tests for case-insensitivity (#979)
5
+ // Problem Specifications Version: 1.4.0
6
6
 
7
7
  type testGroup struct {
8
8
  group string
@@ -135,13 +135,13 @@ var testGroups = []testGroup{
135
135
  group: "dup",
136
136
  tests: []testCase{
137
137
  {
138
- "copies the top value on the stack",
139
- []string{"1 DUP"},
138
+ "copies a value on the stack",
139
+ []string{"1 dup"},
140
140
  []int{1, 1},
141
141
  },
142
142
  {
143
- "is case-insensitive",
144
- []string{"1 2 Dup"},
143
+ "copies the top value on the stack",
144
+ []string{"1 2 dup"},
145
145
  []int{1, 2, 2},
146
146
  },
147
147
  {
@@ -261,4 +261,39 @@ var testGroups = []testGroup{
261
261
  },
262
262
  },
263
263
  },
264
+ {
265
+ group: "case-insensitivity",
266
+ tests: []testCase{
267
+ {
268
+ "DUP is case-insensitive",
269
+ []string{"1 DUP Dup dup"},
270
+ []int{1, 1, 1, 1},
271
+ },
272
+ {
273
+ "DROP is case-insensitive",
274
+ []string{"1 2 3 4 DROP Drop drop"},
275
+ []int{1},
276
+ },
277
+ {
278
+ "SWAP is case-insensitive",
279
+ []string{"1 2 SWAP 3 Swap 4 swap"},
280
+ []int{2, 3, 4, 1},
281
+ },
282
+ {
283
+ "OVER is case-insensitive",
284
+ []string{"1 2 OVER Over over"},
285
+ []int{1, 2, 1, 2, 1},
286
+ },
287
+ {
288
+ "user-defined words are case-insensitive",
289
+ []string{": foo dup ;", "1 FOO Foo foo"},
290
+ []int{1, 1, 1, 1},
291
+ },
292
+ {
293
+ "definitions are case-insensitive",
294
+ []string{": SWAP DUP Dup dup ;", "1 swap"},
295
+ []int{1, 1, 1, 1},
296
+ },
297
+ },
298
+ },
264
299
  }
@@ -20,12 +20,22 @@ func main() {
20
20
 
21
21
  // The JSON structure we expect to be able to unmarshal into
22
22
  type js struct {
23
- Cases []struct {
24
- Description string
25
- Strand1 string
26
- Strand2 string
27
- Expected int
23
+ Cases []oneCase
24
+ }
25
+
26
+ type oneCase struct {
27
+ Description string
28
+ Strand1 string
29
+ Strand2 string
30
+ Expected interface{}
31
+ }
32
+
33
+ func (o oneCase) Want() int {
34
+ d, ok := o.Expected.(float64)
35
+ if ok {
36
+ return int(d)
28
37
  }
38
+ return -1
29
39
  }
30
40
 
31
41
  // template applied to above data structure generates the Go test cases
@@ -41,7 +51,7 @@ var testCases = []struct {
41
51
  {{range .J.Cases}}{ // {{.Description}}
42
52
  {{printf "%q" .Strand1}},
43
53
  {{printf "%q" .Strand2}},
44
- {{.Expected}},
54
+ {{.Want}},
45
55
  },
46
56
  {{end}}}
47
57
  `
@@ -1,8 +1,8 @@
1
1
  package hamming
2
2
 
3
- // Source: exercism/x-common
4
- // Commit: ebe9bbf fix versioning (#845)
5
- // x-common version: 1.1.0
3
+ // Source: exercism/problem-specifications
4
+ // Commit: f79dfd7 Simplify two tests so the difference is easily spotted.
5
+ // Problem Specifications Version: 2.0.1
6
6
 
7
7
  var testCases = []struct {
8
8
  s1 string
@@ -50,13 +50,13 @@ var testCases = []struct {
50
50
  2,
51
51
  },
52
52
  { // non-unique character in first strand
53
- "AGA",
54
- "AGG",
53
+ "AAG",
54
+ "AAA",
55
55
  1,
56
56
  },
57
57
  { // non-unique character in second strand
58
- "AGG",
59
- "AGA",
58
+ "AAA",
59
+ "AAG",
60
60
  1,
61
61
  },
62
62
  { // same nucleotides in different positions
@@ -0,0 +1,44 @@
1
+ package main
2
+
3
+ import (
4
+ "log"
5
+ "text/template"
6
+
7
+ "../../../gen"
8
+ )
9
+
10
+ func main() {
11
+ t, err := template.New("").Parse(tmpl)
12
+ if err != nil {
13
+ log.Fatal(err)
14
+ }
15
+ var j js
16
+ if err := gen.Gen("isbn-verifier", &j, t); err != nil {
17
+ log.Fatal(err)
18
+ }
19
+ }
20
+
21
+ type OneCase struct {
22
+ Description string
23
+ Input string
24
+ Expected bool
25
+ }
26
+
27
+ // The JSON structure we expect to be able to unmarshal into
28
+ type js struct {
29
+ Cases []OneCase
30
+ }
31
+
32
+ // template applied to above data structure generates the Go test cases
33
+ var tmpl = `package isbn
34
+
35
+ {{.Header}}
36
+
37
+ var testCases = []struct {
38
+ isbn string
39
+ expected bool
40
+ description string
41
+ }{
42
+ {{range .J.Cases}}{ "{{.Input}}", {{.Expected}}, "{{.Description}}"},
43
+ {{end}}}
44
+ `
@@ -0,0 +1,25 @@
1
+ package isbn
2
+
3
+ // Source: exercism/problem-specifications
4
+ // Commit: 3251fa6 Rename property for isbn-verifier exercise
5
+ // Problem Specifications Version: 2.0.0
6
+
7
+ var testCases = []struct {
8
+ isbn string
9
+ expected bool
10
+ description string
11
+ }{
12
+ {"3-598-21508-8", true, "valid isbn number"},
13
+ {"3-598-21508-9", false, "invalid isbn check digit"},
14
+ {"3-598-21507-X", true, "valid isbn number with a check digit of 10"},
15
+ {"3-598-21507-A", false, "check digit is a character other than X"},
16
+ {"3-598-2K507-0", false, "invalid character in isbn"},
17
+ {"3-598-2X507-9", false, "X is only valid as a check digit"},
18
+ {"3598215088", true, "valid isbn without separating dashes"},
19
+ {"359821507X", true, "isbn without separating dashes and X as check digit"},
20
+ {"359821507", false, "isbn without check digit and dashes"},
21
+ {"3598215078X", false, "too long isbn and no dashes"},
22
+ {"3-598-21507", false, "isbn without check digit"},
23
+ {"3-598-21507-XX", false, "too long isbn"},
24
+ {"3-598-21515-X", false, "check digit of X should not be used for 0"},
25
+ }
@@ -32,8 +32,8 @@ func dropHyphen(isbn string) string {
32
32
 
33
33
  func strToSlice(isbn string) (result []int, err error) {
34
34
 
35
- for _, char := range isbn {
36
- if unicode.IsLetter(char) && char != 'X' {
35
+ for pos, char := range isbn {
36
+ if unicode.IsLetter(char) && (char != 'X' || pos != 9) {
37
37
  err = errors.New("invalid character")
38
38
  return
39
39
  } else if char == 'X' {
@@ -4,32 +4,13 @@ import (
4
4
  "testing"
5
5
  )
6
6
 
7
- var testCases = []struct {
8
- isbn string
9
- expected bool
10
- description string
11
- }{
12
- {"3-598-21508-8", true, "valid isbn number"},
13
- {"3-598-21508-9", false, "invalid isbn check digit"},
14
- {"3-598-21507-X", true, "valid isbn number with a check digit of 10"},
15
- {"3-598-21507-A", false, "check digit is a character other than X"},
16
- {"3-598-2K507-0", false, "invalid character in isbn"},
17
- {"3-598-2X507-0", false, "X is only valid as a check digit"},
18
- {"3598215088", true, "valid isbn without separating dashes"},
19
- {"359821507X", true, "isbn without separating dashes and X as check digit"},
20
- {"359821507", false, "isbn without check digit and dashes"},
21
- {"3598215078X", false, "too long isbn and no dashes"},
22
- {"3-598-21507", false, "isbn without check digit"},
23
- {"3-598-21507-XA", false, "too long isbn"},
24
- {"3-598-21515-X", false, "check digit of X should not be used for 0"},
25
- }
26
-
27
7
  func TestIsValidISBN(t *testing.T) {
28
8
  for _, test := range testCases {
29
9
  observed := IsValidISBN(test.isbn)
30
10
  if observed != test.expected {
31
- t.Fatalf("got %t, want %t, %s (%s)",
32
- observed, test.expected, test.description, test.isbn)
11
+ t.Errorf("FAIL: %s\nIsValidISBN(%q)\nExpected: %t, Actual: %t",
12
+ test.description, test.isbn, test.expected, observed)
33
13
  }
14
+ t.Logf("PASS: %s", test.description)
34
15
  }
35
16
  }