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
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
require 'exercise_cases'
|
|
2
2
|
|
|
3
|
-
class RunLengthEncodingCase <
|
|
4
|
-
def name
|
|
5
|
-
'test_%s' % cleaned_description
|
|
6
|
-
end
|
|
3
|
+
class RunLengthEncodingCase < ExerciseCase
|
|
7
4
|
|
|
8
5
|
def assign_input
|
|
9
6
|
"input = '#{input}'"
|
|
@@ -14,30 +11,12 @@ class RunLengthEncodingCase < OpenStruct
|
|
|
14
11
|
end
|
|
15
12
|
|
|
16
13
|
def assertion
|
|
17
|
-
|
|
18
|
-
when /decode.+encode/
|
|
14
|
+
if property == 'consistency'
|
|
19
15
|
'assert_equal output,
|
|
20
16
|
RunLengthEncoding.decode(RunLengthEncoding.encode(input))'
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
when /decode/
|
|
24
|
-
'assert_equal output, RunLengthEncoding.decode(input)'
|
|
17
|
+
else
|
|
18
|
+
"assert_equal output, RunLengthEncoding.#{property}(input)"
|
|
25
19
|
end
|
|
26
20
|
end
|
|
27
21
|
|
|
28
|
-
def skipped?
|
|
29
|
-
index > 0
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
# internal
|
|
33
|
-
|
|
34
|
-
def cleaned_description
|
|
35
|
-
description.gsub(/\W+/, '_').squeeze('_')
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
RunLengthEncodingCases = proc do |data|
|
|
40
|
-
JSON.parse(data)['cases'].map.with_index do |row, i|
|
|
41
|
-
RunLengthEncodingCase.new(row.merge('index' => i))
|
|
42
|
-
end
|
|
43
22
|
end
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
end
|
|
1
|
+
require 'exercise_cases'
|
|
2
|
+
|
|
3
|
+
class SayCase < ExerciseCase
|
|
5
4
|
|
|
6
5
|
def workload
|
|
7
6
|
[
|
|
@@ -10,10 +9,6 @@ class SayCase < OpenStruct
|
|
|
10
9
|
].join("\n")
|
|
11
10
|
end
|
|
12
11
|
|
|
13
|
-
def skipped
|
|
14
|
-
index.zero? ? '# skip' : 'skip'
|
|
15
|
-
end
|
|
16
|
-
|
|
17
12
|
private
|
|
18
13
|
|
|
19
14
|
def indent(size, lines)
|
|
@@ -38,9 +33,3 @@ class SayCase < OpenStruct
|
|
|
38
33
|
number.to_s.reverse.gsub(/...(?=.)/, '\&_').reverse
|
|
39
34
|
end
|
|
40
35
|
end
|
|
41
|
-
|
|
42
|
-
SayCases = proc do |data|
|
|
43
|
-
JSON.parse(data)['cases'].map.with_index do |row, i|
|
|
44
|
-
SayCase.new(row.merge(index: i))
|
|
45
|
-
end
|
|
46
|
-
end
|
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
require 'exercise_cases'
|
|
2
2
|
|
|
3
|
-
class SieveCase <
|
|
3
|
+
class SieveCase < ExerciseCase
|
|
4
4
|
OPEN_ARRAY = "[\n\s\s\s\s\s\s".freeze
|
|
5
5
|
CLOSE_ARRAY = "\n\s\s\s\s]".freeze
|
|
6
6
|
NEW_ARRAY_ROW = ",\n\s\s\s\s\s\s".freeze
|
|
7
7
|
ARRAY_ELEMENTS_PER_ROW = 17.freeze
|
|
8
8
|
|
|
9
|
-
def name
|
|
10
|
-
'test_%s' % description.tr(' ', '_')
|
|
11
|
-
end
|
|
12
|
-
|
|
13
9
|
def expected_string
|
|
14
10
|
return expected unless needs_indentation?
|
|
15
11
|
|
|
@@ -17,19 +13,9 @@ class SieveCase < OpenStruct
|
|
|
17
13
|
"#{OPEN_ARRAY}#{array_rows.join(NEW_ARRAY_ROW)}#{CLOSE_ARRAY}"
|
|
18
14
|
end
|
|
19
15
|
|
|
20
|
-
def skipped
|
|
21
|
-
index.zero? ? '# skip' : 'skip'
|
|
22
|
-
end
|
|
23
|
-
|
|
24
16
|
private
|
|
25
17
|
|
|
26
18
|
def needs_indentation?
|
|
27
19
|
expected.size > ARRAY_ELEMENTS_PER_ROW
|
|
28
20
|
end
|
|
29
21
|
end
|
|
30
|
-
|
|
31
|
-
SieveCases = proc do |data|
|
|
32
|
-
JSON.parse(data)['cases'].map.with_index do |row, i|
|
|
33
|
-
SieveCase.new(row.merge('index' => i))
|
|
34
|
-
end
|
|
35
|
-
end
|
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
require 'exercise_cases'
|
|
2
2
|
|
|
3
|
-
class TournamentCase <
|
|
4
|
-
def test_name
|
|
5
|
-
"test_#{description.tr(' ', '_').tr('()', '')}"
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
def skipped
|
|
9
|
-
index.zero? ? '# skip' : 'skip'
|
|
10
|
-
end
|
|
3
|
+
class TournamentCase < ExerciseCase
|
|
11
4
|
|
|
12
5
|
def workload
|
|
13
6
|
'Tournament.tally(input)'
|
|
@@ -39,9 +32,3 @@ class TournamentCase < OpenStruct
|
|
|
39
32
|
' ' * indent * 2 + line
|
|
40
33
|
end
|
|
41
34
|
end
|
|
42
|
-
|
|
43
|
-
TournamentCases = proc do |data|
|
|
44
|
-
JSON.parse(data)['valid_inputs']['cases'].map.with_index do |row, i|
|
|
45
|
-
TournamentCase.new(row.merge('index' => i))
|
|
46
|
-
end
|
|
47
|
-
end
|
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
require 'exercise_cases'
|
|
2
2
|
|
|
3
|
-
class TransposeCase <
|
|
4
|
-
def test_name
|
|
5
|
-
"test_#{description.tr(' ', '_')}"
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
def skipped
|
|
9
|
-
index.zero? ? '# skip' : 'skip'
|
|
10
|
-
end
|
|
3
|
+
class TransposeCase < ExerciseCase
|
|
11
4
|
|
|
12
5
|
def workload
|
|
13
6
|
'Transpose.transpose(input)'
|
|
@@ -39,9 +32,3 @@ class TransposeCase < OpenStruct
|
|
|
39
32
|
' ' * indent * 2 + line
|
|
40
33
|
end
|
|
41
34
|
end
|
|
42
|
-
|
|
43
|
-
TransposeCases = proc do |data|
|
|
44
|
-
JSON.parse(data)['cases'].map.with_index do |row, i|
|
|
45
|
-
TransposeCase.new(row.merge('index' => i))
|
|
46
|
-
end
|
|
47
|
-
end
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
require 'exercise_cases'
|
|
2
2
|
|
|
3
|
-
class TriangleCase <
|
|
4
|
-
def
|
|
3
|
+
class TriangleCase < ExerciseCase
|
|
4
|
+
def name
|
|
5
5
|
initial = description.downcase
|
|
6
6
|
replaced = initial.gsub(/(true|false)/, expected_type)
|
|
7
|
-
if initial.eql?(replaced) && !initial.include?(
|
|
8
|
-
replaced =
|
|
7
|
+
if initial.eql?(replaced) && !initial.include?(property)
|
|
8
|
+
replaced = property + ' triangle ' + initial
|
|
9
9
|
end
|
|
10
10
|
'test_%s' % replaced.tr_s(', -', '_')
|
|
11
11
|
end
|
|
@@ -13,41 +13,22 @@ class TriangleCase < OpenStruct
|
|
|
13
13
|
def workload
|
|
14
14
|
[
|
|
15
15
|
"triangle = Triangle.new(#{sides})",
|
|
16
|
-
indent("#{
|
|
16
|
+
indent("#{assert} triangle.#{property}?, #{failure_message}")
|
|
17
17
|
].join("\n")
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
+
private
|
|
21
|
+
|
|
20
22
|
def indent(line)
|
|
21
23
|
' ' * 4 + line
|
|
22
24
|
end
|
|
23
25
|
|
|
24
|
-
def assert_or_refute
|
|
25
|
-
expected ? 'assert' : 'refute'
|
|
26
|
-
end
|
|
27
|
-
|
|
28
26
|
def failure_message
|
|
29
27
|
%Q("Expected '#{expected}', #{expected_type}.")
|
|
30
28
|
end
|
|
31
29
|
|
|
32
30
|
def expected_type
|
|
33
|
-
"triangle is #{expected ? '' : 'not '}#{
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def skipped
|
|
37
|
-
index.zero? ? '# skip' : 'skip'
|
|
31
|
+
"triangle is #{expected ? '' : 'not '}#{property}"
|
|
38
32
|
end
|
|
39
|
-
end
|
|
40
33
|
|
|
41
|
-
TriangleCases = proc do |data|
|
|
42
|
-
i = 0
|
|
43
|
-
cases = []
|
|
44
|
-
data = JSON.parse(data).select { |key, value| key.to_s.match(/[^#]+/) }
|
|
45
|
-
data.keys.each do |triangle|
|
|
46
|
-
data[triangle]['cases'].each do |row|
|
|
47
|
-
row = row.merge(row.merge('index' => i, 'triangle' => triangle))
|
|
48
|
-
cases << TriangleCase.new(row)
|
|
49
|
-
i += 1
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
cases
|
|
53
34
|
end
|
|
@@ -1,30 +1,20 @@
|
|
|
1
1
|
require 'exercise_cases'
|
|
2
2
|
|
|
3
|
-
class TwoBucketCase <
|
|
4
|
-
def
|
|
5
|
-
"
|
|
6
|
-
"#{bucket_two}_goal_#{goal}
|
|
3
|
+
class TwoBucketCase < ExerciseCase
|
|
4
|
+
def name
|
|
5
|
+
"test_bucket_one_size_#{bucket_one}_bucket_two_"\
|
|
6
|
+
"size_#{bucket_two}_goal_#{goal}_start_with_bucket_#{start_bucket}"
|
|
7
7
|
end
|
|
8
8
|
|
|
9
|
-
def
|
|
10
|
-
"TwoBucket.new(#{bucket_one}, #{bucket_two}, #{goal}, '#{start_bucket}')"
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def test_body
|
|
9
|
+
def workload
|
|
14
10
|
"two_bucket = #{self.do}
|
|
15
11
|
assert_equal #{expected['moves']}, two_bucket.moves
|
|
16
12
|
assert_equal '#{expected['goal_bucket']}', two_bucket.goal_bucket
|
|
17
13
|
assert_equal #{expected['other_bucket']}, two_bucket.other_bucket"
|
|
18
14
|
end
|
|
19
15
|
|
|
20
|
-
def
|
|
21
|
-
|
|
16
|
+
def do
|
|
17
|
+
"TwoBucket.new(#{bucket_one}, #{bucket_two}, #{goal}, '#{start_bucket}')"
|
|
22
18
|
end
|
|
23
|
-
end
|
|
24
19
|
|
|
25
|
-
TwoBucketCases = proc do |data|
|
|
26
|
-
JSON.parse(data)['two_bucket']['cases'].map.with_index do |row, i|
|
|
27
|
-
row = row.merge('index' => i)
|
|
28
|
-
TwoBucketCase.new(row)
|
|
29
|
-
end
|
|
30
20
|
end
|
|
@@ -1,21 +1,9 @@
|
|
|
1
1
|
require 'exercise_cases'
|
|
2
2
|
|
|
3
|
-
class WordCountCase <
|
|
4
|
-
def name
|
|
5
|
-
'test_%s' % description.tr(' ', '_')
|
|
6
|
-
end
|
|
3
|
+
class WordCountCase < ExerciseCase
|
|
7
4
|
|
|
8
5
|
def object_under_test
|
|
9
6
|
%Q(Phrase.new(#{input.inspect}))
|
|
10
7
|
end
|
|
11
8
|
|
|
12
|
-
def skipped?
|
|
13
|
-
index.nonzero?
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
WordCountCases = proc do |data|
|
|
18
|
-
JSON.parse(data)['cases'].map.with_index do |row, i|
|
|
19
|
-
WordCountCase.new(row.merge('index' => i))
|
|
20
|
-
end
|
|
21
9
|
end
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
require 'exercise_cases'
|
|
2
2
|
|
|
3
|
-
class WordyCase <
|
|
4
|
-
def test_name
|
|
5
|
-
'test_%s' % description.downcase.tr(' ', '_')
|
|
6
|
-
end
|
|
3
|
+
class WordyCase < ExerciseCase
|
|
7
4
|
|
|
8
5
|
def workload
|
|
9
6
|
[
|
|
@@ -12,10 +9,6 @@ class WordyCase < OpenStruct
|
|
|
12
9
|
].join("\n")
|
|
13
10
|
end
|
|
14
11
|
|
|
15
|
-
def skipped
|
|
16
|
-
index.zero? ? '# skip' : 'skip'
|
|
17
|
-
end
|
|
18
|
-
|
|
19
12
|
private
|
|
20
13
|
|
|
21
14
|
def indent(size, lines)
|
|
@@ -44,26 +37,10 @@ class WordyCase < OpenStruct
|
|
|
44
37
|
"assert_equal(#{expected}, answer, message)",
|
|
45
38
|
].join("\n")
|
|
46
39
|
end
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
class WordyCase::PreProcessor
|
|
50
|
-
class << self
|
|
51
|
-
def call(row)
|
|
52
|
-
row.merge('message' => message_for(row))
|
|
53
|
-
end
|
|
54
40
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
def message_for(row)
|
|
58
|
-
return unless row['input'] == 'What is -3 plus 7 multiplied by -2?'
|
|
59
|
-
|
|
60
|
-
'You should ignore order of precedence. -3 + 7 * -2 = -8, not %s'
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
end
|
|
41
|
+
def message
|
|
42
|
+
return unless input == 'What is -3 plus 7 multiplied by -2?'
|
|
64
43
|
|
|
65
|
-
|
|
66
|
-
JSON.parse(data)['cases'].map.with_index do |row, i|
|
|
67
|
-
WordyCase.new(WordyCase::PreProcessor.call(row).merge(index: i))
|
|
44
|
+
'You should ignore order of precedence. -3 + 7 * -2 = -8, not %s'
|
|
68
45
|
end
|
|
69
46
|
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"exercise": "beer-song",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"cases": [
|
|
5
|
+
{
|
|
6
|
+
"description": "verse",
|
|
7
|
+
"cases": [
|
|
8
|
+
{
|
|
9
|
+
"description": "single verse",
|
|
10
|
+
"cases": [
|
|
11
|
+
{
|
|
12
|
+
"description": "first generic verse",
|
|
13
|
+
"property": "verse",
|
|
14
|
+
"number": 99,
|
|
15
|
+
"expected": "99 bottles of beer on the wall, YAAAR"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"description": "last generic verse",
|
|
19
|
+
"property": "verse",
|
|
20
|
+
"number": 3,
|
|
21
|
+
"expected": "3 bottles of beer on the wall, YAAAR"
|
|
22
|
+
}
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"description": "lyrics",
|
|
29
|
+
"cases": [
|
|
30
|
+
{
|
|
31
|
+
"description": "multiple verses",
|
|
32
|
+
"cases": [
|
|
33
|
+
{
|
|
34
|
+
"description": "first two verses",
|
|
35
|
+
"property": "verses",
|
|
36
|
+
"beginning": 99,
|
|
37
|
+
"end": 98,
|
|
38
|
+
"expected": "99 bottles of beer on the wall, YAR, PIRATES CAN'T COUNT"
|
|
39
|
+
}
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
]
|
|
45
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require_relative '../test_helper'
|
|
2
|
+
|
|
3
|
+
class ComplexCase < ExerciseCase
|
|
4
|
+
def workload
|
|
5
|
+
assert { Complex.foo(bar) }
|
|
6
|
+
end
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
module Generator
|
|
10
|
+
module CaseValues
|
|
11
|
+
class ExtractorTest < Minitest::Test
|
|
12
|
+
def test_multi_level_auto_extraction
|
|
13
|
+
canonical_data = File.read('test/fixtures/metadata/exercises/complex/canonical-data.json')
|
|
14
|
+
cases = Extractor.new(
|
|
15
|
+
case_class: ComplexCase,
|
|
16
|
+
).cases(canonical_data)
|
|
17
|
+
|
|
18
|
+
expected = [
|
|
19
|
+
ComplexCase.new(description: 'first generic verse', property: 'verse', number: 99,
|
|
20
|
+
expected: '99 bottles of beer on the wall, YAAAR', index: 0),
|
|
21
|
+
ComplexCase.new(description: 'last generic verse', property: 'verse', number: 3,
|
|
22
|
+
expected: '3 bottles of beer on the wall, YAAAR', index: 1),
|
|
23
|
+
ComplexCase.new(description: 'first two verses', property: 'verses', beginning: 99, end: 98,
|
|
24
|
+
expected: "99 bottles of beer on the wall, YAR, PIRATES CAN'T COUNT", index: 2)
|
|
25
|
+
]
|
|
26
|
+
assert_equal expected, cases
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -25,9 +25,8 @@ module Generator
|
|
|
25
25
|
assert_equal 'two_parter_cases', GeneratorCases.filename(exercise_name)
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
-
def
|
|
29
|
-
|
|
30
|
-
assert_equal 'TwoParterCases', GeneratorCases.proc_name(exercise_name)
|
|
28
|
+
def test_class_name
|
|
29
|
+
assert_equal 'TwoParterCase', GeneratorCases.class_name('two-parter')
|
|
31
30
|
end
|
|
32
31
|
end
|
|
33
32
|
|
|
@@ -43,17 +43,58 @@ module Generator
|
|
|
43
43
|
mock_canonical_data
|
|
44
44
|
end
|
|
45
45
|
|
|
46
|
+
def paths
|
|
47
|
+
mock_paths = Minitest::Mock.new
|
|
48
|
+
mock_paths.expect :track, 'test/fixtures/xruby'
|
|
49
|
+
mock_paths
|
|
50
|
+
end
|
|
51
|
+
|
|
46
52
|
include TemplateValuesFactory
|
|
47
53
|
end
|
|
48
54
|
|
|
49
|
-
|
|
50
|
-
|
|
55
|
+
class ClassBasedTestTemplateValuesFactory
|
|
56
|
+
def exercise_name
|
|
57
|
+
'beta'
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def version
|
|
61
|
+
2
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def canonical_data
|
|
65
|
+
mock_canonical_data = Minitest::Mock.new
|
|
66
|
+
mock_canonical_data.expect :abbreviated_commit_hash, nil
|
|
67
|
+
mock_canonical_data.expect :to_s, '{"cases":[]}'
|
|
68
|
+
mock_canonical_data
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def paths
|
|
72
|
+
mock_paths = Minitest::Mock.new
|
|
73
|
+
mock_paths.expect :track, 'test/fixtures/xruby'
|
|
74
|
+
mock_paths
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
include TemplateValuesFactory
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def test_template_values_from_class
|
|
81
|
+
subject = ClassBasedTestTemplateValuesFactory.new
|
|
82
|
+
assert_instance_of TemplateValues, subject.template_values
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def test_template_values_loads_problem_case_classes
|
|
51
86
|
subject = TestTemplateValuesFactory.new
|
|
52
87
|
assert_instance_of TemplateValues, subject.template_values
|
|
88
|
+
assert Object.const_defined?(:AlphaCase)
|
|
89
|
+
assert Object.const_defined?(:AlphaCases)
|
|
53
90
|
end
|
|
54
91
|
|
|
55
92
|
def teardown
|
|
56
|
-
|
|
93
|
+
[:AlphaCase, :AlphaCases].each do |classname|
|
|
94
|
+
if Object.const_defined?(classname)
|
|
95
|
+
Object.send(:remove_const, classname)
|
|
96
|
+
end
|
|
97
|
+
end
|
|
57
98
|
end
|
|
58
99
|
end
|
|
59
100
|
end
|