trackler 2.1.0.1 → 2.1.0.2

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 (160) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/tracks/elixir/config.json +17 -0
  4. data/tracks/elixir/exercises/matrix/example.exs +63 -0
  5. data/tracks/elixir/exercises/matrix/matrix.exs +48 -0
  6. data/tracks/elixir/exercises/matrix/matrix_test.exs +58 -0
  7. data/tracks/elixir/exercises/twelve-days/example.exs +53 -0
  8. data/tracks/elixir/exercises/twelve-days/twelve_days.exs +25 -0
  9. data/tracks/elixir/exercises/twelve-days/twelve_days_test.exs +86 -0
  10. data/tracks/go/exercises/change/.meta/gen.go +1 -3
  11. data/tracks/go/exercises/change/cases_test.go +1 -0
  12. data/tracks/go/exercises/forth/example.go +1 -1
  13. data/tracks/go/exercises/raindrops/.meta/gen.go +1 -3
  14. data/tracks/go/exercises/raindrops/cases_test.go +5 -1
  15. data/tracks/go/exercises/raindrops/example.go +1 -1
  16. data/tracks/go/exercises/raindrops/raindrops.go +1 -1
  17. data/tracks/go/exercises/raindrops/raindrops_test.go +1 -1
  18. data/tracks/java/config.json +5 -5
  19. data/tracks/java/exercises/isogram/src/example/java/IsogramChecker.java +23 -27
  20. data/tracks/java/exercises/isogram/src/test/java/IsogramCheckerTest.java +77 -0
  21. data/tracks/javascript/config.json +9 -0
  22. data/tracks/javascript/exercises/proverb/example.js +36 -0
  23. data/tracks/javascript/exercises/proverb/proverb.spec.js +78 -0
  24. data/tracks/ruby/README.md +0 -33
  25. data/tracks/ruby/exercises/acronym/.meta/.version +1 -1
  26. data/tracks/ruby/exercises/acronym/acronym_test.rb +14 -9
  27. data/tracks/ruby/exercises/acronym/example.rb +1 -1
  28. data/tracks/ruby/exercises/acronym/example.tt +7 -4
  29. data/tracks/ruby/exercises/all-your-base/all_your_base_test.rb +1 -1
  30. data/tracks/ruby/exercises/all-your-base/example.tt +4 -3
  31. data/tracks/ruby/exercises/alphametics/alphametics_test.rb +2 -1
  32. data/tracks/ruby/exercises/alphametics/example.tt +2 -1
  33. data/tracks/ruby/exercises/anagram/anagram_test.rb +35 -20
  34. data/tracks/ruby/exercises/anagram/example.rb +1 -1
  35. data/tracks/ruby/exercises/anagram/example.tt +5 -2
  36. data/tracks/ruby/exercises/beer-song/beer_song_test.rb +1 -0
  37. data/tracks/ruby/exercises/beer-song/example.tt +6 -4
  38. data/tracks/ruby/exercises/binary/binary_test.rb +3 -2
  39. data/tracks/ruby/exercises/binary/example.tt +5 -2
  40. data/tracks/ruby/exercises/bowling/bowling_test.rb +39 -40
  41. data/tracks/ruby/exercises/bowling/example.tt +2 -2
  42. data/tracks/ruby/exercises/bracket-push/.meta/.version +1 -1
  43. data/tracks/ruby/exercises/bracket-push/bracket_push_test.rb +7 -3
  44. data/tracks/ruby/exercises/bracket-push/example.rb +1 -1
  45. data/tracks/ruby/exercises/bracket-push/example.tt +5 -2
  46. data/tracks/ruby/exercises/clock/clock_test.rb +40 -41
  47. data/tracks/ruby/exercises/clock/example.tt +5 -2
  48. data/tracks/ruby/exercises/connect/.meta/.version +1 -1
  49. data/tracks/ruby/exercises/connect/connect_test.rb +20 -3
  50. data/tracks/ruby/exercises/connect/example.rb +1 -1
  51. data/tracks/ruby/exercises/connect/example.tt +3 -1
  52. data/tracks/ruby/exercises/custom-set/custom_set_test.rb +1 -2
  53. data/tracks/ruby/exercises/custom-set/example.tt +5 -2
  54. data/tracks/ruby/exercises/difference-of-squares/difference_of_squares_test.rb +6 -5
  55. data/tracks/ruby/exercises/difference-of-squares/example.tt +8 -4
  56. data/tracks/ruby/exercises/dominoes/dominoes_test.rb +1 -1
  57. data/tracks/ruby/exercises/dominoes/example.tt +1 -1
  58. data/tracks/ruby/exercises/gigasecond/.meta/.version +1 -1
  59. data/tracks/ruby/exercises/gigasecond/example.rb +1 -1
  60. data/tracks/ruby/exercises/gigasecond/example.tt +7 -5
  61. data/tracks/ruby/exercises/gigasecond/gigasecond_test.rb +11 -16
  62. data/tracks/ruby/exercises/grains/example.tt +5 -3
  63. data/tracks/ruby/exercises/grains/grains_test.rb +2 -1
  64. data/tracks/ruby/exercises/hello-world/example.tt +1 -1
  65. data/tracks/ruby/exercises/hello-world/hello_world_test.rb +1 -1
  66. data/tracks/ruby/exercises/isogram/.meta/.version +1 -1
  67. data/tracks/ruby/exercises/isogram/example.rb +1 -1
  68. data/tracks/ruby/exercises/isogram/example.tt +6 -4
  69. data/tracks/ruby/exercises/isogram/isogram_test.rb +18 -10
  70. data/tracks/ruby/exercises/largest-series-product/.meta/.version +1 -1
  71. data/tracks/ruby/exercises/largest-series-product/example.rb +1 -1
  72. data/tracks/ruby/exercises/largest-series-product/example.tt +7 -5
  73. data/tracks/ruby/exercises/largest-series-product/largest_series_product_test.rb +11 -21
  74. data/tracks/ruby/exercises/leap/.meta/.version +1 -1
  75. data/tracks/ruby/exercises/leap/example.rb +1 -1
  76. data/tracks/ruby/exercises/leap/example.tt +6 -4
  77. data/tracks/ruby/exercises/leap/leap_test.rb +11 -25
  78. data/tracks/ruby/exercises/nth-prime/example.tt +7 -5
  79. data/tracks/ruby/exercises/nth-prime/nth_prime_test.rb +2 -3
  80. data/tracks/ruby/exercises/pangram/example.tt +5 -3
  81. data/tracks/ruby/exercises/pangram/pangram_test.rb +2 -1
  82. data/tracks/ruby/exercises/queen-attack/example.tt +2 -2
  83. data/tracks/ruby/exercises/queen-attack/queen_attack_test.rb +14 -15
  84. data/tracks/ruby/exercises/raindrops/example.tt +7 -4
  85. data/tracks/ruby/exercises/raindrops/raindrops_test.rb +38 -38
  86. data/tracks/ruby/exercises/rna-transcription/example.tt +6 -3
  87. data/tracks/ruby/exercises/rna-transcription/rna_transcription_test.rb +4 -5
  88. data/tracks/ruby/exercises/roman-numerals/example.tt +7 -4
  89. data/tracks/ruby/exercises/roman-numerals/roman_numerals_test.rb +5 -5
  90. data/tracks/ruby/exercises/run-length-encoding/.meta/.version +1 -1
  91. data/tracks/ruby/exercises/run-length-encoding/example.rb +1 -1
  92. data/tracks/ruby/exercises/run-length-encoding/example.tt +6 -3
  93. data/tracks/ruby/exercises/run-length-encoding/run_length_encoding_test.rb +70 -28
  94. data/tracks/ruby/exercises/say/example.tt +7 -5
  95. data/tracks/ruby/exercises/say/say_test.rb +3 -2
  96. data/tracks/ruby/exercises/sieve/example.tt +4 -1
  97. data/tracks/ruby/exercises/sieve/sieve_test.rb +1 -3
  98. data/tracks/ruby/exercises/tournament/example.tt +4 -1
  99. data/tracks/ruby/exercises/tournament/tournament_test.rb +1 -2
  100. data/tracks/ruby/exercises/transpose/example.tt +5 -2
  101. data/tracks/ruby/exercises/transpose/transpose_test.rb +1 -2
  102. data/tracks/ruby/exercises/triangle/example.tt +5 -3
  103. data/tracks/ruby/exercises/triangle/triangle_test.rb +1 -3
  104. data/tracks/ruby/exercises/two-bucket/example.tt +7 -4
  105. data/tracks/ruby/exercises/two-bucket/two_bucket_test.rb +9 -9
  106. data/tracks/ruby/exercises/word-count/example.tt +6 -4
  107. data/tracks/ruby/exercises/word-count/word_count_test.rb +2 -3
  108. data/tracks/ruby/exercises/wordy/example.tt +5 -3
  109. data/tracks/ruby/exercises/wordy/wordy_test.rb +2 -1
  110. data/tracks/ruby/lib/acronym_cases.rb +3 -15
  111. data/tracks/ruby/lib/all_your_base_cases.rb +22 -54
  112. data/tracks/ruby/lib/alphametics_cases.rb +12 -27
  113. data/tracks/ruby/lib/anagram_cases.rb +7 -15
  114. data/tracks/ruby/lib/beer_song_cases.rb +7 -24
  115. data/tracks/ruby/lib/binary_cases.rb +5 -18
  116. data/tracks/ruby/lib/bowling_cases.rb +24 -24
  117. data/tracks/ruby/lib/bracket_push_cases.rb +6 -21
  118. data/tracks/ruby/lib/clock_cases.rb +6 -25
  119. data/tracks/ruby/lib/connect_cases.rb +2 -20
  120. data/tracks/ruby/lib/custom_set_cases.rb +14 -35
  121. data/tracks/ruby/lib/difference_of_squares_cases.rb +5 -26
  122. data/tracks/ruby/lib/dominoes_cases.rb +2 -11
  123. data/tracks/ruby/lib/generator/case_values.rb +25 -0
  124. data/tracks/ruby/lib/generator/exercise_cases.rb +11 -0
  125. data/tracks/ruby/lib/generator/files/track_files.rb +7 -2
  126. data/tracks/ruby/lib/generator/template_values.rb +12 -7
  127. data/tracks/ruby/lib/gigasecond_cases.rb +4 -18
  128. data/tracks/ruby/lib/grains_cases.rb +11 -38
  129. data/tracks/ruby/lib/hamming_cases.rb +0 -6
  130. data/tracks/ruby/lib/hello_world_cases.rb +2 -14
  131. data/tracks/ruby/lib/isogram_cases.rb +8 -16
  132. data/tracks/ruby/lib/largest_series_product_cases.rb +10 -16
  133. data/tracks/ruby/lib/leap_cases.rb +3 -16
  134. data/tracks/ruby/lib/luhn_cases.rb +0 -6
  135. data/tracks/ruby/lib/nth_prime_cases.rb +11 -13
  136. data/tracks/ruby/lib/ocr_numbers_cases.rb +0 -5
  137. data/tracks/ruby/lib/pangram_cases.rb +2 -19
  138. data/tracks/ruby/lib/pig_latin_cases.rb +0 -5
  139. data/tracks/ruby/lib/queen_attack_cases.rb +14 -37
  140. data/tracks/ruby/lib/raindrops_cases.rb +3 -15
  141. data/tracks/ruby/lib/rna_transcription_cases.rb +2 -14
  142. data/tracks/ruby/lib/roman_numerals_cases.rb +7 -10
  143. data/tracks/ruby/lib/run_length_encoding_cases.rb +4 -25
  144. data/tracks/ruby/lib/say_cases.rb +3 -14
  145. data/tracks/ruby/lib/sieve_cases.rb +1 -15
  146. data/tracks/ruby/lib/tournament_cases.rb +1 -14
  147. data/tracks/ruby/lib/transpose_cases.rb +1 -14
  148. data/tracks/ruby/lib/triangle_cases.rb +8 -27
  149. data/tracks/ruby/lib/two_bucket_cases.rb +7 -17
  150. data/tracks/ruby/lib/word_count_cases.rb +1 -13
  151. data/tracks/ruby/lib/wordy_cases.rb +4 -27
  152. data/tracks/ruby/test/fixtures/metadata/exercises/complex/canonical-data.json +45 -0
  153. data/tracks/ruby/test/fixtures/xruby/lib/beta_cases.rb +7 -0
  154. data/tracks/ruby/test/generator/case_values_test.rb +30 -0
  155. data/tracks/ruby/test/generator/files/track_files_test.rb +2 -3
  156. data/tracks/ruby/test/generator/template_values_test.rb +44 -3
  157. data/tracks/ruby/test/wordy_cases_test.rb +4 -65
  158. metadata +14 -4
  159. data/tracks/java/exercises/isogram/src/test/java/IsogramTest.java +0 -80
  160. data/tracks/ruby/test/grains_cases_test.rb +0 -103
