trackler 1.0.4.0 → 1.0.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/common/CONTRIBUTING.md +17 -2
  3. data/common/exercises/anagram/canonical-data.json +0 -14
  4. data/common/exercises/pig-latin/canonical-data.json +6 -1
  5. data/common/exercises/raindrops/description.md +4 -4
  6. data/common/exercises/raindrops/metadata.yml +1 -1
  7. data/common/exercises/roman-numerals/metadata.yml +1 -1
  8. data/lib/trackler/version.rb +1 -1
  9. data/tracks/c/config.json +12 -1
  10. data/tracks/c/exercises/roman-numerals/makefile +16 -0
  11. data/tracks/c/exercises/roman-numerals/src/example.c +43 -0
  12. data/tracks/c/exercises/roman-numerals/src/example.h +6 -0
  13. data/tracks/c/exercises/roman-numerals/test/test_roman_numerals.c +126 -0
  14. data/tracks/c/exercises/roman-numerals/test/vendor/unity.c +1300 -0
  15. data/tracks/c/exercises/roman-numerals/test/vendor/unity.h +274 -0
  16. data/tracks/c/exercises/roman-numerals/test/vendor/unity_internals.h +701 -0
  17. data/tracks/clojure/exercises/flatten-array/project.clj +4 -0
  18. data/tracks/csharp/exercises/protein-translation/ProteinTranslationTest.cs +1 -1
  19. data/tracks/elixir/exercises/bowling/bowling_test.exs +157 -62
  20. data/tracks/elixir/exercises/bowling/example.exs +33 -4
  21. data/tracks/erlang/config.json +176 -36
  22. data/tracks/go/.travis.yml +7 -1
  23. data/tracks/go/bin/test-without-stubs +29 -0
  24. data/tracks/go/exercises/robot-simulator/defs.go +1 -1
  25. data/tracks/go/exercises/variable-length-quantity/variable_length_quantity_test.go +31 -25
  26. data/tracks/haskell/.travis.yml +9 -5
  27. data/tracks/haskell/config.json +127 -121
  28. data/tracks/haskell/exercises/leap/src/LeapYear.hs +1 -1
  29. data/tracks/haskell/exercises/space-age/HINTS.md +14 -2
  30. data/tracks/haskell/exercises/space-age/{src/Example.hs → examples/success-double/SpaceAge.hs} +0 -0
  31. data/tracks/haskell/exercises/space-age/examples/success-double/package.yaml +19 -0
  32. data/tracks/haskell/exercises/space-age/examples/success-rational/SpaceAge.hs +24 -0
  33. data/tracks/haskell/exercises/space-age/examples/success-rational/package.yaml +19 -0
  34. data/tracks/haskell/exercises/space-age/src/SpaceAge.hs +4 -1
  35. data/tracks/haskell/exercises/space-age/test/Tests.hs +12 -5
  36. data/tracks/haskell/exercises/word-count/HINTS.md +21 -0
  37. data/tracks/haskell/exercises/word-count/examples/success-newtype/WordCount.hs +31 -0
  38. data/tracks/haskell/exercises/word-count/examples/success-newtype/package.yaml +21 -0
  39. data/tracks/haskell/exercises/word-count/examples/success-simple/WordCount.hs +13 -0
  40. data/tracks/haskell/exercises/word-count/examples/success-simple/package.yaml +20 -0
  41. data/tracks/haskell/exercises/word-count/package.yaml +0 -2
  42. data/tracks/haskell/exercises/word-count/src/WordCount.hs +2 -1
  43. data/tracks/haskell/exercises/word-count/test/Tests.hs +15 -6
  44. data/tracks/haskell/exercises/zebra-puzzle/package.yaml +19 -0
  45. data/tracks/haskell/exercises/zebra-puzzle/src/Example.hs +113 -0
  46. data/tracks/haskell/exercises/zebra-puzzle/src/ZebraPuzzle.hs +12 -0
  47. data/tracks/haskell/exercises/zebra-puzzle/stack.yaml +1 -0
  48. data/tracks/haskell/exercises/zebra-puzzle/test/Tests.hs +13 -0
  49. data/tracks/javascript/exercises/beer-song/beer-song.spec.js +5 -0
  50. data/tracks/lisp/config.json +147 -0
  51. data/tracks/ocaml/config.json +12 -0
  52. data/tracks/ocaml/exercises/atbash-cipher/.merlin +5 -0
  53. data/tracks/ocaml/exercises/atbash-cipher/HINTS.md +17 -0
  54. data/tracks/ocaml/exercises/atbash-cipher/Makefile +11 -0
  55. data/tracks/ocaml/exercises/atbash-cipher/atbash_cipher.mli +5 -0
  56. data/tracks/ocaml/exercises/atbash-cipher/example.ml +47 -0
  57. data/tracks/ocaml/exercises/atbash-cipher/test.ml +37 -0
  58. data/tracks/ocaml/exercises/meetup/.merlin +5 -0
  59. data/tracks/ocaml/exercises/meetup/Makefile +11 -0
  60. data/tracks/ocaml/exercises/meetup/example.ml +63 -0
  61. data/tracks/ocaml/exercises/meetup/meetup.mli +7 -0
  62. data/tracks/ocaml/exercises/meetup/test.ml +786 -0
  63. data/tracks/php/exercises/bowling/bowling_test.php +233 -10
  64. data/tracks/php/exercises/bowling/example.php +49 -6
  65. data/tracks/python/.travis.yml +5 -0
  66. data/tracks/python/config.json +33 -1
  67. data/tracks/python/exercises/flatten-array/example.py +18 -0
  68. data/tracks/python/exercises/flatten-array/flatten_array_test.py +40 -0
  69. data/tracks/python/exercises/robot-name/robot_name_test.py +8 -2
  70. data/tracks/r/config.json +32 -8
  71. data/tracks/ruby/bin/enable-executable +9 -5
  72. data/tracks/ruby/bin/executable-tests-check +7 -3
  73. data/tracks/ruby/bin/local-status-check +4 -4
  74. data/tracks/ruby/config.json +8 -1
  75. data/tracks/ruby/exercises/acronym/acronym_test.rb +0 -1
  76. data/tracks/ruby/exercises/anagram/.version +1 -0
  77. data/tracks/ruby/exercises/anagram/anagram_test.rb +101 -31
  78. data/tracks/ruby/exercises/anagram/example.rb +4 -0
  79. data/tracks/ruby/exercises/anagram/example.tt +19 -0
  80. data/tracks/ruby/exercises/gigasecond/.version +1 -1
  81. data/tracks/ruby/exercises/gigasecond/example.rb +1 -1
  82. data/tracks/ruby/exercises/gigasecond/gigasecond_test.rb +2 -2
  83. data/tracks/ruby/exercises/isogram/.version +1 -0
  84. data/tracks/ruby/exercises/isogram/example.rb +10 -0
  85. data/tracks/ruby/exercises/isogram/example.tt +20 -0
  86. data/tracks/ruby/exercises/isogram/isogram_test.rb +90 -0
  87. data/tracks/ruby/exercises/poker/example.rb +97 -39
  88. data/tracks/ruby/exercises/poker/poker_test.rb +67 -36
  89. data/tracks/ruby/exercises/sieve/.version +1 -0
  90. data/tracks/ruby/exercises/sieve/example.rb +4 -0
  91. data/tracks/ruby/exercises/sieve/example.tt +21 -0
  92. data/tracks/ruby/exercises/sieve/sieve_test.rb +36 -13
  93. data/tracks/ruby/exercises/word-count/example.tt +4 -3
  94. data/tracks/ruby/exercises/word-count/word_count_test.rb +38 -48
  95. data/tracks/ruby/lib/anagram_cases.rb +42 -0
  96. data/tracks/ruby/lib/isogram_cases.rb +24 -0
  97. data/tracks/ruby/lib/sieve_cases.rb +33 -0
  98. data/tracks/ruby/lib/word_count_cases.rb +19 -0
  99. data/tracks/scala/config.json +21 -0
  100. data/tracks/scala/docs/RESOURCES.md +1 -0
  101. data/tracks/scala/exercises/bracket-push/build.sbt +4 -0
  102. data/tracks/scala/exercises/bracket-push/example.scala +23 -0
  103. data/tracks/scala/exercises/bracket-push/src/main/scala/.keep +0 -0
  104. data/tracks/scala/exercises/bracket-push/src/test/scala/BracketsTest.scala +68 -0
  105. data/tracks/scala/exercises/change/src/test/scala/ChangeTest.scala +7 -0
  106. data/tracks/scala/exercises/sgf-parsing/build.sbt +7 -0
  107. data/tracks/scala/exercises/sgf-parsing/example.scala +66 -0
  108. data/tracks/scala/exercises/sgf-parsing/src/main/scala/.keep +0 -0
  109. data/tracks/scala/exercises/sgf-parsing/src/main/scala/Sgf.scala +17 -0
  110. data/tracks/scala/exercises/sgf-parsing/src/test/scala/SgfTest.scala +66 -0
  111. data/tracks/scala/exercises/zebra-puzzle/build.sbt +3 -0
  112. data/tracks/scala/exercises/zebra-puzzle/example.scala +152 -0
  113. data/tracks/scala/exercises/zebra-puzzle/src/main/scala/.keep +0 -0
  114. data/tracks/scala/exercises/zebra-puzzle/src/main/scala/ZebraPuzzle.scala +14 -0
  115. data/tracks/scala/exercises/zebra-puzzle/src/test/scala/ZebraPuzzleTest.scala +11 -0
  116. data/tracks/scala/testgen/src/main/scala/BracketPushTestGenerator.scala +44 -0
  117. metadata +63 -3
  118. data/tracks/haskell/exercises/word-count/src/Example.hs +0 -8
