trackler 2.0.0.2 → 2.0.0.3

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 (197) hide show
  1. checksums.yaml +4 -4
  2. data/common/exercises/forth/canonical-data.json +1 -1
  3. data/common/exercises/pangram/canonical-data.json +0 -10
  4. data/common/exercises/run-length-encoding/canonical-data.json +21 -11
  5. data/lib/trackler/version.rb +1 -1
  6. data/tracks/bash/SETUP.md +2 -39
  7. data/tracks/bash/config.json +0 -9
  8. data/tracks/bash/exercises/hello-world/HINTS.md +38 -0
  9. data/tracks/bash/exercises/hello-world/hello_world_test.sh +0 -14
  10. data/tracks/haskell/.travis.yml +2 -13
  11. data/tracks/haskell/README.md +2 -1
  12. data/tracks/haskell/config.json +6 -0
  13. data/tracks/haskell/exercises/accumulate/examples/success-standard/package.yaml +16 -0
  14. data/tracks/haskell/exercises/accumulate/{src/Example.hs → examples/success-standard/src/Accumulate.hs} +0 -0
  15. data/tracks/haskell/exercises/all-your-base/examples/success-standard/package.yaml +16 -0
  16. data/tracks/haskell/exercises/all-your-base/{src/Example.hs → examples/success-standard/src/Base.hs} +0 -0
  17. data/tracks/haskell/exercises/allergies/examples/success-standard/package.yaml +16 -0
  18. data/tracks/haskell/exercises/allergies/{src/Example.hs → examples/success-standard/src/Allergies.hs} +0 -0
  19. data/tracks/haskell/exercises/alphametics/HINTS.md +5 -0
  20. data/tracks/haskell/exercises/alphametics/examples/success-standard/package.yaml +18 -0
  21. data/tracks/haskell/exercises/alphametics/examples/success-standard/src/Alphametics.hs +116 -0
  22. data/tracks/haskell/exercises/alphametics/package.yaml +20 -0
  23. data/tracks/haskell/exercises/alphametics/src/Alphametics.hs +4 -0
  24. data/tracks/haskell/exercises/alphametics/stack.yaml +1 -0
  25. data/tracks/haskell/exercises/alphametics/test/Tests.hs +78 -0
  26. data/tracks/haskell/exercises/anagram/examples/{list-string → success-liststring}/package.yaml +0 -1
  27. data/tracks/haskell/exercises/anagram/examples/{list-string → success-liststring/src}/Anagram.hs +0 -0
  28. data/tracks/haskell/exercises/anagram/examples/{set-text → success-settext}/package.yaml +0 -0
  29. data/tracks/haskell/exercises/anagram/examples/{set-text → success-settext/src}/Anagram.hs +0 -0
  30. data/tracks/haskell/exercises/atbash-cipher/examples/success-standard/package.yaml +18 -0
  31. data/tracks/haskell/exercises/atbash-cipher/{src/Example.hs → examples/success-standard/src/Atbash.hs} +0 -0
  32. data/tracks/haskell/exercises/bank-account/examples/success-standard/package.yaml +18 -0
  33. data/tracks/haskell/exercises/bank-account/{src/Example.hs → examples/success-standard/src/BankAccount.hs} +0 -0
  34. data/tracks/haskell/exercises/beer-song/examples/success-standard/package.yaml +16 -0
  35. data/tracks/haskell/exercises/beer-song/{src/Example.hs → examples/success-standard/src/Beer.hs} +0 -0
  36. data/tracks/haskell/exercises/binary-search-tree/examples/success-standard/package.yaml +16 -0
  37. data/tracks/haskell/exercises/binary-search-tree/{src/Example.hs → examples/success-standard/src/BST.hs} +0 -0
  38. data/tracks/haskell/exercises/binary/examples/success-standard/package.yaml +16 -0
  39. data/tracks/haskell/exercises/binary/{src/Example.hs → examples/success-standard/src/Binary.hs} +0 -0
  40. data/tracks/haskell/exercises/bob/examples/success-standard/package.yaml +16 -0
  41. data/tracks/haskell/exercises/bob/{src/Example.hs → examples/success-standard/src/Bob.hs} +0 -0
  42. data/tracks/haskell/exercises/change/examples/success-standard/package.yaml +16 -0
  43. data/tracks/haskell/exercises/change/{src/Example.hs → examples/success-standard/src/Change.hs} +0 -0
  44. data/tracks/haskell/exercises/clock/examples/success-standard/package.yaml +16 -0
  45. data/tracks/haskell/exercises/clock/{src/Example.hs → examples/success-standard/src/Clock.hs} +0 -0
  46. data/tracks/haskell/exercises/connect/examples/success-standard/package.yaml +18 -0
  47. data/tracks/haskell/exercises/connect/{src/Example.hs → examples/success-standard/src/Connect.hs} +0 -0
  48. data/tracks/haskell/exercises/crypto-square/examples/success-standard/package.yaml +18 -0
  49. data/tracks/haskell/exercises/crypto-square/{src/Example.hs → examples/success-standard/src/CryptoSquare.hs} +0 -0
  50. data/tracks/haskell/exercises/custom-set/examples/success-standard/package.yaml +16 -0
  51. data/tracks/haskell/exercises/custom-set/{src/Example.hs → examples/success-standard/src/CustomSet.hs} +0 -0
  52. data/tracks/haskell/exercises/difference-of-squares/examples/success-standard/package.yaml +16 -0
  53. data/tracks/haskell/exercises/difference-of-squares/{src/Example.hs → examples/success-standard/src/Squares.hs} +0 -0
  54. data/tracks/haskell/exercises/etl/examples/success-standard/package.yaml +17 -0
  55. data/tracks/haskell/exercises/etl/{src/Example.hs → examples/success-standard/src/ETL.hs} +0 -0
  56. data/tracks/haskell/exercises/food-chain/examples/success-standard/package.yaml +18 -0
  57. data/tracks/haskell/exercises/food-chain/{src/Example.hs → examples/success-standard/src/FoodChain.hs} +0 -0
  58. data/tracks/haskell/exercises/forth/HINTS.md +2 -2
  59. data/tracks/haskell/exercises/forth/examples/success-standard/package.yaml +19 -0
  60. data/tracks/haskell/exercises/forth/{src/Example.hs → examples/success-standard/src/Forth.hs} +3 -3
  61. data/tracks/haskell/exercises/forth/package.yaml +0 -1
  62. data/tracks/haskell/exercises/forth/src/Forth.hs +3 -3
  63. data/tracks/haskell/exercises/forth/test/Tests.hs +120 -65
  64. data/tracks/haskell/exercises/gigasecond/examples/success-standard/package.yaml +17 -0
  65. data/tracks/haskell/exercises/gigasecond/{src/Example.hs → examples/success-standard/src/Gigasecond.hs} +0 -0
  66. data/tracks/haskell/exercises/go-counting/examples/success-standard/package.yaml +20 -0
  67. data/tracks/haskell/exercises/go-counting/{src/Example.hs → examples/success-standard/src/Counting.hs} +0 -0
  68. data/tracks/haskell/exercises/grade-school/examples/success-standard/package.yaml +18 -0
  69. data/tracks/haskell/exercises/grade-school/{src/Example.hs → examples/success-standard/src/School.hs} +0 -0
  70. data/tracks/haskell/exercises/grains/examples/success-standard/package.yaml +16 -0
  71. data/tracks/haskell/exercises/grains/{src/Example.hs → examples/success-standard/src/Grains.hs} +0 -0
  72. data/tracks/haskell/exercises/grains/test/Tests.hs +1 -2
  73. data/tracks/haskell/exercises/hamming/examples/success-standard/package.yaml +16 -0
  74. data/tracks/haskell/exercises/hamming/{src/Example.hs → examples/success-standard/src/Hamming.hs} +0 -0
  75. data/tracks/haskell/exercises/hexadecimal/examples/success-standard/package.yaml +16 -0
  76. data/tracks/haskell/exercises/hexadecimal/{src/Example.hs → examples/success-standard/src/Hexadecimal.hs} +0 -0
  77. data/tracks/haskell/exercises/house/examples/success-standard/package.yaml +16 -0
  78. data/tracks/haskell/exercises/house/{src/Example.hs → examples/success-standard/src/House.hs} +0 -0
  79. data/tracks/haskell/exercises/kindergarten-garden/examples/success-standard/package.yaml +19 -0
  80. data/tracks/haskell/exercises/kindergarten-garden/{src/Example.hs → examples/success-standard/src/Garden.hs} +0 -0
  81. data/tracks/haskell/exercises/largest-series-product/examples/success-standard/package.yaml +18 -0
  82. data/tracks/haskell/exercises/largest-series-product/{src/Example.hs → examples/success-standard/src/Series.hs} +0 -0
  83. data/tracks/haskell/exercises/leap/examples/success-standard/package.yaml +16 -0
  84. data/tracks/haskell/exercises/leap/{src/Example.hs → examples/success-standard/src/LeapYear.hs} +0 -0
  85. data/tracks/haskell/exercises/lens-person/examples/success-standard/package.yaml +19 -0
  86. data/tracks/haskell/exercises/lens-person/{src/Example.hs → examples/success-standard/src/Person.hs} +0 -0
  87. data/tracks/haskell/exercises/linked-list/examples/success-standard/package.yaml +18 -0
  88. data/tracks/haskell/exercises/linked-list/{src/Example.hs → examples/success-standard/src/Deque.hs} +0 -0
  89. data/tracks/haskell/exercises/list-ops/examples/success-standard/package.yaml +16 -0
  90. data/tracks/haskell/exercises/list-ops/{src/Example.hs → examples/success-standard/src/ListOps.hs} +0 -0
  91. data/tracks/haskell/exercises/luhn/examples/success-standard/package.yaml +16 -0
  92. data/tracks/haskell/exercises/luhn/{src/Example.hs → examples/success-standard/src/Luhn.hs} +0 -0
  93. data/tracks/haskell/exercises/matrix/examples/success-standard/package.yaml +17 -0
  94. data/tracks/haskell/exercises/matrix/{src/Example.hs → examples/success-standard/src/Matrix.hs} +0 -0
  95. data/tracks/haskell/exercises/meetup/examples/success-standard/package.yaml +17 -0
  96. data/tracks/haskell/exercises/meetup/{src/Example.hs → examples/success-standard/src/Meetup.hs} +0 -0
  97. data/tracks/haskell/exercises/minesweeper/examples/success-standard/package.yaml +16 -0
  98. data/tracks/haskell/exercises/minesweeper/{src/Example.hs → examples/success-standard/src/Minesweeper.hs} +0 -0
  99. data/tracks/haskell/exercises/nth-prime/examples/success-standard/package.yaml +16 -0
  100. data/tracks/haskell/exercises/nth-prime/{src/Example.hs → examples/success-standard/src/Prime.hs} +0 -0
  101. data/tracks/haskell/exercises/nucleotide-count/examples/success-standard/package.yaml +17 -0
  102. data/tracks/haskell/exercises/nucleotide-count/{src/Example.hs → examples/success-standard/src/DNA.hs} +0 -0
  103. data/tracks/haskell/exercises/ocr-numbers/examples/success-standard/package.yaml +19 -0
  104. data/tracks/haskell/exercises/ocr-numbers/{src/Example.hs → examples/success-standard/src/OCR.hs} +0 -0
  105. data/tracks/haskell/exercises/octal/examples/success-standard/package.yaml +17 -0
  106. data/tracks/haskell/exercises/octal/{src/Example.hs → examples/success-standard/src/Octal.hs} +0 -0
  107. data/tracks/haskell/exercises/palindrome-products/examples/success-standard/package.yaml +16 -0
  108. data/tracks/haskell/exercises/palindrome-products/{src/Example.hs → examples/success-standard/src/Palindromes.hs} +0 -0
  109. data/tracks/haskell/exercises/parallel-letter-frequency/examples/success-standard/package.yaml +20 -0
  110. data/tracks/haskell/exercises/parallel-letter-frequency/{src/Example.hs → examples/success-standard/src/Frequency.hs} +0 -0
  111. data/tracks/haskell/exercises/pascals-triangle/examples/success-standard/package.yaml +16 -0
  112. data/tracks/haskell/exercises/pascals-triangle/{src/Example.hs → examples/success-standard/src/Triangle.hs} +0 -0
  113. data/tracks/haskell/exercises/phone-number/examples/success-standard/package.yaml +16 -0
  114. data/tracks/haskell/exercises/phone-number/{src/Example.hs → examples/success-standard/src/Phone.hs} +0 -0
  115. data/tracks/haskell/exercises/pig-latin/examples/success-standard/package.yaml +16 -0
  116. data/tracks/haskell/exercises/pig-latin/{src/Example.hs → examples/success-standard/src/PigLatin.hs} +0 -0
  117. data/tracks/haskell/exercises/pig-latin/test/Tests.hs +2 -1
  118. data/tracks/haskell/exercises/pov/examples/success-standard/package.yaml +17 -0
  119. data/tracks/haskell/exercises/pov/{src/Example.hs → examples/success-standard/src/POV.hs} +0 -0
  120. data/tracks/haskell/exercises/pov/test/Tests.hs +34 -8
  121. data/tracks/haskell/exercises/prime-factors/examples/success-standard/package.yaml +16 -0
  122. data/tracks/haskell/exercises/prime-factors/{src/Example.hs → examples/success-standard/src/PrimeFactors.hs} +0 -0
  123. data/tracks/haskell/exercises/pythagorean-triplet/examples/success-standard/package.yaml +16 -0
  124. data/tracks/haskell/exercises/pythagorean-triplet/{src/Example.hs → examples/success-standard/src/Triplet.hs} +0 -0
  125. data/tracks/haskell/exercises/queen-attack/examples/success-standard/package.yaml +16 -0
  126. data/tracks/haskell/exercises/queen-attack/{src/Example.hs → examples/success-standard/src/Queens.hs} +0 -0
  127. data/tracks/haskell/exercises/raindrops/examples/success-standard/package.yaml +16 -0
  128. data/tracks/haskell/exercises/raindrops/{src/Example.hs → examples/success-standard/src/Raindrops.hs} +0 -0
  129. data/tracks/haskell/exercises/rna-transcription/examples/success-standard/package.yaml +18 -0
  130. data/tracks/haskell/exercises/rna-transcription/{src/Example.hs → examples/success-standard/src/DNA.hs} +0 -0
  131. data/tracks/haskell/exercises/robot-name/examples/success-standard/package.yaml +18 -0
  132. data/tracks/haskell/exercises/robot-name/{src/Example.hs → examples/success-standard/src/Robot.hs} +0 -0
  133. data/tracks/haskell/exercises/robot-simulator/examples/success-standard/package.yaml +16 -0
  134. data/tracks/haskell/exercises/robot-simulator/{src/Example.hs → examples/success-standard/src/Robot.hs} +0 -0
  135. data/tracks/haskell/exercises/roman-numerals/examples/success-standard/package.yaml +16 -0
  136. data/tracks/haskell/exercises/roman-numerals/{src/Example.hs → examples/success-standard/src/Roman.hs} +0 -0
  137. data/tracks/haskell/exercises/saddle-points/examples/success-standard/package.yaml +19 -0
  138. data/tracks/haskell/exercises/saddle-points/{src/Example.hs → examples/success-standard/src/Matrix.hs} +0 -0
  139. data/tracks/haskell/exercises/say/examples/success-standard/package.yaml +18 -0
  140. data/tracks/haskell/exercises/say/{src/Example.hs → examples/success-standard/src/Say.hs} +0 -0
  141. data/tracks/haskell/exercises/say/test/Tests.hs +4 -2
  142. data/tracks/haskell/exercises/scrabble-score/examples/success-standard/package.yaml +18 -0
  143. data/tracks/haskell/exercises/scrabble-score/{src/Example.hs → examples/success-standard/src/Scrabble.hs} +0 -0
  144. data/tracks/haskell/exercises/secret-handshake/examples/success-standard/package.yaml +16 -0
  145. data/tracks/haskell/exercises/secret-handshake/{src/Example.hs → examples/success-standard/src/SecretHandshake.hs} +0 -0
  146. data/tracks/haskell/exercises/series/examples/success-standard/package.yaml +16 -0
  147. data/tracks/haskell/exercises/series/{src/Example.hs → examples/success-standard/src/Series.hs} +0 -0
  148. data/tracks/haskell/exercises/sgf-parsing/examples/success-standard/package.yaml +20 -0
  149. data/tracks/haskell/exercises/sgf-parsing/{src/Example.hs → examples/success-standard/src/Sgf.hs} +0 -0
  150. data/tracks/haskell/exercises/sieve/examples/success-standard/package.yaml +18 -0
  151. data/tracks/haskell/exercises/sieve/{src/Example.hs → examples/success-standard/src/Sieve.hs} +0 -0
  152. data/tracks/haskell/exercises/simple-cipher/examples/success-standard/package.yaml +18 -0
  153. data/tracks/haskell/exercises/simple-cipher/{src/Example.hs → examples/success-standard/src/Cipher.hs} +0 -0
  154. data/tracks/haskell/exercises/simple-linked-list/examples/success-standard/package.yaml +16 -0
  155. data/tracks/haskell/exercises/simple-linked-list/{src/Example.hs → examples/success-standard/src/LinkedList.hs} +0 -0
  156. data/tracks/haskell/exercises/space-age/examples/success-double/package.yaml +0 -3
  157. data/tracks/haskell/exercises/space-age/examples/success-double/{SpaceAge.hs → src/SpaceAge.hs} +0 -0
  158. data/tracks/haskell/exercises/space-age/examples/success-rational/package.yaml +0 -3
  159. data/tracks/haskell/exercises/space-age/examples/success-rational/{SpaceAge.hs → src/SpaceAge.hs} +0 -0
  160. data/tracks/haskell/exercises/strain/examples/success-standard/package.yaml +16 -0
  161. data/tracks/haskell/exercises/strain/{src/Example.hs → examples/success-standard/src/Strain.hs} +0 -0
  162. data/tracks/haskell/exercises/sublist/examples/success-standard/package.yaml +16 -0
  163. data/tracks/haskell/exercises/sublist/{src/Example.hs → examples/success-standard/src/Sublist.hs} +0 -0
  164. data/tracks/haskell/exercises/sum-of-multiples/examples/success-standard/package.yaml +16 -0
  165. data/tracks/haskell/exercises/sum-of-multiples/{src/Example.hs → examples/success-standard/src/SumOfMultiples.hs} +0 -0
  166. data/tracks/haskell/exercises/triangle/examples/success-standard/package.yaml +18 -0
  167. data/tracks/haskell/exercises/triangle/{src/Example.hs → examples/success-standard/src/Triangle.hs} +0 -0
  168. data/tracks/haskell/exercises/trinary/examples/success-standard/package.yaml +17 -0
  169. data/tracks/haskell/exercises/trinary/{src/Example.hs → examples/success-standard/src/Trinary.hs} +0 -0
  170. data/tracks/haskell/exercises/word-count/examples/success-newtype/package.yaml +0 -2
  171. data/tracks/haskell/exercises/word-count/examples/success-newtype/{WordCount.hs → src/WordCount.hs} +0 -0
  172. data/tracks/haskell/exercises/word-count/examples/success-simple/package.yaml +0 -2
  173. data/tracks/haskell/exercises/word-count/examples/success-simple/{WordCount.hs → src/WordCount.hs} +0 -0
  174. data/tracks/haskell/exercises/wordy/examples/success-standard/package.yaml +19 -0
  175. data/tracks/haskell/exercises/wordy/{src/Example.hs → examples/success-standard/src/WordProblem.hs} +0 -0
  176. data/tracks/haskell/exercises/zebra-puzzle/examples/success-standard/package.yaml +16 -0
  177. data/tracks/haskell/exercises/zebra-puzzle/{src/Example.hs → examples/success-standard/src/ZebraPuzzle.hs} +0 -0
  178. data/tracks/haskell/exercises/zipper/examples/success-standard/package.yaml +16 -0
  179. data/tracks/haskell/exercises/zipper/{src/Example.hs → examples/success-standard/src/Zipper.hs} +0 -0
  180. data/tracks/java/config.json +7 -1
  181. data/tracks/java/exercises/difference-of-squares/build.gradle +17 -0
  182. data/tracks/java/exercises/difference-of-squares/src/example/java/.keep +0 -0
  183. data/tracks/java/exercises/difference-of-squares/src/example/java/Difference.java +20 -0
  184. data/tracks/java/exercises/difference-of-squares/src/main/java/.keep +0 -0
  185. data/tracks/java/exercises/difference-of-squares/src/main/java/Difference.java +5 -0
  186. data/tracks/java/exercises/difference-of-squares/src/test/java/DifferenceTest.java +87 -0
  187. data/tracks/java/exercises/settings.gradle +1 -0
  188. data/tracks/kotlin/docs/TESTS.md +97 -13
  189. data/tracks/ruby/exercises/alphametics/.version +1 -1
  190. data/tracks/ruby/exercises/alphametics/alphametics_test.rb +55 -45
  191. data/tracks/ruby/exercises/alphametics/example.rb +100 -63
  192. data/tracks/ruby/exercises/alphametics/example.tt +7 -6
  193. data/tracks/ruby/lib/alphametics_cases.rb +49 -13
  194. data/tracks/ruby/lib/generator.rb +2 -1
  195. data/tracks/rust/docs/LEARNING.md +1 -0
  196. data/tracks/rust/exercises/acronym/tests/acronym.rs +6 -0
  197. metadata +164 -80