@@ -4,18 +4,20 @@ require 'minitest/autorun'
4
4
  require_relative 'word_count'
5
5
 
6
6
  # Common test data version: <%= abbreviated_commit_hash %>
7
- class PhraseTest < Minitest::Test<% test_cases.each do |test_case| %>
8
- def <%= test_case.name %><% if test_case.skipped? %>
9
- skip<% end %>
7
+ class PhraseTest < Minitest::Test
8
+ <% test_cases.each do |test_case| %>
9
+ def <%= test_case.name %>
10
+ <%= test_case.skipped %>
10
11
  phrase = <%= test_case.object_under_test %>
11
12
  counts = <%= test_case.expected %>
12
13
  assert_equal counts, phrase.word_count
13
14
  end
15
+
14
16
  <% end %>
15
17
  <%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
18
+
16
19
  def test_bookkeeping
17
20
  skip
18
21
  assert_equal <%= version %>, BookKeeping::VERSION
19
22
  end
20
23
  end
21
-
@@ -3,10 +3,10 @@ gem 'minitest', '>= 5.0.0'
3
3
  require 'minitest/autorun'
4
4
  require_relative 'word_count'
5
5
 
6
- # Test data version:
7
- # 5b5e807
6
+ # Common test data version: cd26d49
8
7
  class PhraseTest < Minitest::Test
