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,43 +1,28 @@
|
|
1
1
|
require 'exercise_cases'
|
2
2
|
|
3
|
-
class BracketPushCase <
|
4
|
-
def name
|
5
|
-
'test_%s' % description.gsub(/[ -]/, '_')
|
6
|
-
end
|
7
|
-
|
8
|
-
def skipped
|
9
|
-
index.zero? ? '# skip' : 'skip'
|
10
|
-
end
|
3
|
+
class BracketPushCase < ExerciseCase
|
11
4
|
|
12
|
-
def
|
5
|
+
def workload
|
13
6
|
long_input? ? split_test : simple_test
|
14
7
|
end
|
15
8
|
|
9
|
+
private
|
10
|
+
|
16
11
|
def long_input?
|
17
12
|
input.length > 80
|
18
13
|
end
|
19
14
|
|
20
15
|
def simple_test
|
21
|
-
"#{
|
16
|
+
"#{assert} Brackets.paired?('#{input}')"
|
22
17
|
end
|
23
18
|
|
24
19
|
def split_test
|
25
20
|
"str = '#{split_input[0]}'\\
|
26
21
|
'#{split_input[1]}'
|
27
|
-
#{
|
28
|
-
end
|
29
|
-
|
30
|
-
def assert_or_refute
|
31
|
-
expected ? 'assert' : 'refute'
|
22
|
+
#{assert} Brackets.paired?(str)"
|
32
23
|
end
|
33
24
|
|
34
25
|
def split_input
|
35
26
|
@split_input ||= input.scan(/.{1,#{input.length / 2}}/)
|
36
27
|
end
|
37
28
|
end
|
38
|
-
|
39
|
-
BracketPushCases = proc do |data|
|
40
|
-
JSON.parse(data)['cases'].map.with_index do |row, i|
|
41
|
-
BracketPushCase.new(row.merge('index' => i))
|
42
|
-
end
|
43
|
-
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'exercise_cases'
|
2
2
|
|
3
|
-
class ClockCase <
|
3
|
+
class ClockCase < ExerciseCase
|
4
4
|
def name
|
5
5
|
'test_%s' % description
|
6
6
|
.gsub(/[() -]/, '_')
|
@@ -8,14 +8,16 @@ class ClockCase < OpenStruct
|
|
8
8
|
.chomp('_')
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
12
|
-
|
11
|
+
def workload
|
12
|
+
property == 'equal' ? compare_clocks : simple_test
|
13
13
|
end
|
14
14
|
|
15
|
+
private
|
16
|
+
|
15
17
|
def compare_clocks
|
16
18
|
"clock1 = Clock.at(#{clock1['hour']}, #{clock1['minute']})
|
17
19
|
clock2 = Clock.at(#{clock2['hour']}, #{clock2['minute']})
|
18
|
-
#{
|
20
|
+
#{assert} clock1 == clock2"
|
19
21
|
end
|
20
22
|
|
21
23
|
def simple_test
|
@@ -26,29 +28,8 @@ class ClockCase < OpenStruct
|
|
26
28
|
].join
|
27
29
|
end
|
28
30
|
|
29
|
-
def assert_or_refute
|
30
|
-
expected ? 'assert' : 'refute'
|
31
|
-
end
|
32
|
-
|
33
31
|
def add_to_clock
|
34
32
|
" + #{add}" if add
|
35
33
|
end
|
36
34
|
|
37
|
-
def skipped
|
38
|
-
index.zero? ? '# skip' : 'skip'
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
ClockCases = proc do |data|
|
43
|
-
i = 0
|
44
|
-
json = JSON.parse(data)
|
45
|
-
cases = []
|
46
|
-
%w(create add equal).each do |section|
|
47
|
-
json[section]['cases'].each do |row|
|
48
|
-
row = row.merge(row.merge('index' => i, 'section' => section))
|
49
|
-
cases << ClockCase.new(row)
|
50
|
-
i += 1
|
51
|
-
end
|
52
|
-
end
|
53
|
-
cases
|
54
35
|
end
|
@@ -1,12 +1,6 @@
|
|
1
1
|
require 'exercise_cases'
|
2
2
|
|
3
|
-
class ConnectCase <
|
4
|
-
def name
|
5
|
-
'test_%s' % description
|
6
|
-
.gsub(/[() -]/, '_')
|
7
|
-
.chomp('_')
|
8
|
-
.downcase
|
9
|
-
end
|
3
|
+
class ConnectCase < ExerciseCase
|
10
4
|
|
11
5
|
def test_body
|
12
6
|
[
|
@@ -19,9 +13,7 @@ class ConnectCase < OpenStruct
|
|
19
13
|
]
|
20
14
|
end
|
21
15
|
|
22
|
-
|
23
|
-
index.zero? ? '# skip' : 'skip'
|
24
|
-
end
|
16
|
+
private
|
25
17
|
|
26
18
|
def single_quote(string)
|
27
19
|
string.inspect.tr('"', "'")
|
@@ -31,13 +23,3 @@ class ConnectCase < OpenStruct
|
|
31
23
|
"# rubocop:disable MethodLength\n " if board.length > 8
|
32
24
|
end
|
33
25
|
end
|
34
|
-
|
35
|
-
ConnectCases = proc do |data|
|
36
|
-
json = JSON.parse(data)
|
37
|
-
cases = []
|
38
|
-
json['cases'].each_with_index do |row, i|
|
39
|
-
row['index'] = i
|
40
|
-
cases << ConnectCase.new(row)
|
41
|
-
end
|
42
|
-
cases
|
43
|
-
end
|
@@ -1,88 +1,67 @@
|
|
1
1
|
require 'exercise_cases'
|
2
2
|
|
3
|
-
class CustomSetCase <
|
4
|
-
def name
|
5
|
-
'test_%s' % description.gsub(/ |-/, '_')
|
6
|
-
end
|
3
|
+
class CustomSetCase < ExerciseCase
|
7
4
|
|
8
|
-
def
|
9
|
-
send
|
5
|
+
def workload
|
6
|
+
send property
|
10
7
|
end
|
11
8
|
|
9
|
+
private
|
10
|
+
|
12
11
|
def union
|
13
12
|
"set1 = CustomSet.new #{set1}
|
14
13
|
set2 = CustomSet.new #{set2}
|
15
14
|
expected = CustomSet.new #{expected}
|
16
|
-
#{
|
15
|
+
#{assert}_equal expected, set1.union(set2)"
|
17
16
|
end
|
18
17
|
|
19
18
|
def difference
|
20
19
|
"set1 = CustomSet.new #{set1}
|
21
20
|
set2 = CustomSet.new #{set2}
|
22
21
|
expected = CustomSet.new #{expected}
|
23
|
-
#{
|
22
|
+
#{assert}_equal expected, set1.difference(set2)"
|
24
23
|
end
|
25
24
|
|
26
25
|
def intersection
|
27
26
|
"set1 = CustomSet.new #{set1}
|
28
27
|
set2 = CustomSet.new #{set2}
|
29
28
|
expected = CustomSet.new #{expected}
|
30
|
-
#{
|
29
|
+
#{assert}_equal expected, set2.intersection(set1)"
|
31
30
|
end
|
32
31
|
|
33
32
|
def add
|
34
33
|
"set = CustomSet.new #{set}
|
35
34
|
expected = CustomSet.new #{expected}
|
36
|
-
#{
|
35
|
+
#{assert}_equal expected, set.add(#{element})"
|
37
36
|
end
|
38
37
|
|
39
38
|
def equal
|
40
39
|
"set1 = CustomSet.new #{set1}
|
41
40
|
set2 = CustomSet.new #{set2}
|
42
|
-
#{
|
41
|
+
#{assert}_equal set1, set2"
|
43
42
|
end
|
44
43
|
|
45
44
|
def disjoint
|
46
45
|
"set1 = CustomSet.new #{set1}
|
47
46
|
set2 = CustomSet.new #{set2}
|
48
|
-
#{
|
47
|
+
#{assert} set1.disjoint? set2"
|
49
48
|
end
|
50
49
|
|
51
50
|
def subset
|
52
51
|
"set1 = CustomSet.new #{set1}
|
53
52
|
set2 = CustomSet.new #{set2}
|
54
|
-
#{
|
53
|
+
#{assert} set1.subset? set2"
|
55
54
|
end
|
56
55
|
|
57
56
|
def empty
|
58
57
|
"set = CustomSet.new #{set}
|
59
|
-
#{
|
58
|
+
#{assert}_empty set"
|
60
59
|
end
|
61
60
|
|
62
61
|
def contains
|
63
62
|
"set = CustomSet.new #{set}
|
64
63
|
element = #{element}
|
65
|
-
#{
|
66
|
-
end
|
67
|
-
|
68
|
-
def assert_or_refute
|
69
|
-
expected ? 'assert' : 'refute'
|
64
|
+
#{assert} set.member? element"
|
70
65
|
end
|
71
66
|
|
72
|
-
def skipped
|
73
|
-
index.zero? ? '# skip' : 'skip'
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
CustomSetCases = proc do |data|
|
78
|
-
json = JSON.parse(data)
|
79
|
-
cases = []
|
80
|
-
i = 0
|
81
|
-
(json.keys - ['#']).each do |section|
|
82
|
-
json[section]['cases'].each do |row|
|
83
|
-
cases << CustomSetCase.new(row.merge('index' => i, 'section' => section))
|
84
|
-
i += 1
|
85
|
-
end
|
86
|
-
end
|
87
|
-
cases
|
88
67
|
end
|
@@ -1,38 +1,17 @@
|
|
1
1
|
require 'exercise_cases'
|
2
2
|
|
3
|
-
class DifferenceOfSquaresCase <
|
4
|
-
def test_name
|
5
|
-
'test_%s' % description.gsub(/[ -]/, '_')
|
6
|
-
end
|
3
|
+
class DifferenceOfSquaresCase < ExerciseCase
|
7
4
|
|
8
|
-
def
|
9
|
-
|
5
|
+
def workload
|
6
|
+
%Q(assert_equal #{expected_formatted}, Squares.new(#{number}).#{action})
|
10
7
|
end
|
11
8
|
|
12
9
|
def action
|
13
|
-
return 'difference' if
|
14
|
-
|
15
|
-
end
|
16
|
-
|
17
|
-
def skipped?
|
18
|
-
index > 0
|
10
|
+
return 'difference' if property == 'differenceOfSquares'
|
11
|
+
property.gsub(/([OS])/) {|cap| "_#{$1.downcase}" }
|
19
12
|
end
|
20
13
|
|
21
14
|
def expected_formatted
|
22
15
|
expected.to_s.reverse.scan(/\d{1,3}/).join('_').reverse
|
23
16
|
end
|
24
17
|
end
|
25
|
-
|
26
|
-
DifferenceOfSquaresCases = proc do |data|
|
27
|
-
i = 0
|
28
|
-
json = JSON.parse(data)
|
29
|
-
cases = []
|
30
|
-
%w(square_of_sum sum_of_squares difference_of_squares).each do |section|
|
31
|
-
json[section]['cases'].each do |row|
|
32
|
-
row = row.merge(row.merge('index' => i, 'section' => section))
|
33
|
-
cases << DifferenceOfSquaresCase.new(row)
|
34
|
-
i += 1
|
35
|
-
end
|
36
|
-
end
|
37
|
-
cases
|
38
|
-
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'exercise_cases'
|
2
2
|
|
3
|
-
class DominoesCase <
|
4
|
-
def
|
3
|
+
class DominoesCase < ExerciseCase
|
4
|
+
def name
|
5
5
|
'test_%s' % description.gsub("can't", 'can not').gsub(/[= -]+/, '_')
|
6
6
|
end
|
7
7
|
|
@@ -13,13 +13,4 @@ input_dominoes = #{input}
|
|
13
13
|
WL
|
14
14
|
end
|
15
15
|
|
16
|
-
def skipped
|
17
|
-
index.zero? ? '# skip' : 'skip'
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
DominoesCases = proc do |data|
|
22
|
-
JSON.parse(data)['cases'].map.with_index do |row, i|
|
23
|
-
DominoesCase.new(row.merge('index' => i))
|
24
|
-
end
|
25
16
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Generator
|
2
|
+
module CaseValues
|
3
|
+
class Extractor
|
4
|
+
def initialize(case_class:)
|
5
|
+
@case_class = case_class
|
6
|
+
end
|
7
|
+
|
8
|
+
def cases(exercise_data)
|
9
|
+
extract_test_cases(
|
10
|
+
data: JSON.parse(exercise_data)['cases']
|
11
|
+
).map.with_index do |test, index|
|
12
|
+
@case_class.new(test.merge('index' => index))
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def extract_test_cases(data:)
|
19
|
+
data.flat_map do |entry|
|
20
|
+
entry.key?('cases') ? extract_test_cases(data: entry['cases']) : entry
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -14,6 +14,17 @@ class ExerciseCase < OpenStruct
|
|
14
14
|
|
15
15
|
protected
|
16
16
|
|
17
|
+
# used to indent multi line workloads, as
|
18
|
+
# indent_lines(
|
19
|
+
# [
|
20
|
+
# "string = #{input.inspect}",
|
21
|
+
# "#{assert} Isogram.is_isogram?(string)"
|
22
|
+
# ], 4
|
23
|
+
# )
|
24
|
+
def indent_lines(code, depth)
|
25
|
+
code.join("\n" + ' ' * depth)
|
26
|
+
end
|
27
|
+
|
17
28
|
# used in workload, for example, as
|
18
29
|
# "#{assert} Luhn.valid?(#{input.inspect})"
|
19
30
|
def assert
|
@@ -14,13 +14,18 @@ module Generator
|
|
14
14
|
"#{exercise_name.tr('-', '_')}_cases"
|
15
15
|
end
|
16
16
|
|
17
|
-
def
|
18
|
-
filename(exercise_name).split('_').map(&:capitalize).join
|
17
|
+
def class_name(exercise_name)
|
18
|
+
filename(exercise_name)[0..-2].split('_').map(&:capitalize).join
|
19
19
|
end
|
20
20
|
|
21
21
|
def exercise_name(filename)
|
22
22
|
%r{([^/]*)_cases\.rb$}.match(filename).captures[0].tr('_', '-')
|
23
23
|
end
|
24
|
+
|
25
|
+
def load_filename(track_path, exercise_name)
|
26
|
+
path = File.join(track_path, 'lib')
|
27
|
+
"%s/%s.rb" % [ path, filename(exercise_name) ]
|
28
|
+
end
|
24
29
|
end
|
25
30
|
|
26
31
|
module TrackFiles
|
@@ -16,23 +16,28 @@ module Generator
|
|
16
16
|
|
17
17
|
module TemplateValuesFactory
|
18
18
|
def template_values
|
19
|
-
require cases_require_name
|
20
|
-
|
21
19
|
TemplateValues.new(
|
22
20
|
abbreviated_commit_hash: canonical_data.abbreviated_commit_hash,
|
23
21
|
version: version,
|
24
|
-
test_cases:
|
22
|
+
test_cases: extract
|
25
23
|
)
|
26
24
|
end
|
27
25
|
|
28
26
|
private
|
29
27
|
|
30
|
-
def
|
31
|
-
|
28
|
+
def extract
|
29
|
+
load cases_load_name
|
30
|
+
extractor.cases(canonical_data.to_s)
|
31
|
+
end
|
32
|
+
|
33
|
+
def extractor
|
34
|
+
CaseValues::Extractor.new(
|
35
|
+
case_class: Object.const_get(Files::GeneratorCases.class_name(exercise_name))
|
36
|
+
)
|
32
37
|
end
|
33
38
|
|
34
|
-
def
|
35
|
-
|
39
|
+
def cases_load_name
|
40
|
+
Files::GeneratorCases.load_filename(paths.track, exercise_name)
|
36
41
|
end
|
37
42
|
end
|
38
43
|
end
|
@@ -1,15 +1,11 @@
|
|
1
|
-
require 'exercise_cases'
|
2
|
-
|
3
1
|
require 'time'
|
4
2
|
|
5
|
-
class GigasecondCase <
|
6
|
-
def
|
7
|
-
|
3
|
+
class GigasecondCase < ExerciseCase
|
4
|
+
def workload
|
5
|
+
%Q(assert_equal #{want}, Gigasecond.from(#{got}))
|
8
6
|
end
|
9
7
|
|
10
|
-
|
11
|
-
send(:'#') || input
|
12
|
-
end
|
8
|
+
private
|
13
9
|
|
14
10
|
def got
|
15
11
|
"Time.utc(#{start_values.join(', ')})"
|
@@ -28,14 +24,4 @@ class GigasecondCase < OpenStruct
|
|
28
24
|
ts = Time.parse(expected)
|
29
25
|
[ts.year, ts.month, ts.day, ts.hour, ts.min, ts.sec]
|
30
26
|
end
|
31
|
-
|
32
|
-
def skipped?
|
33
|
-
index > 0
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
GigasecondCases = proc do |data|
|
38
|
-
JSON.parse(data)['add']['cases'].map.with_index do |row, i|
|
39
|
-
GigasecondCase.new(row.merge('index' => i))
|
40
|
-
end
|
41
27
|
end
|