trackler 2.0.0.8 → 2.0.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (226) hide show
  1. checksums.yaml +4 -4
  2. data/common/exercises/bob/canonical-data.json +1 -20
  3. data/common/exercises/raindrops/canonical-data.json +18 -0
  4. data/common/exercises/sublist/canonical-data.json +5 -0
  5. data/lib/trackler/version.rb +1 -1
  6. data/tracks/clojure/config.json +5 -0
  7. data/tracks/clojure/exercises/pig-latin/project.clj +4 -0
  8. data/tracks/clojure/exercises/pig-latin/src/example.clj +49 -0
  9. data/tracks/clojure/exercises/pig-latin/test/pig_latin_test.clj +92 -0
  10. data/tracks/clojure/exercises/robot-name/src/example.clj +8 -11
  11. data/tracks/clojure/exercises/robot-name/test/robot_name_test.clj +23 -18
  12. data/tracks/crystal/config.json +6 -0
  13. data/tracks/crystal/exercises/acronym/spec/acronym_spec.cr +7 -7
  14. data/tracks/crystal/exercises/forth/spec/forth_spec.cr +198 -0
  15. data/tracks/crystal/exercises/forth/src/example.cr +187 -0
  16. data/tracks/crystal/exercises/hello-world/spec/hello_world_spec.cr +3 -3
  17. data/tracks/crystal/src/generator/exercises/acronym.cr +1 -1
  18. data/tracks/crystal/src/generator/exercises/exercise_generator.cr +3 -2
  19. data/tracks/crystal/src/generator/exercises/forth.cr +56 -0
  20. data/tracks/crystal/src/generator/exercises/templates/example.tt +2 -2
  21. data/tracks/crystal/src/generator/spec/exercise_generator_spec.cr +5 -3
  22. data/tracks/csharp/exercises/wordy/WordyTest.cs +2 -2
  23. data/tracks/elixir/config.json +83 -70
  24. data/tracks/fsharp/exercises/wordy/WordyTest.fs +1 -1
  25. data/tracks/go/config.json +28 -3
  26. data/tracks/go/exercises/all-your-base/all_your_base_test.go +185 -0
  27. data/tracks/go/exercises/all-your-base/example.go +60 -0
  28. data/tracks/go/exercises/isogram/example.go +15 -0
  29. data/tracks/go/exercises/isogram/isogram_test.go +50 -0
  30. data/tracks/go/exercises/ledger/ledger.go +2 -2
  31. data/tracks/go/exercises/pangram/example.go +32 -0
  32. data/tracks/go/exercises/pangram/pangram_test.go +43 -0
  33. data/tracks/go/exercises/protein-translation/example.go +59 -0
  34. data/tracks/go/exercises/protein-translation/protein_translation_test.go +69 -0
  35. data/tracks/go/exercises/tree-building/tree_building.go +1 -1
  36. data/tracks/go/exercises/twelve-days/example.go +57 -0
  37. data/tracks/go/exercises/twelve-days/twelve_days_test.go +79 -0
  38. data/tracks/haskell/.travis.yml +13 -8
  39. data/tracks/haskell/config.json +6 -0
  40. data/tracks/haskell/exercises/accumulate/stack.yaml +1 -1
  41. data/tracks/haskell/exercises/all-your-base/stack.yaml +1 -1
  42. data/tracks/haskell/exercises/allergies/stack.yaml +1 -1
  43. data/tracks/haskell/exercises/alphametics/stack.yaml +1 -1
  44. data/tracks/haskell/exercises/anagram/stack.yaml +1 -1
  45. data/tracks/haskell/exercises/atbash-cipher/stack.yaml +1 -1
  46. data/tracks/haskell/exercises/bank-account/stack.yaml +1 -1
  47. data/tracks/haskell/exercises/beer-song/stack.yaml +1 -1
  48. data/tracks/haskell/exercises/binary/stack.yaml +1 -1
  49. data/tracks/haskell/exercises/binary-search-tree/stack.yaml +1 -1
  50. data/tracks/haskell/exercises/bob/stack.yaml +1 -1
  51. data/tracks/haskell/exercises/bowling/HINTS.md +19 -0
  52. data/tracks/haskell/exercises/bowling/examples/success-standard/package.yaml +16 -0
  53. data/tracks/haskell/exercises/bowling/examples/success-standard/src/Bowling.hs +84 -0
  54. data/tracks/haskell/exercises/bowling/package.yaml +19 -0
  55. data/tracks/haskell/exercises/bowling/src/Bowling.hs +9 -0
  56. data/tracks/haskell/exercises/bowling/stack.yaml +1 -0
  57. data/tracks/haskell/exercises/bowling/test/Tests.hs +143 -0
  58. data/tracks/haskell/exercises/change/stack.yaml +1 -1
  59. data/tracks/haskell/exercises/clock/stack.yaml +1 -1
  60. data/tracks/haskell/exercises/connect/stack.yaml +1 -1
  61. data/tracks/haskell/exercises/crypto-square/stack.yaml +1 -1
  62. data/tracks/haskell/exercises/custom-set/stack.yaml +1 -1
  63. data/tracks/haskell/exercises/difference-of-squares/stack.yaml +1 -1
  64. data/tracks/haskell/exercises/dominoes/stack.yaml +1 -1
  65. data/tracks/haskell/exercises/etl/stack.yaml +1 -1
  66. data/tracks/haskell/exercises/food-chain/stack.yaml +1 -1
  67. data/tracks/haskell/exercises/forth/stack.yaml +1 -1
  68. data/tracks/haskell/exercises/gigasecond/stack.yaml +1 -1
  69. data/tracks/haskell/exercises/go-counting/stack.yaml +1 -1
  70. data/tracks/haskell/exercises/grade-school/stack.yaml +1 -1
  71. data/tracks/haskell/exercises/grains/stack.yaml +1 -1
  72. data/tracks/haskell/exercises/hamming/stack.yaml +1 -1
  73. data/tracks/haskell/exercises/hexadecimal/stack.yaml +1 -1
  74. data/tracks/haskell/exercises/house/stack.yaml +1 -1
  75. data/tracks/haskell/exercises/kindergarten-garden/stack.yaml +1 -1
  76. data/tracks/haskell/exercises/largest-series-product/stack.yaml +1 -1
  77. data/tracks/haskell/exercises/leap/stack.yaml +1 -1
  78. data/tracks/haskell/exercises/lens-person/stack.yaml +1 -1
  79. data/tracks/haskell/exercises/linked-list/stack.yaml +1 -1
  80. data/tracks/haskell/exercises/list-ops/stack.yaml +1 -1
  81. data/tracks/haskell/exercises/luhn/stack.yaml +1 -1
  82. data/tracks/haskell/exercises/matrix/stack.yaml +1 -1
  83. data/tracks/haskell/exercises/meetup/stack.yaml +1 -1
  84. data/tracks/haskell/exercises/minesweeper/stack.yaml +1 -1
  85. data/tracks/haskell/exercises/nth-prime/stack.yaml +1 -1
  86. data/tracks/haskell/exercises/nucleotide-count/stack.yaml +1 -1
  87. data/tracks/haskell/exercises/ocr-numbers/stack.yaml +1 -1
  88. data/tracks/haskell/exercises/octal/stack.yaml +1 -1
  89. data/tracks/haskell/exercises/palindrome-products/stack.yaml +1 -1
  90. data/tracks/haskell/exercises/parallel-letter-frequency/stack.yaml +1 -1
  91. data/tracks/haskell/exercises/pascals-triangle/stack.yaml +1 -1
  92. data/tracks/haskell/exercises/phone-number/stack.yaml +1 -1
  93. data/tracks/haskell/exercises/pig-latin/stack.yaml +1 -1
  94. data/tracks/haskell/exercises/pov/stack.yaml +1 -1
  95. data/tracks/haskell/exercises/prime-factors/stack.yaml +1 -1
  96. data/tracks/haskell/exercises/pythagorean-triplet/stack.yaml +1 -1
  97. data/tracks/haskell/exercises/queen-attack/stack.yaml +1 -1
  98. data/tracks/haskell/exercises/raindrops/stack.yaml +1 -1
  99. data/tracks/haskell/exercises/rna-transcription/stack.yaml +1 -1
  100. data/tracks/haskell/exercises/robot-name/stack.yaml +1 -1
  101. data/tracks/haskell/exercises/robot-simulator/stack.yaml +1 -1
  102. data/tracks/haskell/exercises/roman-numerals/stack.yaml +1 -1
  103. data/tracks/haskell/exercises/saddle-points/stack.yaml +1 -1
  104. data/tracks/haskell/exercises/say/stack.yaml +1 -1
  105. data/tracks/haskell/exercises/scrabble-score/stack.yaml +1 -1
  106. data/tracks/haskell/exercises/secret-handshake/stack.yaml +1 -1
  107. data/tracks/haskell/exercises/series/stack.yaml +1 -1
  108. data/tracks/haskell/exercises/sgf-parsing/stack.yaml +1 -1
  109. data/tracks/haskell/exercises/sieve/stack.yaml +1 -1
  110. data/tracks/haskell/exercises/simple-cipher/stack.yaml +1 -1
  111. data/tracks/haskell/exercises/simple-linked-list/stack.yaml +1 -1
  112. data/tracks/haskell/exercises/space-age/stack.yaml +1 -1
  113. data/tracks/haskell/exercises/strain/stack.yaml +1 -1
  114. data/tracks/haskell/exercises/sublist/stack.yaml +1 -1
  115. data/tracks/haskell/exercises/sum-of-multiples/stack.yaml +1 -1
  116. data/tracks/haskell/exercises/triangle/stack.yaml +1 -1
  117. data/tracks/haskell/exercises/trinary/stack.yaml +1 -1
  118. data/tracks/haskell/exercises/word-count/stack.yaml +1 -1
  119. data/tracks/haskell/exercises/wordy/stack.yaml +1 -1
  120. data/tracks/haskell/exercises/zebra-puzzle/stack.yaml +1 -1
  121. data/tracks/haskell/exercises/zipper/stack.yaml +1 -1
  122. data/tracks/java/config.json +13 -1
  123. data/tracks/java/exercises/etl/src/main/java/Etl.java +3 -3
  124. data/tracks/java/exercises/hello-world/GETTING_STARTED.md +1 -1
  125. data/tracks/java/exercises/hello-world/src/main/java/HelloWorld.java +3 -3
  126. data/tracks/java/exercises/minesweeper/build.gradle +17 -0
  127. data/tracks/java/exercises/minesweeper/src/example/java/MinesweeperBoard.java +111 -0
  128. data/tracks/java/exercises/minesweeper/src/main/java/MinesweeperBoard.java +5 -0
  129. data/tracks/java/exercises/minesweeper/src/test/java/MinesweeperBoardTest.java +295 -0
  130. data/tracks/java/exercises/nucleotide-count/src/test/java/NucleotideTest.java +67 -67
  131. data/tracks/java/exercises/series/build.gradle +18 -0
  132. data/tracks/java/exercises/series/src/example/java/Series.java +39 -0
  133. data/tracks/java/exercises/series/src/main/java/.keep +0 -0
  134. data/tracks/java/exercises/series/src/main/java/Series.java +3 -0
  135. data/tracks/java/exercises/series/src/test/java/.keep +0 -0
  136. data/tracks/java/exercises/series/src/test/java/SeriesTest.java +154 -0
  137. data/tracks/java/exercises/settings.gradle +2 -0
  138. data/tracks/javascript/exercises/custom-set/custom-set.spec.js +130 -84
  139. data/tracks/javascript/exercises/custom-set/example-gen.js +200 -0
  140. data/tracks/ocaml/Makefile +5 -1
  141. data/tracks/ocaml/config.json +2 -1
  142. data/tracks/ocaml/exercises/anagram/test.ml +35 -24
  143. data/tracks/ocaml/exercises/bob/example.ml +1 -1
  144. data/tracks/ocaml/exercises/bob/test.ml +53 -40
  145. data/tracks/ocaml/exercises/hamming/test.ml +41 -31
  146. data/tracks/ocaml/exercises/raindrops/test.ml +38 -39
  147. data/tracks/ocaml/tools/test-generator/.merlin +5 -0
  148. data/tracks/ocaml/tools/test-generator/Makefile +15 -0
  149. data/tracks/ocaml/tools/test-generator/_tags +0 -0
  150. data/tracks/ocaml/tools/test-generator/src/codegen.ml +17 -0
  151. data/tracks/ocaml/tools/test-generator/src/codegen.mli +7 -0
  152. data/tracks/ocaml/tools/test-generator/src/leap.json +39 -0
  153. data/tracks/ocaml/tools/test-generator/src/model.ml +31 -0
  154. data/tracks/ocaml/tools/test-generator/src/parser.ml +61 -0
  155. data/tracks/ocaml/tools/test-generator/src/parser.mli +9 -0
  156. data/tracks/ocaml/tools/test-generator/src/special_cases.ml +12 -0
  157. data/tracks/ocaml/tools/test-generator/src/special_cases.mli +7 -0
  158. data/tracks/ocaml/tools/test-generator/src/test_gen.ml +25 -0
  159. data/tracks/ocaml/tools/test-generator/src/test_generator.ml +62 -0
  160. data/tracks/ocaml/tools/test-generator/src/test_generator.mli +6 -0
  161. data/tracks/ocaml/tools/test-generator/src/utils.ml +32 -0
  162. data/tracks/ocaml/tools/test-generator/src/utils.mli +18 -0
  163. data/tracks/ocaml/tools/test-generator/templates/anagram/template.ml +17 -0
  164. data/tracks/ocaml/tools/test-generator/templates/bob/template.ml +15 -0
  165. data/tracks/ocaml/tools/test-generator/templates/hamming/template.ml +30 -0
  166. data/tracks/ocaml/tools/test-generator/templates/leap/template.ml +15 -0
  167. data/tracks/ocaml/tools/test-generator/templates/raindrops/template.ml +15 -0
  168. data/tracks/ocaml/tools/test-generator/templates/word-count/template.ml +19 -0
  169. data/tracks/ocaml/tools/test-generator/test/all_tests.ml +11 -0
  170. data/tracks/ocaml/tools/test-generator/test/codegen_test.ml +20 -0
  171. data/tracks/ocaml/tools/test-generator/test/model_test.ml +27 -0
  172. data/tracks/ocaml/tools/test-generator/test/parser_test.ml +73 -0
  173. data/tracks/ocaml/tools/test-generator/test/special_cases_test.ml +22 -0
  174. data/tracks/ocaml/tools/test-generator/test/test_generator_test.ml +11 -0
  175. data/tracks/ocaml/tools/test-generator/test/utils_test.ml +21 -0
  176. data/tracks/perl5/config.json +1 -1
  177. data/tracks/perl6/accumulate/accumulate.t +8 -2
  178. data/tracks/perl6/anagram/Example.pm +1 -1
  179. data/tracks/perl6/anagram/anagram.t +7 -8
  180. data/tracks/perl6/binary/Example.pm +1 -1
  181. data/tracks/perl6/binary/binary.t +7 -8
  182. data/tracks/perl6/bob/bob.t +1 -3
  183. data/tracks/perl6/config.json +1 -0
  184. data/tracks/perl6/grains/grains.t +7 -2
  185. data/tracks/perl6/leap/leap.t +3 -1
  186. data/tracks/perl6/raindrops/raindrops.t +8 -2
  187. data/tracks/perl6/rna-transcription/rna_transcription.t +8 -9
  188. data/tracks/perl6/robot-name/robot.t +8 -9
  189. data/tracks/perl6/scrabble-score/Example.pm +1 -1
  190. data/tracks/perl6/scrabble-score/scrabble_score.t +8 -2
  191. data/tracks/perl6/word-count/word_count.t +8 -2
  192. data/tracks/php/config.json +5 -0
  193. data/tracks/php/exercises/markdown/example.php +85 -0
  194. data/tracks/php/exercises/markdown/markdown.php +82 -0
  195. data/tracks/php/exercises/markdown/markdown_test.php +57 -0
  196. data/tracks/python/exercises/hamming/example.py +3 -0
  197. data/tracks/python/exercises/hamming/hamming_test.py +40 -14
  198. data/tracks/python/exercises/rna-transcription/example.py +6 -1
  199. data/tracks/python/exercises/rna-transcription/rna_transcription_test.py +9 -0
  200. data/tracks/ruby/config.json +6 -0
  201. data/tracks/ruby/exercises/dominoes/.version +1 -0
  202. data/tracks/ruby/exercises/dominoes/dominoes_test.rb +149 -0
  203. data/tracks/ruby/exercises/dominoes/example.rb +37 -0
  204. data/tracks/ruby/exercises/dominoes/example.tt +57 -0
  205. data/tracks/ruby/exercises/pangram/.version +1 -1
  206. data/tracks/ruby/exercises/pangram/example.rb +2 -2
  207. data/tracks/ruby/exercises/pangram/example.tt +5 -7
  208. data/tracks/ruby/exercises/pangram/pangram_test.rb +30 -25
  209. data/tracks/ruby/exercises/queen-attack/.version +1 -0
  210. data/tracks/ruby/exercises/queen-attack/example.rb +5 -30
  211. data/tracks/ruby/exercises/queen-attack/example.tt +22 -0
  212. data/tracks/ruby/exercises/queen-attack/queen_attack_test.rb +46 -95
  213. data/tracks/ruby/exercises/triangle/.version +1 -0
  214. data/tracks/ruby/exercises/triangle/example.rb +15 -22
  215. data/tracks/ruby/exercises/triangle/example.tt +20 -0
  216. data/tracks/ruby/exercises/triangle/triangle_test.rb +80 -40
  217. data/tracks/ruby/lib/dominoes_cases.rb +23 -0
  218. data/tracks/ruby/lib/pangram_cases.rb +19 -4
  219. data/tracks/ruby/lib/queen_attack_cases.rb +54 -0
  220. data/tracks/ruby/lib/triangle_cases.rb +51 -0
  221. data/tracks/scala/config.json +6 -0
  222. data/tracks/scala/exercises/dominoes/Example.scala +41 -0
  223. data/tracks/scala/exercises/dominoes/build.sbt +3 -0
  224. data/tracks/scala/exercises/dominoes/src/main/scala/Dominoes.scala +4 -0
  225. data/tracks/scala/exercises/dominoes/src/test/scala/DominoesSuite.scala +91 -0
  226. metadata +83 -2