9
8
  def test_count_one_word
9
+ # skip
10
10
  phrase = Phrase.new("word")
11
11
  counts = {"word"=>1}
12
12
  assert_equal counts, phrase.word_count
@@ -97,4 +97,3 @@ class PhraseTest < Minitest::Test
97
97
  assert_equal 1, BookKeeping::VERSION
98
98
  end
99
99
  end
100
-
@@ -2,14 +2,16 @@ require 'minitest/autorun'
2
2
  require_relative 'wordy'
3
3
 
4
4
  # Common test data version: <%= abbreviated_commit_hash %>
5
- class WordyTest < Minitest::Test<% test_cases.each do |test_case| %>
6
- def <%= test_case.test_name %>
5
+ class WordyTest < Minitest::Test
6
+ <% test_cases.each do |test_case| %>
7
+ def <%= test_case.name %>
7
8
  <%= test_case.skipped %>
8
9
  <%= test_case.workload %>
9
10
  end
10
- <% end %>
11
11
 
12
+ <% end %>
12
13
  <%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
14
+
13
15
  def test_bookkeeping
14
16
  skip
15
17
  assert_equal <%= version %>, BookKeeping::VERSION
@@ -1,7 +1,7 @@
1
1
  require 'minitest/autorun'
2
2
  require_relative 'wordy'