@@ -3,7 +3,7 @@ module Forth
3
3
  ( ForthError(..)
4
4
  , ForthState
5
5
  , evalText
6
- , formatStack
6
+ , toList
7
7
  , empty
8
8
  ) where
9
9
 
@@ -147,5 +147,5 @@ stepWord (User xs) = mapCode (xs ++)
147
147
  evalText :: Text -> ForthState -> Either ForthError ForthState
148
148
  evalText = eval . parseText
149
149
 
150
- formatStack :: ForthState -> Text
151
- formatStack = T.pack . unwords . map show . reverse . forthStack
150
+ toList :: ForthState -> [Int]
151
+ toList = reverse . forthStack
@@ -10,7 +10,6 @@ library:
10
10
  dependencies:
11
11
  # - foo # List here the packages you
12
12
  # - bar # want to use in your solution.
13
- - containers
14
13
 
15
14
  tests:
16
15
  test:
@@ -4,7 +4,7 @@ module Forth
4
4
  ( ForthError(..)
5
5
  , ForthState
6
6
  , evalText
7
- , formatStack
7
+ , toList
8
8
  , empty
9
9
  ) where
10
10
 
@@ -23,5 +23,5 @@ empty = undefined
23
23
  evalText :: Text -> ForthState -> Either ForthError ForthState