@@ -1,3 +1,7 @@
1
+ module BookKeeping
2
+ VERSION = 1
3
+ end
4
+
1
5
  class Sieve
2
6
  attr_reader :range
3
7
  def initialize(limit)
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby
2
+ gem 'minitest', '>= 5.0.0'
3
+ require 'minitest/autorun'
4
+ require_relative 'sieve'
5
+
6
+ # Test data version:
7
+ # <%= sha1 %>
8
+
9
+ class SieveTest < Minitest::Test<% test_cases.each do |test_case| %>
10
+ def <%= test_case.name %>
11
+ <%= test_case.skipped %>
12
+ expected = <%= test_case.expected_string %>
13
+ assert_equal expected, Sieve.new(<%= test_case.limit %>).primes
14
+ end
15
+ <% end %>
16
+ <%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
17
+ def test_bookkeeping
18
+ skip
19
+ assert_equal <%= version.next %>, BookKeeping::VERSION
20
+ end
21
+ end
@@ -3,8 +3,12 @@ gem 'minitest', '>= 5.0.0'
3
3
  require 'minitest/autorun'
4
4
  require_relative 'sieve'
5
5
 
6
+ # Test data version:
7
+ # 43d62d1
8
+
6
9
  class SieveTest < Minitest::Test
7
10
  def test_no_primes_under_two