@@ -0,0 +1,187 @@
1
+ class Token
2
+ property type : Symbol
3
+ property string_value : String
4
+ property int_value : Int32
5
+
6
+ def initialize
7
+ @type = :EOF
8
+ @string_value = ""
9
+ @int_value = 0_i32
10
+ end
11
+
12
+ def eof?
13
+ type == :EOF
14
+ end
15
+ end
16
+
17
+ class Lexer
18
+ getter reader
19
+ getter token
20
+
21
+ def initialize(code : String)
22
+ @reader = Char::Reader.new(code)
23
+ @token = Token.new
24
+ end
25
+
26
+ def create_token
27
+ @token = Token.new unless @token.eof?
28
+ end
29
+
30
+ def next_token
31
+ create_token
32
+ skip_whitespace
33
+ case current_char
34
+ when '\0'
35
+ @token.type = :EOF
36
+ when ':'
37
+ next_char :":"
38
+ when ';'
39
+ next_char :";"
40
+ when .number?
41
+ @token.type = :INT
42
+ consume_number
43
+ else
44
+ @token.type = :WORD
45
+ consume_string
46
+ end
47
+
48
+ @token
49
+ end
50
+
51
+ private def consume_string
52
+ start_pos = current_pos
53
+
54
+ while valid_word_char?
55
+ next_char
56
+ end
57
+
58
+ @token.string_value = reader.string.byte_slice(start_pos, current_pos - start_pos)
59
+ end
60
+
61
+ private def consume_number
62
+ integer = 0
63
+
64
+ while '0' <= current_char <= '9'
65
+ integer *= 10
66
+ integer += current_char.to_i
67
+ next_char
68
+ end
69
+
70
+ @token.int_value = integer
71
+ end
72
+
73
+ private def next_char(token_type)
74
+ @token.type = token_type
75
+ next_char
76
+ end
77
+
78
+ private def current_pos
79
+ reader.pos
80
+ end
81
+
82
+ private def skip_whitespace
83
+ while current_char.whitespace? || current_char.control?
84
+ break unless reader.has_next?
85
+ next_char
86
+ end
87
+ end
88
+
89
+ private def valid_word_char?
90
+ !current_char.number? && !current_char.whitespace? && !(current_char == '\0')
91
+ end
92
+
93
+ private delegate current_char, to: @reader
94
+ private delegate next_char, to: @reader
95
+ end
96
+
97
+ class Forth
98
+ def self.evaluate(code_string)
99
+ new(code_string).evaluate
100
+ end
101
+
102
+ def initialize(code_string)
103
+ @lexer = Lexer.new(code_string)
104
+ @stack = Array(Int32).new
105
+ @defs = Hash(String, Array(Token)).new
106
+ end
107
+
108
+ def evaluate
109
+ loop do
110
+ evaluate_token(next_token)
111
+ return stack if token.eof?
112
+ end
113
+ end
114
+
115
+ private def evaluate_token(t)
116
+ case t.type
117
+ when :INT
118
+ parse_number(t)
119
+ when :WORD
120
+ parse_word(t)
121
+ when :":"
122
+ parse_def
123
+ when :EOF
124
+ return
125
+ else
126
+ raise "Unexpected Token!"
127
+ end
128
+ end
129
+
130
+ private def parse_number(t)
131
+ stack.push(t.int_value)
132
+ end
133
+
134
+ private def parse_word(t)
135
+ if defs[t.string_value.upcase]?
136
+ return defs[t.string_value.upcase].each { |t| evaluate_token(t) }
137
+ end
138
+
139
+ case t.string_value.upcase
140
+ when "+"
141
+ pop_twice { |a, b| stack.push(b + a) }
142
+ when "-"
143
+ pop_twice { |a, b| stack.push(b - a) }
144
+ when "*"
145
+ pop_twice { |a, b| stack.push(b * a) }
146
+ when "/"
147
+ pop_twice { |a, b| stack.push(b / a) }
148
+ when "DUP"
149
+ pop_once { |a| stack.push(a).push(a) }
150
+ when "DROP"
151
+ pop_once { }
152
+ when "SWAP"
153
+ pop_twice { |a, b| stack.push(a).push(b) }
154
+ when "OVER"
155
+ pop_twice { |a, b| stack.push(b).push(a).push(b) }
156
+ else
157
+ raise "Unknown word"
158
+ end
159
+ end
160
+
161
+ private def parse_def
162
+ next_token
163
+ raise "Invalid method name" if token.type == :INT
164
+ name = token.string_value.upcase
165
+ defs[name] = [] of Token
166
+ while next_token
167
+ raise "Invalid Definition" if token.type == :EOF
168
+ break if token.type == :";"
169
+ defs[name] << token
170
+ end
171
+ end
172
+
173
+ private def pop_once(&block)
174
+ raise "Invalid program" if stack.empty?
175
+ yield(stack.pop)
176
+ end
177
+
178
+ private def pop_twice(&block)
179
+ raise "Invalid program" if stack.size < 2
180
+ yield(stack.pop, stack.pop)
181
+ end
182
+
183
+ private property defs
184
+ private getter stack
185
+ private delegate token, to: @lexer
186
+ private delegate next_token, to: @lexer
187
+ end
@@ -2,15 +2,15 @@ require "spec"
2
2
  require "../src/*"
