trackler 2.1.0.6 → 2.1.0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/common/exercises/rail-fence-cipher/canonical-data.json +7 -7
  3. data/common/exercises/scrabble-score/description.md +2 -2
  4. data/lib/trackler/version.rb +1 -1
  5. data/tracks/delphi/exercises/clock/uClockExample.pas +5 -5
  6. data/tracks/delphi/exercises/clock/uClockTest.pas +435 -49
  7. data/tracks/ocaml/exercises/triangle/example.ml +1 -1
  8. data/tracks/ocaml/exercises/triangle/test.ml +8 -8
  9. data/tracks/ocaml/exercises/triangle/triangle.mli +1 -1
  10. data/tracks/ocaml/tools/test-generator/templates/triangle/template.ml +3 -3
  11. data/tracks/perl6/exercises/all-your-base/AllYourBase.pm6 +1 -1
  12. data/tracks/perl6/exercises/all-your-base/Example.pm +2 -2
  13. data/tracks/perl6/exercises/all-your-base/all-your-base.t +215 -138
  14. data/tracks/perl6/exercises/all-your-base/example.yaml +14 -0
  15. data/tracks/ruby/exercises/acronym/.meta/generator/acronym_cases.rb +1 -1
  16. data/tracks/ruby/exercises/all-your-base/.meta/generator/all_your_base_cases.rb +4 -10
  17. data/tracks/ruby/exercises/all-your-base/all_your_base_test.rb +3 -0
  18. data/tracks/ruby/exercises/alphametics/.meta/generator/alphametics_cases.rb +1 -1
  19. data/tracks/ruby/exercises/alphametics/{example.tt → .meta/generator/test_template.erb} +0 -0
  20. data/tracks/ruby/exercises/anagram/.meta/generator/anagram_cases.rb +1 -1
  21. data/tracks/ruby/exercises/beer-song/.meta/generator/beer_song_cases.rb +3 -6
  22. data/tracks/ruby/exercises/beer-song/beer_song_test.rb +1 -1
  23. data/tracks/ruby/exercises/binary/.meta/generator/binary_cases.rb +1 -1
  24. data/tracks/ruby/exercises/bowling/.meta/generator/bowling_cases.rb +1 -1
  25. data/tracks/ruby/exercises/bowling/{example.tt → .meta/generator/test_template.erb} +0 -0
  26. data/tracks/ruby/exercises/bracket-push/.meta/generator/bracket_push_cases.rb +1 -1
  27. data/tracks/ruby/exercises/clock/.meta/generator/clock_cases.rb +1 -1
  28. data/tracks/ruby/exercises/connect/.meta/generator/connect_cases.rb +1 -1
  29. data/tracks/ruby/exercises/connect/{example.tt → .meta/generator/test_template.erb} +0 -0
  30. data/tracks/ruby/exercises/custom-set/.meta/generator/custom_set_cases.rb +1 -1
  31. data/tracks/ruby/exercises/difference-of-squares/.meta/generator/difference_of_squares_cases.rb +1 -1
  32. data/tracks/ruby/exercises/difference-of-squares/difference_of_squares_test.rb +0 -6
  33. data/tracks/ruby/exercises/dominoes/.meta/generator/dominoes_cases.rb +1 -1
  34. data/tracks/ruby/exercises/dominoes/{example.tt → .meta/generator/test_template.erb} +0 -0
  35. data/tracks/ruby/exercises/etl/.meta/generator/etl_cases.rb +1 -1
  36. data/tracks/ruby/exercises/gigasecond/.meta/generator/gigasecond_cases.rb +1 -1
  37. data/tracks/ruby/exercises/gigasecond/gigasecond_test.rb +3 -5
  38. data/tracks/ruby/exercises/grains/.meta/generator/grains_cases.rb +1 -1
  39. data/tracks/ruby/exercises/hamming/.meta/generator/hamming_cases.rb +1 -1
  40. data/tracks/ruby/exercises/hello-world/.meta/generator/hello_world_cases.rb +1 -1
  41. data/tracks/ruby/exercises/hello-world/{example.tt → .meta/generator/test_template.erb} +0 -0
  42. data/tracks/ruby/exercises/isogram/.meta/generator/isogram_cases.rb +1 -1
  43. data/tracks/ruby/exercises/largest-series-product/.meta/generator/largest_series_product_cases.rb +1 -1
  44. data/tracks/ruby/exercises/leap/.meta/generator/leap_cases.rb +1 -1
  45. data/tracks/ruby/exercises/leap/{example.tt → .meta/generator/test_template.erb} +0 -0
  46. data/tracks/ruby/exercises/luhn/.meta/generator/luhn_cases.rb +1 -1
  47. data/tracks/ruby/exercises/nth-prime/.meta/generator/nth_prime_cases.rb +1 -1
  48. data/tracks/ruby/exercises/ocr-numbers/.meta/generator/ocr_numbers_cases.rb +1 -1
  49. data/tracks/ruby/exercises/pangram/.meta/generator/pangram_cases.rb +1 -1
  50. data/tracks/ruby/exercises/pig-latin/.meta/generator/pig_latin_cases.rb +1 -1
  51. data/tracks/ruby/exercises/queen-attack/.meta/generator/queen_attack_cases.rb +1 -1
  52. data/tracks/ruby/exercises/raindrops/.meta/generator/raindrops_cases.rb +1 -1
  53. data/tracks/ruby/exercises/rna-transcription/.meta/generator/rna_transcription_cases.rb +1 -1
  54. data/tracks/ruby/exercises/roman-numerals/.meta/generator/roman_numerals_cases.rb +1 -1
  55. data/tracks/ruby/exercises/run-length-encoding/.meta/generator/run_length_encoding_cases.rb +1 -1
  56. data/tracks/ruby/exercises/say/.meta/generator/say_cases.rb +1 -1
  57. data/tracks/ruby/exercises/sieve/.meta/generator/sieve_cases.rb +1 -1
  58. data/tracks/ruby/exercises/tournament/.meta/generator/tournament_cases.rb +7 -24
  59. data/tracks/ruby/exercises/tournament/tournament_test.rb +37 -38
  60. data/tracks/ruby/exercises/transpose/.meta/generator/transpose_cases.rb +7 -23
  61. data/tracks/ruby/exercises/transpose/transpose_test.rb +22 -22
  62. data/tracks/ruby/exercises/triangle/.meta/generator/triangle_cases.rb +1 -1
  63. data/tracks/ruby/exercises/two-bucket/.meta/generator/two_bucket_cases.rb +1 -1
  64. data/tracks/ruby/exercises/word-count/.meta/generator/word_count_cases.rb +1 -1
  65. data/tracks/ruby/exercises/wordy/.meta/generator/wordy_cases.rb +1 -1
  66. data/tracks/ruby/lib/generator/exercise_case/assertion.rb +33 -0
  67. data/tracks/ruby/lib/generator/exercise_cases.rb +46 -49
  68. data/tracks/ruby/lib/generator/files/generator_cases.rb +0 -14
  69. data/tracks/ruby/test/fixtures/xruby/{lib → exercises/alpha/.meta/generator}/alpha_cases.rb +0 -0
  70. data/tracks/ruby/test/fixtures/xruby/exercises/beta/.meta/generator/beta_cases.rb +1 -1
  71. data/tracks/ruby/test/generator/case_values_test.rb +5 -5
  72. data/tracks/ruby/test/generator/exercise_case/assertion_test.rb +46 -0
  73. data/tracks/ruby/test/generator/exercise_cases_test.rb +47 -0
  74. data/tracks/ruby/test/generator/files/generate_cases_test.rb +0 -12
  75. metadata +13 -15
  76. data/tracks/ruby/exercises/all-your-base/example.tt +0 -18
  77. data/tracks/ruby/exercises/beer-song/example.tt +0 -24
  78. data/tracks/ruby/exercises/difference-of-squares/example.tt +0 -27
  79. data/tracks/ruby/exercises/gigasecond/example.tt +0 -23
  80. data/tracks/ruby/exercises/tournament/example.tt +0 -25
  81. data/tracks/ruby/exercises/transpose/example.tt +0 -24
