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,9 +1,6 @@
1
1
  require 'exercise_cases'
2
2
 
3
- class RunLengthEncodingCase < OpenStruct
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
- case description
18
- when /decode.+encode/
14
+ if property == 'consistency'
19
15
  'assert_equal output,
20
16
  RunLengthEncoding.decode(RunLengthEncoding.encode(input))'
21
- when /encode/
22
- 'assert_equal output, RunLengthEncoding.encode(input)'
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
- class SayCase < OpenStruct
2
- def test_name
3
- 'test_%s' % description.tr(' ,-', '_').downcase
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 < OpenStruct
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 < OpenStruct
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 < OpenStruct
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 < OpenStruct
4
- def test_name
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?(triangle)
8
- replaced = triangle + ' triangle ' + initial
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("#{assert_or_refute} triangle.#{triangle}?, #{failure_message}")
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 '}#{triangle}"
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 < OpenStruct
4
- def test_name
5
- "test_bucket_one_#{bucket_one}_bucket_two_"\
6
- "#{bucket_two}_goal_#{goal}_starting_#{start_bucket}"
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 do
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 skipped?
21
- index > 0
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 < OpenStruct
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 < OpenStruct
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
- private
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
- WordyCases = proc do |data|
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,7 @@
1
+ require 'exercise_cases'
2
+
3
+ class BetaCase < ExerciseCase
4
+ def workload
5
+ assert_equal { "Beta.call('#{input}')" }
6
+ end
7
+ end
@@ -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 test_proc_name
29
- exercise_name = 'two-parter'
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
- def test_template_values
50
- $LOAD_PATH.unshift 'test/fixtures/xruby/lib'
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
- $LOAD_PATH.delete 'test/fixtures/xruby/lib'
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