24
24
  evalText = undefined
25
25
 
26
- formatStack :: ForthState -> Text
27
- formatStack = undefined
26
+ toList :: ForthState -> [Int]
27
+ toList = undefined
@@ -4,7 +4,7 @@ import Control.Monad (foldM)
4
4
  import Test.Hspec (Spec, describe, it, shouldBe)
5
5
  import Test.Hspec.Runner (configFastFail, defaultConfig, hspecWith)
6
6
 
7
- import Forth (ForthError(..), empty, evalText, formatStack)
7
+ import Forth (ForthError(..), empty, evalText, toList)
8
8
 
9
9
  main :: IO ()
10
10
  main = hspecWith defaultConfig {configFastFail = True} specs
@@ -12,67 +12,122 @@ main = hspecWith defaultConfig {configFastFail = True} specs
12
12
  specs :: Spec
13
13
  specs = describe "forth" $ do
14
14
 
15
- -- As of 2016-10-02, there was no reference file
16
- -- for the test cases in `exercism/x-common`.
17
-
18
- let runTexts = fmap formatStack . foldM (flip evalText) empty
19
-
20
- it "no input, no stack" $
21
- formatStack empty `shouldBe` ""
22
-
23
- it "numbers just get pushed onto the stack" $
24
- runTexts ["1 2 3 4 5"] `shouldBe` Right "1 2 3 4 5"
25
-
26
- it "non-word characters are separators" $
27
- runTexts ["1\NUL2\SOH3\n4\r56\t7"] `shouldBe` Right "1 2 3 4 5 6 7"
28
-
29
- it "basic arithmetic" $ do
30
- runTexts ["1 2 + 4 -"] `shouldBe` Right "-1"
31
- runTexts ["2 4 * 3 /"] `shouldBe` Right "2"
32
-
33
- it "division by zero" $
34
- runTexts ["4 2 2 - /"] `shouldBe` Left DivisionByZero
35
-
36
- it "dup" $ do
37
- runTexts ["1 DUP" ] `shouldBe` Right "1 1"
38
- runTexts ["1 2 Dup"] `shouldBe` Right "1 2 2"
39
- runTexts ["dup" ] `shouldBe` Left StackUnderflow
40
-
41
- it "drop" $ do
42
- runTexts ["1 drop" ] `shouldBe` Right ""
43
- runTexts ["1 2 drop"] `shouldBe` Right "1"
44
- runTexts ["drop" ] `shouldBe` Left StackUnderflow
45
-
46
- it "swap" $ do
47
- runTexts ["1 2 swap" ] `shouldBe` Right "2 1"
48
- runTexts ["1 2 3 swap"] `shouldBe` Right "1 3 2"
49
- runTexts ["1 swap" ] `shouldBe` Left StackUnderflow
50
- runTexts ["swap" ] `shouldBe` Left StackUnderflow
51
-
52
- it "over" $ do
53
- runTexts ["1 2 over" ] `shouldBe` Right "1 2 1"
54
- runTexts ["1 2 3 over"] `shouldBe` Right "1 2 3 2"
55
- runTexts ["1 over" ] `shouldBe` Left StackUnderflow
56
- runTexts ["over" ] `shouldBe` Left StackUnderflow
57
-
58
- it "defining a new word" $
59
- runTexts [ ": dup-twice dup dup ;"
60
- , "1 dup-twice" ] `shouldBe` Right "1 1 1"
61
-
62
- it "redefining an existing word" $
63
- runTexts [ ": foo dup ;"
64
- , ": foo dup dup ;"
65
- , "1 foo" ] `shouldBe` Right "1 1 1"
66
-
67
- it "redefining an existing built-in word" $
68
- runTexts [ ": swap dup ;"
69
- , "1 swap" ] `shouldBe` Right "1 1"
70
-
71
- it "defining words with odd characters" $
72
- runTexts [": € 220371 ; €"] `shouldBe` Right "220371"
73
-
74
- it "defining a number" $
75
- runTexts [": 1 2 ;"] `shouldBe` Left InvalidWord
76
-
77
- it "calling a non-existing word" $
78
- runTexts ["1 foo"] `shouldBe` Left (UnknownWord "foo")
15
+ -- Test cases adapted from `exercism/x-common/forth` on 2016-11-06.
16
+
17
+ let runTexts = fmap toList . foldM (flip evalText) empty
18
+
19
+ describe "parsing and numbers" $ do
20
+ it "empty input results in empty stack" $
21
+ toList empty `shouldBe` []
22
+
23
+ it "numbers just get pushed onto the stack" $
24
+ runTexts ["1 2 3 4 5"] `shouldBe` Right [1, 2, 3, 4, 5]
25
+
26
+ it "all non-word characters are separators" $
27
+ runTexts ["1\NUL2\SOH3\n4\r5 6\t7"] `shouldBe` Right [1, 2, 3, 4, 5, 6, 7]
28
+
29
+ describe "addition" $ do
30
+ it "can add two numbers" $
31
+ runTexts ["1 2 +"] `shouldBe` Right [3]
32
+ it "errors if there is nothing on the stack" $
33
+ runTexts ["+"] `shouldBe` Left StackUnderflow
34
+ it "errors if there is only one value on the stack" $
35
+ runTexts ["1 +"] `shouldBe` Left StackUnderflow
36
+
37
+ describe "subtraction" $ do
38
+ it "can subtract two numbers" $
39
+ runTexts ["3 4 -"] `shouldBe` Right [-1]
40
+ it "errors if there is nothing on the stack" $
41
+ runTexts ["-"] `shouldBe` Left StackUnderflow
42
+ it "errors if there is only one value on the stack" $
43
+ runTexts ["1 -"] `shouldBe` Left StackUnderflow
44
+
45
+ describe "multiplication" $ do
46
+ it "can multiply two numbers" $
47
+ runTexts ["2 4 *"] `shouldBe` Right [8]
48
+ it "errors if there is nothing on the stack" $
49
+ runTexts ["*"] `shouldBe` Left StackUnderflow
50
+ it "errors if there is only one value on the stack" $
51
+ runTexts ["1 *"] `shouldBe` Left StackUnderflow
52
+
53
+ describe "division" $ do
54
+ it "can divide two numbers" $
55
+ runTexts ["12 3 /"] `shouldBe` Right [4]
56
+ it "performs integer division" $
57
+ runTexts ["8 3 /"] `shouldBe` Right [2]
58
+ it "errors if dividing by zero" $
59
+ runTexts ["4 0 /"] `shouldBe` Left DivisionByZero
60
+ it "errors if there is nothing on the stack" $
61
+ runTexts ["/"] `shouldBe` Left StackUnderflow
62
+ it "errors if there is only one value on the stack" $
63
+ runTexts ["1 /"] `shouldBe` Left StackUnderflow
64
+
65
+ describe "combined arithmetic" $ do
66
+ it "addition and subtraction" $
67
+ runTexts ["1 2 + 4 -"] `shouldBe` Right [-1]
68
+
69
+ it "multiplication and division" $
70
+ runTexts ["2 4 * 3 /"] `shouldBe` Right [2]
71
+
72
+ describe "dup" $ do
73
+ it "copies the top value on the stack" $
74
+ runTexts ["1 DUP" ] `shouldBe` Right [1, 1]
75
+ it "is case-insensitive" $
76
+ runTexts ["1 2 Dup"] `shouldBe` Right [1, 2, 2]
77
+ it "errors if there is nothing on the stack" $
78
+ runTexts ["dup" ] `shouldBe` Left StackUnderflow
79
+
80
+ describe "drop" $ do
81
+ it "removes the top value on the stack if it is the only one" $
82
+ runTexts ["1 drop" ] `shouldBe` Right []
83
+ it "removes the top value on the stack if it is not the only one" $
84
+ runTexts ["1 2 drop"] `shouldBe` Right [1]
85
+ it "errors if there is nothing on the stack" $
86
+ runTexts ["drop" ] `shouldBe` Left StackUnderflow
87
+
88
+ describe "swap" $ do
89
+ it "swaps the top two values on the stack if they are the only ones" $
90
+ runTexts ["1 2 swap" ] `shouldBe` Right [2, 1]
91
+ it "swaps the top two values on the stack if they are not the only ones" $
92
+ runTexts ["1 2 3 swap"] `shouldBe` Right [1, 3, 2]
93
+ it "errors if there is nothing on the stack" $
94
+ runTexts ["swap" ] `shouldBe` Left StackUnderflow
95
+ it "errors if there is only one value on the stack" $
96
+ runTexts ["1 swap" ] `shouldBe` Left StackUnderflow
97
+
98
+ describe "over" $ do
99
+ it "copies the second element if there are only two" $
100
+ runTexts ["1 2 over" ] `shouldBe` Right [1, 2, 1]
101
+ it "copies the second element if there are more than two" $
102
+ runTexts ["1 2 3 over"] `shouldBe` Right [1, 2, 3, 2]
103
+ it "errors if there is nothing on the stack" $
104
+ runTexts ["over" ] `shouldBe` Left StackUnderflow
105
+ it "errors if there is only one value on the stack" $
106
+ runTexts ["1 over" ] `shouldBe` Left StackUnderflow
107
+
108
+ describe "user-defined words" $ do
109
+ it "can consist of built-in words" $
110
+ runTexts [ ": dup-twice dup dup ;"
111
+ , "1 dup-twice" ] `shouldBe` Right [1, 1, 1]
112
+
113
+ it "execute in the right order" $
114
+ runTexts [ ": countup 1 2 3 ;"
115
+ , "countup" ] `shouldBe` Right [1, 2, 3]
116
+
117
+ it "can override other user-defined words" $
118
+ runTexts [ ": foo dup ;"
119
+ , ": foo dup dup ;"
120
+ , "1 foo" ] `shouldBe` Right [1, 1, 1]
121
+
122
+ it "can override built-in words" $
123
+ runTexts [ ": swap dup ;"
124
+ , "1 swap" ] `shouldBe` Right [1, 1]
125
+
126
+ it "can consist of arbitrary characters such as Unicode characters" $
127
+ runTexts [": € 220371 ; €"] `shouldBe` Right [220371]
128
+
129
+ it "cannot redefine numbers" $
130
+ runTexts [": 1 2 ;"] `shouldBe` Left InvalidWord
131
+
132
+ it "errors if executing a non-existent word" $
133
+ runTexts ["1 foo"] `shouldBe` Left (UnknownWord "foo")
@@ -0,0 +1,17 @@
1
+ name: gigasecond
2
+
3
+ dependencies:
4
+ - base
5
+ - time
6
+
7
+ library:
8
+ exposed-modules: Gigasecond
9
+ source-dirs: src
10
+
11
+ tests:
12
+ test:
13
+ main: Tests.hs
14
+ source-dirs: test
15
+ dependencies:
16
+ - gigasecond
17
+ - hspec
@@ -0,0 +1,20 @@
1
+ name: go-counting
2
+
3
+ dependencies:
4
+ - base
5
+ - containers
6
+
7
+ library:
8
+ exposed-modules: Counting
9
+ source-dirs: src
10
+ dependencies:
11
+ - array
12
+
13
+ tests:
14
+ test:
15
+ main: Tests.hs
16
+ source-dirs: test
17
+ dependencies:
18
+ - go-counting
19
+ - hspec
20
+ - multiset
@@ -0,0 +1,18 @@
1
+ name: grade-school
2
+
3
+ dependencies:
4
+ - base
5
+
6
+ library:
7
+ exposed-modules: School
8
+ source-dirs: src
9
+ dependencies:
10
+ - containers
11
+
12
+ tests:
13
+ test:
14
+ main: Tests.hs
15
+ source-dirs: test
16
+ dependencies:
17
+ - grade-school
18
+ - hspec
@@ -0,0 +1,16 @@
1
+ name: grains
2
+
3
+ dependencies:
4
+ - base
5
+
6
+ library:
7
+ exposed-modules: Grains
8
+ source-dirs: src
9
+
10
+ tests:
11
+ test:
12
+ main: Tests.hs
13
+ source-dirs: test
14
+ dependencies:
15
+ - grains
16
+ - hspec
@@ -24,8 +24,7 @@ specs = describe "grains" $ do
24
24
  where
