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.
- checksums.yaml +4 -4
- data/common/exercises/rail-fence-cipher/canonical-data.json +7 -7
- data/common/exercises/scrabble-score/description.md +2 -2
- data/lib/trackler/version.rb +1 -1
- data/tracks/delphi/exercises/clock/uClockExample.pas +5 -5
- data/tracks/delphi/exercises/clock/uClockTest.pas +435 -49
- data/tracks/ocaml/exercises/triangle/example.ml +1 -1
- data/tracks/ocaml/exercises/triangle/test.ml +8 -8
- data/tracks/ocaml/exercises/triangle/triangle.mli +1 -1
- data/tracks/ocaml/tools/test-generator/templates/triangle/template.ml +3 -3
- data/tracks/perl6/exercises/all-your-base/AllYourBase.pm6 +1 -1
- data/tracks/perl6/exercises/all-your-base/Example.pm +2 -2
- data/tracks/perl6/exercises/all-your-base/all-your-base.t +215 -138
- data/tracks/perl6/exercises/all-your-base/example.yaml +14 -0
- data/tracks/ruby/exercises/acronym/.meta/generator/acronym_cases.rb +1 -1
- data/tracks/ruby/exercises/all-your-base/.meta/generator/all_your_base_cases.rb +4 -10
- data/tracks/ruby/exercises/all-your-base/all_your_base_test.rb +3 -0
- data/tracks/ruby/exercises/alphametics/.meta/generator/alphametics_cases.rb +1 -1
- data/tracks/ruby/exercises/alphametics/{example.tt → .meta/generator/test_template.erb} +0 -0
- data/tracks/ruby/exercises/anagram/.meta/generator/anagram_cases.rb +1 -1
- data/tracks/ruby/exercises/beer-song/.meta/generator/beer_song_cases.rb +3 -6
- data/tracks/ruby/exercises/beer-song/beer_song_test.rb +1 -1
- data/tracks/ruby/exercises/binary/.meta/generator/binary_cases.rb +1 -1
- data/tracks/ruby/exercises/bowling/.meta/generator/bowling_cases.rb +1 -1
- data/tracks/ruby/exercises/bowling/{example.tt → .meta/generator/test_template.erb} +0 -0
- data/tracks/ruby/exercises/bracket-push/.meta/generator/bracket_push_cases.rb +1 -1
- data/tracks/ruby/exercises/clock/.meta/generator/clock_cases.rb +1 -1
- data/tracks/ruby/exercises/connect/.meta/generator/connect_cases.rb +1 -1
- data/tracks/ruby/exercises/connect/{example.tt → .meta/generator/test_template.erb} +0 -0
- data/tracks/ruby/exercises/custom-set/.meta/generator/custom_set_cases.rb +1 -1
- data/tracks/ruby/exercises/difference-of-squares/.meta/generator/difference_of_squares_cases.rb +1 -1
- data/tracks/ruby/exercises/difference-of-squares/difference_of_squares_test.rb +0 -6
- data/tracks/ruby/exercises/dominoes/.meta/generator/dominoes_cases.rb +1 -1
- data/tracks/ruby/exercises/dominoes/{example.tt → .meta/generator/test_template.erb} +0 -0
- data/tracks/ruby/exercises/etl/.meta/generator/etl_cases.rb +1 -1
- data/tracks/ruby/exercises/gigasecond/.meta/generator/gigasecond_cases.rb +1 -1
- data/tracks/ruby/exercises/gigasecond/gigasecond_test.rb +3 -5
- data/tracks/ruby/exercises/grains/.meta/generator/grains_cases.rb +1 -1
- data/tracks/ruby/exercises/hamming/.meta/generator/hamming_cases.rb +1 -1
- data/tracks/ruby/exercises/hello-world/.meta/generator/hello_world_cases.rb +1 -1
- data/tracks/ruby/exercises/hello-world/{example.tt → .meta/generator/test_template.erb} +0 -0
- data/tracks/ruby/exercises/isogram/.meta/generator/isogram_cases.rb +1 -1
- data/tracks/ruby/exercises/largest-series-product/.meta/generator/largest_series_product_cases.rb +1 -1
- data/tracks/ruby/exercises/leap/.meta/generator/leap_cases.rb +1 -1
- data/tracks/ruby/exercises/leap/{example.tt → .meta/generator/test_template.erb} +0 -0
- data/tracks/ruby/exercises/luhn/.meta/generator/luhn_cases.rb +1 -1
- data/tracks/ruby/exercises/nth-prime/.meta/generator/nth_prime_cases.rb +1 -1
- data/tracks/ruby/exercises/ocr-numbers/.meta/generator/ocr_numbers_cases.rb +1 -1
- data/tracks/ruby/exercises/pangram/.meta/generator/pangram_cases.rb +1 -1
- data/tracks/ruby/exercises/pig-latin/.meta/generator/pig_latin_cases.rb +1 -1
- data/tracks/ruby/exercises/queen-attack/.meta/generator/queen_attack_cases.rb +1 -1
- data/tracks/ruby/exercises/raindrops/.meta/generator/raindrops_cases.rb +1 -1
- data/tracks/ruby/exercises/rna-transcription/.meta/generator/rna_transcription_cases.rb +1 -1
- data/tracks/ruby/exercises/roman-numerals/.meta/generator/roman_numerals_cases.rb +1 -1
- data/tracks/ruby/exercises/run-length-encoding/.meta/generator/run_length_encoding_cases.rb +1 -1
- data/tracks/ruby/exercises/say/.meta/generator/say_cases.rb +1 -1
- data/tracks/ruby/exercises/sieve/.meta/generator/sieve_cases.rb +1 -1
- data/tracks/ruby/exercises/tournament/.meta/generator/tournament_cases.rb +7 -24
- data/tracks/ruby/exercises/tournament/tournament_test.rb +37 -38
- data/tracks/ruby/exercises/transpose/.meta/generator/transpose_cases.rb +7 -23
- data/tracks/ruby/exercises/transpose/transpose_test.rb +22 -22
- data/tracks/ruby/exercises/triangle/.meta/generator/triangle_cases.rb +1 -1
- data/tracks/ruby/exercises/two-bucket/.meta/generator/two_bucket_cases.rb +1 -1
- data/tracks/ruby/exercises/word-count/.meta/generator/word_count_cases.rb +1 -1
- data/tracks/ruby/exercises/wordy/.meta/generator/wordy_cases.rb +1 -1
- data/tracks/ruby/lib/generator/exercise_case/assertion.rb +33 -0
- data/tracks/ruby/lib/generator/exercise_cases.rb +46 -49
- data/tracks/ruby/lib/generator/files/generator_cases.rb +0 -14
- data/tracks/ruby/test/fixtures/xruby/{lib → exercises/alpha/.meta/generator}/alpha_cases.rb +0 -0
- data/tracks/ruby/test/fixtures/xruby/exercises/beta/.meta/generator/beta_cases.rb +1 -1
- data/tracks/ruby/test/generator/case_values_test.rb +5 -5
- data/tracks/ruby/test/generator/exercise_case/assertion_test.rb +46 -0
- data/tracks/ruby/test/generator/exercise_cases_test.rb +47 -0
- data/tracks/ruby/test/generator/files/generate_cases_test.rb +0 -12
- metadata +13 -15
- data/tracks/ruby/exercises/all-your-base/example.tt +0 -18
- data/tracks/ruby/exercises/beer-song/example.tt +0 -24
- data/tracks/ruby/exercises/difference-of-squares/example.tt +0 -27
- data/tracks/ruby/exercises/gigasecond/example.tt +0 -23
- data/tracks/ruby/exercises/tournament/example.tt +0 -25
- 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
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
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
|
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
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
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
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
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
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
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
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
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
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
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
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
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
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
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
|
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
|
-
|
12
|
+
INPUT
|
13
13
|
actual = Transpose.transpose(input)
|
14
14
|
expected = <<-EXPECTED.gsub(/^ {6}/, '')
|
15
15
|
|
16
|
-
|
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
|
-
|
24
|
+
INPUT
|
25
25
|
actual = Transpose.transpose(input)
|
26
26
|
expected = <<-EXPECTED.gsub(/^ {6}/, '')
|
27
27
|
A
|
28
28
|
1
|
29
|
-
|
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
|
-
|
38
|
+
INPUT
|
39
39
|
actual = Transpose.transpose(input)
|
40
40
|
expected = <<-EXPECTED.gsub(/^ {6}/, '')
|
41
41
|
A1
|
42
|
-
|
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
|
-
|
51
|
+
INPUT
|
52
52
|
actual = Transpose.transpose(input)
|
53
53
|
expected = <<-EXPECTED.gsub(/^ {6}/, '')
|
54
54
|
A1
|
55
55
|
B2
|
56
56
|
C3
|
57
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
277
|
+
EXPECTED
|
278
278
|
assert_equal expected.strip, actual
|
279
279
|
end
|
280
280
|
|
@@ -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
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
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
|