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