3
3
 
4
- # Test data version: aa12f2e
4
+ # Common test data version: 5b8ad58
5
5
  class WordyTest < Minitest::Test
6
6
  def test_addition
7
7
  # skip
@@ -121,6 +121,7 @@ class WordyTest < Minitest::Test
121
121
  #
122
122
  # If you are curious, read more about constants on RubyDoc:
123
123
  # http://ruby-doc.org/docs/ruby-doc-bundle/UsersGuide/rg/constants.html
124
+
124
125
  def test_bookkeeping
125
126
  skip
126
127
  assert_equal 1, BookKeeping::VERSION
@@ -1,21 +1,9 @@
1
1
  require 'exercise_cases'
2
2
 
3
- class AcronymCase < OpenStruct
4
- def name
5
- 'test_%s' % description.tr(' ', '_')
6
- end
3
+ class AcronymCase < ExerciseCase
7
4
 
8
- def assertion
9
- "Acronym.abbreviate('#{phrase}')"
5
+ def workload
6
+ assert_equal { "Acronym.abbreviate('#{phrase}')" }
10
7
  end
11
8
 
12
- def skipped?
13
- index > 0
14
- end
15
- end
16
-
17
- AcronymCases = proc do |data|
18
- JSON.parse(data)['abbreviate']['cases'].map.with_index do |row, i|
19
- AcronymCase.new(row.merge('index' => i))
20
- end
21
9
  end
