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.
- 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
|