11
+ # skip
8
12
  expected = []
9
13
  assert_equal expected, Sieve.new(1).primes
10
14
  end
@@ -27,23 +31,42 @@ class SieveTest < Minitest::Test
27
31
  assert_equal expected, Sieve.new(13).primes
28
32
  end
29
33
 
30
- def test_primes_up_to_1000 # rubocop:disable Metrics/MethodLength
34
+ def test_find_primes_up_to_1000
31
35
  skip
32
36
  expected = [
33
37
  2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59,
34
- 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127,
35
- 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193,
36
- 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269,
37
- 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349,
38
- 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431,
39
- 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503,
40
- 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599,
41
- 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673,
42
- 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761,
43
- 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857,
44
- 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947,
45
- 953, 967, 971, 977, 983, 991, 997
38
+ 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139,
39
+ 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233,
40
+ 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337,
41
+ 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439,
42
+ 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557,
43
+ 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653,
44
+ 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769,
45
+ 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883,
46
+ 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997
46
47
  ]
47
48
  assert_equal expected, Sieve.new(1000).primes
48
49
  end
50
+
51
+ # Problems in exercism evolve over time, as we find better ways to ask
52
+ # questions.
53
+ # The version number refers to the version of the problem you solved,
54
+ # not your solution.
55
+ #
56
+ # Define a constant named VERSION inside of the top level BookKeeping
57
+ # module, which may be placed near the end of your file.
58
+ #
59
+ # In your file, it will look like this:
60
+ #
61
+ # module BookKeeping
62
+ # VERSION = 1 # Where the version number matches the one in the test.
63
+ # end
64
+ #
65
+ # If you are curious, read more about constants on RubyDoc:
66
+ # http://ruby-doc.org/docs/ruby-doc-bundle/UsersGuide/rg/constants.html
67
+
68
+ def test_bookkeeping
69
+ skip
70
+ assert_equal 1, BookKeeping::VERSION
71
+ end
49
72
  end
