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.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/tracks/elixir/config.json +17 -0
- data/tracks/elixir/exercises/matrix/example.exs +63 -0
- data/tracks/elixir/exercises/matrix/matrix.exs +48 -0
- data/tracks/elixir/exercises/matrix/matrix_test.exs +58 -0
- data/tracks/elixir/exercises/twelve-days/example.exs +53 -0
- data/tracks/elixir/exercises/twelve-days/twelve_days.exs +25 -0
- data/tracks/elixir/exercises/twelve-days/twelve_days_test.exs +86 -0
- data/tracks/go/exercises/change/.meta/gen.go +1 -3
- data/tracks/go/exercises/change/cases_test.go +1 -0
- data/tracks/go/exercises/forth/example.go +1 -1
- data/tracks/go/exercises/raindrops/.meta/gen.go +1 -3
- data/tracks/go/exercises/raindrops/cases_test.go +5 -1
- data/tracks/go/exercises/raindrops/example.go +1 -1
- data/tracks/go/exercises/raindrops/raindrops.go +1 -1
- data/tracks/go/exercises/raindrops/raindrops_test.go +1 -1
- data/tracks/java/config.json +5 -5
- data/tracks/java/exercises/isogram/src/example/java/IsogramChecker.java +23 -27
- data/tracks/java/exercises/isogram/src/test/java/IsogramCheckerTest.java +77 -0
- data/tracks/javascript/config.json +9 -0
- data/tracks/javascript/exercises/proverb/example.js +36 -0
- data/tracks/javascript/exercises/proverb/proverb.spec.js +78 -0
- data/tracks/ruby/README.md +0 -33
- data/tracks/ruby/exercises/acronym/.meta/.version +1 -1
- data/tracks/ruby/exercises/acronym/acronym_test.rb +14 -9
- data/tracks/ruby/exercises/acronym/example.rb +1 -1
- data/tracks/ruby/exercises/acronym/example.tt +7 -4
- data/tracks/ruby/exercises/all-your-base/all_your_base_test.rb +1 -1
- data/tracks/ruby/exercises/all-your-base/example.tt +4 -3
- data/tracks/ruby/exercises/alphametics/alphametics_test.rb +2 -1
- data/tracks/ruby/exercises/alphametics/example.tt +2 -1
- data/tracks/ruby/exercises/anagram/anagram_test.rb +35 -20
- data/tracks/ruby/exercises/anagram/example.rb +1 -1
- data/tracks/ruby/exercises/anagram/example.tt +5 -2
- data/tracks/ruby/exercises/beer-song/beer_song_test.rb +1 -0
- data/tracks/ruby/exercises/beer-song/example.tt +6 -4
- data/tracks/ruby/exercises/binary/binary_test.rb +3 -2
- data/tracks/ruby/exercises/binary/example.tt +5 -2
- data/tracks/ruby/exercises/bowling/bowling_test.rb +39 -40
- data/tracks/ruby/exercises/bowling/example.tt +2 -2
- data/tracks/ruby/exercises/bracket-push/.meta/.version +1 -1
- data/tracks/ruby/exercises/bracket-push/bracket_push_test.rb +7 -3
- data/tracks/ruby/exercises/bracket-push/example.rb +1 -1
- data/tracks/ruby/exercises/bracket-push/example.tt +5 -2
- data/tracks/ruby/exercises/clock/clock_test.rb +40 -41
- data/tracks/ruby/exercises/clock/example.tt +5 -2
- data/tracks/ruby/exercises/connect/.meta/.version +1 -1
- data/tracks/ruby/exercises/connect/connect_test.rb +20 -3
- data/tracks/ruby/exercises/connect/example.rb +1 -1
- data/tracks/ruby/exercises/connect/example.tt +3 -1
- data/tracks/ruby/exercises/custom-set/custom_set_test.rb +1 -2
- data/tracks/ruby/exercises/custom-set/example.tt +5 -2
- data/tracks/ruby/exercises/difference-of-squares/difference_of_squares_test.rb +6 -5
- data/tracks/ruby/exercises/difference-of-squares/example.tt +8 -4
- data/tracks/ruby/exercises/dominoes/dominoes_test.rb +1 -1
- data/tracks/ruby/exercises/dominoes/example.tt +1 -1
- data/tracks/ruby/exercises/gigasecond/.meta/.version +1 -1
- data/tracks/ruby/exercises/gigasecond/example.rb +1 -1
- data/tracks/ruby/exercises/gigasecond/example.tt +7 -5
- data/tracks/ruby/exercises/gigasecond/gigasecond_test.rb +11 -16
- data/tracks/ruby/exercises/grains/example.tt +5 -3
- data/tracks/ruby/exercises/grains/grains_test.rb +2 -1
- data/tracks/ruby/exercises/hello-world/example.tt +1 -1
- data/tracks/ruby/exercises/hello-world/hello_world_test.rb +1 -1
- data/tracks/ruby/exercises/isogram/.meta/.version +1 -1
- data/tracks/ruby/exercises/isogram/example.rb +1 -1
- data/tracks/ruby/exercises/isogram/example.tt +6 -4
- data/tracks/ruby/exercises/isogram/isogram_test.rb +18 -10
- data/tracks/ruby/exercises/largest-series-product/.meta/.version +1 -1
- data/tracks/ruby/exercises/largest-series-product/example.rb +1 -1
- data/tracks/ruby/exercises/largest-series-product/example.tt +7 -5
- data/tracks/ruby/exercises/largest-series-product/largest_series_product_test.rb +11 -21
- data/tracks/ruby/exercises/leap/.meta/.version +1 -1
- data/tracks/ruby/exercises/leap/example.rb +1 -1
- data/tracks/ruby/exercises/leap/example.tt +6 -4
- data/tracks/ruby/exercises/leap/leap_test.rb +11 -25
- data/tracks/ruby/exercises/nth-prime/example.tt +7 -5
- data/tracks/ruby/exercises/nth-prime/nth_prime_test.rb +2 -3
- data/tracks/ruby/exercises/pangram/example.tt +5 -3
- data/tracks/ruby/exercises/pangram/pangram_test.rb +2 -1
- data/tracks/ruby/exercises/queen-attack/example.tt +2 -2
- data/tracks/ruby/exercises/queen-attack/queen_attack_test.rb +14 -15
- data/tracks/ruby/exercises/raindrops/example.tt +7 -4
- data/tracks/ruby/exercises/raindrops/raindrops_test.rb +38 -38
- data/tracks/ruby/exercises/rna-transcription/example.tt +6 -3
- data/tracks/ruby/exercises/rna-transcription/rna_transcription_test.rb +4 -5
- data/tracks/ruby/exercises/roman-numerals/example.tt +7 -4
- data/tracks/ruby/exercises/roman-numerals/roman_numerals_test.rb +5 -5
- data/tracks/ruby/exercises/run-length-encoding/.meta/.version +1 -1
- data/tracks/ruby/exercises/run-length-encoding/example.rb +1 -1
- data/tracks/ruby/exercises/run-length-encoding/example.tt +6 -3
- data/tracks/ruby/exercises/run-length-encoding/run_length_encoding_test.rb +70 -28
- data/tracks/ruby/exercises/say/example.tt +7 -5
- data/tracks/ruby/exercises/say/say_test.rb +3 -2
- data/tracks/ruby/exercises/sieve/example.tt +4 -1
- data/tracks/ruby/exercises/sieve/sieve_test.rb +1 -3
- data/tracks/ruby/exercises/tournament/example.tt +4 -1
- data/tracks/ruby/exercises/tournament/tournament_test.rb +1 -2
- data/tracks/ruby/exercises/transpose/example.tt +5 -2
- data/tracks/ruby/exercises/transpose/transpose_test.rb +1 -2
- data/tracks/ruby/exercises/triangle/example.tt +5 -3
- data/tracks/ruby/exercises/triangle/triangle_test.rb +1 -3
- data/tracks/ruby/exercises/two-bucket/example.tt +7 -4
- data/tracks/ruby/exercises/two-bucket/two_bucket_test.rb +9 -9
- data/tracks/ruby/exercises/word-count/example.tt +6 -4
- data/tracks/ruby/exercises/word-count/word_count_test.rb +2 -3
- data/tracks/ruby/exercises/wordy/example.tt +5 -3
- data/tracks/ruby/exercises/wordy/wordy_test.rb +2 -1
- data/tracks/ruby/lib/acronym_cases.rb +3 -15
- data/tracks/ruby/lib/all_your_base_cases.rb +22 -54
- data/tracks/ruby/lib/alphametics_cases.rb +12 -27
- data/tracks/ruby/lib/anagram_cases.rb +7 -15
- data/tracks/ruby/lib/beer_song_cases.rb +7 -24
- data/tracks/ruby/lib/binary_cases.rb +5 -18
- data/tracks/ruby/lib/bowling_cases.rb +24 -24
- data/tracks/ruby/lib/bracket_push_cases.rb +6 -21
- data/tracks/ruby/lib/clock_cases.rb +6 -25
- data/tracks/ruby/lib/connect_cases.rb +2 -20
- data/tracks/ruby/lib/custom_set_cases.rb +14 -35
- data/tracks/ruby/lib/difference_of_squares_cases.rb +5 -26
- data/tracks/ruby/lib/dominoes_cases.rb +2 -11
- data/tracks/ruby/lib/generator/case_values.rb +25 -0
- data/tracks/ruby/lib/generator/exercise_cases.rb +11 -0
- data/tracks/ruby/lib/generator/files/track_files.rb +7 -2
- data/tracks/ruby/lib/generator/template_values.rb +12 -7
- data/tracks/ruby/lib/gigasecond_cases.rb +4 -18
- data/tracks/ruby/lib/grains_cases.rb +11 -38
- data/tracks/ruby/lib/hamming_cases.rb +0 -6
- data/tracks/ruby/lib/hello_world_cases.rb +2 -14
- data/tracks/ruby/lib/isogram_cases.rb +8 -16
- data/tracks/ruby/lib/largest_series_product_cases.rb +10 -16
- data/tracks/ruby/lib/leap_cases.rb +3 -16
- data/tracks/ruby/lib/luhn_cases.rb +0 -6
- data/tracks/ruby/lib/nth_prime_cases.rb +11 -13
- data/tracks/ruby/lib/ocr_numbers_cases.rb +0 -5
- data/tracks/ruby/lib/pangram_cases.rb +2 -19
- data/tracks/ruby/lib/pig_latin_cases.rb +0 -5
- data/tracks/ruby/lib/queen_attack_cases.rb +14 -37
- data/tracks/ruby/lib/raindrops_cases.rb +3 -15
- data/tracks/ruby/lib/rna_transcription_cases.rb +2 -14
- data/tracks/ruby/lib/roman_numerals_cases.rb +7 -10
- data/tracks/ruby/lib/run_length_encoding_cases.rb +4 -25
- data/tracks/ruby/lib/say_cases.rb +3 -14
- data/tracks/ruby/lib/sieve_cases.rb +1 -15
- data/tracks/ruby/lib/tournament_cases.rb +1 -14
- data/tracks/ruby/lib/transpose_cases.rb +1 -14
- data/tracks/ruby/lib/triangle_cases.rb +8 -27
- data/tracks/ruby/lib/two_bucket_cases.rb +7 -17
- data/tracks/ruby/lib/word_count_cases.rb +1 -13
- data/tracks/ruby/lib/wordy_cases.rb +4 -27
- data/tracks/ruby/test/fixtures/metadata/exercises/complex/canonical-data.json +45 -0
- data/tracks/ruby/test/fixtures/xruby/lib/beta_cases.rb +7 -0
- data/tracks/ruby/test/generator/case_values_test.rb +30 -0
- data/tracks/ruby/test/generator/files/track_files_test.rb +2 -3
- data/tracks/ruby/test/generator/template_values_test.rb +44 -3
- data/tracks/ruby/test/wordy_cases_test.rb +4 -65
- metadata +14 -4
- data/tracks/java/exercises/isogram/src/test/java/IsogramTest.java +0 -80
- 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
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
#
|
|
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
|
|
6
|
-
|
|
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
|
-
#
|
|
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 <
|
|
4
|
-
def name
|
|
5
|
-
'test_%s' % description.tr(' ', '_')
|
|
6
|
-
end
|
|
3
|
+
class AcronymCase < ExerciseCase
|
|
7
4
|
|
|
8
|
-
def
|
|
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 <
|
|
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
|
|
26
|
+
return error_assertion unless expected_value
|
|
34
27
|
|
|
35
28
|
[
|
|
36
|
-
"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
|
-
|
|
74
|
-
|
|
52
|
+
def expected_value
|
|
53
|
+
return expected if expected
|
|
75
54
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
-
|
|
92
|
-
|
|
93
|
-
|
|
64
|
+
def invalid_input_digits?
|
|
65
|
+
input_digits.any? { |x| x < 0 || x >= input_base }
|
|
66
|
+
end
|
|
94
67
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
68
|
+
def invalid_bases?
|
|
69
|
+
input_base <= 1 || output_base <= 1
|
|
70
|
+
end
|
|
98
71
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
end
|
|
72
|
+
def input_of_zero?
|
|
73
|
+
input_digits.all? { |x| x == 0 }
|
|
102
74
|
end
|
|
103
|
-
end
|
|
104
75
|
|
|
105
|
-
|
|
106
|
-
|
|
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 <
|
|
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 <
|
|
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
|
|
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 <
|
|
4
|
-
def test_name
|
|
5
|
-
'test_%s' % description.tr(' ', '_')
|
|
6
|
-
end
|
|
3
|
+
class BeerSongCase < ExerciseCase
|
|
7
4
|
|
|
8
5
|
def workload
|
|
9
|
-
"
|
|
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
|
|
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 <
|
|
4
|
-
def name
|
|
5
|
-
'test_%s' % description.gsub(/[ -]/, '_')
|
|
6
|
-
end
|
|
3
|
+
class BinaryCase < ExerciseCase
|
|
7
4
|
|
|
8
|
-
def
|
|
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) { #{
|
|
12
|
+
"assert_raises(ArgumentError) { #{test_case} }"
|
|
20
13
|
end
|
|
21
14
|
|
|
22
15
|
def equality_assertion
|
|
23
|
-
"assert_equal #{expected}, #{
|
|
16
|
+
"assert_equal #{expected}, #{test_case}"
|
|
24
17
|
end
|
|
25
18
|
|
|
26
|
-
def
|
|
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 <
|
|
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
|
|
19
|
-
"
|
|
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
|
-
[
|
|
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
|
|
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
|