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.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/tracks/elixir/config.json +17 -0
- data/tracks/elixir/exercises/matrix/example.exs +63 -0
- data/tracks/elixir/exercises/matrix/matrix.exs +48 -0
- data/tracks/elixir/exercises/matrix/matrix_test.exs +58 -0
- data/tracks/elixir/exercises/twelve-days/example.exs +53 -0
- data/tracks/elixir/exercises/twelve-days/twelve_days.exs +25 -0
- data/tracks/elixir/exercises/twelve-days/twelve_days_test.exs +86 -0
- data/tracks/go/exercises/change/.meta/gen.go +1 -3
- data/tracks/go/exercises/change/cases_test.go +1 -0
- data/tracks/go/exercises/forth/example.go +1 -1
- data/tracks/go/exercises/raindrops/.meta/gen.go +1 -3
- data/tracks/go/exercises/raindrops/cases_test.go +5 -1
- data/tracks/go/exercises/raindrops/example.go +1 -1
- data/tracks/go/exercises/raindrops/raindrops.go +1 -1
- data/tracks/go/exercises/raindrops/raindrops_test.go +1 -1
- data/tracks/java/config.json +5 -5
- data/tracks/java/exercises/isogram/src/example/java/IsogramChecker.java +23 -27
- data/tracks/java/exercises/isogram/src/test/java/IsogramCheckerTest.java +77 -0
- data/tracks/javascript/config.json +9 -0
- data/tracks/javascript/exercises/proverb/example.js +36 -0
- data/tracks/javascript/exercises/proverb/proverb.spec.js +78 -0
- data/tracks/ruby/README.md +0 -33
- data/tracks/ruby/exercises/acronym/.meta/.version +1 -1
- data/tracks/ruby/exercises/acronym/acronym_test.rb +14 -9
- data/tracks/ruby/exercises/acronym/example.rb +1 -1
- data/tracks/ruby/exercises/acronym/example.tt +7 -4
- data/tracks/ruby/exercises/all-your-base/all_your_base_test.rb +1 -1
- data/tracks/ruby/exercises/all-your-base/example.tt +4 -3
- data/tracks/ruby/exercises/alphametics/alphametics_test.rb +2 -1
- data/tracks/ruby/exercises/alphametics/example.tt +2 -1
- data/tracks/ruby/exercises/anagram/anagram_test.rb +35 -20
- data/tracks/ruby/exercises/anagram/example.rb +1 -1
- data/tracks/ruby/exercises/anagram/example.tt +5 -2
- data/tracks/ruby/exercises/beer-song/beer_song_test.rb +1 -0
- data/tracks/ruby/exercises/beer-song/example.tt +6 -4
- data/tracks/ruby/exercises/binary/binary_test.rb +3 -2
- data/tracks/ruby/exercises/binary/example.tt +5 -2
- data/tracks/ruby/exercises/bowling/bowling_test.rb +39 -40
- data/tracks/ruby/exercises/bowling/example.tt +2 -2
- data/tracks/ruby/exercises/bracket-push/.meta/.version +1 -1
- data/tracks/ruby/exercises/bracket-push/bracket_push_test.rb +7 -3
- data/tracks/ruby/exercises/bracket-push/example.rb +1 -1
- data/tracks/ruby/exercises/bracket-push/example.tt +5 -2
- data/tracks/ruby/exercises/clock/clock_test.rb +40 -41
- data/tracks/ruby/exercises/clock/example.tt +5 -2
- data/tracks/ruby/exercises/connect/.meta/.version +1 -1
- data/tracks/ruby/exercises/connect/connect_test.rb +20 -3
- data/tracks/ruby/exercises/connect/example.rb +1 -1
- data/tracks/ruby/exercises/connect/example.tt +3 -1
- data/tracks/ruby/exercises/custom-set/custom_set_test.rb +1 -2
- data/tracks/ruby/exercises/custom-set/example.tt +5 -2
- data/tracks/ruby/exercises/difference-of-squares/difference_of_squares_test.rb +6 -5
- data/tracks/ruby/exercises/difference-of-squares/example.tt +8 -4
- data/tracks/ruby/exercises/dominoes/dominoes_test.rb +1 -1
- data/tracks/ruby/exercises/dominoes/example.tt +1 -1
- data/tracks/ruby/exercises/gigasecond/.meta/.version +1 -1
- data/tracks/ruby/exercises/gigasecond/example.rb +1 -1
- data/tracks/ruby/exercises/gigasecond/example.tt +7 -5
- data/tracks/ruby/exercises/gigasecond/gigasecond_test.rb +11 -16
- data/tracks/ruby/exercises/grains/example.tt +5 -3
- data/tracks/ruby/exercises/grains/grains_test.rb +2 -1
- data/tracks/ruby/exercises/hello-world/example.tt +1 -1
- data/tracks/ruby/exercises/hello-world/hello_world_test.rb +1 -1
- data/tracks/ruby/exercises/isogram/.meta/.version +1 -1
- data/tracks/ruby/exercises/isogram/example.rb +1 -1
- data/tracks/ruby/exercises/isogram/example.tt +6 -4
- data/tracks/ruby/exercises/isogram/isogram_test.rb +18 -10
- data/tracks/ruby/exercises/largest-series-product/.meta/.version +1 -1
- data/tracks/ruby/exercises/largest-series-product/example.rb +1 -1
- data/tracks/ruby/exercises/largest-series-product/example.tt +7 -5
- data/tracks/ruby/exercises/largest-series-product/largest_series_product_test.rb +11 -21
- data/tracks/ruby/exercises/leap/.meta/.version +1 -1
- data/tracks/ruby/exercises/leap/example.rb +1 -1
- data/tracks/ruby/exercises/leap/example.tt +6 -4
- data/tracks/ruby/exercises/leap/leap_test.rb +11 -25
- data/tracks/ruby/exercises/nth-prime/example.tt +7 -5
- data/tracks/ruby/exercises/nth-prime/nth_prime_test.rb +2 -3
- data/tracks/ruby/exercises/pangram/example.tt +5 -3
- data/tracks/ruby/exercises/pangram/pangram_test.rb +2 -1
- data/tracks/ruby/exercises/queen-attack/example.tt +2 -2
- data/tracks/ruby/exercises/queen-attack/queen_attack_test.rb +14 -15
- data/tracks/ruby/exercises/raindrops/example.tt +7 -4
- data/tracks/ruby/exercises/raindrops/raindrops_test.rb +38 -38
- data/tracks/ruby/exercises/rna-transcription/example.tt +6 -3
- data/tracks/ruby/exercises/rna-transcription/rna_transcription_test.rb +4 -5
- data/tracks/ruby/exercises/roman-numerals/example.tt +7 -4
- data/tracks/ruby/exercises/roman-numerals/roman_numerals_test.rb +5 -5
- data/tracks/ruby/exercises/run-length-encoding/.meta/.version +1 -1
- data/tracks/ruby/exercises/run-length-encoding/example.rb +1 -1
- data/tracks/ruby/exercises/run-length-encoding/example.tt +6 -3
- data/tracks/ruby/exercises/run-length-encoding/run_length_encoding_test.rb +70 -28
- data/tracks/ruby/exercises/say/example.tt +7 -5
- data/tracks/ruby/exercises/say/say_test.rb +3 -2
- data/tracks/ruby/exercises/sieve/example.tt +4 -1
- data/tracks/ruby/exercises/sieve/sieve_test.rb +1 -3
- data/tracks/ruby/exercises/tournament/example.tt +4 -1
- data/tracks/ruby/exercises/tournament/tournament_test.rb +1 -2
- data/tracks/ruby/exercises/transpose/example.tt +5 -2
- data/tracks/ruby/exercises/transpose/transpose_test.rb +1 -2
- data/tracks/ruby/exercises/triangle/example.tt +5 -3
- data/tracks/ruby/exercises/triangle/triangle_test.rb +1 -3
- data/tracks/ruby/exercises/two-bucket/example.tt +7 -4
- data/tracks/ruby/exercises/two-bucket/two_bucket_test.rb +9 -9
- data/tracks/ruby/exercises/word-count/example.tt +6 -4
- data/tracks/ruby/exercises/word-count/word_count_test.rb +2 -3
- data/tracks/ruby/exercises/wordy/example.tt +5 -3
- data/tracks/ruby/exercises/wordy/wordy_test.rb +2 -1
- data/tracks/ruby/lib/acronym_cases.rb +3 -15
- data/tracks/ruby/lib/all_your_base_cases.rb +22 -54
- data/tracks/ruby/lib/alphametics_cases.rb +12 -27
- data/tracks/ruby/lib/anagram_cases.rb +7 -15
- data/tracks/ruby/lib/beer_song_cases.rb +7 -24
- data/tracks/ruby/lib/binary_cases.rb +5 -18
- data/tracks/ruby/lib/bowling_cases.rb +24 -24
- data/tracks/ruby/lib/bracket_push_cases.rb +6 -21
- data/tracks/ruby/lib/clock_cases.rb +6 -25
- data/tracks/ruby/lib/connect_cases.rb +2 -20
- data/tracks/ruby/lib/custom_set_cases.rb +14 -35
- data/tracks/ruby/lib/difference_of_squares_cases.rb +5 -26
- data/tracks/ruby/lib/dominoes_cases.rb +2 -11
- data/tracks/ruby/lib/generator/case_values.rb +25 -0
- data/tracks/ruby/lib/generator/exercise_cases.rb +11 -0
- data/tracks/ruby/lib/generator/files/track_files.rb +7 -2
- data/tracks/ruby/lib/generator/template_values.rb +12 -7
- data/tracks/ruby/lib/gigasecond_cases.rb +4 -18
- data/tracks/ruby/lib/grains_cases.rb +11 -38
- data/tracks/ruby/lib/hamming_cases.rb +0 -6
- data/tracks/ruby/lib/hello_world_cases.rb +2 -14
- data/tracks/ruby/lib/isogram_cases.rb +8 -16
- data/tracks/ruby/lib/largest_series_product_cases.rb +10 -16
- data/tracks/ruby/lib/leap_cases.rb +3 -16
- data/tracks/ruby/lib/luhn_cases.rb +0 -6
- data/tracks/ruby/lib/nth_prime_cases.rb +11 -13
- data/tracks/ruby/lib/ocr_numbers_cases.rb +0 -5
- data/tracks/ruby/lib/pangram_cases.rb +2 -19
- data/tracks/ruby/lib/pig_latin_cases.rb +0 -5
- data/tracks/ruby/lib/queen_attack_cases.rb +14 -37
- data/tracks/ruby/lib/raindrops_cases.rb +3 -15
- data/tracks/ruby/lib/rna_transcription_cases.rb +2 -14
- data/tracks/ruby/lib/roman_numerals_cases.rb +7 -10
- data/tracks/ruby/lib/run_length_encoding_cases.rb +4 -25
- data/tracks/ruby/lib/say_cases.rb +3 -14
- data/tracks/ruby/lib/sieve_cases.rb +1 -15
- data/tracks/ruby/lib/tournament_cases.rb +1 -14
- data/tracks/ruby/lib/transpose_cases.rb +1 -14
- data/tracks/ruby/lib/triangle_cases.rb +8 -27
- data/tracks/ruby/lib/two_bucket_cases.rb +7 -17
- data/tracks/ruby/lib/word_count_cases.rb +1 -13
- data/tracks/ruby/lib/wordy_cases.rb +4 -27
- data/tracks/ruby/test/fixtures/metadata/exercises/complex/canonical-data.json +45 -0
- data/tracks/ruby/test/fixtures/xruby/lib/beta_cases.rb +7 -0
- data/tracks/ruby/test/generator/case_values_test.rb +30 -0
- data/tracks/ruby/test/generator/files/track_files_test.rb +2 -3
- data/tracks/ruby/test/generator/template_values_test.rb +44 -3
- data/tracks/ruby/test/wordy_cases_test.rb +4 -65
- metadata +14 -4
- data/tracks/java/exercises/isogram/src/test/java/IsogramTest.java +0 -80
- data/tracks/ruby/test/grains_cases_test.rb +0 -103
data/tracks/java/config.json
CHANGED
@@ -105,6 +105,11 @@
|
|
105
105
|
"difficulty": 4,
|
106
106
|
"topics": []
|
107
107
|
},
|
108
|
+
{
|
109
|
+
"slug": "isogram",
|
110
|
+
"difficulty": 4,
|
111
|
+
"topics": []
|
112
|
+
},
|
108
113
|
{
|
109
114
|
"slug": "flatten-array",
|
110
115
|
"difficulty": 5,
|
@@ -314,11 +319,6 @@
|
|
314
319
|
"slug": "ocr-numbers",
|
315
320
|
"difficulty": 1,
|
316
321
|
"topics": []
|
317
|
-
},
|
318
|
-
{
|
319
|
-
"slug": "isogram",
|
320
|
-
"difficulty": 1,
|
321
|
-
"topics": []
|
322
322
|
},
|
323
323
|
{
|
324
324
|
"slug": "book-store",
|
@@ -1,34 +1,30 @@
|
|
1
|
-
package example;
|
2
|
-
|
3
1
|
import java.util.HashSet;
|
4
2
|
import java.util.Set;
|
3
|
+
|
5
4
|
import static java.util.Arrays.stream;
|
6
5
|
import static java.util.stream.Collectors.joining;
|
7
6
|
|
8
7
|
public class IsogramChecker {
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
return stream(words).collect(joining());
|
32
|
-
}
|
33
|
-
|
8
|
+
|
9
|
+
public boolean isIsogram(String word) {
|
10
|
+
|
11
|
+
Set<Character> charSet = new HashSet<>();
|
12
|
+
|
13
|
+
String[] words = word.split(" ");
|
14
|
+
String newWord = concat(words);
|
15
|
+
|
16
|
+
words = newWord.split("-");
|
17
|
+
newWord = concat(words).toLowerCase();
|
18
|
+
|
19
|
+
for (int i = 0; i < newWord.length(); i++) {
|
20
|
+
charSet.add(newWord.charAt(i));
|
21
|
+
}
|
22
|
+
|
23
|
+
return charSet.size() == newWord.length();
|
24
|
+
}
|
25
|
+
|
26
|
+
private String concat(String[] words) {
|
27
|
+
return stream(words).collect(joining());
|
28
|
+
}
|
29
|
+
|
34
30
|
}
|
@@ -0,0 +1,77 @@
|
|
1
|
+
import org.junit.Ignore;
|
2
|
+
import org.junit.Test;
|
3
|
+
|
4
|
+
import static org.junit.Assert.*;
|
5
|
+
|
6
|
+
public class IsogramCheckerTest {
|
7
|
+
|
8
|
+
@Test
|
9
|
+
public void testIsogram() {
|
10
|
+
IsogramChecker iso = new IsogramChecker();
|
11
|
+
assertTrue(iso.isIsogram("duplicates"));
|
12
|
+
}
|
13
|
+
|
14
|
+
@Ignore
|
15
|
+
@Test
|
16
|
+
public void testNotIsogram() {
|
17
|
+
IsogramChecker iso = new IsogramChecker();
|
18
|
+
assertFalse(iso.isIsogram("eleven"));
|
19
|
+
}
|
20
|
+
|
21
|
+
@Ignore
|
22
|
+
@Test
|
23
|
+
public void testMediumLongIsogram() {
|
24
|
+
IsogramChecker iso = new IsogramChecker();
|
25
|
+
assertTrue(iso.isIsogram("subdermatoglyphic"));
|
26
|
+
}
|
27
|
+
|
28
|
+
@Ignore
|
29
|
+
@Test
|
30
|
+
public void testCaseInsensitive() {
|
31
|
+
IsogramChecker iso = new IsogramChecker();
|
32
|
+
assertFalse(iso.isIsogram("Alphabet"));
|
33
|
+
}
|
34
|
+
|
35
|
+
@Ignore
|
36
|
+
@Test
|
37
|
+
public void testIsogramWithHyphen() {
|
38
|
+
IsogramChecker iso = new IsogramChecker();
|
39
|
+
assertTrue(iso.isIsogram("thumbscrew-japingly"));
|
40
|
+
}
|
41
|
+
|
42
|
+
@Ignore
|
43
|
+
@Test
|
44
|
+
public void testIgnoresMultipleHyphens() {
|
45
|
+
IsogramChecker iso = new IsogramChecker();
|
46
|
+
assertTrue(iso.isIsogram("Hjelmqvist-Gryb-Zock-Pfund-Wax"));
|
47
|
+
}
|
48
|
+
|
49
|
+
@Ignore
|
50
|
+
@Test
|
51
|
+
public void testWorksWithGermanLetters() {
|
52
|
+
IsogramChecker iso = new IsogramChecker();
|
53
|
+
assertTrue(iso.isIsogram("Heizölrückstoßabdämpfung"));
|
54
|
+
}
|
55
|
+
|
56
|
+
@Ignore
|
57
|
+
@Test
|
58
|
+
public void testIgnoresSpaces() {
|
59
|
+
IsogramChecker iso = new IsogramChecker();
|
60
|
+
assertFalse(iso.isIsogram("the quick brown fox"));
|
61
|
+
}
|
62
|
+
|
63
|
+
@Ignore
|
64
|
+
@Test
|
65
|
+
public void testIgnoresSpaces2() {
|
66
|
+
IsogramChecker iso = new IsogramChecker();
|
67
|
+
assertTrue(iso.isIsogram("Emily Jung Schwartzkopf"));
|
68
|
+
}
|
69
|
+
|
70
|
+
@Ignore
|
71
|
+
@Test
|
72
|
+
public void testDuplicateAccentedLetters() {
|
73
|
+
IsogramChecker iso = new IsogramChecker();
|
74
|
+
assertFalse(iso.isIsogram("éléphant"));
|
75
|
+
}
|
76
|
+
|
77
|
+
}
|
@@ -48,6 +48,7 @@
|
|
48
48
|
"series",
|
49
49
|
"difference-of-squares",
|
50
50
|
"secret-handshake",
|
51
|
+
"proverb",
|
51
52
|
"linked-list",
|
52
53
|
"wordy",
|
53
54
|
"flatten-array",
|
@@ -352,6 +353,14 @@
|
|
352
353
|
"topics": [
|
353
354
|
]
|
354
355
|
},
|
356
|
+
{
|
357
|
+
"slug": "proverb",
|
358
|
+
"difficulty": 1,
|
359
|
+
"topics": [
|
360
|
+
"Arrays",
|
361
|
+
"Optional values"
|
362
|
+
]
|
363
|
+
},
|
355
364
|
{
|
356
365
|
"slug": "linked-list",
|
357
366
|
"difficulty": 1,
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module.exports = function(){
|
2
|
+
var last = arguments[arguments.length - 1];
|
3
|
+
var chain = Array.from(arguments);
|
4
|
+
this.options = {};
|
5
|
+
|
6
|
+
if(typeof last == "object" && last.hasOwnProperty("qualifier")){
|
7
|
+
this.options = chain.pop();
|
8
|
+
}
|
9
|
+
|
10
|
+
this.chain = chain;
|
11
|
+
this.qualifier = this.options.qualifier ? this.options.qualifier + ' ' : '';
|
12
|
+
|
13
|
+
this.toString = function(){
|
14
|
+
return this.chainOfEvents() + this.conclusion();
|
15
|
+
}.bind(this);
|
16
|
+
|
17
|
+
this.chainOfEvents = function(){
|
18
|
+
return this.causesAndEffects().map( function(entry){
|
19
|
+
return "For want of a " + entry.cause +
|
20
|
+
" the " + entry.effect + " was lost.\n";
|
21
|
+
}.bind(this) ).join('');
|
22
|
+
}.bind(this);
|
23
|
+
|
24
|
+
this.causesAndEffects = function(){
|
25
|
+
return this.chain.reduce( function(array, event, index){
|
26
|
+
if(index < this.chain.length - 1){
|
27
|
+
array.push({ cause: event, effect: this.chain[index + 1] });
|
28
|
+
}
|
29
|
+
return array;
|
30
|
+
}.bind(this), [] );
|
31
|
+
}.bind(this);
|
32
|
+
|
33
|
+
this.conclusion = function(){
|
34
|
+
return "And all for the want of a " + this.qualifier + this.chain[0] + ".";
|
35
|
+
}.bind(this);
|
36
|
+
};
|
@@ -0,0 +1,78 @@
|
|
1
|
+
var Proverb = require('./proverb');
|
2
|
+
|
3
|
+
describe('Proverb Test Suite', function() {
|
4
|
+
it('tests a single consequence', function() {
|
5
|
+
var proverb = new Proverb('nail', 'shoe');
|
6
|
+
|
7
|
+
expect(proverb.toString()).toEqual(
|
8
|
+
"For want of a nail the shoe was lost.\n" +
|
9
|
+
"And all for the want of a nail.");
|
10
|
+
});
|
11
|
+
|
12
|
+
|
13
|
+
it('tests a short chain of consequences', function() {
|
14
|
+
var proverb = new Proverb('nail', 'shoe', 'horse');
|
15
|
+
|
16
|
+
expect(proverb.toString()).toEqual(
|
17
|
+
"For want of a nail the shoe was lost.\n" +
|
18
|
+
"For want of a shoe the horse was lost.\n" +
|
19
|
+
"And all for the want of a nail.");
|
20
|
+
});
|
21
|
+
|
22
|
+
it('tests a longer chain of consequences', function() {
|
23
|
+
var proverb = new Proverb('nail', 'shoe', 'horse', 'rider');
|
24
|
+
|
25
|
+
expect(proverb.toString()).toEqual(
|
26
|
+
"For want of a nail the shoe was lost.\n" +
|
27
|
+
"For want of a shoe the horse was lost.\n" +
|
28
|
+
"For want of a horse the rider was lost.\n" +
|
29
|
+
"And all for the want of a nail.");
|
30
|
+
});
|
31
|
+
|
32
|
+
|
33
|
+
it('tests Proverb class does not hard code the rhyme dictionary',
|
34
|
+
function() {
|
35
|
+
var proverb = new Proverb('key', 'value');
|
36
|
+
|
37
|
+
expect(proverb.toString()).toEqual(
|
38
|
+
"For want of a key the value was lost.\n" +
|
39
|
+
"And all for the want of a key.");
|
40
|
+
});
|
41
|
+
|
42
|
+
it('tests the whole proveb', function() {
|
43
|
+
var proverb = new Proverb('nail', 'shoe', 'horse', 'rider',
|
44
|
+
'message', 'battle', 'kingdom');
|
45
|
+
|
46
|
+
expect(proverb.toString()).toEqual(
|
47
|
+
"For want of a nail the shoe was lost.\n" +
|
48
|
+
"For want of a shoe the horse was lost.\n" +
|
49
|
+
"For want of a horse the rider was lost.\n" +
|
50
|
+
"For want of a rider the message was lost.\n" +
|
51
|
+
"For want of a message the battle was lost.\n" +
|
52
|
+
"For want of a battle the kingdom was lost.\n" +
|
53
|
+
"And all for the want of a nail.");
|
54
|
+
});
|
55
|
+
|
56
|
+
|
57
|
+
it('tests the use of an optional qualifier in the final consequence',
|
58
|
+
function() {
|
59
|
+
var proverb = new Proverb('nail', 'shoe', 'horse', 'rider',
|
60
|
+
'message', 'battle', 'kingdom',
|
61
|
+
{ qualifier: 'horseshoe' });
|
62
|
+
|
63
|
+
expect(proverb.toString()).toEqual(
|
64
|
+
"For want of a nail the shoe was lost.\n" +
|
65
|
+
"For want of a shoe the horse was lost.\n" +
|
66
|
+
"For want of a horse the rider was lost.\n" +
|
67
|
+
"For want of a rider the message was lost.\n" +
|
68
|
+
"For want of a message the battle was lost.\n" +
|
69
|
+
"For want of a battle the kingdom was lost.\n" +
|
70
|
+
"And all for the want of a horseshoe nail.");
|
71
|
+
});
|
72
|
+
|
73
|
+
it('tests the proverb is the same each time', function(){
|
74
|
+
var proverb = new Proverb('nail', 'shoe');
|
75
|
+
|
76
|
+
expect(proverb.toString()).toEqual(proverb.toString());
|
77
|
+
});
|
78
|
+
});
|
data/tracks/ruby/README.md
CHANGED
@@ -157,39 +157,6 @@ and any setup required. The base class provides a variety of assertion and
|
|
157
157
|
helper methods. Beyond that, you can implement any helper methods that you need
|
158
158
|
as private methods in your derived class. See below for more information about [the intention of workload](#workload-philosophy)
|
159
159
|
|
160
|
-
Below this class, implement a small loop that will generate all the test cases by reading the
|
161
|
-
`canonical-data.json` file, and looping through the test cases.
|
162
|
-
|
163
|
-
You will need to adjust the logic to match the structure of the canonical data.
|
164
|
-
|
165
|
-
For example, if there is a single top-level key named "cases", then you can loop through
|
166
|
-
them as follows:
|
167
|
-
|
168
|
-
```
|
169
|
-
ProblemNameCases = proc do |data|
|
170
|
-
JSON.parse(data)['cases'].map.with_index do |row, i|
|
171
|
-
ProblemNameCase.new(row.merge('index' => i))
|
172
|
-
end
|
173
|
-
end
|
174
|
-
```
|
175
|
-
|
176
|
-
If there are multiple sections, then you will need to loop through the sections, and then
|
177
|
-
loop through each of the cases in an inner loop:
|
178
|
-
|
179
|
-
```
|
180
|
-
ProblemNameCases = proc do |data|
|
181
|
-
json = JSON.parse(data)
|
182
|
-
cases = []
|
183
|
-
%w(section1 section2 etc).each do |section|
|
184
|
-
json[section]['cases'].each do |row|
|
185
|
-
row = row.merge(row.merge('index' => cases.size, 'section' => section))
|
186
|
-
cases << ProblemNameCase.new(row)
|
187
|
-
end
|
188
|
-
end
|
189
|
-
cases
|
190
|
-
end
|
191
|
-
```
|
192
|
-
|
193
160
|
Finally, you need to create a text template, `example.tt`, as the bases for the test suite.
|
194
161
|
|
195
162
|
Start with the following boilerplate, and adjust as necessary. Remember, however, to strive
|
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
3
|
@@ -3,36 +3,41 @@ gem 'minitest', '>= 5.0.0'
|
|
3
3
|
require 'minitest/autorun'
|
4
4
|
require_relative 'acronym'
|
5
5
|
|
6
|
-
#
|
7
|
-
# 5b5e807
|
6
|
+
# Common test data version: dcfe476
|
8
7
|
class AcronymTest < Minitest::Test
|
9
8
|
def test_basic
|
10
|
-
|
9
|
+
# skip
|
10
|
+
assert_equal "PNG", Acronym.abbreviate('Portable Network Graphics')
|
11
11
|
end
|
12
12
|
|
13
13
|
def test_lowercase_words
|
14
14
|
skip
|
15
|
-
assert_equal
|
15
|
+
assert_equal "ROR", Acronym.abbreviate('Ruby on Rails')
|
16
16
|
end
|
17
17
|
|
18
18
|
def test_camelcase
|
19
19
|
skip
|
20
|
-
assert_equal
|
20
|
+
assert_equal "HTML", Acronym.abbreviate('HyperText Markup Language')
|
21
21
|
end
|
22
22
|
|
23
23
|
def test_punctuation
|
24
24
|
skip
|
25
|
-
assert_equal
|
25
|
+
assert_equal "FIFO", Acronym.abbreviate('First In, First Out')
|
26
26
|
end
|
27
27
|
|
28
28
|
def test_all_caps_words
|
29
29
|
skip
|
30
|
-
assert_equal
|
30
|
+
assert_equal "PHP", Acronym.abbreviate('PHP: Hypertext Preprocessor')
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_non_acronym_all_caps_word
|
34
|
+
skip
|
35
|
+
assert_equal "GIMP", Acronym.abbreviate('GNU Image Manipulation Program')
|
31
36
|
end
|
32
37
|
|
33
38
|
def test_hyphenated
|
34
39
|
skip
|
35
|
-
assert_equal
|
40
|
+
assert_equal "CMOS", Acronym.abbreviate('Complementary metal-oxide semiconductor')
|
36
41
|
end
|
37
42
|
|
38
43
|
# Problems in exercism evolve over time, as we find better ways to ask
|
@@ -54,6 +59,6 @@ class AcronymTest < Minitest::Test
|
|
54
59
|
|
55
60
|
def test_bookkeeping
|
56
61
|
skip
|
57
|
-
assert_equal
|
62
|
+
assert_equal 3, BookKeeping::VERSION
|
58
63
|
end
|
59
64
|
end
|
@@ -4,13 +4,16 @@ require 'minitest/autorun'
|
|
4
4
|
require_relative 'acronym'
|
5
5
|
|
6
6
|
# Common test data version: <%= abbreviated_commit_hash %>
|
7
|
-
class AcronymTest < Minitest::Test
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
class AcronymTest < Minitest::Test
|
8
|
+
<% test_cases.each do |test_case| %>
|
9
|
+
def <%= test_case.name %>
|
10
|
+
<%= test_case.skipped %>
|
11
|
+
<%= test_case.workload %>
|
11
12
|
end
|
13
|
+
|
12
14
|
<% end %>
|
13
15
|
<%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
|
16
|
+
|
14
17
|
def test_bookkeeping
|
15
18
|
skip
|
16
19
|
assert_equal <%= version %>, BookKeeping::VERSION
|