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.
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
@@ -1,43 +1,28 @@
1
1
  require 'exercise_cases'
2
2
 
3
- class BracketPushCase < OpenStruct
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 test_body
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
- "#{assert_or_refute} Brackets.paired?('#{input}')"
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
- #{assert_or_refute} Brackets.paired?(str)"
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 < OpenStruct
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 test_body
12
- section == 'equal' ? compare_clocks : simple_test
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
- #{assert_or_refute} clock1 == clock2"
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 < OpenStruct
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
- def skipped
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 < OpenStruct
4
- def name
5
- 'test_%s' % description.gsub(/ |-/, '_')
6
- end
3
+ class CustomSetCase < ExerciseCase
7
4
 
8
- def test_body
9
- send section
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
- #{assert_or_refute}_equal expected, set1.union(set2)"
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
- #{assert_or_refute}_equal expected, set1.difference(set2)"
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
- #{assert_or_refute}_equal expected, set2.intersection(set1)"
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
- #{assert_or_refute}_equal expected, set.add(#{element})"
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
- #{assert_or_refute}_equal set1, set2"
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
- #{assert_or_refute} set1.disjoint? set2"
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
- #{assert_or_refute} set1.subset? set2"
53
+ #{assert} set1.subset? set2"
55
54
  end
56
55
 
57
56
  def empty
58
57
  "set = CustomSet.new #{set}
59
- #{assert_or_refute}_empty set"
58
+ #{assert}_empty set"
60
59
  end
61
60
 
62
61
  def contains
63
62
  "set = CustomSet.new #{set}
64
63
  element = #{element}
65
- #{assert_or_refute} set.member? element"
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 < OpenStruct
4
- def test_name
5
- 'test_%s' % description.gsub(/[ -]/, '_')
6
- end
3
+ class DifferenceOfSquaresCase < ExerciseCase
7
4
 
8
- def do
9
- "Squares.new(#{number}).#{action}"
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 section == 'difference_of_squares'
14
- section
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 < OpenStruct
4
- def test_name
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 proc_name(exercise_name)
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: test_cases_proc.call(canonical_data.to_s)
22
+ test_cases: extract
25
23
  )
26
24
  end
27
25
 
28
26
  private
29
27
 
30
- def cases_require_name
31
- Files::GeneratorCases.filename(exercise_name)
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 test_cases_proc
35
- Object.const_get(Files::GeneratorCases.proc_name(exercise_name))
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 < OpenStruct
6
- def name
7
- 'test_%s' % description.gsub(/[ :-]/, '_')
3
+ class GigasecondCase < ExerciseCase
4
+ def workload
5
+ %Q(assert_equal #{want}, Gigasecond.from(#{got}))
8
6
  end
9
7
 
10
- def description
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