@@ -1,18 +1,11 @@
1
1
  require 'exercise_cases'
2
2
 
3
- class AllYourBaseCase < OpenStruct
4
- def test_name
5
- 'test_%s' % description.downcase.tr(' -', '_')
6
- end
3
+ class AllYourBaseCase < ExerciseCase
7
4
 
8
5
  def workload
9
6
  indent(4, (assignments + assertion).join("\n")) + "\n"
10
7
  end
11
8
 
12
- def skipped
13
- index.zero? ? '# skip' : 'skip'
14
- end
15
-
16
9
  private
17
10
 
18
11
  def indent(size, text)
@@ -30,10 +23,10 @@ class AllYourBaseCase < OpenStruct
30
23
  end
31
24
 
32
25
  def assertion
33
- return error_assertion unless expected
26
+ return error_assertion unless expected_value
34
27
 
35
28
  [
36
- "expected = #{expected}",
29
+ "expected = #{expected_value}",
37
30
  "",
38
31
  "converted = BaseConverter.convert(input_base, digits, output_base)",
39
32
  "",
@@ -55,57 +48,32 @@ class AllYourBaseCase < OpenStruct
55
48
  %q("Input base: #{input_base}, output base #{output_base}. " \\) \
56
49
  "\n" + %q("Expected #{expected} but got #{converted}.")
57
50
  end
58
- end
59
-
60
- class AllYourBaseCase::PreProcessor
61
- class << self
62
- attr_reader :row
63
-
64
- def call(row)
65
- @row = row
66
-
67
- row.merge('expected' => expected_value)
68
- end
69
-
70
- private :row
71
- private
72
51
 
73
- def expected_value
74
- return row['expected'] if row['expected']
52
+ def expected_value
53
+ return expected if expected
75
54
 
76
- if invalid_input_digits? || invalid_bases?
77
- nil
78
- elsif row['input_digits'].empty?
79
- []
80
- elsif input_of_zero?
81
- [0]
82
- else
83
- handle_special_cases
84
- end
85
- end
86
-
87
- def invalid_input_digits?
88
- row['input_digits'].any? { |x| x < 0 || x >= row['input_base'] }
55
+ case
56
+ when invalid_input_digits? || invalid_bases? then nil
57
+ when input_digits.empty? then []
58
+ when input_of_zero? then [0]
59
+ else
60
+ handle_special_cases
89
61
  end
62
+ end
90
63
 
91
- def invalid_bases?
92
- row['input_base'] <= 1 || row['output_base'] <= 1
93
- end
64
+ def invalid_input_digits?
65
+ input_digits.any? { |x| x < 0 || x >= input_base }
66
+ end
94
67
 
95
- def input_of_zero?
96
- row['input_digits'].all? { |x| x == 0 }
97
- end
68
+ def invalid_bases?
69
+ input_base <= 1 || output_base <= 1
70
+ end
98
71
 
99
- def handle_special_cases
100
- [4, 2] if row['input_digits'] == [0, 6, 0]
101
- end
72
+ def input_of_zero?
73
+ input_digits.all? { |x| x == 0 }
102
74
  end
103
- end
104
75
 
105
- AllYourBaseCases = proc do |data|
106
- JSON.parse(data)['cases'].map.with_index do |row, i|
107
- AllYourBaseCase.new(
108
- AllYourBaseCase::PreProcessor.call(row).merge(index: i),
109
- )
76
+ def handle_special_cases
77
+ [4, 2] if input_digits == [0, 6, 0]
110
78
  end
111
79
  end
@@ -1,24 +1,8 @@
1
1
  require 'exercise_cases'
2
2
 
3
- class AlphameticsCase < OpenStruct
4
- def test_name
5
- "test_#{description.tr(' ', '_')}"
6
- end
7
-
8
- def skipped
9
- index.zero? ? '# skip' : 'skip'
10
- end
11
-
12
- def input
13
- "'#{puzzle}'"
14
- end
15
-
16
- def expect
17
- expected.nil? ? {} : expected_values
18
- end
19
-
3
+ class AlphameticsCase < ExerciseCase
20
4
  def workload
21
- body =
5
+ body =
22
6
  "input = %s\n" % input,
23
7
  "expected = %s\n" % expect,
24
8
  "assert_equal expected, Alphametics.solve(input)"
@@ -27,7 +11,7 @@ class AlphameticsCase < OpenStruct
27
11
 
28
12
  def runtime_comment
29
13
  if slow?
30
- comments =
14
+ comments =
31
15
  '',
32
16
  "# The obvious algorithm can take a long time to solve this puzzle,\n",
33
17
  "# but an optimised solution can solve it fairly quickly.\n",
@@ -38,8 +22,16 @@ class AlphameticsCase < OpenStruct
38
22
 
39
23
  private
40
24
 
25
+ def input
26
+ "'#{puzzle}'"
27
+ end
28
+
29
+ def expect
30
+ expected.nil? ? {} : expected_values
31
+ end
32
+
41
33
  def slow?
42
- (expected||{}).size > 7
34
+ (expected||{}).size > 7
43
35
  end
44
36
 
45
37
  def expected_values
@@ -64,10 +56,3 @@ class AlphameticsCase < OpenStruct
64
56
  end
65
57
 
66
58
  end
67
-
68
- AlphameticsCases = proc do |data|
69
- JSON.parse(data)['solve']['cases'].map.with_index do |row, i|
70
- row = row.merge('index' => i)
71
- AlphameticsCase.new(row)
72
- end
73
- end
@@ -1,16 +1,9 @@
1
1
  require 'exercise_cases'
2
2
 
3
- class AnagramCase < OpenStruct
4
- def test_name
5
- 'test_%s' % description.gsub(/[ -]/, '_')
6
- end
3
+ class AnagramCase < ExerciseCase
7
4
 
8
5
  def workload
9
- indent_lines([show_comment, detector, anagram, assert].compact)
10
- end
11
-
12
- def skipped
13
- index.zero? ? '# skip' : 'skip'
6
+ indent_lines([show_comment, detector, anagram, wanted, assert].compact)
14
7
  end
15
8
 
16
9
  private
@@ -31,14 +24,13 @@ class AnagramCase < OpenStruct
31
24
  "anagrams = detector.match(#{candidates})"
32
25
  end
33
26
 
27
+ def wanted
28
+ "expected = #{expected.sort}"
29
+ end
30
+
34
31
  def assert
35
32
  actual = expected.size > 1 ? 'anagrams.sort' : 'anagrams'
36
- "assert_equal #{expected.sort}, #{actual}"
33
+ "assert_equal expected, #{actual}"
37
34
  end
38
- end
39
35
 
40
- AnagramCases = proc do |data|
41
- JSON.parse(data)['cases'].map.with_index do |row, i|
42
- AnagramCase.new(row.merge('index' => i))
43
- end
44
36
  end
@@ -1,25 +1,22 @@
1
1
  require 'exercise_cases'
2
2
 
3
- class BeerSongCase < OpenStruct
4
- def test_name
5
- 'test_%s' % description.tr(' ', '_')
6
- end
3
+ class BeerSongCase < ExerciseCase
7
4
 
8
5
  def workload
9
- "BeerSong.new.%s(%s)" % [property, workload_arguments]
6
+ "assert_equal expected, #{beer_song}"
10
7
  end
11
8
 
12
9
  def expected
13
10
  self["expected"].gsub('\n', '"\n" \\')
14
11
  end
15
12
 
16
- def skipped
17
- index.zero? ? '# skip' : 'skip'
18
- end
19
-
20
13
  private
21
14
 
22
- def workload_arguments
15
+ def beer_song
16
+ "BeerSong.new.%s(%s)" % [property, beer_song_arguments]
17
+ end
18
+
19
+ def beer_song_arguments
23
20
  if property == 'verse'
24
21
  number
25
22
  else
@@ -27,17 +24,3 @@ class BeerSongCase < OpenStruct
27
24
  end
28
25
  end
29
26
  end
30
-
31
- BeerSongCases = proc do |data|
32
- i = 0
33
- cases = []
34
- JSON.parse(data)["cases"].each do |section|
35
- section["cases"].each do |tests|
36
- tests["cases"].each do |test|
37
- cases << BeerSongCase.new(test.merge('index' => i))
38
- i += 1
39
- end
40
- end
41
- end
42
- cases
43
- end
@@ -1,29 +1,22 @@
1
1
  require 'exercise_cases'
2
2
 
3
- class BinaryCase < OpenStruct
4
- def name
5
- 'test_%s' % description.gsub(/[ -]/, '_')
6
- end
3
+ class BinaryCase < ExerciseCase
7
4
 
8
- def assertion
5
+ def workload
9
6
  raises_error? ? error_assertion : equality_assertion
10
7
  end
11
8
 
12
- def skipped
13
- index.zero? ? '# skip' : 'skip'
14
- end
15
-
16
9
  private
17
10
 
18
11
  def error_assertion
19
- "assert_raises(ArgumentError) { #{workload} }"
12
+ "assert_raises(ArgumentError) { #{test_case} }"
20
13
  end
21
14
 
22
15
  def equality_assertion
23
- "assert_equal #{expected}, #{workload}"
16
+ "assert_equal #{expected}, #{test_case}"
24
17
  end
25
18
 
26
- def workload
19
+ def test_case
27
20
  "Binary.to_decimal('#{binary}')"
28
21
  end
29
22
 
@@ -31,9 +24,3 @@ class BinaryCase < OpenStruct
31
24
  expected.nil?
32
25
  end
33
26
  end
34
-
35
- BinaryCases = proc do |data|
36
- JSON.parse(data)['decimal'].map.with_index do |row, i|
37
- BinaryCase.new(row.merge('index' => i))
38
- end
39
- end
@@ -1,13 +1,6 @@
1
1
  require 'exercise_cases'
2
2
 
3
- class BowlingCase < OpenStruct
4
- def test_name
5
- "test_#{description.downcase.tr(' ', '_')}"
6
- end
7
-
8
- def skipped
9
- index.zero? ? '# skip' : 'skip'
10
- end
3
+ class BowlingCase < ExerciseCase
11
4
 
12
5
  def workload
13
6
  indent_lines(assert)
@@ -15,34 +8,41 @@ class BowlingCase < OpenStruct
15
8
 
16
9
  private
17
10
 
18
- def roll
19
- "roll(#{rolls})"
11
+ def roll_previous
12
+ "record(#{previous_rolls})"
20
13
  end
21
14
 
22
15
  def assert
23
16
  if assert_error?
24
- [
25
- 'assert_raises Game::BowlingError do',
26
- " #{roll}",
27
- ' @game.score',
28
- 'end'
29
- ]
17
+ property == 'score' ? score_raises : roll_raises
30
18
  else
31
- [roll, "assert_equal #{expected}, @game.score"]
19
+ [roll_previous, "assert_equal #{expected}, @game.score"]
32
20
  end
33
21
  end
34
22
 
23
+ def roll_raises
24
+ [
25
+ roll_previous,
26
+ 'assert_raises Game::BowlingError do',
27
+ ' @game.roll(' + roll.to_s + ')',
28
+ 'end'
29
+ ]
30
+ end
31
+
32
+ def score_raises
33
+ [
34
+ roll_previous,
35
+ 'assert_raises Game::BowlingError do',
36
+ ' @game.score',
37
+ 'end'
38
+ ]
39
+ end
40
+
35
41
  def assert_error?
36
- expected == -1
42
+ expected.respond_to?(:key?) && expected.key?('error')
37
43
  end
38
44
 
39
45
  def indent_lines(code)
40
46
  code.join("\n" + ' ' * 4)
41
47
  end
42
48
  end
43
-
44
- BowlingCases = proc do |data|
45
- JSON.parse(data)['score']['cases'].map.with_index do |row, i|
46
- BowlingCase.new(row.merge('index' => i))
47
- end
48
- end