trackler 2.2.1.52 → 2.2.1.53
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/problem-specifications/exercises/leap/canonical-data.json +2 -2
- data/tracks/cfml/tasks/FormatConfig.cfc +6 -4
- data/tracks/cfml/tasks/GenerateReadme.cfc +197 -0
- data/tracks/cfml/tasks/ScaffoldExercise.cfc +6 -0
- data/tracks/csharp/config.json +1 -1
- data/tracks/delphi/exercises/leap/uLeapTests.pas +1 -1
- data/tracks/fsharp/exercises/clock/Clock.fs +1 -1
- data/tracks/fsharp/exercises/clock/ClockTest.fs +239 -61
- data/tracks/fsharp/exercises/clock/Example.fs +3 -3
- data/tracks/fsharp/exercises/dominoes/DominoesTest.fs +29 -26
- data/tracks/fsharp/exercises/largest-series-product/LargestSeriesProductTest.fs +30 -15
- data/tracks/fsharp/exercises/leap/LeapTest.fs +2 -2
- data/tracks/fsharp/exercises/rectangles/Example.fs +1 -1
- data/tracks/fsharp/exercises/rectangles/Rectangles.fs +1 -1
- data/tracks/fsharp/exercises/rectangles/RectanglesTest.fs +66 -43
- data/tracks/fsharp/generators/Generators.fs +85 -1
- data/tracks/java/scripts/canonical_data_check.sh +8 -0
- data/tracks/kotlin/.gitignore +1 -0
- data/tracks/kotlin/exercises/acronym/.meta/version +1 -0
- data/tracks/kotlin/exercises/acronym/src/test/kotlin/AcronymTest.kt +9 -10
- data/tracks/kotlin/exercises/all-your-base/.meta/version +1 -1
- data/tracks/kotlin/exercises/all-your-base/src/test/kotlin/BaseConverterTest.kt +20 -20
- data/tracks/kotlin/exercises/allergies/.meta/version +1 -0
- data/tracks/kotlin/exercises/allergies/src/test/kotlin/AllergiesTest.kt +19 -72
- data/tracks/kotlin/exercises/anagram/.meta/src/reference/kotlin/Anagram.kt +7 -4
- data/tracks/kotlin/exercises/anagram/.meta/version +1 -0
- data/tracks/kotlin/exercises/anagram/src/test/kotlin/AnagramTest.kt +76 -29
- data/tracks/kotlin/exercises/atbash-cipher/.meta/version +1 -0
- data/tracks/kotlin/exercises/atbash-cipher/src/test/kotlin/AtbashTest.kt +6 -3
- data/tracks/kotlin/exercises/beer-song/.meta/version +1 -0
- data/tracks/kotlin/exercises/beer-song/src/test/kotlin/BeerSongTest.kt +21 -46
- data/tracks/kotlin/exercises/binary-search/.meta/version +1 -0
- data/tracks/kotlin/exercises/binary-search/src/test/kotlin/BinarySearchTest.kt +30 -19
- data/tracks/kotlin/exercises/bob/.meta/src/reference/kotlin/Bob.kt +8 -7
- data/tracks/kotlin/exercises/bob/.meta/version +1 -0
- data/tracks/kotlin/exercises/bob/src/test/kotlin/BobTest.kt +57 -15
- data/tracks/kotlin/exercises/bracket-push/.meta/version +1 -0
- data/tracks/kotlin/exercises/bracket-push/src/test/kotlin/BracketPushTest.kt +3 -1
- data/tracks/kotlin/exercises/collatz-conjecture/.meta/version +1 -1
- data/tracks/kotlin/exercises/difference-of-squares/.meta/version +1 -0
- data/tracks/kotlin/exercises/difference-of-squares/src/test/kotlin/SquaresTest.kt +10 -23
- data/tracks/kotlin/exercises/etl/.meta/src/reference/kotlin/ETL.kt +7 -1
- data/tracks/kotlin/exercises/etl/.meta/version +1 -0
- data/tracks/kotlin/exercises/etl/src/test/kotlin/ETLTest.kt +10 -10
- data/tracks/kotlin/exercises/flatten-array/.meta/version +1 -0
- data/tracks/kotlin/exercises/flatten-array/src/test/kotlin/FlattenerTest.kt +8 -16
- data/tracks/kotlin/exercises/gigasecond/.meta/version +1 -0
- data/tracks/kotlin/exercises/gigasecond/src/test/kotlin/GigasecondTest.kt +1 -1
- data/tracks/kotlin/exercises/hamming/.meta/src/reference/kotlin/Hamming.kt +1 -1
- data/tracks/kotlin/exercises/hamming/.meta/version +1 -1
- data/tracks/kotlin/exercises/hamming/src/test/kotlin/HammingTest.kt +4 -4
- data/tracks/kotlin/exercises/hello-world/.meta/version +1 -0
- data/tracks/kotlin/exercises/hello-world/src/test/kotlin/HelloWorldTest.kt +1 -1
- data/tracks/kotlin/exercises/isogram/.meta/version +1 -0
- data/tracks/kotlin/exercises/isogram/src/test/kotlin/IsogramTest.kt +5 -8
- data/tracks/kotlin/exercises/largest-series-product/.meta/src/reference/kotlin/Series.kt +2 -3
- data/tracks/kotlin/exercises/largest-series-product/.meta/version +1 -0
- data/tracks/kotlin/exercises/largest-series-product/src/test/kotlin/SeriesTest.kt +97 -0
- data/tracks/kotlin/exercises/leap/.meta/version +1 -0
- data/tracks/kotlin/exercises/leap/src/test/kotlin/LeapTest.kt +8 -26
- data/tracks/kotlin/exercises/list-ops/.meta/version +1 -1
- data/tracks/kotlin/exercises/luhn/.meta/version +1 -0
- data/tracks/kotlin/exercises/luhn/src/test/kotlin/LuhnTest.kt +0 -3
- data/tracks/kotlin/exercises/nth-prime/.meta/version +1 -0
- data/tracks/kotlin/exercises/nth-prime/src/test/kotlin/PrimeTest.kt +0 -2
- data/tracks/kotlin/exercises/nucleotide-count/.meta/src/reference/kotlin/{DNA.kt → Dna.kt} +3 -8
- data/tracks/kotlin/exercises/nucleotide-count/.meta/version +1 -0
- data/tracks/kotlin/exercises/nucleotide-count/src/test/kotlin/DnaTest.kt +48 -0
- data/tracks/kotlin/exercises/pangram/.meta/src/reference/kotlin/{Pangrams.kt → Pangram.kt} +1 -1
- data/tracks/kotlin/exercises/pangram/.meta/version +1 -1
- data/tracks/kotlin/exercises/pangram/src/test/kotlin/PangramTest.kt +15 -9
- data/tracks/kotlin/exercises/pascals-triangle/.meta/version +1 -0
- data/tracks/kotlin/exercises/pascals-triangle/src/test/kotlin/PascalsTriangleTest.kt +32 -14
- data/tracks/kotlin/exercises/perfect-numbers/.meta/src/reference/kotlin/NaturalNumber.kt +1 -1
- data/tracks/kotlin/exercises/perfect-numbers/.meta/version +1 -0
- data/tracks/kotlin/exercises/perfect-numbers/src/test/kotlin/{PerfectNumbersTest.kt → NaturalNumberTest.kt} +25 -7
- data/tracks/kotlin/exercises/phone-number/.meta/src/reference/kotlin/PhoneNumber.kt +15 -7
- data/tracks/kotlin/exercises/phone-number/.meta/version +1 -0
- data/tracks/kotlin/exercises/phone-number/src/test/kotlin/PhoneNumberTest.kt +46 -29
- data/tracks/kotlin/exercises/pig-latin/.meta/src/reference/kotlin/PigLatin.kt +2 -2
- data/tracks/kotlin/exercises/pig-latin/.meta/version +1 -0
- data/tracks/kotlin/exercises/pig-latin/src/test/kotlin/PigLatinTest.kt +21 -10
- data/tracks/kotlin/exercises/raindrops/.meta/version +1 -0
- data/tracks/kotlin/exercises/raindrops/src/test/kotlin/RaindropsTest.kt +19 -26
- data/tracks/kotlin/exercises/react/.meta/version +1 -0
- data/tracks/kotlin/exercises/react/src/test/kotlin/ReactTest.kt +11 -4
- data/tracks/kotlin/exercises/robot-simulator/.meta/version +1 -1
- data/tracks/kotlin/exercises/roman-numerals/.meta/version +1 -0
- data/tracks/kotlin/exercises/roman-numerals/src/test/kotlin/RomanNumeralTest.kt +1 -2
- data/tracks/kotlin/exercises/rotational-cipher/.meta/version +1 -1
- data/tracks/kotlin/exercises/rotational-cipher/src/test/kotlin/RotationalCipherTest.kt +7 -7
- data/tracks/kotlin/exercises/scrabble-score/.meta/src/reference/kotlin/{Scrabble.kt → ScrabbleScore.kt} +1 -1
- data/tracks/kotlin/exercises/scrabble-score/.meta/version +1 -0
- data/tracks/kotlin/exercises/scrabble-score/src/test/kotlin/ScrabbleScoreTest.kt +9 -7
- data/tracks/kotlin/exercises/sieve/.meta/version +1 -0
- data/tracks/kotlin/exercises/sieve/src/test/kotlin/SieveTest.kt +8 -0
- data/tracks/kotlin/exercises/space-age/.meta/version +1 -0
- data/tracks/kotlin/exercises/space-age/src/test/kotlin/SpaceAgeTest.kt +1 -16
- data/tracks/kotlin/exercises/sum-of-multiples/.meta/version +1 -0
- data/tracks/kotlin/exercises/sum-of-multiples/src/test/kotlin/SumOfMultiplesTest.kt +7 -7
- data/tracks/kotlin/exercises/triangle/.meta/version +1 -0
- data/tracks/kotlin/exercises/two-fer/.meta/version +1 -0
- data/tracks/kotlin/exercises/two-fer/src/test/kotlin/TwoferTest.kt +0 -1
- data/tracks/kotlin/exercises/word-count/.meta/src/reference/kotlin/WordCount.kt +6 -2
- data/tracks/kotlin/exercises/word-count/.meta/version +1 -0
- data/tracks/kotlin/exercises/word-count/src/test/kotlin/WordCountTest.kt +31 -9
- data/tracks/kotlin/scripts/canonical_data_check.sh +8 -0
- data/tracks/perl6/exercises/leap/leap.t +2 -2
- data/tracks/php/config.json +16 -0
- data/tracks/php/exercises/crypto-square/crypto-square_test.php +50 -0
- data/tracks/php/exercises/crypto-square/example.php +32 -0
- data/tracks/php/exercises/meetup/README.md +21 -0
- data/tracks/php/exercises/meetup/example.php +19 -0
- data/tracks/php/exercises/meetup/meetup_test.php +577 -0
- data/tracks/python/README.md +7 -5
- data/tracks/python/config.json +36 -27
- data/tracks/python/docs/TESTS.md +36 -12
- data/tracks/python/exercises/complex-numbers/complex_numbers_test.py +1 -1
- data/tracks/python/exercises/diffie-hellman/.meta/hints.md +16 -0
- data/tracks/python/exercises/diffie-hellman/README.md +15 -2
- data/tracks/python/exercises/error-handling/README.md +23 -0
- data/tracks/python/exercises/error-handling/error_handling.py +14 -0
- data/tracks/python/exercises/error-handling/error_handling_test.py +66 -0
- data/tracks/python/exercises/error-handling/example.py +21 -0
- data/tracks/python/exercises/forth/forth_test.py +1 -1
- data/tracks/python/exercises/isogram/isogram_test.py +5 -3
- data/tracks/python/exercises/leap/leap_test.py +2 -2
- data/tracks/python/exercises/rotational-cipher/rotational_cipher_test.py +4 -4
- data/tracks/python/exercises/simple-cipher/.meta/hints.md +16 -0
- data/tracks/python/exercises/simple-cipher/README.md +17 -0
- data/tracks/python/exercises/sum-of-multiples/sum_of_multiples_test.py +4 -1
- data/tracks/python/exercises/twelve-days/example.py +3 -3
- data/tracks/python/exercises/twelve-days/twelve_days.py +2 -2
- metadata +53 -9
- data/tracks/kotlin/exercises/largest-series-product/src/test/kotlin/SeriesInvalidInputTest.kt +0 -30
- data/tracks/kotlin/exercises/largest-series-product/src/test/kotlin/SeriesValidInputTest.kt +0 -34
- data/tracks/kotlin/exercises/nucleotide-count/src/test/kotlin/NucleotideTest.kt +0 -87
|
@@ -62,6 +62,7 @@ then
|
|
|
62
62
|
fi
|
|
63
63
|
|
|
64
64
|
track_exercise_slugs=$(jq '.exercises[] | select(has("deprecated") | not) | .slug' $config_file_path | tr -d "\"")
|
|
65
|
+
update_needed_count=0
|
|
65
66
|
|
|
66
67
|
for slug in $track_exercise_slugs
|
|
67
68
|
do
|
|
@@ -88,6 +89,7 @@ do
|
|
|
88
89
|
if ! [ -f "$track_exercise_version_file_path" ]
|
|
89
90
|
then
|
|
90
91
|
echo "$slug: needs update or version file (v$canonical_data_version)."
|
|
92
|
+
update_needed_count=$((update_needed_count + 1))
|
|
91
93
|
continue
|
|
92
94
|
fi
|
|
93
95
|
|
|
@@ -98,7 +100,13 @@ do
|
|
|
98
100
|
# echo "$slug: up-to-date."
|
|
99
101
|
continue
|
|
100
102
|
else
|
|
103
|
+
update_needed_count=$((update_needed_count + 1))
|
|
101
104
|
echo "$slug: needs update (v$track_data_version -> v$canonical_data_version)."
|
|
102
105
|
fi
|
|
103
106
|
|
|
104
107
|
done
|
|
108
|
+
|
|
109
|
+
if [ $update_needed_count -eq 1 ]
|
|
110
|
+
then
|
|
111
|
+
echo "All exercises are up to date!"
|
|
112
|
+
fi
|
data/tracks/kotlin/.gitignore
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
1.1.0
|
|
@@ -4,7 +4,6 @@ import kotlin.test.assertEquals
|
|
|
4
4
|
|
|
5
5
|
class AcronymTest {
|
|
6
6
|
|
|
7
|
-
|
|
8
7
|
@Test
|
|
9
8
|
fun fromTitleCasedPhrases() {
|
|
10
9
|
val phrase = "Portable Network Graphics"
|
|
@@ -20,14 +19,6 @@ class AcronymTest {
|
|
|
20
19
|
assertEquals(expected, Acronym.generate(phrase))
|
|
21
20
|
}
|
|
22
21
|
|
|
23
|
-
@Ignore
|
|
24
|
-
@Test
|
|
25
|
-
fun fromInconsistentlyCasedPhrases() {
|
|
26
|
-
val phrase = "HyperText Markup Language"
|
|
27
|
-
val expected = "HTML"
|
|
28
|
-
assertEquals(expected, Acronym.generate(phrase))
|
|
29
|
-
}
|
|
30
|
-
|
|
31
22
|
@Ignore
|
|
32
23
|
@Test
|
|
33
24
|
fun fromPhrasesWithPunctuation() {
|
|
@@ -38,12 +29,20 @@ class AcronymTest {
|
|
|
38
29
|
|
|
39
30
|
@Ignore
|
|
40
31
|
@Test
|
|
41
|
-
fun
|
|
32
|
+
fun fromAllCapsWord() {
|
|
42
33
|
val phrase = "PHP: Hypertext Preprocessor"
|
|
43
34
|
val expected = "PHP"
|
|
44
35
|
assertEquals(expected, Acronym.generate(phrase))
|
|
45
36
|
}
|
|
46
37
|
|
|
38
|
+
@Ignore
|
|
39
|
+
@Test
|
|
40
|
+
fun fromNonAcronymAllCapsWord() {
|
|
41
|
+
val phrase = "GNU Image Manipulation Program"
|
|
42
|
+
val expected = "GIMP"
|
|
43
|
+
assertEquals(expected, Acronym.generate(phrase))
|
|
44
|
+
}
|
|
45
|
+
|
|
47
46
|
@Ignore
|
|
48
47
|
@Test
|
|
49
48
|
fun fromPhrasesWithPunctuationAndSentenceCasing() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
1.
|
|
1
|
+
1.1.0
|
|
@@ -168,69 +168,69 @@ class BaseConverterTest {
|
|
|
168
168
|
|
|
169
169
|
@Ignore
|
|
170
170
|
@Test
|
|
171
|
-
fun
|
|
171
|
+
fun testFirstBaseIsOne() {
|
|
172
172
|
expectedException.expect(IllegalArgumentException::class.java)
|
|
173
|
-
expectedException.expectMessage("
|
|
173
|
+
expectedException.expectMessage("Bases must be at least 2.")
|
|
174
174
|
|
|
175
|
-
BaseConverter(
|
|
175
|
+
BaseConverter(1, intArrayOf())
|
|
176
176
|
}
|
|
177
177
|
|
|
178
178
|
@Ignore
|
|
179
179
|
@Test
|
|
180
|
-
fun
|
|
180
|
+
fun testFirstBaseIsZero() {
|
|
181
181
|
expectedException.expect(IllegalArgumentException::class.java)
|
|
182
|
-
expectedException.expectMessage("
|
|
182
|
+
expectedException.expectMessage("Bases must be at least 2.")
|
|
183
183
|
|
|
184
|
-
BaseConverter(
|
|
184
|
+
BaseConverter(0, intArrayOf())
|
|
185
185
|
}
|
|
186
186
|
|
|
187
187
|
@Ignore
|
|
188
188
|
@Test
|
|
189
|
-
fun
|
|
189
|
+
fun testFirstBaseIsNegative() {
|
|
190
190
|
expectedException.expect(IllegalArgumentException::class.java)
|
|
191
191
|
expectedException.expectMessage("Bases must be at least 2.")
|
|
192
192
|
|
|
193
|
-
BaseConverter(
|
|
193
|
+
BaseConverter(-2, intArrayOf())
|
|
194
194
|
}
|
|
195
195
|
|
|
196
196
|
@Ignore
|
|
197
197
|
@Test
|
|
198
|
-
fun
|
|
199
|
-
val baseConverter = BaseConverter(2, intArrayOf(1, 0, 1, 0, 1, 0))
|
|
200
|
-
|
|
198
|
+
fun testNegativeDigit() {
|
|
201
199
|
expectedException.expect(IllegalArgumentException::class.java)
|
|
202
|
-
expectedException.expectMessage("
|
|
200
|
+
expectedException.expectMessage("Digits may not be negative.")
|
|
203
201
|
|
|
204
|
-
|
|
202
|
+
BaseConverter(2, intArrayOf(1, -1, 1, 0, 1, 0))
|
|
205
203
|
}
|
|
206
204
|
|
|
207
205
|
@Ignore
|
|
208
206
|
@Test
|
|
209
|
-
fun
|
|
207
|
+
fun testInvalidPositiveDigit() {
|
|
210
208
|
expectedException.expect(IllegalArgumentException::class.java)
|
|
211
|
-
expectedException.expectMessage("
|
|
209
|
+
expectedException.expectMessage("All digits must be strictly less than the base.")
|
|
212
210
|
|
|
213
|
-
BaseConverter(
|
|
211
|
+
BaseConverter(2, intArrayOf(1, 2, 1, 0, 1, 0))
|
|
214
212
|
}
|
|
215
213
|
|
|
216
214
|
@Ignore
|
|
217
215
|
@Test
|
|
218
|
-
fun
|
|
216
|
+
fun testSecondBaseIsOne() {
|
|
219
217
|
val baseConverter = BaseConverter(2, intArrayOf(1, 0, 1, 0, 1, 0))
|
|
220
218
|
|
|
221
219
|
expectedException.expect(IllegalArgumentException::class.java)
|
|
222
220
|
expectedException.expectMessage("Bases must be at least 2.")
|
|
223
221
|
|
|
224
|
-
baseConverter.convertToBase(
|
|
222
|
+
baseConverter.convertToBase(1)
|
|
225
223
|
}
|
|
226
224
|
|
|
227
225
|
@Ignore
|
|
228
226
|
@Test
|
|
229
|
-
fun
|
|
227
|
+
fun testSecondBaseIsZero() {
|
|
228
|
+
val baseConverter = BaseConverter(2, intArrayOf(1, 0, 1, 0, 1, 0))
|
|
229
|
+
|
|
230
230
|
expectedException.expect(IllegalArgumentException::class.java)
|
|
231
231
|
expectedException.expectMessage("Bases must be at least 2.")
|
|
232
232
|
|
|
233
|
-
|
|
233
|
+
baseConverter.convertToBase(0)
|
|
234
234
|
}
|
|
235
235
|
|
|
236
236
|
@Ignore
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
1.0.0
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import org.junit.Test
|
|
2
2
|
import org.junit.Ignore
|
|
3
3
|
import kotlin.test.assertEquals
|
|
4
|
+
import kotlin.test.assertFalse
|
|
5
|
+
import kotlin.test.assertTrue
|
|
4
6
|
|
|
5
7
|
class AllergiesTest {
|
|
6
8
|
|
|
7
|
-
|
|
8
9
|
@Test
|
|
9
10
|
fun noAllergiesMeansNotAllergicToAnything() {
|
|
10
11
|
val allergies = Allergies(0)
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
assertEquals(false, allergies.isAllergicTo(Allergen.CATS))
|
|
13
|
+
assertFalse(allergies.isAllergicTo(Allergen.PEANUTS))
|
|
14
|
+
assertFalse(allergies.isAllergicTo(Allergen.CATS))
|
|
15
|
+
assertFalse(allergies.isAllergicTo(Allergen.STRAWBERRIES))
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
@Ignore
|
|
@@ -20,71 +20,17 @@ class AllergiesTest {
|
|
|
20
20
|
fun allergicToEggs() {
|
|
21
21
|
val allergies = Allergies(1)
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
@Ignore
|
|
27
|
-
@Test
|
|
28
|
-
fun allergicToPeanuts() {
|
|
29
|
-
val allergies = Allergies(2)
|
|
30
|
-
|
|
31
|
-
assertEquals(true, allergies.isAllergicTo(Allergen.PEANUTS))
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
@Ignore
|
|
35
|
-
@Test
|
|
36
|
-
fun allergicToShellfish() {
|
|
37
|
-
val allergies = Allergies(4)
|
|
38
|
-
|
|
39
|
-
assertEquals(true, allergies.isAllergicTo(Allergen.SHELLFISH))
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
@Ignore
|
|
43
|
-
@Test
|
|
44
|
-
fun allergicToStrawberries() {
|
|
45
|
-
val allergies = Allergies(8)
|
|
46
|
-
|
|
47
|
-
assertEquals(true, allergies.isAllergicTo(Allergen.STRAWBERRIES))
|
|
23
|
+
assertTrue(allergies.isAllergicTo(Allergen.EGGS))
|
|
48
24
|
}
|
|
49
25
|
|
|
50
26
|
@Ignore
|
|
51
27
|
@Test
|
|
52
|
-
fun
|
|
53
|
-
val allergies = Allergies(16)
|
|
54
|
-
|
|
55
|
-
assertEquals(true, allergies.isAllergicTo(Allergen.TOMATOES))
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
@Ignore
|
|
59
|
-
@Test
|
|
60
|
-
fun allergicToChocolate() {
|
|
61
|
-
val allergies = Allergies(32)
|
|
62
|
-
|
|
63
|
-
assertEquals(true, allergies.isAllergicTo(Allergen.CHOCOLATE))
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
@Ignore
|
|
67
|
-
@Test
|
|
68
|
-
fun allergicToPollen() {
|
|
69
|
-
val allergies = Allergies(64)
|
|
70
|
-
|
|
71
|
-
assertEquals(true, allergies.isAllergicTo(Allergen.POLLEN))
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
@Ignore
|
|
75
|
-
@Test
|
|
76
|
-
fun allergicToCats() {
|
|
77
|
-
val allergies = Allergies(128)
|
|
78
|
-
|
|
79
|
-
assertEquals(true, allergies.isAllergicTo(Allergen.CATS))
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
@Ignore
|
|
83
|
-
@Test
|
|
84
|
-
fun isAllergicToEggsInAdditionToOtherStuff() {
|
|
28
|
+
fun allergicToEggsAndOtherThings() {
|
|
85
29
|
val allergies = Allergies(5)
|
|
86
30
|
|
|
87
|
-
|
|
31
|
+
assertTrue(allergies.isAllergicTo(Allergen.EGGS))
|
|
32
|
+
assertTrue(allergies.isAllergicTo(Allergen.SHELLFISH))
|
|
33
|
+
assertFalse(allergies.isAllergicTo(Allergen.STRAWBERRIES))
|
|
88
34
|
}
|
|
89
35
|
|
|
90
36
|
@Ignore
|
|
@@ -92,12 +38,12 @@ class AllergiesTest {
|
|
|
92
38
|
fun noAllergies() {
|
|
93
39
|
val allergies = Allergies(0)
|
|
94
40
|
|
|
95
|
-
|
|
41
|
+
assertTrue(allergies.getList().isEmpty())
|
|
96
42
|
}
|
|
97
43
|
|
|
98
44
|
@Ignore
|
|
99
45
|
@Test
|
|
100
|
-
fun
|
|
46
|
+
fun allergicToJustEggs() {
|
|
101
47
|
val allergies = Allergies(1)
|
|
102
48
|
val expectedAllergens = listOf(Allergen.EGGS)
|
|
103
49
|
|
|
@@ -106,7 +52,7 @@ class AllergiesTest {
|
|
|
106
52
|
|
|
107
53
|
@Ignore
|
|
108
54
|
@Test
|
|
109
|
-
fun
|
|
55
|
+
fun allergicToJustPeanuts() {
|
|
110
56
|
val allergies = Allergies(2)
|
|
111
57
|
val expectedAllergens = listOf(Allergen.PEANUTS)
|
|
112
58
|
|
|
@@ -115,7 +61,7 @@ class AllergiesTest {
|
|
|
115
61
|
|
|
116
62
|
@Ignore
|
|
117
63
|
@Test
|
|
118
|
-
fun
|
|
64
|
+
fun allergicToJustStrawberries() {
|
|
119
65
|
val allergies = Allergies(8)
|
|
120
66
|
val expectedAllergens = listOf(Allergen.STRAWBERRIES)
|
|
121
67
|
|
|
@@ -124,7 +70,7 @@ class AllergiesTest {
|
|
|
124
70
|
|
|
125
71
|
@Ignore
|
|
126
72
|
@Test
|
|
127
|
-
fun
|
|
73
|
+
fun allergicToEggsAndPeanuts() {
|
|
128
74
|
val allergies = Allergies(3)
|
|
129
75
|
val expectedAllergens = listOf(
|
|
130
76
|
Allergen.EGGS,
|
|
@@ -136,7 +82,7 @@ class AllergiesTest {
|
|
|
136
82
|
|
|
137
83
|
@Ignore
|
|
138
84
|
@Test
|
|
139
|
-
fun
|
|
85
|
+
fun allergicToEggsAndShellfish() {
|
|
140
86
|
val allergies = Allergies(5)
|
|
141
87
|
val expectedAllergens = listOf(
|
|
142
88
|
Allergen.EGGS,
|
|
@@ -148,7 +94,7 @@ class AllergiesTest {
|
|
|
148
94
|
|
|
149
95
|
@Ignore
|
|
150
96
|
@Test
|
|
151
|
-
fun
|
|
97
|
+
fun allergicToLotsOfStuff() {
|
|
152
98
|
val allergies = Allergies(248)
|
|
153
99
|
val expectedAllergens = listOf(
|
|
154
100
|
Allergen.STRAWBERRIES,
|
|
@@ -163,7 +109,7 @@ class AllergiesTest {
|
|
|
163
109
|
|
|
164
110
|
@Ignore
|
|
165
111
|
@Test
|
|
166
|
-
fun
|
|
112
|
+
fun allergicToEverything() {
|
|
167
113
|
val allergies = Allergies(255)
|
|
168
114
|
val expectedAllergens = listOf(
|
|
169
115
|
Allergen.EGGS,
|
|
@@ -195,4 +141,5 @@ class AllergiesTest {
|
|
|
195
141
|
|
|
196
142
|
assertEquals(expectedAllergens, allergies.getList())
|
|
197
143
|
}
|
|
144
|
+
|
|
198
145
|
}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
class Anagram(val word: String) {
|
|
1
|
+
class Anagram(private val word: String) {
|
|
2
|
+
|
|
2
3
|
fun match(anagrams: Collection<String>) =
|
|
3
|
-
anagrams.filter
|
|
4
|
+
anagrams.filter { containSameChars(it.toLowerCase()) }
|
|
5
|
+
.filterNot { it.equals(word, ignoreCase = true) }
|
|
6
|
+
.toSet()
|
|
4
7
|
|
|
5
|
-
private fun
|
|
6
|
-
|
|
8
|
+
private fun containSameChars(candidate: String) =
|
|
9
|
+
candidate.toLowerCase().toCharArray().sorted() == word.toLowerCase().toCharArray().sorted()
|
|
7
10
|
|
|
8
11
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
1.0.1
|
|
@@ -4,81 +4,128 @@ import kotlin.test.assertEquals
|
|
|
4
4
|
|
|
5
5
|
class AnagramTest {
|
|
6
6
|
|
|
7
|
-
|
|
8
7
|
@Test
|
|
9
8
|
fun noMatches() {
|
|
10
9
|
val detector = Anagram("diaper")
|
|
11
|
-
assertEquals(
|
|
10
|
+
assertEquals(emptySet(), detector.match(listOf("hello", "world", "zombies", "pants")))
|
|
12
11
|
}
|
|
13
12
|
|
|
14
13
|
@Ignore
|
|
15
14
|
@Test
|
|
16
|
-
fun
|
|
15
|
+
fun detectsSimpleAnagram() {
|
|
17
16
|
val detector = Anagram("ant")
|
|
18
17
|
val anagram = detector.match(listOf("tan", "stand", "at"))
|
|
19
|
-
assertEquals(
|
|
18
|
+
assertEquals(setOf("tan"), anagram)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
@Ignore
|
|
22
|
+
@Test
|
|
23
|
+
fun doesNotDetectFalsePositives() {
|
|
24
|
+
val detector = Anagram("galea")
|
|
25
|
+
val anagrams = detector.match(listOf("eagle"))
|
|
26
|
+
assertEquals(emptySet(), anagrams)
|
|
20
27
|
}
|
|
21
28
|
|
|
22
29
|
@Ignore
|
|
23
30
|
@Test
|
|
24
|
-
fun
|
|
31
|
+
fun detectsTwoAnagrams() {
|
|
25
32
|
val detector = Anagram("master")
|
|
26
33
|
val anagrams = detector.match(listOf("stream", "pigeon", "maters"))
|
|
27
|
-
assertEquals(
|
|
34
|
+
assertEquals(setOf("maters", "stream"), anagrams)
|
|
28
35
|
}
|
|
29
36
|
|
|
30
37
|
@Ignore
|
|
31
38
|
@Test
|
|
32
|
-
fun
|
|
33
|
-
val detector = Anagram("
|
|
34
|
-
|
|
35
|
-
assertEquals(listOf(), anagrams)
|
|
39
|
+
fun doesNotDetectAnagramSubsets() {
|
|
40
|
+
val detector = Anagram("good")
|
|
41
|
+
assertEquals(emptySet(), detector.match(listOf("dog", "goody")))
|
|
36
42
|
}
|
|
37
43
|
|
|
38
44
|
@Ignore
|
|
39
45
|
@Test
|
|
40
|
-
fun
|
|
46
|
+
fun detectsLongerAnagram() {
|
|
47
|
+
val detector = Anagram("listen")
|
|
48
|
+
val anagrams = detector.match(listOf("enlists", "google", "inlets", "banana"))
|
|
49
|
+
assertEquals(setOf("inlets"), anagrams)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
@Ignore
|
|
53
|
+
@Test
|
|
54
|
+
fun detectsThreeAnagrams() {
|
|
55
|
+
val detector = Anagram("allergy")
|
|
56
|
+
val anagrams = detector.match(listOf("gallery", "ballerina", "regally", "clergy", "largely", "leading"))
|
|
57
|
+
assertEquals(setOf("gallery", "largely", "regally"), anagrams)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
@Ignore
|
|
61
|
+
@Test
|
|
62
|
+
fun doesNotDetectIdenticalWordAsAnagram() {
|
|
41
63
|
val detector = Anagram("corn")
|
|
42
64
|
val anagrams = detector.match(listOf("corn", "dark", "Corn", "rank", "CORN", "cron", "park"))
|
|
43
|
-
assertEquals(
|
|
65
|
+
assertEquals(setOf("cron"), anagrams)
|
|
44
66
|
}
|
|
45
67
|
|
|
46
68
|
@Ignore
|
|
47
69
|
@Test
|
|
48
|
-
fun
|
|
70
|
+
fun doesNotDetectNonAnagramsWithIdenticalChecksums() {
|
|
49
71
|
val detector = Anagram("mass")
|
|
50
|
-
assertEquals(
|
|
72
|
+
assertEquals(emptySet(), detector.match(listOf("last")))
|
|
51
73
|
}
|
|
52
74
|
|
|
53
75
|
@Ignore
|
|
54
76
|
@Test
|
|
55
|
-
fun
|
|
56
|
-
val detector = Anagram("
|
|
57
|
-
|
|
77
|
+
fun detectsAnagramsCaseInsensitively() {
|
|
78
|
+
val detector = Anagram("Orchestra")
|
|
79
|
+
val anagrams = detector.match(listOf("cashregister", "Carthorse", "radishes"))
|
|
80
|
+
assertEquals(setOf("Carthorse"), anagrams)
|
|
58
81
|
}
|
|
59
82
|
|
|
60
83
|
@Ignore
|
|
61
84
|
@Test
|
|
62
|
-
fun
|
|
63
|
-
val detector = Anagram("
|
|
64
|
-
val anagrams = detector.match(listOf("
|
|
65
|
-
assertEquals(
|
|
85
|
+
fun detectsAnagramsUsingCaseInsensitiveSubject() {
|
|
86
|
+
val detector = Anagram("Orchestra")
|
|
87
|
+
val anagrams = detector.match(listOf("cashregister", "carthorse", "radishes"))
|
|
88
|
+
assertEquals(setOf("carthorse"), anagrams)
|
|
66
89
|
}
|
|
67
90
|
|
|
68
91
|
@Ignore
|
|
69
92
|
@Test
|
|
70
|
-
fun
|
|
71
|
-
val detector = Anagram("
|
|
72
|
-
val anagrams = detector.match(listOf("
|
|
73
|
-
assertEquals(
|
|
93
|
+
fun detectsAnagramsUsingCaseInsensitiveCandidates() {
|
|
94
|
+
val detector = Anagram("orchestra")
|
|
95
|
+
val anagrams = detector.match(listOf("cashregister", "Carthorse", "radishes"))
|
|
96
|
+
assertEquals(setOf("Carthorse"), anagrams)
|
|
74
97
|
}
|
|
75
98
|
|
|
76
99
|
@Ignore
|
|
77
100
|
@Test
|
|
78
|
-
fun
|
|
79
|
-
val detector = Anagram("
|
|
80
|
-
val anagrams = detector.match(listOf("
|
|
81
|
-
assertEquals(
|
|
101
|
+
fun doesNotDetectIdenticalWordWithMixedCasingAsAnagram() {
|
|
102
|
+
val detector = Anagram("banana")
|
|
103
|
+
val anagrams = detector.match(listOf("Banana"))
|
|
104
|
+
assertEquals(emptySet(), anagrams)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
@Ignore
|
|
108
|
+
@Test
|
|
109
|
+
fun doesNotDetectAnAnagramIfTheOriginalWordIsRepeated() {
|
|
110
|
+
val detector = Anagram("go")
|
|
111
|
+
val anagrams = detector.match(listOf("go Go GO"))
|
|
112
|
+
assertEquals(emptySet(), anagrams)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
@Ignore
|
|
116
|
+
@Test
|
|
117
|
+
fun anagramsMustUseAllLettersExactlyOnce() {
|
|
118
|
+
val detector = Anagram("tapper")
|
|
119
|
+
val anagrams = detector.match(listOf("patter"))
|
|
120
|
+
assertEquals(emptySet(), anagrams)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
@Ignore
|
|
124
|
+
@Test
|
|
125
|
+
fun doesNotDetectIdenticalUppercasedWordAsAnagram() {
|
|
126
|
+
val detector = Anagram("BANANA")
|
|
127
|
+
val anagrams = detector.match(listOf("Banana"))
|
|
128
|
+
assertEquals(emptySet(), anagrams)
|
|
82
129
|
}
|
|
83
130
|
|
|
84
131
|
}
|