trackler 2.1.0.1 → 2.1.0.2

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