trackler 2.2.1.52 → 2.2.1.53

Sign up to get free protection for your applications and to get access to all the features.
Files changed (139) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/leap/canonical-data.json +2 -2
  4. data/tracks/cfml/tasks/FormatConfig.cfc +6 -4
  5. data/tracks/cfml/tasks/GenerateReadme.cfc +197 -0
  6. data/tracks/cfml/tasks/ScaffoldExercise.cfc +6 -0
  7. data/tracks/csharp/config.json +1 -1
  8. data/tracks/delphi/exercises/leap/uLeapTests.pas +1 -1
  9. data/tracks/fsharp/exercises/clock/Clock.fs +1 -1
  10. data/tracks/fsharp/exercises/clock/ClockTest.fs +239 -61
  11. data/tracks/fsharp/exercises/clock/Example.fs +3 -3
  12. data/tracks/fsharp/exercises/dominoes/DominoesTest.fs +29 -26
  13. data/tracks/fsharp/exercises/largest-series-product/LargestSeriesProductTest.fs +30 -15
  14. data/tracks/fsharp/exercises/leap/LeapTest.fs +2 -2
  15. data/tracks/fsharp/exercises/rectangles/Example.fs +1 -1
  16. data/tracks/fsharp/exercises/rectangles/Rectangles.fs +1 -1
  17. data/tracks/fsharp/exercises/rectangles/RectanglesTest.fs +66 -43
  18. data/tracks/fsharp/generators/Generators.fs +85 -1
  19. data/tracks/java/scripts/canonical_data_check.sh +8 -0
  20. data/tracks/kotlin/.gitignore +1 -0
  21. data/tracks/kotlin/exercises/acronym/.meta/version +1 -0
  22. data/tracks/kotlin/exercises/acronym/src/test/kotlin/AcronymTest.kt +9 -10
  23. data/tracks/kotlin/exercises/all-your-base/.meta/version +1 -1
  24. data/tracks/kotlin/exercises/all-your-base/src/test/kotlin/BaseConverterTest.kt +20 -20
  25. data/tracks/kotlin/exercises/allergies/.meta/version +1 -0
  26. data/tracks/kotlin/exercises/allergies/src/test/kotlin/AllergiesTest.kt +19 -72
  27. data/tracks/kotlin/exercises/anagram/.meta/src/reference/kotlin/Anagram.kt +7 -4
  28. data/tracks/kotlin/exercises/anagram/.meta/version +1 -0
  29. data/tracks/kotlin/exercises/anagram/src/test/kotlin/AnagramTest.kt +76 -29
  30. data/tracks/kotlin/exercises/atbash-cipher/.meta/version +1 -0
  31. data/tracks/kotlin/exercises/atbash-cipher/src/test/kotlin/AtbashTest.kt +6 -3
  32. data/tracks/kotlin/exercises/beer-song/.meta/version +1 -0
  33. data/tracks/kotlin/exercises/beer-song/src/test/kotlin/BeerSongTest.kt +21 -46
  34. data/tracks/kotlin/exercises/binary-search/.meta/version +1 -0
  35. data/tracks/kotlin/exercises/binary-search/src/test/kotlin/BinarySearchTest.kt +30 -19
  36. data/tracks/kotlin/exercises/bob/.meta/src/reference/kotlin/Bob.kt +8 -7
  37. data/tracks/kotlin/exercises/bob/.meta/version +1 -0
  38. data/tracks/kotlin/exercises/bob/src/test/kotlin/BobTest.kt +57 -15
  39. data/tracks/kotlin/exercises/bracket-push/.meta/version +1 -0
  40. data/tracks/kotlin/exercises/bracket-push/src/test/kotlin/BracketPushTest.kt +3 -1
  41. data/tracks/kotlin/exercises/collatz-conjecture/.meta/version +1 -1
  42. data/tracks/kotlin/exercises/difference-of-squares/.meta/version +1 -0
  43. data/tracks/kotlin/exercises/difference-of-squares/src/test/kotlin/SquaresTest.kt +10 -23
  44. data/tracks/kotlin/exercises/etl/.meta/src/reference/kotlin/ETL.kt +7 -1
  45. data/tracks/kotlin/exercises/etl/.meta/version +1 -0
  46. data/tracks/kotlin/exercises/etl/src/test/kotlin/ETLTest.kt +10 -10
  47. data/tracks/kotlin/exercises/flatten-array/.meta/version +1 -0
  48. data/tracks/kotlin/exercises/flatten-array/src/test/kotlin/FlattenerTest.kt +8 -16
  49. data/tracks/kotlin/exercises/gigasecond/.meta/version +1 -0
  50. data/tracks/kotlin/exercises/gigasecond/src/test/kotlin/GigasecondTest.kt +1 -1
  51. data/tracks/kotlin/exercises/hamming/.meta/src/reference/kotlin/Hamming.kt +1 -1
  52. data/tracks/kotlin/exercises/hamming/.meta/version +1 -1
  53. data/tracks/kotlin/exercises/hamming/src/test/kotlin/HammingTest.kt +4 -4
  54. data/tracks/kotlin/exercises/hello-world/.meta/version +1 -0
  55. data/tracks/kotlin/exercises/hello-world/src/test/kotlin/HelloWorldTest.kt +1 -1
  56. data/tracks/kotlin/exercises/isogram/.meta/version +1 -0
  57. data/tracks/kotlin/exercises/isogram/src/test/kotlin/IsogramTest.kt +5 -8
  58. data/tracks/kotlin/exercises/largest-series-product/.meta/src/reference/kotlin/Series.kt +2 -3
  59. data/tracks/kotlin/exercises/largest-series-product/.meta/version +1 -0
  60. data/tracks/kotlin/exercises/largest-series-product/src/test/kotlin/SeriesTest.kt +97 -0
  61. data/tracks/kotlin/exercises/leap/.meta/version +1 -0
  62. data/tracks/kotlin/exercises/leap/src/test/kotlin/LeapTest.kt +8 -26
  63. data/tracks/kotlin/exercises/list-ops/.meta/version +1 -1
  64. data/tracks/kotlin/exercises/luhn/.meta/version +1 -0
  65. data/tracks/kotlin/exercises/luhn/src/test/kotlin/LuhnTest.kt +0 -3
  66. data/tracks/kotlin/exercises/nth-prime/.meta/version +1 -0
  67. data/tracks/kotlin/exercises/nth-prime/src/test/kotlin/PrimeTest.kt +0 -2
  68. data/tracks/kotlin/exercises/nucleotide-count/.meta/src/reference/kotlin/{DNA.kt → Dna.kt} +3 -8
  69. data/tracks/kotlin/exercises/nucleotide-count/.meta/version +1 -0
  70. data/tracks/kotlin/exercises/nucleotide-count/src/test/kotlin/DnaTest.kt +48 -0
  71. data/tracks/kotlin/exercises/pangram/.meta/src/reference/kotlin/{Pangrams.kt → Pangram.kt} +1 -1
  72. data/tracks/kotlin/exercises/pangram/.meta/version +1 -1
  73. data/tracks/kotlin/exercises/pangram/src/test/kotlin/PangramTest.kt +15 -9
  74. data/tracks/kotlin/exercises/pascals-triangle/.meta/version +1 -0
  75. data/tracks/kotlin/exercises/pascals-triangle/src/test/kotlin/PascalsTriangleTest.kt +32 -14
  76. data/tracks/kotlin/exercises/perfect-numbers/.meta/src/reference/kotlin/NaturalNumber.kt +1 -1
  77. data/tracks/kotlin/exercises/perfect-numbers/.meta/version +1 -0
  78. data/tracks/kotlin/exercises/perfect-numbers/src/test/kotlin/{PerfectNumbersTest.kt → NaturalNumberTest.kt} +25 -7
  79. data/tracks/kotlin/exercises/phone-number/.meta/src/reference/kotlin/PhoneNumber.kt +15 -7
  80. data/tracks/kotlin/exercises/phone-number/.meta/version +1 -0
  81. data/tracks/kotlin/exercises/phone-number/src/test/kotlin/PhoneNumberTest.kt +46 -29
  82. data/tracks/kotlin/exercises/pig-latin/.meta/src/reference/kotlin/PigLatin.kt +2 -2
  83. data/tracks/kotlin/exercises/pig-latin/.meta/version +1 -0
  84. data/tracks/kotlin/exercises/pig-latin/src/test/kotlin/PigLatinTest.kt +21 -10
  85. data/tracks/kotlin/exercises/raindrops/.meta/version +1 -0
  86. data/tracks/kotlin/exercises/raindrops/src/test/kotlin/RaindropsTest.kt +19 -26
  87. data/tracks/kotlin/exercises/react/.meta/version +1 -0
  88. data/tracks/kotlin/exercises/react/src/test/kotlin/ReactTest.kt +11 -4
  89. data/tracks/kotlin/exercises/robot-simulator/.meta/version +1 -1
  90. data/tracks/kotlin/exercises/roman-numerals/.meta/version +1 -0
  91. data/tracks/kotlin/exercises/roman-numerals/src/test/kotlin/RomanNumeralTest.kt +1 -2
  92. data/tracks/kotlin/exercises/rotational-cipher/.meta/version +1 -1
  93. data/tracks/kotlin/exercises/rotational-cipher/src/test/kotlin/RotationalCipherTest.kt +7 -7
  94. data/tracks/kotlin/exercises/scrabble-score/.meta/src/reference/kotlin/{Scrabble.kt → ScrabbleScore.kt} +1 -1
  95. data/tracks/kotlin/exercises/scrabble-score/.meta/version +1 -0
  96. data/tracks/kotlin/exercises/scrabble-score/src/test/kotlin/ScrabbleScoreTest.kt +9 -7
  97. data/tracks/kotlin/exercises/sieve/.meta/version +1 -0
  98. data/tracks/kotlin/exercises/sieve/src/test/kotlin/SieveTest.kt +8 -0
  99. data/tracks/kotlin/exercises/space-age/.meta/version +1 -0
  100. data/tracks/kotlin/exercises/space-age/src/test/kotlin/SpaceAgeTest.kt +1 -16
  101. data/tracks/kotlin/exercises/sum-of-multiples/.meta/version +1 -0
  102. data/tracks/kotlin/exercises/sum-of-multiples/src/test/kotlin/SumOfMultiplesTest.kt +7 -7
  103. data/tracks/kotlin/exercises/triangle/.meta/version +1 -0
  104. data/tracks/kotlin/exercises/two-fer/.meta/version +1 -0
  105. data/tracks/kotlin/exercises/two-fer/src/test/kotlin/TwoferTest.kt +0 -1
  106. data/tracks/kotlin/exercises/word-count/.meta/src/reference/kotlin/WordCount.kt +6 -2
  107. data/tracks/kotlin/exercises/word-count/.meta/version +1 -0
  108. data/tracks/kotlin/exercises/word-count/src/test/kotlin/WordCountTest.kt +31 -9
  109. data/tracks/kotlin/scripts/canonical_data_check.sh +8 -0
  110. data/tracks/perl6/exercises/leap/leap.t +2 -2
  111. data/tracks/php/config.json +16 -0
  112. data/tracks/php/exercises/crypto-square/crypto-square_test.php +50 -0
  113. data/tracks/php/exercises/crypto-square/example.php +32 -0
  114. data/tracks/php/exercises/meetup/README.md +21 -0
  115. data/tracks/php/exercises/meetup/example.php +19 -0
  116. data/tracks/php/exercises/meetup/meetup_test.php +577 -0
  117. data/tracks/python/README.md +7 -5
  118. data/tracks/python/config.json +36 -27
  119. data/tracks/python/docs/TESTS.md +36 -12
  120. data/tracks/python/exercises/complex-numbers/complex_numbers_test.py +1 -1
  121. data/tracks/python/exercises/diffie-hellman/.meta/hints.md +16 -0
  122. data/tracks/python/exercises/diffie-hellman/README.md +15 -2
  123. data/tracks/python/exercises/error-handling/README.md +23 -0
  124. data/tracks/python/exercises/error-handling/error_handling.py +14 -0
  125. data/tracks/python/exercises/error-handling/error_handling_test.py +66 -0
  126. data/tracks/python/exercises/error-handling/example.py +21 -0
  127. data/tracks/python/exercises/forth/forth_test.py +1 -1
  128. data/tracks/python/exercises/isogram/isogram_test.py +5 -3
  129. data/tracks/python/exercises/leap/leap_test.py +2 -2
  130. data/tracks/python/exercises/rotational-cipher/rotational_cipher_test.py +4 -4
  131. data/tracks/python/exercises/simple-cipher/.meta/hints.md +16 -0
  132. data/tracks/python/exercises/simple-cipher/README.md +17 -0
  133. data/tracks/python/exercises/sum-of-multiples/sum_of_multiples_test.py +4 -1
  134. data/tracks/python/exercises/twelve-days/example.py +3 -3
  135. data/tracks/python/exercises/twelve-days/twelve_days.py +2 -2
  136. metadata +53 -9
  137. data/tracks/kotlin/exercises/largest-series-product/src/test/kotlin/SeriesInvalidInputTest.kt +0 -30
  138. data/tracks/kotlin/exercises/largest-series-product/src/test/kotlin/SeriesValidInputTest.kt +0 -34
  139. data/tracks/kotlin/exercises/nucleotide-count/src/test/kotlin/NucleotideTest.kt +0 -87