@@ -7,9 +7,10 @@ require_relative 'word_count'
7
7
  # <%= sha1 %>
8
8
  class PhraseTest < Minitest::Test<% test_cases.each do |test_case| %>
9
9
  def <%= test_case.name %><% if test_case.skipped? %>
10
- skip<% end %><% if test_case.raises_error? %>
11
- assert_raises(ArgumentError) { <%= test_case.do %> }<% else %>
12
- assert_equal <%= test_case.expected %>, <%= test_case.do %><% end %>
10
+ skip<% end %>
11
+ phrase = <%= test_case.object_under_test %>
12
+ counts = <%= test_case.expected %>
13
+ assert_equal counts, phrase.word_count
13
14
  end
14
15
  <% end %>
15
16
  <%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
@@ -4,107 +4,97 @@ require 'minitest/autorun'
4
4
  require_relative 'word_count'
5
5
 
6
6
  # Test data version:
7
-
7
+ # 5b5e807
8
8
  class PhraseTest < Minitest::Test
9
9
  def test_count_one_word
10
- phrase = Phrase.new('word')
11
- counts = { 'word' => 1 }
12
- assert_equal counts, phrase.word_count
13
- end
14
-
15
- def test_count_one_of_each
16
- skip
17
- phrase = Phrase.new('one of each')
18
- counts = { 'one' => 1, 'of' => 1, 'each' => 1 }
10
+ phrase = Phrase.new("word")
11
+ counts = {"word"=>1}
19
12
  assert_equal counts, phrase.word_count
20
13
  end
21
14
 
22
- def test_count_multiple_occurrences
15
+ def test_count_one_of_each_word
23
16
  skip
24
- phrase = Phrase.new('one fish two fish red fish blue fish')
25
- counts = { 'one' => 1, 'fish' => 4, 'two' => 1, 'red' => 1, 'blue' => 1 }
17
+ phrase = Phrase.new("one of each")
18
+ counts = {"one"=>1, "of"=>1, "each"=>1}
26
19
  assert_equal counts, phrase.word_count
27
20
  end
28
21
 
29
- def test_count_everything_just_once
22
+ def test_multiple_occurrences_of_a_word
30
23
  skip
31
- phrase = Phrase.new('all the kings horses and all the kings men')
32
- phrase.word_count # count it an extra time
33
- counts = {
34
- 'all' => 2, 'the' => 2, 'kings' => 2,
35
- 'horses' => 1, 'and' => 1, 'men' => 1
36
- }
24
+ phrase = Phrase.new("one fish two fish red fish blue fish")
25
+ counts = {"one"=>1, "fish"=>4, "two"=>1, "red"=>1, "blue"=>1}
37
26
  assert_equal counts, phrase.word_count
38
27
  end
39
28
 
40
- def test_ignore_punctuation
29
+ def test_handles_cramped_lists
41
30
  skip
42
- phrase = Phrase.new('car : carpet as java : javascript!!&@$%^&')
43
- counts = {
44
- 'car' => 1, 'carpet' => 1, 'as' => 1,
45
- 'java' => 1, 'javascript' => 1
46
- }
31
+ phrase = Phrase.new("one,two,three")
32
+ counts = {"one"=>1, "two"=>1, "three"=>1}
47
33
  assert_equal counts, phrase.word_count
48
34
  end
49
35
 
50
- def test_handles_cramped_lists
36
+ def test_handles_expanded_lists
51
37
  skip
52
- phrase = Phrase.new('one,two,three')
53
- counts = { 'one' => 1, 'two' => 1, 'three' => 1 }
38
+ phrase = Phrase.new("one,\ntwo,\nthree")
39
+ counts = {"one"=>1, "two"=>1, "three"=>1}
54
40
  assert_equal counts, phrase.word_count
55
41
  end
56
42
 
57
- def test_handles_expanded_lists
43
+ def test_ignore_punctuation
58
44
  skip
59
- phrase = Phrase.new("one,\ntwo,\nthree")
60
- counts = { 'one' => 1, 'two' => 1, 'three' => 1 }
45
+ phrase = Phrase.new("car: carpet as java: javascript!!&@$%^&")
46
+ counts = {"car"=>1, "carpet"=>1, "as"=>1, "java"=>1, "javascript"=>1}
61
47
  assert_equal counts, phrase.word_count
62
48
  end
63
49
 
64
50
  def test_include_numbers
65
51
  skip