@@ -1,34 +1,17 @@
1
1
  require 'generator/exercise_cases'
2
2
 
3
- class TournamentCase < ExerciseCase
3
+ class TournamentCase < Generator::ExerciseCase
4
4
 
5
5
  def workload
6
- 'Tournament.tally(input)'
7
- end
8
-
9
- def expect
10
- indented_heredoc(expected, 'TALLY')
11
- end
12
-
13
- def input_text
14
- indented_heredoc(input, 'INPUT')
6
+ %Q(input = #{indent_heredoc(input, 'INPUT', 0, delimiter_mod)}\n) +
7
+ %Q( actual = Tournament.tally(input)\n) +
8
+ %Q( expected = #{indent_heredoc(expected, 'TALLY', 0, delimiter_mod)}\n) +
9
+ ' assert_equal expected, actual'
15
10
  end
16
11
 
17
12
  private
18
13
 
19
- def indented_heredoc(string, delimiter)
20
- [
21
- "<<-#{delimiter}.gsub(/^ */, '')",
22
- indent_lines(string),
23
- indent_line(delimiter)
24
- ].join("\n")
25
- end
26
-
27
- def indent_lines(lines, indent = 3)
28
- lines.map { |line| indent_line(line, indent) }.join("\n")
29
- end
30
-
31
- def indent_line(line, indent = 2)
32
- ' ' * indent * 2 + line
14
+ def delimiter_mod
15
+ ".gsub(/^ */, '')"
33
16
  end
34
17
  end
@@ -5,65 +5,64 @@ require_relative 'tournament'
5
5
 
6
6
  # Common test data version: cda8f98
7
7
  class TournamentTest < Minitest::Test
8
-
9
8
  def test_typical_input
10
9
  # skip
11
10
  input = <<-INPUT.gsub(/^ */, '')
12
- Allegoric Alaskans;Blithering Badgers;win
13
- Devastating Donkeys;Courageous Californians;draw
14
- Devastating Donkeys;Allegoric Alaskans;win
15
- Courageous Californians;Blithering Badgers;loss
16
- Blithering Badgers;Devastating Donkeys;loss
17
- Allegoric Alaskans;Courageous Californians;win
18
- INPUT
11
+ Allegoric Alaskans;Blithering Badgers;win
12
+ Devastating Donkeys;Courageous Californians;draw
13
+ Devastating Donkeys;Allegoric Alaskans;win
14
+ Courageous Californians;Blithering Badgers;loss
15
+ Blithering Badgers;Devastating Donkeys;loss
16
+ Allegoric Alaskans;Courageous Californians;win
17
+ INPUT
19
18
  actual = Tournament.tally(input)
20
19
  expected = <<-TALLY.gsub(/^ */, '')
21
- Team | MP | W | D | L | P
22
- Devastating Donkeys | 3 | 2 | 1 | 0 | 7
23
- Allegoric Alaskans | 3 | 2 | 0 | 1 | 6
24
- Blithering Badgers | 3 | 1 | 0 | 2 | 3
25
- Courageous Californians | 3 | 0 | 1 | 2 | 1
26
- TALLY
20
+ Team | MP | W | D | L | P
21
+ Devastating Donkeys | 3 | 2 | 1 | 0 | 7
22
+ Allegoric Alaskans | 3 | 2 | 0 | 1 | 6
23
+ Blithering Badgers | 3 | 1 | 0 | 2 | 3
24
+ Courageous Californians | 3 | 0 | 1 | 2 | 1
25
+ TALLY
27
26
  assert_equal expected, actual
28
27
  end
29
28
 
30
29
  def test_incomplete_competition_not_all_pairs_have_played
31
30
  skip
32
31
  input = <<-INPUT.gsub(/^ */, '')
33
- Allegoric Alaskans;Blithering Badgers;loss
34
- Devastating Donkeys;Allegoric Alaskans;loss
35
- Courageous Californians;Blithering Badgers;draw
36
- Allegoric Alaskans;Courageous Californians;win
37
- INPUT
32
+ Allegoric Alaskans;Blithering Badgers;loss
33
+ Devastating Donkeys;Allegoric Alaskans;loss
34
+ Courageous Californians;Blithering Badgers;draw
35
+ Allegoric Alaskans;Courageous Californians;win
36
+ INPUT
38
37
  actual = Tournament.tally(input)
39
38
  expected = <<-TALLY.gsub(/^ */, '')
40
- Team | MP | W | D | L | P
41
- Allegoric Alaskans | 3 | 2 | 0 | 1 | 6
42
- Blithering Badgers | 2 | 1 | 1 | 0 | 4
43
- Courageous Californians | 2 | 0 | 1 | 1 | 1
44
- Devastating Donkeys | 1 | 0 | 0 | 1 | 0
45
- TALLY
39
+ Team | MP | W | D | L | P
40
+ Allegoric Alaskans | 3 | 2 | 0 | 1 | 6
41
+ Blithering Badgers | 2 | 1 | 1 | 0 | 4
42
+ Courageous Californians | 2 | 0 | 1 | 1 | 1
43
+ Devastating Donkeys | 1 | 0 | 0 | 1 | 0
44
+ TALLY
46
45
  assert_equal expected, actual
47
46
  end
48
47
 
49
48
  def test_ties_broken_alphabetically
50
49
  skip
51
50
  input = <<-INPUT.gsub(/^ */, '')
52
- Courageous Californians;Devastating Donkeys;win
53
- Allegoric Alaskans;Blithering Badgers;win
54
- Devastating Donkeys;Allegoric Alaskans;loss
55
- Courageous Californians;Blithering Badgers;win
56
- Blithering Badgers;Devastating Donkeys;draw
57
- Allegoric Alaskans;Courageous Californians;draw
58
- INPUT
51
+ Courageous Californians;Devastating Donkeys;win
52
+ Allegoric Alaskans;Blithering Badgers;win
53
+ Devastating Donkeys;Allegoric Alaskans;loss
54
+ Courageous Californians;Blithering Badgers;win
55
+ Blithering Badgers;Devastating Donkeys;draw
56
+ Allegoric Alaskans;Courageous Californians;draw
57
+ INPUT
59
58
  actual = Tournament.tally(input)
60
59
  expected = <<-TALLY.gsub(/^ */, '')
61
- Team | MP | W | D | L | P
62
- Allegoric Alaskans | 3 | 2 | 1 | 0 | 7
63
- Courageous Californians | 3 | 2 | 1 | 0 | 7
64
- Blithering Badgers | 3 | 0 | 1 | 2 | 1
65
- Devastating Donkeys | 3 | 0 | 1 | 2 | 1
66
- TALLY
60
+ Team | MP | W | D | L | P
61
+ Allegoric Alaskans | 3 | 2 | 1 | 0 | 7
62
+ Courageous Californians | 3 | 2 | 1 | 0 | 7
63
+ Blithering Badgers | 3 | 0 | 1 | 2 | 1
64
+ Devastating Donkeys | 3 | 0 | 1 | 2 | 1
65
+ TALLY
67
66
  assert_equal expected, actual
68
67
  end
69
68
 
@@ -1,34 +1,18 @@
1
1
  require 'generator/exercise_cases'
2
2
 
3
- class TransposeCase < ExerciseCase
3
+ class TransposeCase < Generator::ExerciseCase
4
4
 
5
5
  def workload
6
- 'Transpose.transpose(input)'
7
- end
8
-
9
- def expect
10
- indented_heredoc(expected, 'EXPECTED')
11
- end
12
-
13
- def input_text
14
- indented_heredoc(input, 'INPUT')
6
+ %Q(input = #{indent_heredoc(input, 'INPUT', 6, delimiter_mod)}\n) +
7
+ %Q( actual = Transpose.transpose(input)\n) +
8
+ %Q( expected = #{indent_heredoc(expected, 'EXPECTED', 6, delimiter_mod)}\n) +
9
+ ' assert_equal expected.strip, actual'
15
10
  end
16
11
 
17
12
  private
18
13
 
19
- def indented_heredoc(string, delimiter)
20
- [
21
- "<<-#{delimiter}.gsub(/^ {6}/, '')",
22
- indent_lines(string),
23
- indent_line(delimiter)
24
- ].join("\n")
14
+ def delimiter_mod
15
+ ".gsub(/^ {6}/, '')"
25
16
  end
26
17
 
27
- def indent_lines(lines, indent = 3)
28
- lines.map { |line| indent_line(line, indent) }.join("\n")
29
- end
30
-
31
- def indent_line(line, indent = 2)
32
- ' ' * indent * 2 + line
33
- end
34
18
  end
@@ -9,11 +9,11 @@ class TransposeTest < Minitest::Test
9
9
  # skip
10
10
  input = <<-INPUT.gsub(/^ {6}/, '')
11
11
 
12
- INPUT
12
+ INPUT
13
13
  actual = Transpose.transpose(input)
14
14
  expected = <<-EXPECTED.gsub(/^ {6}/, '')
15
15
 
16
- EXPECTED
16
+ EXPECTED
17
17
  assert_equal expected.strip, actual
18
18
  end
19
19
 
@@ -21,12 +21,12 @@ class TransposeTest < Minitest::Test
21
21
  skip
22
22
  input = <<-INPUT.gsub(/^ {6}/, '')
23
23
  A1
24
- INPUT
24
+ INPUT
25
25
  actual = Transpose.transpose(input)
26
26
  expected = <<-EXPECTED.gsub(/^ {6}/, '')
27
27
  A
28
28
  1
29
- EXPECTED
29
+ EXPECTED
30
30
  assert_equal expected.strip, actual
31
31
  end
32
32
 
@@ -35,11 +35,11 @@ class TransposeTest < Minitest::Test
35
35
  input = <<-INPUT.gsub(/^ {6}/, '')
36
36
  A
37
37
  1
38
- INPUT
38
+ INPUT
39
39
  actual = Transpose.transpose(input)
40
40
  expected = <<-EXPECTED.gsub(/^ {6}/, '')
41
41
  A1
42
- EXPECTED
42
+ EXPECTED
43
43
  assert_equal expected.strip, actual
44
44
  end
45
45
 
@@ -48,13 +48,13 @@ class TransposeTest < Minitest::Test
48
48
  input = <<-INPUT.gsub(/^ {6}/, '')
49
49
  ABC
50
50
  123
51
- INPUT
51
+ INPUT
52
52
  actual = Transpose.transpose(input)
53
53
  expected = <<-EXPECTED.gsub(/^ {6}/, '')
54
54
  A1
55
55
  B2
56
56
  C3
57
- EXPECTED
57
+ EXPECTED
58
58
  assert_equal expected.strip, actual
59
59
  end
60
60
 
@@ -62,7 +62,7 @@ class TransposeTest < Minitest::Test
62
62
  skip
63
63
  input = <<-INPUT.gsub(/^ {6}/, '')
64
64
  Single line.
65
- INPUT
65
+ INPUT
66
66
  actual = Transpose.transpose(input)
67
67
  expected = <<-EXPECTED.gsub(/^ {6}/, '')
68
68
  S
@@ -77,7 +77,7 @@ class TransposeTest < Minitest::Test
77
77
  n
78
78
  e
79
79
  .
80
- EXPECTED
80
+ EXPECTED
81
81
  assert_equal expected.strip, actual
82
82
  end
83
83
 
@@ -86,7 +86,7 @@ class TransposeTest < Minitest::Test
86
86
  input = <<-INPUT.gsub(/^ {6}/, '')
87
87
  The fourth line.
88
88
  The fifth line.
89
- INPUT
89
+ INPUT
90
90
  actual = Transpose.transpose(input)
91
91
  expected = <<-EXPECTED.gsub(/^ {6}/, '')
92
92
  TT
@@ -105,7 +105,7 @@ class TransposeTest < Minitest::Test
105
105
  ne
106
106
  e.
107
107
  .
108
- EXPECTED
108
+ EXPECTED
109
109
  assert_equal expected.strip, actual
110
110
  end
111
111
 
@@ -114,7 +114,7 @@ class TransposeTest < Minitest::Test
114
114
  input = <<-INPUT.gsub(/^ {6}/, '')
115
115
  The first line.
116
116
  The second line.
117
- INPUT
117
+ INPUT
118
118
  actual = Transpose.transpose(input)
119
119
  expected = <<-EXPECTED.gsub(/^ {6}/, '')
120
120
  TT
@@ -133,7 +133,7 @@ class TransposeTest < Minitest::Test
133
133
  en
134
134
  .e
135
135
  .
136
- EXPECTED
136
+ EXPECTED
137
137
  assert_equal expected.strip, actual
138
138
  end
139
139
 
@@ -145,7 +145,7 @@ class TransposeTest < Minitest::Test
145
145
  ABUSE
146
146
  RESIN
147
147
  TREND
148
- INPUT
148
+ INPUT
149
149
  actual = Transpose.transpose(input)
150
150
  expected = <<-EXPECTED.gsub(/^ {6}/, '')
151
151
  HEART
@@ -153,7 +153,7 @@ class TransposeTest < Minitest::Test
153
153
  ABUSE
154
154
  RESIN
155
155
  TREND
156
- EXPECTED
156
+ EXPECTED
157
157
  assert_equal expected.strip, actual
158
158
  end
159
159
 
@@ -164,7 +164,7 @@ class TransposeTest < Minitest::Test
164
164
  OUTLINED
165
165
  BLOOMING
166
166
  SEPTETTE
167
- INPUT
167
+ INPUT
168
168
  actual = Transpose.transpose(input)
169
169
  expected = <<-EXPECTED.gsub(/^ {6}/, '')
170
170
  FOBS
@@ -175,7 +175,7 @@ class TransposeTest < Minitest::Test
175
175
  UNIT
176
176
  RENT
177
177
  EDGE
178
- EXPECTED
178
+ EXPECTED
179
179
  assert_equal expected.strip, actual
180
180
  end
181
181
 
@@ -188,7 +188,7 @@ class TransposeTest < Minitest::Test
188
188
  SSSS
189
189
  EEEEE
190
190
  RRRRRR
191
- INPUT
191
+ INPUT
192
192
  actual = Transpose.transpose(input)
193
193
  expected = <<-EXPECTED.gsub(/^ {6}/, '')
194
194
  TEASER
@@ -197,7 +197,7 @@ class TransposeTest < Minitest::Test
197
197
  SER
198
198
  ER
199
199
  R
200
- EXPECTED
200
+ EXPECTED
201
201
  assert_equal expected.strip, actual
202
202
  end
203
203
 
@@ -218,7 +218,7 @@ class TransposeTest < Minitest::Test
218
218
  Is now the two hours' traffic of our stage;
219
219
  The which if you with patient ears attend,
220
220
  What here shall miss, our toil shall strive to mend.
221
- INPUT
221
+ INPUT
222
222
  actual = Transpose.transpose(input)
223
223
  expected = <<-EXPECTED.gsub(/^ {6}/, '')
224
224
  CIFWFAWDTAWITW
@@ -274,7 +274,7 @@ class TransposeTest < Minitest::Test
274
274
  v d
275
275
  e .
276
276
  ,
277
- EXPECTED
277
+ EXPECTED
278
278
  assert_equal expected.strip, actual
279
279
  end
280
280
 
@@ -1,6 +1,6 @@
1
1
  require 'generator/exercise_cases'
2
2
 
3
- class TriangleCase < ExerciseCase
3
+ class TriangleCase < Generator::ExerciseCase
4
4
  def name
5
5
  initial = description.downcase
6
6
  replaced = initial.gsub(/(true|false)/, expected_type)
@@ -1,6 +1,6 @@
1
1
  require 'generator/exercise_cases'
2
2
 
3
- class TwoBucketCase < ExerciseCase
3
+ class TwoBucketCase < Generator::ExerciseCase
4
4
  def name
5
5
  "test_bucket_one_size_#{bucket_one}_bucket_two_"\
6
6
  "size_#{bucket_two}_goal_#{goal}_start_with_bucket_#{start_bucket}"
@@ -1,6 +1,6 @@
1
1
  require 'generator/exercise_cases'
2
2
 
3
- class WordCountCase < ExerciseCase
3
+ class WordCountCase < Generator::ExerciseCase
4
4
 
5
5
  def workload
6
6
  indent_lines([
@@ -1,6 +1,6 @@
1
1
  require 'generator/exercise_cases'
2
2
 
3
- class WordyCase < ExerciseCase
3
+ class WordyCase < Generator::ExerciseCase
4
4
 
5
5
  def workload
6
6
  [
@@ -0,0 +1,33 @@
1
+ module Generator
2
+ class ExerciseCase < OpenStruct
3
+ module Assertion
4
+
5
+ # "#{assert} Luhn.valid?(#{input.inspect})"
6
+ def assert
7
+ expected ? 'assert' : 'refute'
8
+ end
9
+
10
+ # e.g.,
11
+ # assert_equal { "PigLatin.translate(#{input.inspect})" }
12
+ def assert_equal
13
+ "assert_equal #{expected.inspect}, #{yield}"
14
+ end
15
+
16
+ # e.g.,
17
+ # if raises_error?
18
+ # assert_raises(ArgumentError) { test_case }
19
+ # else
20
+ # assert_equal { test_case }
21
+ # end
22
+ def raises_error?
23
+ expected.to_i == -1
24
+ end
25
+
26
+ # e.g.,
27
+ # assert_raises(ArgumentError) { test_case }
28
+ def assert_raises(error)
29
+ "assert_raises(#{error}) { #{yield} }"
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,54 +1,51 @@
1
1
  require 'ostruct'
2
2
  require 'json'
3
3
 
4
- class ExerciseCase < OpenStruct
5
- using Generator::Underscore
6
-
7
- def name
8
- 'test_%s' % description.underscore
9
- end
10
-
11
- def skipped
12
- index.zero? ? '# skip' : 'skip'
13
- end
14
-
15
- protected
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, separator = "\n")
25
- code.join(separator + ' ' * depth)
26
- end
27
-
28
- # used in workload, for example, as
29
- # "#{assert} Luhn.valid?(#{input.inspect})"
30
- def assert
31
- expected ? 'assert' : 'refute'
32
- end
33
-
34
- # used in workload, for example, as
35
- # assert_equal { "PigLatin.translate(#{input.inspect})" }
36
- def assert_equal
37
- "assert_equal #{expected.inspect}, #{yield}"
38
- end
39
-
40
- # used in workload, for example, as
41
- # if raises_error?
42
- # assert_raises(ArgumentError) { test_case }
43
- # else
44
- # assert_equal { test_case }
45
- # end
46
-
47
- def raises_error?
48
- expected.to_i == -1
49
- end
50
-
51
- def assert_raises(error)
52
- "assert_raises(#{error}) { #{yield} }"
4
+ module Generator
5
+ class ExerciseCase < OpenStruct
6
+ using Generator::Underscore
7
+ include Assertion
8
+
9
+ def name
10
+ 'test_%s' % description.underscore
11
+ end
12
+
13
+ def skipped
14
+ index.zero? ? '# skip' : 'skip'
15
+ end
16
+
17
+ protected
18
+
19
+ # indent multi line workloads
20
+ #
21
+ # indent_lines(
22
+ # [
23
+ # "string = #{input.inspect}",
24
+ # "#{assert} Isogram.is_isogram?(string)"
25
+ # ], 4
26
+ # )
27
+ def indent_lines(code, depth, separator = "\n")
28
+ code.join(separator + ' ' * depth)
29
+ end
30
+
31
+ # indent multi line workloads with (unindented) blank lines
32
+ #
33
+ # indent_text(4, text)
34
+ def indent_text(depth, text)
35
+ text.lines.reduce do |obj, line|
36
+ obj << (line == "\n" ? line : ' ' * depth + line)
37
+ end
38
+ end
39
+
40
+ # generate heredoc (as part of workload) with optional indentation
41
+ #
42
+ # indent_heredoc(["foo", "bar"], 'TEXT', 1)
43
+ def indent_heredoc(lines, delimiter, depth = 0, delimiter_method = nil)
44
+ [
45
+ "<<-#{delimiter}#{delimiter_method}",
46
+ lines.map { |line| ' ' * depth + line }.join("\n"),
47
+ delimiter
48
+ ].join("\n")
49
+ end
53
50
  end
54
51
  end