25
25
  assertion = fromIntegral total `shouldBe` expected
26
26
 
27
- -- As of 2016-07-27, there was no reference file
28
- -- for the test cases in `exercism/x-common`.
27
+ -- Test cases adapted from `exercism/x-common/grains` on 2016-11-06.
29
28
 
30
29
  squareCases :: [(String, Integer, Maybe Integer)]
31
30
  squareCases =
@@ -0,0 +1,16 @@
1
+ name: hamming
2
+
3
+ dependencies:
4
+ - base
5
+
6
+ library:
7
+ exposed-modules: Hamming
8
+ source-dirs: src
9
+
10
+ tests:
11
+ test:
12
+ main: Tests.hs
13
+ source-dirs: test
14
+ dependencies:
15
+ - hamming
16
+ - hspec
@@ -0,0 +1,16 @@
1
+ name: hexadecimal
2
+
3
+ dependencies:
4
+ - base
5
+
6
+ library:
7
+ exposed-modules: Hexadecimal
8
+ source-dirs: src
9
+
10
+ tests:
11
+ test:
12
+ main: Tests.hs
13
+ source-dirs: test
14
+ dependencies:
15
+ - hexadecimal
16
+ - hspec
@@ -0,0 +1,16 @@
1
+ name: house
2
+
3
+ dependencies:
4
+ - base
5
+
6
+ library:
7
+ exposed-modules: House
8
+ source-dirs: src
9
+
10
+ tests:
11
+ test:
12
+ main: Tests.hs
13
+ source-dirs: test
14
+ dependencies:
15
+ - house
16
+ - hspec
@@ -0,0 +1,19 @@
1
+ name: kindergarten-garden
2
+
3
+ dependencies:
4
+ - base
5
+
6
+ library:
7
+ exposed-modules: Garden
8
+ source-dirs: src
9
+ dependencies:
10
+ - containers
11
+ - split
12
+
13
+ tests:
14
+ test:
15
+ main: Tests.hs
16
+ source-dirs: test
17
+ dependencies:
18
+ - kindergarten-garden
19
+ - hspec
@@ -0,0 +1,18 @@
1
+ name: largest-series-product
2
+
3
+ dependencies:
4
+ - base
5
+
6
+ library:
7
+ exposed-modules: Series
8
+ source-dirs: src
9
+ dependencies:
10
+ - safe
11
+
12
+ tests:
13
+ test:
14
+ main: Tests.hs
15
+ source-dirs: test
16
+ dependencies:
17
+ - largest-series-product
18
+ - hspec