66
- phrase = Phrase.new('testing, 1, 2 testing')
67
- counts = { 'testing' => 2, '1' => 1, '2' => 1 }
52
+ phrase = Phrase.new("testing, 1, 2 testing")
53
+ counts = {"testing"=>2, "1"=>1, "2"=>1}
68
54
  assert_equal counts, phrase.word_count
69
55
  end
70
56
 
71
57
  def test_normalize_case
72
58
  skip
73
- phrase = Phrase.new('go Go GO')
74
- counts = { 'go' => 3 }
59
+ phrase = Phrase.new("go Go GO Stop stop")
60
+ counts = {"go"=>3, "stop"=>2}
75
61
  assert_equal counts, phrase.word_count
76
62
  end
77
63
 
78
64
  def test_with_apostrophes
79
65
  skip
80
66
  phrase = Phrase.new("First: don't laugh. Then: don't cry.")
81
- counts = {
82
- 'first' => 1, "don't" => 2, 'laugh' => 1,
83
- 'then' => 1, 'cry' => 1
84
- }
67
+ counts = {"first"=>1, "don't"=>2, "laugh"=>1, "then"=>1, "cry"=>1}
85
68
  assert_equal counts, phrase.word_count
86
69
  end
87
70
 
88
71
  def test_with_quotations
89
72
  skip
90
73
  phrase = Phrase.new("Joe can't tell between 'large' and large.")
91
- counts = {
92
- 'joe' => 1, "can't" => 1, 'tell' => 1,
93
- 'between' => 1, 'large' => 2, 'and' => 1
94
- }
74
+ counts = {"joe"=>1, "can't"=>1, "tell"=>1, "between"=>1, "large"=>2, "and"=>1}
95
75
  assert_equal counts, phrase.word_count
96
76
  end
97
77
 
98
- # Problems in exercism evolve over time,
99
- # as we find better ways to ask questions.
78
+ # Problems in exercism evolve over time, as we find better ways to ask
79
+ # questions.
100
80
  # The version number refers to the version of the problem you solved,
101
81
  # not your solution.
102
82
  #
103
- # Define a constant named VERSION inside of BookKeeping.
104
- # If you're curious, read more about constants on RubyDoc:
83
+ # Define a constant named VERSION inside of the top level BookKeeping
84
+ # module, which may be placed near the end of your file.
85
+ #
86
+ # In your file, it will look like this:
87
+ #
88
+ # module BookKeeping
89
+ # VERSION = 1 # Where the version number matches the one in the test.
90
+ # end
91
+ #
92
+ # If you are curious, read more about constants on RubyDoc:
105
93
  # http://ruby-doc.org/docs/ruby-doc-bundle/UsersGuide/rg/constants.html
94
+
106
95
  def test_bookkeeping
107
96
  skip
108
97
  assert_equal 1, BookKeeping::VERSION
109
98
  end
110
99
  end