@@ -1,5 +1,11 @@
1
1
  object ETL {
2
+
2
3
  fun transform(old: Map<Int, Collection<Char>>): Map<Char, Int> {
3
- return old.flatMap { mapEntry -> mapEntry.value.map { word -> Pair(word.toLowerCase(), mapEntry.key) } }.toMap()
4
+ return old.flatMap { mapEntry ->
5
+ mapEntry.value.map { word ->
6
+ Pair(word.toLowerCase(), mapEntry.key)
7
+ }
8
+ }.toMap()
4
9
  }
10
+
5
11
  }
@@ -4,10 +4,9 @@ import kotlin.test.assertEquals
4
4
 
5
5
  class ETLTest {
6
6
 
7
-
8
7
  @Test
9
- fun transformOneValue() {
10
- val old = mapOf(1 to listOf('a'))
8
+ fun aSingleLetter() {
9
+ val old = mapOf(1 to listOf('A'))
11
10
  val expected = mapOf('a' to 1)
12
11
 
13
12
  assertEquals(expected, ETL.transform(old))
@@ -15,25 +14,25 @@ class ETLTest {
15
14
 
16
15
  @Ignore
17
16
  @Test
18
- fun transformMoreValues() {
19
- val old = mapOf(1 to listOf('A', 'E', 'I'))
20
- val expected = mapOf('a' to 1, 'e' to 1, 'i' to 1)
17
+ fun singleScoreWithMultipleLetters() {
18
+ val old = mapOf(1 to listOf('A', 'E', 'I', 'O', 'U'))
19
+ val expected = mapOf('a' to 1, 'e' to 1, 'i' to 1, 'o' to 1, 'u' to 1)
21
20
 
22
21
  assertEquals(expected, ETL.transform(old))
23
22
  }
24
23
 
25
24
  @Ignore
26
25
  @Test
27
- fun moreKeys() {
28
- val old = mapOf(1 to listOf('A', 'E', 'I'), 2 to listOf('D', 'G'))
29
- val expected = mapOf('a' to 1, 'e' to 1, 'i' to 1, 'd' to 2, 'g' to 2)
26
+ fun multipleScoresWithMultipleLetters() {
27
+ val old = mapOf(1 to listOf('A', 'E'), 2 to listOf('D', 'G'))
28
+ val expected = mapOf('a' to 1, 'd' to 2, 'e' to 1, 'g' to 2)
30
29
 
31
30
  assertEquals(expected, ETL.transform(old))
32
31
  }
33
32
 
34
33
  @Ignore
35
34
  @Test
36
- fun fullDataset() {
35
+ fun multipleScoresWithDifferingNumbersOfLetters() {
37
36
  val old = mapOf(
38
37
  1 to listOf('A', 'E', 'I', 'O', 'U', 'L', 'N', 'R', 'S', 'T'),
39
38
  2 to listOf('D', 'G'),
@@ -54,4 +53,5 @@ class ETLTest {
54
53
 
55
54
  assertEquals(expected, ETL.transform(old))
56
55
  }
56
+
57
57
  }
@@ -4,24 +4,16 @@ import kotlin.test.assertEquals
4
4
 
5
5
  class FlattenerTest {
6
6
 
7
-
8
7
  @Test
9
- fun flattensANestedList() {
10
- val nestedList = listOf<Any>(emptyList<Any>())
11
- assertEquals(emptyList<Any>(), Flattener.flatten(nestedList))
8
+ fun flatListIsUnchanged() {
9
+ val flatList = listOf(0, 1, 2)
10
+ assertEquals(listOf(0, 1, 2), Flattener.flatten(flatList))
12
11
  }
13
12
 
14
13
  @Ignore
15
14
  @Test
16
15
  fun flattens2LevelNestedList() {
17
- val nestedList = listOf(1, listOf(2, 3, 4), 5)
18
- assertEquals(listOf(1, 2, 3, 4, 5), Flattener.flatten(nestedList))
19
- }
20
-
21
- @Ignore
22
- @Test
23
- fun flattens3LevelNestedList() {
24
- val nestedList = listOf(1, listOf(2, 3, 4), 5, listOf(6, listOf(7, 8)))
16
+ val nestedList = listOf(1, listOf(2, 3, 4, 5, 6, 7), 8)
25
17
  assertEquals(listOf(1, 2, 3, 4, 5, 6, 7, 8), Flattener.flatten(nestedList))
26
18
  }
27
19
 
@@ -42,15 +34,15 @@ class FlattenerTest {
42
34
  @Ignore
43
35
  @Test
44
36
  fun flattens6LevelNestedListWithNulls() {
45
- val nestedList = listOf(1, listOf(2, null, listOf(listOf(3), null), listOf(4, listOf(listOf(5))), 6, 7, listOf(listOf(null))), 8, null)
46
- assertEquals(listOf(1, 2, 3, 4, 5, 6, 7, 8), Flattener.flatten(nestedList))
37
+ val nestedList = listOf(0, 2, listOf(listOf(2, 3), 8, listOf(listOf(100)), null, listOf(listOf(null))), -2)
38
+ assertEquals(listOf(0, 2, 2, 3, 8, 100, -2), Flattener.flatten(nestedList))
47
39
  }
48
40
 
49
41
  @Ignore
50
42
  @Test
51
43
  fun allNullNestedListReturnsEmptyList() {
52
- val nestedList = listOf(null, listOf(null, listOf(null), listOf(listOf(listOf(null)))), null)
44
+ val nestedList = listOf(null, listOf(listOf(listOf(null))), null, null, listOf(listOf(null, null), null), null)
53
45
  assertEquals(emptyList<Any>(), Flattener.flatten(nestedList))
54
46
  }
55
- }
56
47
 
48
+ }
@@ -7,7 +7,6 @@ import kotlin.test.assertEquals
7
7
 
8
8
  class GigasecondTest {
9
9
 
10
-
11
10
  @Test
12
11
  fun modernTime() {
13
12
  val gigaSecond = Gigasecond(LocalDate.of(2011, Month.APRIL, 25))
@@ -46,4 +45,5 @@ class GigasecondTest {
46
45
 
47
46
  assertEquals(LocalDateTime.of(2046, Month.OCTOBER, 3, 1, 46, 39), gigaSecond.date)
48
47
  }
48
+
49
49
  }
@@ -1,7 +1,7 @@
1
1
  object Hamming {
2
2
 
3
3
  fun compute(leftStrand: String, rightStrand: String): Int {
4
- require(leftStrand.length == rightStrand.length, {"leftStrand and rightStrand must be of equal length."})
4
+ require(leftStrand.length == rightStrand.length, {"left and right strands must be of equal length."})
5
5
 
6
6
  val commonPairs = leftStrand.zip(rightStrand)
7
7
  return commonPairs.count { it.first != it.second }
@@ -1 +1 @@
1
- 1.1.0
1
+ 2.0.1
@@ -60,13 +60,13 @@ class HammingTest {
60
60
  @Ignore
61
61
  @Test
62
62
  fun nonUniqueCharacterInFirstStrand() {
63
- assertEquals(1, Hamming.compute("AGA", "AGG"))
63
+ assertEquals(1, Hamming.compute("AAG", "AAA"))
64
64
  }
65
65
 
66
66
  @Ignore
67
67
  @Test
68
68
  fun nonUniqueCharacterInSecondStrand() {
69
- assertEquals(1, Hamming.compute("AGG", "AGA"))
69
+ assertEquals(1, Hamming.compute("AAA", "AAG"))
70
70
  }
71
71
 
72
72
  @Ignore
@@ -91,7 +91,7 @@ class HammingTest {
91
91
  @Test
92
92
  fun validatesFirstStrandNotLonger() {
93
93
  expectedException.expect(IllegalArgumentException::class.java)
94
- expectedException.expectMessage("leftStrand and rightStrand must be of equal length.")
94
+ expectedException.expectMessage("left and right strands must be of equal length.")
95
95
 
96
96
  Hamming.compute("AATG", "AAA")
97
97
  }
@@ -100,7 +100,7 @@ class HammingTest {
100
100
  @Test
101
101
  fun validatesSecondStrandNotLonger() {
102
102
  expectedException.expect(IllegalArgumentException::class.java)
103
- expectedException.expectMessage("leftStrand and rightStrand must be of equal length.")
103
+ expectedException.expectMessage("left and right strands must be of equal length.")
104
104
 
105
105
  Hamming.compute("ATA", "AGTG")
106
106
  }
@@ -1,11 +1,11 @@
1
1
  import org.junit.Test
2
2
  import kotlin.test.assertEquals
3
3
 
4
-
5
4
  class HelloWorldTest {
6
5
 
7
6
  @Test
8
7
  fun helloWorldTest() {
9
8
  assertEquals("Hello, World!", hello())
10
9
  }
10
+
11
11
  }
@@ -1,6 +1,4 @@
1
-
2
1
  import org.junit.Test
3
- import org.junit.Ignore
4
2
  import org.junit.runner.RunWith
5
3
  import org.junit.runners.Parameterized
6
4
  import kotlin.test.assertEquals
@@ -12,22 +10,21 @@ class IsogramTest(val input: String, val expectedOutput: Boolean) {
12
10
  @JvmStatic
13
11
  @Parameterized.Parameters(name = "{index}: isogram({0})={1}")
14
12
  fun data() = listOf(
15
- arrayOf("duplicates", true),
13
+ arrayOf("", true),
14
+ arrayOf("isogram", true),
16
15
  arrayOf("eleven", false),
17
16
  arrayOf("subdermatoglyphic", true),
18
17
  arrayOf("Alphabet", false),
19
18
  arrayOf("thumbscrew-japingly", true),
20
- arrayOf("Hjelmqvist-Gryb-Zock-Pfund-Wax", true),
21
- arrayOf("Heizölrückstoßabdämpfung", true),
22
- arrayOf("the quick brown fox", false),
19
+ arrayOf("six-year-old", true),
23
20
  arrayOf("Emily Jung Schwartzkopf", true),
24
- arrayOf("éléphant", false)
21
+ arrayOf("accentor", false)
25
22
  )
26
23
  }
27
24
 
28
-
29
25
  @Test
30
26
  fun test() {
31
27
  assertEquals(expectedOutput, Isogram.isIsogram(input))
32
28
  }
29
+
33
30
  }
@@ -1,6 +1,6 @@
1
1
  import java.lang.Math.max
2
2
 
3
- class Series(val digits: String) {
3
+ class Series(private val digits: String) {
4
4
 
5
5
  init {
6
6
  require(digits.all { it.isDigit() })
@@ -14,7 +14,6 @@ class Series(val digits: String) {
14
14
  return 1
15
15
  }
16
16
 
17
-
18
17
  return calculateRec(digits.map { it.intValue() }, span, 0)
19
18
  }
20
19
 
@@ -42,4 +41,4 @@ fun Char.intDiff(other: Char) = this.toInt() - other.toInt()
42
41
 
43
42
  fun List<Int>.prod() : Long = this.fold(1L) {productSoFar, item -> item*productSoFar}
44
43
 
45
- fun <T> List<T>.tail() = this.subList(1, this.size)
44
+ fun <T> List<T>.tail() = this.subList(1, this.size)
@@ -0,0 +1,97 @@
1
+
2
+ import org.junit.Test
3
+ import org.junit.Ignore
4
+ import kotlin.test.assertEquals
5
+
6
+ class SeriesTest {
7
+
8
+ @Test
9
+ fun findsTheLargestProductIfSpanEqualsLength() {
10
+ assertEquals(18, Series("29").getLargestProduct(2))
11
+ }
12
+
13
+ @Ignore
14
+ @Test
15
+ fun findsTheLargestProductOf2WithNumbersInOrder() {
16
+ assertEquals(72, Series("0123456789").getLargestProduct(2))
17
+ }
18
+
19
+ @Ignore
20
+ @Test
21
+ fun findsTheLargestProductOf2() {
22
+ assertEquals(48, Series("576802143").getLargestProduct(2))
23
+ }
24
+
25
+ @Ignore
26
+ @Test
27
+ fun findsTheLargestProductOf3WithNumbersInOrder() {
28
+ assertEquals(504, Series("0123456789").getLargestProduct(3))
29
+ }
30
+
31
+ @Ignore
32
+ @Test
33
+ fun findsTheLargestProductOf3() {
34
+ assertEquals(270, Series("1027839564").getLargestProduct(3))
35
+ }
36
+
37
+ @Ignore
38
+ @Test
39
+ fun findsTheLargestProductOf5WithNumbersInOrder() {
40
+ assertEquals(15120, Series("0123456789").getLargestProduct(5))
41
+ }
42
+
43
+ @Ignore
44
+ @Test
45
+ fun findsTheLargestProductWithinABigNumber() {
46
+ assertEquals(23520, Series("73167176531330624919225119674426574742355349194934").getLargestProduct(6))
47
+ }
48
+
49
+ @Ignore
50
+ @Test
51
+ fun reports0IfAllDigitsAre0() {
52
+ assertEquals(0, Series("0000").getLargestProduct(2))
53
+ }
54
+
55
+ @Ignore
56
+ @Test
57
+ fun reports0IfAllSpansInclude0() {
58
+ assertEquals(0, Series("99099").getLargestProduct(3))
59
+ }
60
+
61
+ @Ignore
62
+ @Test(expected = IllegalArgumentException::class)
63
+ fun rejectsSpanLongerThanStringLength() {
64
+ Series("123").getLargestProduct(4)
65
+ }
66
+
67
+ @Ignore
68
+ @Test
69
+ fun reports1ForEmptyStringAndEmptyProduct() {
70
+ assertEquals(1, Series("").getLargestProduct(0))
71
+ }
72
+
73
+ @Ignore
74
+ @Test
75
+ fun reports1ForNonEmptyStringAndEmptyProduct() {
76
+ assertEquals(1, Series("123").getLargestProduct(0))
77
+ }
78
+
79
+ @Ignore
80
+ @Test(expected = IllegalArgumentException::class)
81
+ fun rejectsEmptyStringAndNonZeroSpan() {
82
+ Series("").getLargestProduct(1)
83
+ }
84
+
85
+ @Ignore
86
+ @Test(expected = IllegalArgumentException::class)
87
+ fun rejectsInvalidCharacterInDigits() {
88
+ Series("1234a5")
89
+ }
90
+
91
+ @Ignore
92
+ @Test(expected = IllegalArgumentException::class)
93
+ fun rejectsNegativeSpan() {
94
+ Series("12345").getLargestProduct(-1)
95
+ }
96
+
97
+ }
@@ -5,45 +5,27 @@ import kotlin.test.assertTrue
5
5
 
6
6
  class LeapTest {
7
7
 
8
-
9
- @Test
10
- fun leapYear() {
11
- assertTrue(Year(1996).isLeap)
12
- }
13
-
14
- @Ignore
15
- @Test
16
- fun standardOddYear() {
17
- assertFalse(Year(1997).isLeap)
18
- }
19
-
20
- @Ignore
21
8
  @Test
22
- fun standardEvenYear() {
23
- assertFalse(Year(1998).isLeap)
9
+ fun yearNotDivisibleBy4() {
10
+ assertFalse(Year(2015).isLeap)
24
11
  }
25
12
 
26
13
  @Ignore
27
14
  @Test
28
- fun standardNineteenthCentury() {
29
- assertFalse(Year(1900).isLeap)
15
+ fun yearDivisibleBy4NotDivisibleBy100() {
16
+ assertTrue(Year(2020).isLeap)
30
17
  }
31
18
 
32
19
  @Ignore
33
20
  @Test
34
- fun standardEighteenthCentury() {
35
- assertFalse(Year(1800).isLeap)
21
+ fun yearDivisibleBy100NotDivisibleBy400() {
22
+ assertFalse(Year(2100).isLeap)
36
23
  }
37
24
 
38
25
  @Ignore
39
26
  @Test
40
- fun leapTwentyFourthCentury() {
41
- assertTrue(Year(2400).isLeap)
42
- }
43
-
44
- @Ignore
45
- @Test
46
- fun leapY2K() {
27
+ fun yearDivisibleBy400() {
47
28
  assertTrue(Year(2000).isLeap)
48
29
  }
30
+
49
31
  }
@@ -1 +1 @@
1
- 1.0.0
1
+ 2.0.0
@@ -5,7 +5,6 @@ import kotlin.test.assertTrue
5
5
 
6
6
  class LuhnTest {
7
7
 
8
-
9
8
  @Test
10
9
  fun singleDigitStringsCannotBeValid() {
11
10
  assertFalse(Luhn.isValid("1"))
@@ -21,14 +20,12 @@ class LuhnTest {
21
20
  @Test
22
21
  fun simpleValidSINThatRemainsValidIfReversed() {
23
22
  assertTrue(Luhn.isValid("059"))
24
- assertTrue(Luhn.isValid("950"))
25
23
  }
26
24
 
27
25
  @Ignore
28
26
  @Test
29
27
  fun simpleValidSINThatBecomesInvalidIfReversed() {
30
28
  assertTrue(Luhn.isValid("59"))
31
- assertFalse(Luhn.isValid("95"))
32
29
  }
33
30
 
34
31
  @Ignore