3
3
 
4
4
  describe "HelloWorld" do
5
- it "tests no name" do
5
+ it "no name" do
6
6
  HelloWorld.hello.should eq("Hello, World!")
7
7
  end
8
8
 
9
- pending "tests sample name" do
9
+ pending "sample name" do
10
10
  HelloWorld.hello("Alice").should eq("Hello, Alice!")
11
11
  end
12
12
 
13
- pending "tests other sample name" do
13
+ pending "other sample name" do
14
14
  HelloWorld.hello("Bob").should eq("Hello, Bob!")
15
15
  end
16
16
  end
@@ -29,6 +29,6 @@ class AcronymTestCase < ExerciseTestCase
29
29
  end
30
30
 
31
31
  def test_name
32
- description
32
+ "does #{description}"
33
33
  end
34
34
  end
@@ -9,6 +9,7 @@ abstract class ExerciseGenerator
9
9
  end
10
10
 
11
11
  def generate
12
+ raise "There are no test cases for #{exercise_name}" if test_cases.empty?
12
13
  File.write(test_file, to_s)
13
14
  end
14
15
 
@@ -16,8 +17,8 @@ abstract class ExerciseGenerator
16
17
  exercise_name.split('-').map(&.capitalize).join
17
18
  end
18
19
 
19
- abstract def exercise_name : String
20
- abstract def test_cases : Array(ExerciseTestCase)
20
+ abstract def exercise_name
21
+ abstract def test_cases
21
22
 