100
+
@@ -0,0 +1,42 @@
1
+ class AnagramCase < OpenStruct
2
+ def test_name
3
+ 'test_%s' % description.gsub(/[ -]/, '_')
4
+ end
5
+
6
+ def work_load
7
+ indent_lines([show_comment, detector, anagram, assert].compact)
8
+ end
9
+
10
+ def skipped
11
+ index.zero? ? '# skip' : 'skip'
12
+ end
13
+
14
+ private
15
+
16
+ def indent_lines(code, indent = 2)
17
+ code.join("\n" + ' '*2*indent)
18
+ end
19
+
20
+ def show_comment
21
+ "# #{comment}" unless comment.nil?
22
+ end
23
+
24
+ def detector
25
+ "detector = Anagram.new('#{subject}')"
26
+ end
27
+
28
+ def anagram
29
+ "anagrams = detector.match(#{candidates})"
30
+ end
31
+
32
+ def assert
33
+ actual = expected.size > 1 ? 'anagrams.sort' : 'anagrams'
34
+ "assert_equal #{expected.sort}, #{actual}"
35
+ end
36
+ end
37
+
38
+ AnagramCases = proc do |data|
39
+ JSON.parse(data)['cases'].map.with_index do |row, i|
40
+ AnagramCase.new(row.merge('index' => i))
41
+ end
42
+ end
@@ -0,0 +1,24 @@
1
+ class IsogramCase < OpenStruct
2
+
3
+ def name
4
+ format('test_%s', description)
5
+ end
6
+
7
+ def description
8
+ input.downcase.gsub(/[ -]/,'_')
9
+ end
10
+
11
+ def assertion
12
+ expected ? 'assert' : 'refute'
13
+ end
14
+
15
+ def skip
16
+ 'skip' unless index.zero?
17
+ end
18
+ end
19
+
20
+ IsogramCases = proc do |data|
21
+ JSON.parse(data)['cases'].map.with_index do |row, i|
22
+ IsogramCase.new(row.merge('index' => i))
23
+ end
24
+ end
@@ -0,0 +1,33 @@
1
+ class SieveCase < OpenStruct
2
+ OPEN_ARRAY = "[\n\s\s\s\s\s\s".freeze
3
+ CLOSE_ARRAY = "\n\s\s\s\s]".freeze
4
+ NEW_ARRAY_ROW = ",\n\s\s\s\s\s\s".freeze
5
+ ARRAY_ELEMENTS_PER_ROW = 17.freeze
6
+
7
+ def name
8
+ 'test_%s' % description.tr(' ', '_')
9
+ end
10
+
11
+ def expected_string
12
+ return expected unless needs_indentation?
13
+
14
+ array_rows = expected.each_slice(ARRAY_ELEMENTS_PER_ROW).map { |elements| elements.join(', ') }
15
+ "#{OPEN_ARRAY}#{array_rows.join(NEW_ARRAY_ROW)}#{CLOSE_ARRAY}"
16
+ end
17
+
18
+ def skipped
19
+ index.zero? ? '# skip' : 'skip'
20
+ end
21
+
22
+ private
23
+
24
+ def needs_indentation?
25
+ expected.size > ARRAY_ELEMENTS_PER_ROW
26
+ end
27
+ end
28
+
29
+ SieveCases = proc do |data|
30
+ JSON.parse(data)['cases'].map.with_index do |row, i|
31
+ SieveCase.new(row.merge('index' => i))
32
+ end
33
+ end
@@ -0,0 +1,19 @@
1
+ class WordCountCase < OpenStruct
2
+ def name
3
+ 'test_%s' % description.tr(' ', '_')
4
+ end
5
+
6
+ def object_under_test
7
+ %Q(Phrase.new(#{input.inspect}))
8
+ end
9
+
10
+ def skipped?
11
+ index.nonzero?
12
+ end
13
+ end
14
+
15
+ WordCountCases = proc do |data|
16
+ JSON.parse(data)['cases'].map.with_index do |row, i|
17
+ WordCountCase.new(row.merge('index' => i))
18
+ end
19
+ end
@@ -37,6 +37,7 @@
37
37
  "crypto-square",
38
38
  "kindergarten-garden",
39
39
  "robot-simulator",
40
+ "bracket-push",
40
41
  "queen-attack",
41
42
  "binary-search-tree",
42
43
  "largest-series-product",
@@ -44,6 +45,7 @@
44
45
  "clock",
45
46
  "matrix",
46
47
  "house",
48
+ "zebra-puzzle",
47
49
  "minesweeper",
48
50
  "ocr-numbers",
49
51
  "wordy",
@@ -64,6 +66,7 @@
64
66
  "change",
65
67
  "connect",
66
68
  "parallel-letter-frequency",
69
+ "sgf-parsing",
67
70
  "acronym",
68
71
  "zipper",
69
72
  "forth",
@@ -276,6 +279,12 @@
276
279
  "topics": [
277
280
  ]
278
281
  },
282
+ {
283
+ "slug": "bracket-push",
284
+ "difficulty": 1,
285
+ "topics": [
286
+ ]
287
+ },
279
288
  {
280
289
  "slug": "queen-attack",
281
290
  "difficulty": 1,
@@ -318,6 +327,12 @@
318
327
  "topics": [
319
328
  ]
320
329
  },
330
+ {
331
+ "slug": "zebra-puzzle",
332
+ "difficulty": 1,
333
+ "topics": [
334
+ ]
335
+ },
321
336
  {
322
337
  "slug": "minesweeper",
323
338
  "difficulty": 1,
@@ -438,6 +453,12 @@
438
453
  "topics": [
439
454
  ]
440
455
  },
456
+ {
457
+ "slug": "sgf-parsing",
458
+ "difficulty": 1,
459
+ "topics": [
460
+ ]
461
+ },
441
462
  {
442
463
  "slug": "acronym",
443
464
  "difficulty": 1,