trackler 2.0.0.2 → 2.0.0.3

Sign up to get free protection for your applications and to get access to all the features.
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