22
23
  private def root
23
24
  File.expand_path(File.join("..", "..", "..", ".."), __FILE__)
@@ -0,0 +1,56 @@
1
+ require "./exercise_generator"
2
+ require "./exercise_test_case"
3
+
4
+ class ForthGenerator < ExerciseGenerator
5
+ def exercise_name
6
+ "forth"
7
+ end
8
+
9
+ def test_cases
10
+ test_cases = [] of JSON::Any
11
+ JSON.parse(data).each do |k, v|
12
+ v.each do |a, b|
13
+ test_cases.concat(b) if a.as_s == "cases"
14
+ end
15
+ end
16
+ test_cases.map do |test_case|
17
+ ForthTestCase.new(test_case)
18
+ end
19
+ end
20
+ end
21
+
22
+ class ForthTestCase < ExerciseTestCase
23
+ private getter input : JSON::Any | String
24
+ private getter description : JSON::Any
25
+ private getter expected : JSON::Any
26
+
27
+ def initialize(test_case)
28
+ @input = test_case["input"].as_a.join
29
+ @description = test_case["description"]
30
+ @expected = fix_empty_array(test_case["expected"])
31
+ end
32
+
33
+ def workload
34
+ if !(expected == nil)
35
+ "Forth.evaluate(#{input.inspect}).should eq(#{expected})"
36
+ else
37
+ <<-WL
38
+ expect_raises do
39
+ Forth.evaluate(#{input.inspect})
40
+ end
41
+ WL
42
+ end
43
+ end
44
+
45
+ def test_name
46
+ description
47
+ end
48
+
49
+ private def fix_empty_array(json)
50
+ if json.to_s.match(/\[\]/)
51
+ JSON.parse("[] of Int32".to_json)
52
+ else
53
+ json
54
+ end
55
+ end
56
+ end
@@ -1,9 +1,9 @@
1
1
  require "spec"
2
2
  require "../src/*"
3
3
 
4
- describe <%= "#{describe_name.inspect} do" %>
4
+ describe <%= "#{describe_name.inspect} do" -%>
5
5
  <% test_cases.each_with_index do |test_case, index| %>
6
- <%= test_case.pending?(index) %> "tests <%= test_case.test_name %>" do
6
+ <%= test_case.pending?(index) %> "<%= test_case.test_name %>" do
7
7
  <%= test_case.workload %>
8
8
  end
9
9
  <% end -%>
@@ -19,9 +19,11 @@ describe "ExerciseGenerator" do
19
19
  end
20
20
  end
21
21
 
22
- describe "#to_s" do
23
- it "will output the generator test file using the example.tt" do
24
- DummyGenerator.new.to_s.should eq("require \"spec\"\nrequire \"../src/*\"\n\ndescribe \"Dummy\" do\nend\n")
22
+ describe "#generate" do
23
+ it "raises an error if no test cases exist" do
24
+ expect_raises do
25
+ DummyGenerator.generate
26
+ end
25
27
  end
26
28
  end
27
29
  end
@@ -109,8 +109,8 @@ public class WordProblemTest
109
109
 
110
110
  [Ignore("Remove to run test")]
111
111
  [Test]
112
- public void Irrelevent_problems_are_not_valid()
112
+ public void Irrelevant_problems_are_not_valid()
113
113
  {
114
114
  Assert.That(() => WordProblem.Solve("Who is the president of the United States?"), Throws.ArgumentException);
115
115
  }
116
- }
116
+ }