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