trackler 2.1.0.2 → 2.1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/common/exercises/phone-number/canonical-data.json +28 -10
- data/common/exercises/phone-number/description.md +19 -13
- data/lib/trackler/version.rb +1 -1
- data/tracks/go/exercises/bob/.meta/gen.go +1 -3
- data/tracks/go/exercises/bob/bob.go +1 -1
- data/tracks/go/exercises/bob/bob_test.go +1 -1
- data/tracks/go/exercises/bob/cases_test.go +8 -12
- data/tracks/go/exercises/bob/example.go +1 -1
- data/tracks/go/exercises/largest-series-product/.meta/gen.go +1 -3
- data/tracks/go/exercises/largest-series-product/cases_test.go +3 -4
- data/tracks/go/exercises/largest-series-product/example.go +1 -1
- data/tracks/go/exercises/largest-series-product/largest_series_product_test.go +1 -1
- data/tracks/java/exercises/accumulate/src/test/java/AccumulateTest.java +4 -4
- data/tracks/java/exercises/acronym/src/test/java/AcronymTest.java +7 -7
- data/tracks/java/exercises/all-your-base/src/test/java/BaseConverterTest.java +19 -19
- data/tracks/java/exercises/allergies/src/test/java/AllergiesTest.java +18 -18
- data/tracks/java/exercises/anagram/src/test/java/AnagramTest.java +15 -15
- data/tracks/lisp/docs/INSTALLATION.md +7 -13
- data/tracks/python/exercises/bracket-push/bracket_push_test.py +4 -1
- data/tracks/python/exercises/isogram/isogram_test.py +5 -1
- data/tracks/ruby/README.md +14 -40
- data/tracks/ruby/exercises/binary/binary_test.rb +0 -1
- data/tracks/ruby/exercises/bracket-push/bracket_push_test.rb +1 -1
- data/tracks/ruby/exercises/grains/grains_test.rb +2 -0
- data/tracks/ruby/exercises/isogram/isogram_test.rb +0 -1
- data/tracks/ruby/exercises/largest-series-product/largest_series_product_test.rb +2 -1
- data/tracks/ruby/exercises/luhn/luhn_test.rb +2 -0
- data/tracks/ruby/exercises/pangram/pangram_test.rb +0 -1
- data/tracks/ruby/exercises/queen-attack/queen_attack_test.rb +1 -1
- data/tracks/ruby/exercises/rna-transcription/rna_transcription_test.rb +1 -1
- data/tracks/ruby/exercises/run-length-encoding/run_length_encoding_test.rb +0 -1
- data/tracks/ruby/exercises/say/say_test.rb +2 -0
- data/tracks/ruby/exercises/word-count/word_count_test.rb +1 -1
- data/tracks/ruby/exercises/wordy/wordy_test.rb +2 -0
- data/tracks/ruby/lib/acronym_cases.rb +1 -1
- data/tracks/ruby/lib/all_your_base_cases.rb +1 -1
- data/tracks/ruby/lib/alphametics_cases.rb +1 -1
- data/tracks/ruby/lib/anagram_cases.rb +1 -1
- data/tracks/ruby/lib/beer_song_cases.rb +1 -1
- data/tracks/ruby/lib/binary_cases.rb +1 -1
- data/tracks/ruby/lib/bowling_cases.rb +1 -1
- data/tracks/ruby/lib/bracket_push_cases.rb +1 -1
- data/tracks/ruby/lib/clock_cases.rb +1 -1
- data/tracks/ruby/lib/connect_cases.rb +1 -1
- data/tracks/ruby/lib/custom_set_cases.rb +1 -1
- data/tracks/ruby/lib/difference_of_squares_cases.rb +1 -1
- data/tracks/ruby/lib/dominoes_cases.rb +1 -1
- data/tracks/ruby/lib/generator/files/generator_cases.rb +29 -0
- data/tracks/ruby/lib/generator/files/track_files.rb +11 -27
- data/tracks/ruby/lib/generator/template_values.rb +8 -2
- data/tracks/ruby/{exercises/anagram/example.tt → lib/generator/test_template.erb} +2 -2
- data/tracks/ruby/lib/gigasecond_cases.rb +1 -0
- data/tracks/ruby/lib/grains_cases.rb +1 -1
- data/tracks/ruby/lib/hamming_cases.rb +2 -0
- data/tracks/ruby/lib/hello_world_cases.rb +1 -1
- data/tracks/ruby/lib/isogram_cases.rb +1 -1
- data/tracks/ruby/lib/largest_series_product_cases.rb +1 -1
- data/tracks/ruby/lib/leap_cases.rb +1 -1
- data/tracks/ruby/lib/luhn_cases.rb +2 -0
- data/tracks/ruby/lib/nth_prime_cases.rb +1 -1
- data/tracks/ruby/lib/ocr_numbers_cases.rb +2 -0
- data/tracks/ruby/lib/pangram_cases.rb +1 -1
- data/tracks/ruby/lib/pig_latin_cases.rb +2 -0
- data/tracks/ruby/lib/queen_attack_cases.rb +1 -1
- data/tracks/ruby/lib/raindrops_cases.rb +1 -1
- data/tracks/ruby/lib/rna_transcription_cases.rb +1 -1
- data/tracks/ruby/lib/roman_numerals_cases.rb +1 -1
- data/tracks/ruby/lib/run_length_encoding_cases.rb +8 -6
- data/tracks/ruby/lib/say_cases.rb +1 -1
- data/tracks/ruby/lib/sieve_cases.rb +10 -3
- data/tracks/ruby/lib/tournament_cases.rb +1 -1
- data/tracks/ruby/lib/transpose_cases.rb +1 -1
- data/tracks/ruby/lib/triangle_cases.rb +1 -1
- data/tracks/ruby/lib/two_bucket_cases.rb +1 -1
- data/tracks/ruby/lib/word_count_cases.rb +12 -1
- data/tracks/ruby/lib/wordy_cases.rb +1 -1
- data/tracks/ruby/test/fixtures/xruby/lib/beta_cases.rb +1 -1
- data/tracks/ruby/{exercises/acronym/example.tt → test/fixtures/xruby/lib/generator/test_template.erb} +0 -0
- data/tracks/ruby/test/generator/files/generate_cases_test.rb +33 -0
- data/tracks/ruby/test/generator/files/track_files_test.rb +14 -28
- data/tracks/ruby/test/generator/template_values_test.rb +22 -4
- data/tracks/rust/config.json +10 -0
- data/tracks/rust/exercises/run-length-encoding/Cargo.lock +4 -0
- data/tracks/rust/exercises/run-length-encoding/Cargo.toml +6 -0
- data/tracks/rust/exercises/run-length-encoding/example.rs +45 -0
- data/tracks/rust/exercises/run-length-encoding/tests/run-length-encoding.rs +86 -0
- metadata +11 -29
- data/tracks/ruby/exercises/binary/example.tt +0 -22
- data/tracks/ruby/exercises/bracket-push/example.tt +0 -21
- data/tracks/ruby/exercises/clock/example.tt +0 -21
- data/tracks/ruby/exercises/custom-set/example.tt +0 -21
- data/tracks/ruby/exercises/grains/example.tt +0 -19
- data/tracks/ruby/exercises/hamming/example.tt +0 -21
- data/tracks/ruby/exercises/isogram/example.tt +0 -22
- data/tracks/ruby/exercises/largest-series-product/example.tt +0 -20
- data/tracks/ruby/exercises/luhn/example.tt +0 -18
- data/tracks/ruby/exercises/nth-prime/example.tt +0 -21
- data/tracks/ruby/exercises/ocr-numbers/example.tt +0 -21
- data/tracks/ruby/exercises/pangram/example.tt +0 -22
- data/tracks/ruby/exercises/pig-latin/example.tt +0 -21
- data/tracks/ruby/exercises/queen-attack/example.tt +0 -21
- data/tracks/ruby/exercises/raindrops/example.tt +0 -21
- data/tracks/ruby/exercises/rna-transcription/example.tt +0 -21
- data/tracks/ruby/exercises/roman-numerals/example.tt +0 -21
- data/tracks/ruby/exercises/run-length-encoding/example.tt +0 -24
- data/tracks/ruby/exercises/say/example.tt +0 -19
- data/tracks/ruby/exercises/sieve/example.tt +0 -22
- data/tracks/ruby/exercises/triangle/example.tt +0 -21
- data/tracks/ruby/exercises/two-bucket/example.tt +0 -21
- data/tracks/ruby/exercises/word-count/example.tt +0 -23
- data/tracks/ruby/exercises/wordy/example.tt +0 -19
- data/tracks/ruby/lib/exercise_cases.rb +0 -2
@@ -20,7 +20,7 @@ public class AllergiesTest {
|
|
20
20
|
assertEquals(false, allergies.isAllergicTo(Allergen.CATS));
|
21
21
|
}
|
22
22
|
|
23
|
-
@Ignore
|
23
|
+
@Ignore("Remove to run test")
|
24
24
|
@Test
|
25
25
|
public void allergicToEggs() {
|
26
26
|
Allergies allergies = new Allergies(1);
|
@@ -28,7 +28,7 @@ public class AllergiesTest {
|
|
28
28
|
assertEquals(true, allergies.isAllergicTo(Allergen.EGGS));
|
29
29
|
}
|
30
30
|
|
31
|
-
@Ignore
|
31
|
+
@Ignore("Remove to run test")
|
32
32
|
@Test
|
33
33
|
public void allergicToPeanuts() {
|
34
34
|
Allergies allergies = new Allergies(2);
|
@@ -36,7 +36,7 @@ public class AllergiesTest {
|
|
36
36
|
assertEquals(true, allergies.isAllergicTo(Allergen.PEANUTS));
|
37
37
|
}
|
38
38
|
|
39
|
-
@Ignore
|
39
|
+
@Ignore("Remove to run test")
|
40
40
|
@Test
|
41
41
|
public void allergicToShellfish() {
|
42
42
|
Allergies allergies = new Allergies(4);
|
@@ -44,7 +44,7 @@ public class AllergiesTest {
|
|
44
44
|
assertEquals(true, allergies.isAllergicTo(Allergen.SHELLFISH));
|
45
45
|
}
|
46
46
|
|
47
|
-
@Ignore
|
47
|
+
@Ignore("Remove to run test")
|
48
48
|
@Test
|
49
49
|
public void allergicToStrawberries() {
|
50
50
|
Allergies allergies = new Allergies(8);
|
@@ -52,7 +52,7 @@ public class AllergiesTest {
|
|
52
52
|
assertEquals(true, allergies.isAllergicTo(Allergen.STRAWBERRIES));
|
53
53
|
}
|
54
54
|
|
55
|
-
@Ignore
|
55
|
+
@Ignore("Remove to run test")
|
56
56
|
@Test
|
57
57
|
public void allergicToTomatoes() {
|
58
58
|
Allergies allergies = new Allergies(16);
|
@@ -60,7 +60,7 @@ public class AllergiesTest {
|
|
60
60
|
assertEquals(true, allergies.isAllergicTo(Allergen.TOMATOES));
|
61
61
|
}
|
62
62
|
|
63
|
-
@Ignore
|
63
|
+
@Ignore("Remove to run test")
|
64
64
|
@Test
|
65
65
|
public void allergicToChocolate() {
|
66
66
|
Allergies allergies = new Allergies(32);
|
@@ -68,7 +68,7 @@ public class AllergiesTest {
|
|
68
68
|
assertEquals(true, allergies.isAllergicTo(Allergen.CHOCOLATE));
|
69
69
|
}
|
70
70
|
|
71
|
-
@Ignore
|
71
|
+
@Ignore("Remove to run test")
|
72
72
|
@Test
|
73
73
|
public void allergicToPollen() {
|
74
74
|
Allergies allergies = new Allergies(64);
|
@@ -76,7 +76,7 @@ public class AllergiesTest {
|
|
76
76
|
assertEquals(true, allergies.isAllergicTo(Allergen.POLLEN));
|
77
77
|
}
|
78
78
|
|
79
|
-
@Ignore
|
79
|
+
@Ignore("Remove to run test")
|
80
80
|
@Test
|
81
81
|
public void allergicToCats() {
|
82
82
|
Allergies allergies = new Allergies(128);
|
@@ -84,7 +84,7 @@ public class AllergiesTest {
|
|
84
84
|
assertEquals(true, allergies.isAllergicTo(Allergen.CATS));
|
85
85
|
}
|
86
86
|
|
87
|
-
@Ignore
|
87
|
+
@Ignore("Remove to run test")
|
88
88
|
@Test
|
89
89
|
public void isAllergicToEggsInAdditionToOtherStuff() {
|
90
90
|
Allergies allergies = new Allergies(5);
|
@@ -94,7 +94,7 @@ public class AllergiesTest {
|
|
94
94
|
assertEquals(false, allergies.isAllergicTo(Allergen.STRAWBERRIES));
|
95
95
|
}
|
96
96
|
|
97
|
-
@Ignore
|
97
|
+
@Ignore("Remove to run test")
|
98
98
|
@Test
|
99
99
|
public void noAllergies() {
|
100
100
|
Allergies allergies = new Allergies(0);
|
@@ -102,7 +102,7 @@ public class AllergiesTest {
|
|
102
102
|
assertEquals(0, allergies.getList().size());
|
103
103
|
}
|
104
104
|
|
105
|
-
@Ignore
|
105
|
+
@Ignore("Remove to run test")
|
106
106
|
@Test
|
107
107
|
public void isAllergicToJustEggs() {
|
108
108
|
Allergies allergies = new Allergies(1);
|
@@ -111,7 +111,7 @@ public class AllergiesTest {
|
|
111
111
|
assertEquals(expectedAllergens, allergies.getList());
|
112
112
|
}
|
113
113
|
|
114
|
-
@Ignore
|
114
|
+
@Ignore("Remove to run test")
|
115
115
|
@Test
|
116
116
|
public void isAllergicToJustPeanuts() {
|
117
117
|
Allergies allergies = new Allergies(2);
|
@@ -120,7 +120,7 @@ public class AllergiesTest {
|
|
120
120
|
assertEquals(expectedAllergens, allergies.getList());
|
121
121
|
}
|
122
122
|
|
123
|
-
@Ignore
|
123
|
+
@Ignore("Remove to run test")
|
124
124
|
@Test
|
125
125
|
public void isAllergicToJustStrawberries() {
|
126
126
|
Allergies allergies = new Allergies(8);
|
@@ -129,7 +129,7 @@ public class AllergiesTest {
|
|
129
129
|
assertEquals(expectedAllergens, allergies.getList());
|
130
130
|
}
|
131
131
|
|
132
|
-
@Ignore
|
132
|
+
@Ignore("Remove to run test")
|
133
133
|
@Test
|
134
134
|
public void isAllergicToEggsAndPeanuts() {
|
135
135
|
Allergies allergies = new Allergies(3);
|
@@ -141,7 +141,7 @@ public class AllergiesTest {
|
|
141
141
|
assertEquals(expectedAllergens, allergies.getList());
|
142
142
|
}
|
143
143
|
|
144
|
-
@Ignore
|
144
|
+
@Ignore("Remove to run test")
|
145
145
|
@Test
|
146
146
|
public void isAllergicToEggsAndShellfish() {
|
147
147
|
Allergies allergies = new Allergies(5);
|
@@ -153,7 +153,7 @@ public class AllergiesTest {
|
|
153
153
|
assertEquals(expectedAllergens, allergies.getList());
|
154
154
|
}
|
155
155
|
|
156
|
-
@Ignore
|
156
|
+
@Ignore("Remove to run test")
|
157
157
|
@Test
|
158
158
|
public void isAllergicToLotsOfStuff() {
|
159
159
|
Allergies allergies = new Allergies(248);
|
@@ -168,7 +168,7 @@ public class AllergiesTest {
|
|
168
168
|
assertEquals(expectedAllergens, allergies.getList());
|
169
169
|
}
|
170
170
|
|
171
|
-
@Ignore
|
171
|
+
@Ignore("Remove to run test")
|
172
172
|
@Test
|
173
173
|
public void isAllergicToEverything() {
|
174
174
|
Allergies allergies = new Allergies(255);
|
@@ -186,7 +186,7 @@ public class AllergiesTest {
|
|
186
186
|
assertEquals(expectedAllergens, allergies.getList());
|
187
187
|
}
|
188
188
|
|
189
|
-
@Ignore
|
189
|
+
@Ignore("Remove to run test")
|
190
190
|
@Test
|
191
191
|
public void ignoreNonAllergenScoreParts() {
|
192
192
|
Allergies allergies = new Allergies(509);
|
@@ -16,7 +16,7 @@ public class AnagramTest {
|
|
16
16
|
assertTrue(detector.match(Arrays.asList("hello", "world", "zombies", "pants")).isEmpty());
|
17
17
|
}
|
18
18
|
|
19
|
-
@Ignore
|
19
|
+
@Ignore("Remove to run test")
|
20
20
|
@Test
|
21
21
|
public void testDetectSimpleAnagram() {
|
22
22
|
Anagram detector = new Anagram("ant");
|
@@ -25,7 +25,7 @@ public class AnagramTest {
|
|
25
25
|
assertThat(anagram.size(), is(1));
|
26
26
|
}
|
27
27
|
|
28
|
-
@Ignore
|
28
|
+
@Ignore("Remove to run test")
|
29
29
|
@Test
|
30
30
|
public void testDetectLongerAnagram() {
|
31
31
|
Anagram detector = new Anagram("listen");
|
@@ -33,7 +33,7 @@ public class AnagramTest {
|
|
33
33
|
assertThat(anagrams, hasItem("inlets"));
|
34
34
|
}
|
35
35
|
|
36
|
-
@Ignore
|
36
|
+
@Ignore("Remove to run test")
|
37
37
|
@Test
|
38
38
|
public void testDetectMultipleAnagrams() {
|
39
39
|
Anagram detector = new Anagram("master");
|
@@ -41,7 +41,7 @@ public class AnagramTest {
|
|
41
41
|
assertThat(anagrams, allOf(hasItem("maters"), hasItem("stream")));
|
42
42
|
}
|
43
43
|
|
44
|
-
@Ignore
|
44
|
+
@Ignore("Remove to run test")
|
45
45
|
@Test
|
46
46
|
public void testDetectMultipleAnagramsForLongerWord() {
|
47
47
|
Anagram detector = new Anagram("allergy");
|
@@ -49,14 +49,14 @@ public class AnagramTest {
|
|
49
49
|
assertThat(anagrams, allOf(hasItem("gallery"), hasItem("largely"), hasItem("regally")));
|
50
50
|
}
|
51
51
|
|
52
|
-
@Ignore
|
52
|
+
@Ignore("Remove to run test")
|
53
53
|
@Test
|
54
54
|
public void testDoesNotConfuseDifferentDuplicates() {
|
55
55
|
Anagram detector = new Anagram("galea");
|
56
56
|
assertTrue(detector.match(Arrays.asList("eagle")).isEmpty());
|
57
57
|
}
|
58
58
|
|
59
|
-
@Ignore
|
59
|
+
@Ignore("Remove to run test")
|
60
60
|
@Test
|
61
61
|
public void testIdenticalWordIsNotAnagram() {
|
62
62
|
Anagram detector = new Anagram("corn");
|
@@ -65,35 +65,35 @@ public class AnagramTest {
|
|
65
65
|
assertThat(anagrams.size(), is(1));
|
66
66
|
}
|
67
67
|
|
68
|
-
@Ignore
|
68
|
+
@Ignore("Remove to run test")
|
69
69
|
@Test
|
70
70
|
public void testIdenticalWordRepeatedIsNotAnagram() {
|
71
71
|
Anagram detector = new Anagram("go");
|
72
72
|
assertTrue(detector.match(Arrays.asList("go Go GO")).isEmpty());
|
73
73
|
}
|
74
74
|
|
75
|
-
@Ignore
|
75
|
+
@Ignore("Remove to run test")
|
76
76
|
@Test
|
77
77
|
public void testCapitalWordIsNotOwnAnagram() {
|
78
78
|
Anagram detector = new Anagram("BANANA");
|
79
79
|
assertTrue(detector.match(Arrays.asList("Banana")).isEmpty());
|
80
80
|
}
|
81
81
|
|
82
|
-
@Ignore
|
82
|
+
@Ignore("Remove to run test")
|
83
83
|
@Test
|
84
84
|
public void testEliminateAnagramsWithSameChecksum() {
|
85
85
|
Anagram detector = new Anagram("mass");
|
86
86
|
assertTrue(detector.match(Arrays.asList("last")).isEmpty());
|
87
87
|
}
|
88
88
|
|
89
|
-
@Ignore
|
89
|
+
@Ignore("Remove to run test")
|
90
90
|
@Test
|
91
91
|
public void testEliminateAnagramSubsets() {
|
92
92
|
Anagram detector = new Anagram("good");
|
93
93
|
assertTrue(detector.match(Arrays.asList("dog", "goody")).isEmpty());
|
94
94
|
}
|
95
95
|
|
96
|
-
@Ignore
|
96
|
+
@Ignore("Remove to run test")
|
97
97
|
@Test
|
98
98
|
public void testCaseInsensitiveWhenSubjectStartsWithUpperCaseLetter() {
|
99
99
|
Anagram detector = new Anagram("Orchestra");
|
@@ -101,7 +101,7 @@ public class AnagramTest {
|
|
101
101
|
assertThat(anagrams, hasItem("carthorse"));
|
102
102
|
}
|
103
103
|
|
104
|
-
@Ignore
|
104
|
+
@Ignore("Remove to run test")
|
105
105
|
@Test
|
106
106
|
public void testCaseInsensitiveWhenAnagramStartsWithUpperCaseLetter() {
|
107
107
|
Anagram detector = new Anagram("orchestra");
|
@@ -109,7 +109,7 @@ public class AnagramTest {
|
|
109
109
|
assertThat(anagrams, hasItem("Carthorse"));
|
110
110
|
}
|
111
111
|
|
112
|
-
@Ignore
|
112
|
+
@Ignore("Remove to run test")
|
113
113
|
@Test
|
114
114
|
public void testCaseInsensitiveWhenBothAnagramAndSubjectStartWithUpperCaseLetter() {
|
115
115
|
Anagram detector = new Anagram("Orchestra");
|
@@ -117,14 +117,14 @@ public class AnagramTest {
|
|
117
117
|
assertThat(anagrams, hasItem("Carthorse"));
|
118
118
|
}
|
119
119
|
|
120
|
-
@Ignore
|
120
|
+
@Ignore("Remove to run test")
|
121
121
|
@Test
|
122
122
|
public void testWordIsNotItsOwnAnagram() {
|
123
123
|
Anagram detector = new Anagram("banana");
|
124
124
|
assertTrue(detector.match(Arrays.asList("Banana")).isEmpty());
|
125
125
|
}
|
126
126
|
|
127
|
-
@Ignore
|
127
|
+
@Ignore("Remove to run test")
|
128
128
|
@Test
|
129
129
|
public void testAnagramMustUseAllLettersExactlyOnce() {
|
130
130
|
Anagram detector = new Anagram("tapper");
|
@@ -8,29 +8,23 @@ brew install sbcl
|
|
8
8
|
brew install clisp
|
9
9
|
```
|
10
10
|
|
11
|
-
|
12
|
-
platforms.
|
11
|
+
See their homepages for instructions for installing on other
|
12
|
+
platforms.
|
13
13
|
|
14
|
-
|
15
|
-
and download
|
16
|
-
[http://beta.quicklisp.org/quicklisp.lisp](http://beta.quicklisp.org/quicklisp.lisp).
|
14
|
+
We will use [QuickLisp](http://www.quicklisp.org/beta/#installation) for Lisp library management. To install QuickLisp:
|
17
15
|
|
18
16
|
```bash
|
19
17
|
curl -O http://beta.quicklisp.org/quicklisp.lisp
|
20
18
|
```
|
21
19
|
|
22
|
-
|
20
|
+
Now launch lisp, and copy-paste the following expressions to finish QuickLisp installation:
|
23
21
|
|
24
22
|
```lisp
|
25
|
-
(quicklisp-quickstart:install)
|
23
|
+
> (quicklisp-quickstart:install) ;; this will install quicklisp
|
24
|
+
> (ql:add-to-init-file) ;; this will add quicklisp setup to your init file (recommended)
|
26
25
|
```
|
27
26
|
|
28
|
-
|
29
|
-
start the lisp interpreter QuickLisp will be loaded, type:
|
30
|
-
|
31
|
-
```lisp
|
32
|
-
(ql:add-to-init-file)
|
33
|
-
```
|
27
|
+
See the documentation of your lisp implementation on how to load quicklisp.lisp into lisp.
|
34
28
|
|
35
29
|
Optionally load lisp-unit:
|
36
30
|
|
@@ -3,7 +3,7 @@ import unittest
|
|
3
3
|
from bracket_push import check_brackets
|
4
4
|
|
5
5
|
|
6
|
-
# test cases adapted from `x-common//canonical-data.json` @ version: 1.
|
6
|
+
# test cases adapted from `x-common//canonical-data.json` @ version: 1.1.0
|
7
7
|
|
8
8
|
class BracketPushTests(unittest.TestCase):
|
9
9
|
def test_paired_square_brackets(self):
|
@@ -18,6 +18,9 @@ class BracketPushTests(unittest.TestCase):
|
|
18
18
|
def test_wrong_ordered_brackets(self):
|
19
19
|
self.assertEqual(check_brackets("}{"), False)
|
20
20
|
|
21
|
+
def test_wrong_closing_bracket(self):
|
22
|
+
self.assertEqual(check_brackets("{]"), False)
|
23
|
+
|
21
24
|
def test_paired_with_whitespace(self):
|
22
25
|
self.assertEqual(check_brackets("{ }"), True)
|
23
26
|
|
@@ -1,8 +1,9 @@
|
|
1
1
|
import unittest
|
2
|
+
|
2
3
|
from isogram import is_isogram
|
3
4
|
|
4
5
|
|
5
|
-
# test cases adapted from `x-common//canonical-data.json` @ version: 1.
|
6
|
+
# test cases adapted from `x-common//canonical-data.json` @ version: 1.1.0
|
6
7
|
|
7
8
|
class TestIsogram(unittest.TestCase):
|
8
9
|
|
@@ -30,6 +31,9 @@ class TestIsogram(unittest.TestCase):
|
|
30
31
|
def test_made_up_name_that_is_an_isogram(self):
|
31
32
|
self.assertTrue(is_isogram("Emily Jung Schwartzkopf"))
|
32
33
|
|
34
|
+
def test_duplicated_character_in_the_middle(self):
|
35
|
+
self.assertFalse(is_isogram("accentor"))
|
36
|
+
|
33
37
|
|
34
38
|
if __name__ == '__main__':
|
35
39
|
unittest.main()
|
data/tracks/ruby/README.md
CHANGED
@@ -64,7 +64,7 @@ Note that flags which have an attached value, like above, must take the form
|
|
64
64
|
|
65
65
|
### Generated Test Suites
|
66
66
|
|
67
|
-
If you find
|
67
|
+
If you find a `<problem_name>_cases.rb` file in `lib/`, then the test suite is
|
68
68
|
generated from shared data, which can be found in the exercise definition in the [x-common][]
|
69
69
|
repository.
|
70
70
|
|
@@ -94,7 +94,8 @@ bin/generate $PROBLEM
|
|
94
94
|
|
95
95
|
#### Changing a Generated Exercise
|
96
96
|
|
97
|
-
|
97
|
+
Do not edit `$PROBLEM/$PROBLEM_test.rb`. Any changes you make will be overwritten when
|
98
|
+
the file is generated the next time.
|
98
99
|
|
99
100
|
There are two reasons why a test suite might change:
|
100
101
|
|
@@ -114,23 +115,14 @@ the exercise, which lives in the x-common repository.
|
|
114
115
|
This change will need to be submitted as a pull request to the x-common repository. This pull
|
115
116
|
request needs to be merged before you can regenerate the exercise.
|
116
117
|
|
117
|
-
Changes that don't have to do directly with the test inputs and outputs
|
118
|
-
|
119
|
-
`exercises/$PROBLEM/example.tt`. Then you can regenerate the exercise with
|
118
|
+
Changes that don't have to do directly with the test inputs and outputs should
|
119
|
+
be made to `lib/$PROBLEM_cases.rb`. Then you can regenerate the exercise with
|
120
120
|
`bin/generate $PROBLEM`.
|
121
121
|
|
122
122
|
#### Implementing a Generator
|
123
123
|
|
124
|
-
You will need to
|
125
|
-
|
126
|
-
1. `lib/$PROBLEM_cases.rb` - the logic for turning the data into tests.
|
127
|
-
1. `exercises/$PROBLEM/example.tt` - the Erb template for the test file, `$PROBLEM_test.rb`.
|
128
|
-
1. `exercises/$PROBLEM/.meta/` - metadata directory, currently contains version file
|
129
|
-
|
130
|
-
You will not need to touch the top-level script, `bin/generate`.
|
131
|
-
|
132
|
-
The `bin/generate` command relies on some common logic implemented in `lib/generator.rb`.
|
133
|
-
You probably won't need to touch that, either.
|
124
|
+
You will need to write code to produce the code that goes inside the test methods. Your
|
125
|
+
code will live in `lib/$PROBLEM_cases.rb`.
|
134
126
|
|
135
127
|
`lib/$PROBLEM_cases.rb` contains a derived class of `ExerciseCase` (in `lib/generator/exercise_cases.rb`)
|
136
128
|
which wraps the JSON for a single test case. The default version looks something like this:
|
@@ -149,7 +141,7 @@ end
|
|
149
141
|
Instead of `ProblemName` use the CamelCased name of the actual problem. This is important, since
|
150
142
|
the generator script will infer the name of the class from the argument that is passed.
|
151
143
|
|
152
|
-
This class must provide the methods used by `
|
144
|
+
This class must provide the methods used by `lib/generator/test_template.erb`. The base class provides methods
|
153
145
|
for the default template for everything except `workload`.
|
154
146
|
|
155
147
|
`workload` generates the code for the body of a test, including the assertion
|
@@ -157,34 +149,16 @@ and any setup required. The base class provides a variety of assertion and
|
|
157
149
|
helper methods. Beyond that, you can implement any helper methods that you need
|
158
150
|
as private methods in your derived class. See below for more information about [the intention of workload](#workload-philosophy)
|
159
151
|
|
160
|
-
|
152
|
+
If you really must add additional logic to the view template, you can use a custom
|
153
|
+
template. Copy `lib/generator/test_template.erb` to your exercise directory, name it
|
154
|
+
`exercise.tt`, and customize.
|
161
155
|
|
162
|
-
|
163
|
-
to keep logic out of views.
|
156
|
+
You will not need to touch the top-level script, `bin/generate`.
|
164
157
|
|
165
|
-
|
166
|
-
|
167
|
-
gem 'minitest', '>= 5.0.0'
|
168
|
-
require 'minitest/autorun'
|
169
|
-
require_relative '$PROBLEM'
|
170
|
-
|
171
|
-
# Common test data version: <%= abbreviated_commit_hash %>
|
172
|
-
class ProblemNameTest < Minitest::Test
|
173
|
-
<% test_cases.each do |test_case| %>
|
174
|
-
def <%= test_case.name %>
|
175
|
-
<%= test_case.skipped %>
|
176
|
-
<%= test_case.workload %>
|
177
|
-
end
|
158
|
+
The `bin/generate` command relies on some common logic implemented in `lib/generator.rb`.
|
159
|
+
You won't need to touch that, either.
|
178
160
|
|
179
|
-
<% end %>
|
180
|
-
<%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
|
181
161
|
|
182
|
-
def test_bookkeeping
|
183
|
-
skip
|
184
|
-
assert_equal <%= version %>, BookKeeping::VERSION
|
185
|
-
end
|
186
|
-
end
|
187
|
-
```
|
188
162
|
### Workload philosophy.
|
189
163
|
|
190
164
|
Prioritize educational value over expert comprehension and make sure that
|