trackler 2.2.1.88 → 2.2.1.89
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/problem-specifications/exercises/bowling/canonical-data.json +95 -39
- data/problem-specifications/exercises/gigasecond/canonical-data.json +17 -7
- data/problem-specifications/exercises/pangram/canonical-data.json +32 -12
- data/problem-specifications/exercises/say/canonical-data.json +47 -17
- data/problem-specifications/exercises/sum-of-multiples/canonical-data.json +54 -28
- data/problem-specifications/exercises/triangle/canonical-data.json +52 -18
- data/problem-specifications/exercises/two-bucket/canonical-data.json +38 -26
- data/problem-specifications/exercises/two-fer/canonical-data.json +14 -8
- data/problem-specifications/exercises/word-count/canonical-data.json +35 -13
- data/problem-specifications/exercises/wordy/canonical-data.json +50 -18
- data/tracks/bash/exercises/leap/.meta/version +1 -0
- data/tracks/bash/exercises/leap/example.sh +9 -9
- data/tracks/bash/exercises/leap/leap_test.sh +17 -33
- data/tracks/ceylon/exercises/anagram/source/anagram/AnagramTest.ceylon +1 -1
- data/tracks/ceylon/exercises/bracket-push/source/bracketpush/BracketsTest.ceylon +1 -1
- data/tracks/ceylon/exercises/rna-transcription/source/rnatranscription/RNATest.ceylon +2 -1
- data/tracks/fsharp/build.cake +2 -7
- data/tracks/fsharp/exercises/acronym/AcronymTest.fs +1 -1
- data/tracks/fsharp/exercises/all-your-base/AllYourBase.fs +1 -1
- data/tracks/fsharp/exercises/all-your-base/AllYourBaseTest.fs +43 -43
- data/tracks/fsharp/exercises/all-your-base/Example.fs +5 -5
- data/tracks/fsharp/exercises/allergies/AllergiesTest.fs +1 -1
- data/tracks/fsharp/exercises/alphametics/AlphameticsTest.fs +19 -1
- data/tracks/fsharp/exercises/alphametics/Example.fs +53 -34
- data/tracks/fsharp/exercises/anagram/AnagramTest.fs +1 -1
- data/tracks/fsharp/exercises/atbash-cipher/AtbashCipherTest.fs +1 -1
- data/tracks/fsharp/exercises/beer-song/BeerSongTest.fs +1 -1
- data/tracks/fsharp/exercises/binary-search/BinarySearchTest.fs +1 -1
- data/tracks/fsharp/exercises/bob/BobTest.fs +1 -1
- data/tracks/fsharp/exercises/book-store/BookStoreTest.fs +1 -1
- data/tracks/fsharp/exercises/bracket-push/BracketPushTest.fs +1 -1
- data/tracks/fsharp/exercises/change/ChangeTest.fs +1 -1
- data/tracks/fsharp/exercises/collatz-conjecture/CollatzConjectureTest.fs +1 -1
- data/tracks/fsharp/exercises/connect/ConnectTest.fs +1 -1
- data/tracks/fsharp/exercises/crypto-square/CryptoSquareTest.fs +1 -1
- data/tracks/fsharp/exercises/difference-of-squares/DifferenceOfSquaresTest.fs +1 -1
- data/tracks/fsharp/exercises/dominoes/DominoesTest.fs +25 -25
- data/tracks/fsharp/exercises/etl/EtlTest.fs +8 -8
- data/tracks/fsharp/exercises/isbn-verifier/IsbnVerifierTest.fs +5 -1
- data/tracks/fsharp/exercises/luhn/LuhnTest.fs +1 -1
- data/tracks/fsharp/exercises/meetup/Example.fs +11 -11
- data/tracks/fsharp/exercises/meetup/Meetup.fs +2 -2
- data/tracks/fsharp/exercises/meetup/MeetupTest.fs +96 -96
- data/tracks/fsharp/exercises/robot-simulator/Example.fs +21 -21
- data/tracks/fsharp/exercises/robot-simulator/RobotSimulator.fs +5 -5
- data/tracks/fsharp/exercises/robot-simulator/RobotSimulatorTest.fs +78 -96
- data/tracks/fsharp/generators/CanonicalData.fs +50 -4
- data/tracks/fsharp/generators/Common.fs +4 -13
- data/tracks/fsharp/generators/Exercise.fs +31 -15
- data/tracks/fsharp/generators/Generators.fs +76 -111
- data/tracks/haskell/exercises/alphametics/package.yaml +1 -1
- data/tracks/haskell/exercises/alphametics/test/Tests.hs +5 -0
- data/tracks/haskell/exercises/bowling/package.yaml +1 -1
- data/tracks/haskell/exercises/pangram/package.yaml +1 -1
- data/tracks/haskell/exercises/say/package.yaml +1 -1
- data/tracks/haskell/exercises/sum-of-multiples/package.yaml +1 -1
- data/tracks/haskell/exercises/word-count/package.yaml +1 -1
- data/tracks/haskell/exercises/wordy/package.yaml +1 -1
- data/tracks/java/exercises/nucleotide-count/.meta/hints.md +58 -0
- data/tracks/java/exercises/nucleotide-count/README.md +62 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 54dcd4e9322bb9c0319c133fdbd385c681223090
|
4
|
+
data.tar.gz: 70685e822782caa9d0154d29d929809c87468a2c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 85c27aebbbfa56706709ada5850ab5b85afb1d2a7d51fdd9ed7fbc94b3c976f125e9b2c13082719c95b4b4bef6d151964460dba1350e4d0eac166cf5135152c4
|
7
|
+
data.tar.gz: 449d36d2f05e4271075a1cab1cd17d1b407ce7b817bfc67548862f17a3f4240b337be81a6c437337cfe4f1c1c77c222b035cd0133fa82a2570d3ef3e02d66a24
|
data/lib/trackler/version.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
{
|
2
2
|
"exercise": "bowling",
|
3
|
-
"version": "1.0
|
3
|
+
"version": "1.1.0",
|
4
4
|
"comments": [
|
5
5
|
"Students should implement roll and score methods.",
|
6
6
|
"Roll should accept a single integer.",
|
7
7
|
"Score should return the game's final score, when possible",
|
8
8
|
"For brevity the tests display all the previous rolls in an array;",
|
9
|
-
"each element of the
|
9
|
+
"each element of the previousRolls array should be passed to the roll method",
|
10
10
|
"and each of those previous rolls is expected to succeed.",
|
11
11
|
"",
|
12
12
|
"Two properties are tested:",
|
@@ -14,7 +14,7 @@
|
|
14
14
|
"`score`: All rolls succeed, and taking the score gives the expected result.",
|
15
15
|
"The expected result may be an integer score or an error.",
|
16
16
|
"",
|
17
|
-
"`roll`: All
|
17
|
+
"`roll`: All previousRolls succeed, and rolling the number of pins in `roll` produces the expected result.",
|
18
18
|
"Currently, all cases of this type result in errors.",
|
19
19
|
"",
|
20
20
|
"In all error cases you should expect an error as is idiomatic for your language",
|
@@ -23,150 +23,206 @@
|
|
23
23
|
"cases": [{
|
24
24
|
"description": "should be able to score a game with all zeros",
|
25
25
|
"property": "score",
|
26
|
-
"
|
26
|
+
"input": {
|
27
|
+
"previousRolls": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
28
|
+
},
|
27
29
|
"expected": 0
|
28
30
|
}, {
|
29
31
|
"description": "should be able to score a game with no strikes or spares",
|
30
32
|
"property": "score",
|
31
|
-
"
|
33
|
+
"input": {
|
34
|
+
"previousRolls": [3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6]
|
35
|
+
},
|
32
36
|
"expected": 90
|
33
37
|
}, {
|
34
38
|
"description": "a spare followed by zeros is worth ten points",
|
35
39
|
"property": "score",
|
36
|
-
"
|
40
|
+
"input": {
|
41
|
+
"previousRolls": [6, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
42
|
+
},
|
37
43
|
"expected": 10
|
38
44
|
}, {
|
39
45
|
"description": "points scored in the roll after a spare are counted twice",
|
40
46
|
"property": "score",
|
41
|
-
"
|
47
|
+
"input": {
|
48
|
+
"previousRolls": [6, 4, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
49
|
+
},
|
42
50
|
"expected": 16
|
43
51
|
}, {
|
44
52
|
"description": "consecutive spares each get a one roll bonus",
|
45
53
|
"property": "score",
|
46
|
-
"
|
54
|
+
"input": {
|
55
|
+
"previousRolls": [5, 5, 3, 7, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
56
|
+
},
|
47
57
|
"expected": 31
|
48
58
|
}, {
|
49
59
|
"description": "a spare in the last frame gets a one roll bonus that is counted once",
|
50
60
|
"property": "score",
|
51
|
-
"
|
61
|
+
"input": {
|
62
|
+
"previousRolls": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 3, 7]
|
63
|
+
},
|
52
64
|
"expected": 17
|
53
65
|
}, {
|
54
66
|
"description": "a strike earns ten points in a frame with a single roll",
|
55
67
|
"property": "score",
|
56
|
-
"
|
68
|
+
"input": {
|
69
|
+
"previousRolls": [10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
70
|
+
},
|
57
71
|
"expected": 10
|
58
72
|
}, {
|
59
73
|
"description": "points scored in the two rolls after a strike are counted twice as a bonus",
|
60
74
|
"property": "score",
|
61
|
-
"
|
75
|
+
"input": {
|
76
|
+
"previousRolls": [10, 5, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
77
|
+
},
|
62
78
|
"expected": 26
|
63
79
|
}, {
|
64
80
|
"description": "consecutive strikes each get the two roll bonus",
|
65
81
|
"property": "score",
|
66
|
-
"
|
82
|
+
"input": {
|
83
|
+
"previousRolls": [10, 10, 10, 5, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
84
|
+
},
|
67
85
|
"expected": 81
|
68
86
|
}, {
|
69
87
|
"description": "a strike in the last frame gets a two roll bonus that is counted once",
|
70
88
|
"property": "score",
|
71
|
-
"
|
89
|
+
"input": {
|
90
|
+
"previousRolls": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 7, 1]
|
91
|
+
},
|
72
92
|
"expected": 18
|
73
93
|
}, {
|
74
94
|
"description": "rolling a spare with the two roll bonus does not get a bonus roll",
|
75
95
|
"property": "score",
|
76
|
-
"
|
96
|
+
"input": {
|
97
|
+
"previousRolls": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 7, 3]
|
98
|
+
},
|
77
99
|
"expected": 20
|
78
100
|
}, {
|
79
101
|
"description": "strikes with the two roll bonus do not get bonus rolls",
|
80
102
|
"property": "score",
|
81
|
-
"
|
103
|
+
"input": {
|
104
|
+
"previousRolls": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10]
|
105
|
+
},
|
82
106
|
"expected": 30
|
83
107
|
}, {
|
84
108
|
"description": "a strike with the one roll bonus after a spare in the last frame does not get a bonus",
|
85
109
|
"property": "score",
|
86
|
-
"
|
110
|
+
"input": {
|
111
|
+
"previousRolls": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 3, 10]
|
112
|
+
},
|
87
113
|
"expected": 20
|
88
114
|
}, {
|
89
115
|
"description": "all strikes is a perfect game",
|
90
116
|
"property": "score",
|
91
|
-
"
|
117
|
+
"input": {
|
118
|
+
"previousRolls": [10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10]
|
119
|
+
},
|
92
120
|
"expected": 300
|
93
121
|
}, {
|
94
122
|
"description": "rolls cannot score negative points",
|
95
123
|
"property": "roll",
|
96
|
-
"
|
97
|
-
|
124
|
+
"input": {
|
125
|
+
"previousRolls": [],
|
126
|
+
"roll": -1
|
127
|
+
},
|
98
128
|
"expected": {"error": "Negative roll is invalid"}
|
99
129
|
}, {
|
100
130
|
"description": "a roll cannot score more than 10 points",
|
101
131
|
"property": "roll",
|
102
|
-
"
|
103
|
-
|
132
|
+
"input": {
|
133
|
+
"previousRolls": [],
|
134
|
+
"roll": 11
|
135
|
+
},
|
104
136
|
"expected": {"error": "Pin count exceeds pins on the lane"}
|
105
137
|
}, {
|
106
138
|
"description": "two rolls in a frame cannot score more than 10 points",
|
107
139
|
"property": "roll",
|
108
|
-
"
|
109
|
-
|
140
|
+
"input": {
|
141
|
+
"previousRolls": [5],
|
142
|
+
"roll": 6
|
143
|
+
},
|
110
144
|
"expected": {"error": "Pin count exceeds pins on the lane"}
|
111
145
|
}, {
|
112
146
|
"description": "bonus roll after a strike in the last frame cannot score more than 10 points",
|
113
147
|
"property": "roll",
|
114
|
-
"
|
115
|
-
|
148
|
+
"input": {
|
149
|
+
"previousRolls": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10],
|
150
|
+
"roll": 11
|
151
|
+
},
|
116
152
|
"expected": {"error": "Pin count exceeds pins on the lane"}
|
117
153
|
}, {
|
118
154
|
"description": "two bonus rolls after a strike in the last frame cannot score more than 10 points",
|
119
155
|
"property": "roll",
|
120
|
-
"
|
121
|
-
|
156
|
+
"input": {
|
157
|
+
"previousRolls": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 5],
|
158
|
+
"roll": 6
|
159
|
+
},
|
122
160
|
"expected": {"error": "Pin count exceeds pins on the lane"}
|
123
161
|
}, {
|
124
162
|
"description": "two bonus rolls after a strike in the last frame can score more than 10 points if one is a strike",
|
125
163
|
"property": "score",
|
126
|
-
"
|
164
|
+
"input": {
|
165
|
+
"previousRolls": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 6]
|
166
|
+
},
|
127
167
|
"expected": 26
|
128
168
|
}, {
|
129
169
|
"description": "the second bonus rolls after a strike in the last frame cannot be a strike if the first one is not a strike",
|
130
170
|
"property": "roll",
|
131
|
-
"
|
132
|
-
|
171
|
+
"input": {
|
172
|
+
"previousRolls": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 6],
|
173
|
+
"roll": 10
|
174
|
+
},
|
133
175
|
"expected": {"error": "Pin count exceeds pins on the lane"}
|
134
176
|
}, {
|
135
177
|
"description": "second bonus roll after a strike in the last frame cannot score more than 10 points",
|
136
178
|
"property": "roll",
|
137
|
-
"
|
138
|
-
|
179
|
+
"input": {
|
180
|
+
"previousRolls": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10],
|
181
|
+
"roll": 11
|
182
|
+
},
|
139
183
|
"expected": {"error": "Pin count exceeds pins on the lane"}
|
140
184
|
}, {
|
141
185
|
"description": "an unstarted game cannot be scored",
|
142
186
|
"property": "score",
|
143
|
-
"
|
187
|
+
"input": {
|
188
|
+
"previousRolls": []
|
189
|
+
},
|
144
190
|
"expected": {"error": "Score cannot be taken until the end of the game"}
|
145
191
|
}, {
|
146
192
|
"description": "an incomplete game cannot be scored",
|
147
193
|
"property": "score",
|
148
|
-
"
|
194
|
+
"input": {
|
195
|
+
"previousRolls": [0, 0]
|
196
|
+
},
|
149
197
|
"expected": {"error": "Score cannot be taken until the end of the game"}
|
150
198
|
}, {
|
151
199
|
"description": "cannot roll if game already has ten frames",
|
152
200
|
"property": "roll",
|
153
|
-
"
|
154
|
-
|
201
|
+
"input": {
|
202
|
+
"previousRolls": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
203
|
+
"roll": 0
|
204
|
+
},
|
155
205
|
"expected": {"error": "Cannot roll after game is over"}
|
156
206
|
}, {
|
157
207
|
"description": "bonus rolls for a strike in the last frame must be rolled before score can be calculated",
|
158
208
|
"property": "score",
|
159
|
-
"
|
209
|
+
"input": {
|
210
|
+
"previousRolls": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10]
|
211
|
+
},
|
160
212
|
"expected": {"error": "Score cannot be taken until the end of the game"}
|
161
213
|
}, {
|
162
214
|
"description": "both bonus rolls for a strike in the last frame must be rolled before score can be calculated",
|
163
215
|
"property": "score",
|
164
|
-
"
|
216
|
+
"input": {
|
217
|
+
"previousRolls": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10]
|
218
|
+
},
|
165
219
|
"expected": {"error": "Score cannot be taken until the end of the game"}
|
166
220
|
}, {
|
167
221
|
"description": "bonus roll for a spare in the last frame must be rolled before score can be calculated",
|
168
222
|
"property": "score",
|
169
|
-
"
|
223
|
+
"input": {
|
224
|
+
"previousRolls": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 3]
|
225
|
+
},
|
170
226
|
"expected": {"error": "Score cannot be taken until the end of the game"}
|
171
227
|
}]
|
172
228
|
}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"exercise": "gigasecond",
|
3
|
-
"version": "1.
|
3
|
+
"version": "1.1.0",
|
4
4
|
"comments": [
|
5
5
|
"The basic test is to add one gigasecond to a few ordinary dates.",
|
6
6
|
"Most test programs currently check only the date and ignore the time.",
|
@@ -22,34 +22,44 @@
|
|
22
22
|
{
|
23
23
|
"description": "date only specification of time",
|
24
24
|
"property": "add",
|
25
|
-
"input":
|
25
|
+
"input": {
|
26
|
+
"birthdate": "2011-04-25"
|
27
|
+
},
|
26
28
|
"expected": "2043-01-01T01:46:40"
|
27
29
|
},
|
28
30
|
{
|
29
31
|
"description": "second test for date only specification of time",
|
30
32
|
"property": "add",
|
31
|
-
"input":
|
33
|
+
"input": {
|
34
|
+
"birthdate": "1977-06-13"
|
35
|
+
},
|
32
36
|
"expected": "2009-02-19T01:46:40"
|
33
37
|
},
|
34
38
|
{
|
35
39
|
"description": "third test for date only specification of time",
|
36
40
|
"property": "add",
|
37
|
-
"input":
|
41
|
+
"input": {
|
42
|
+
"birthdate": "1959-07-19"
|
43
|
+
},
|
38
44
|
"expected": "1991-03-27T01:46:40"
|
39
45
|
},
|
40
46
|
{
|
41
47
|
"description": "full time specified",
|
42
48
|
"property": "add",
|
43
|
-
"input":
|
49
|
+
"input": {
|
50
|
+
"birthdate": "2015-01-24T22:00:00"
|
51
|
+
},
|
44
52
|
"expected": "2046-10-02T23:46:40"
|
45
53
|
},
|
46
54
|
{
|
47
55
|
"description": "full time with day roll-over",
|
48
56
|
"property": "add",
|
49
|
-
"input":
|
57
|
+
"input": {
|
58
|
+
"birthdate": "2015-01-24T23:59:59"
|
59
|
+
},
|
50
60
|
"expected": "2046-10-03T01:46:39"
|
51
61
|
}
|
52
62
|
]
|
53
63
|
}
|
54
64
|
]
|
55
|
-
}
|
65
|
+
}
|
@@ -3,7 +3,7 @@
|
|
3
3
|
"comments": [
|
4
4
|
"A pangram is a sentence using every letter of the alphabet at least once."
|
5
5
|
],
|
6
|
-
"version": "1.
|
6
|
+
"version": "1.4.0",
|
7
7
|
"cases": [
|
8
8
|
{
|
9
9
|
"description": "Check if the given string is an pangram",
|
@@ -14,64 +14,84 @@
|
|
14
14
|
{
|
15
15
|
"description": "sentence empty",
|
16
16
|
"property": "isPangram",
|
17
|
-
"input":
|
17
|
+
"input": {
|
18
|
+
"sentence": ""
|
19
|
+
},
|
18
20
|
"expected": false
|
19
21
|
},
|
20
22
|
{
|
21
23
|
"description": "recognizes a perfect lower case pangram",
|
22
24
|
"property": "isPangram",
|
23
|
-
"input":
|
25
|
+
"input": {
|
26
|
+
"sentence": "abcdefghijklmnopqrstuvwxyz"
|
27
|
+
},
|
24
28
|
"expected": true
|
25
29
|
},
|
26
30
|
{
|
27
31
|
"description": "pangram with only lower case",
|
28
32
|
"property": "isPangram",
|
29
|
-
"input":
|
33
|
+
"input": {
|
34
|
+
"sentence": "the quick brown fox jumps over the lazy dog"
|
35
|
+
},
|
30
36
|
"expected": true
|
31
37
|
},
|
32
38
|
{
|
33
39
|
"description": "missing character 'x'",
|
34
40
|
"property": "isPangram",
|
35
|
-
"input":
|
41
|
+
"input": {
|
42
|
+
"sentence": "a quick movement of the enemy will jeopardize five gunboats"
|
43
|
+
},
|
36
44
|
"expected": false
|
37
45
|
},
|
38
46
|
{
|
39
47
|
"description": "another missing character, e.g. 'h'",
|
40
48
|
"property": "isPangram",
|
41
|
-
"input":
|
49
|
+
"input": {
|
50
|
+
"sentence": "five boxing wizards jump quickly at it"
|
51
|
+
},
|
42
52
|
"expected": false
|
43
53
|
},
|
44
54
|
{
|
45
55
|
"description": "pangram with underscores",
|
46
56
|
"property": "isPangram",
|
47
|
-
"input":
|
57
|
+
"input": {
|
58
|
+
"sentence": "the_quick_brown_fox_jumps_over_the_lazy_dog"
|
59
|
+
},
|
48
60
|
"expected": true
|
49
61
|
},
|
50
62
|
{
|
51
63
|
"description": "pangram with numbers",
|
52
64
|
"property": "isPangram",
|
53
|
-
"input":
|
65
|
+
"input": {
|
66
|
+
"sentence": "the 1 quick brown fox jumps over the 2 lazy dogs"
|
67
|
+
},
|
54
68
|
"expected": true
|
55
69
|
},
|
56
70
|
{
|
57
71
|
"description": "missing letters replaced by numbers",
|
58
72
|
"property": "isPangram",
|
59
|
-
"input":
|
73
|
+
"input": {
|
74
|
+
"sentence": "7h3 qu1ck brown fox jumps ov3r 7h3 lazy dog"
|
75
|
+
},
|
60
76
|
"expected": false
|
61
77
|
},
|
62
78
|
{
|
63
79
|
"description": "pangram with mixed case and punctuation",
|
64
80
|
"property": "isPangram",
|
65
|
-
"input":
|
81
|
+
"input": {
|
82
|
+
"sentence": "\"Five quacking Zephyrs jolt my wax bed.\""
|
83
|
+
},
|
66
84
|
"expected": true
|
67
85
|
},
|
68
86
|
{
|
69
87
|
"description": "upper and lower case versions of the same character should not be counted separately",
|
70
88
|
"property": "isPangram",
|
71
|
-
"input":
|
89
|
+
"input": {
|
90
|
+
"sentence": "the quick brown fox jumps over with lazy FX"
|
91
|
+
},
|
72
92
|
"expected": false
|
73
93
|
}
|
74
94
|
]
|
75
95
|
}
|
76
96
|
]
|
77
|
-
}
|
97
|
+
}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"exercise": "say",
|
3
|
-
"version": "1.
|
3
|
+
"version": "1.1.0",
|
4
4
|
"comments": [
|
5
5
|
"Here -1 is used as expected value to indicate that the",
|
6
6
|
"input value is out of the range described in the exercise."
|
@@ -9,92 +9,122 @@
|
|
9
9
|
{
|
10
10
|
"description": "zero",
|
11
11
|
"property": "say",
|
12
|
-
"input":
|
12
|
+
"input": {
|
13
|
+
"number": 0
|
14
|
+
},
|
13
15
|
"expected": "zero"
|
14
16
|
},
|
15
17
|
{
|
16
18
|
"description": "one",
|
17
19
|
"property": "say",
|
18
|
-
"input":
|
20
|
+
"input": {
|
21
|
+
"number": 1
|
22
|
+
},
|
19
23
|
"expected": "one"
|
20
24
|
},
|
21
25
|
{
|
22
26
|
"description": "fourteen",
|
23
27
|
"property": "say",
|
24
|
-
"input":
|
28
|
+
"input": {
|
29
|
+
"number": 14
|
30
|
+
},
|
25
31
|
"expected": "fourteen"
|
26
32
|
},
|
27
33
|
{
|
28
34
|
"description": "twenty",
|
29
35
|
"property": "say",
|
30
|
-
"input":
|
36
|
+
"input": {
|
37
|
+
"number": 20
|
38
|
+
},
|
31
39
|
"expected": "twenty"
|
32
40
|
},
|
33
41
|
{
|
34
42
|
"description": "twenty-two",
|
35
43
|
"property": "say",
|
36
|
-
"input":
|
44
|
+
"input": {
|
45
|
+
"number": 22
|
46
|
+
},
|
37
47
|
"expected": "twenty-two"
|
38
48
|
},
|
39
49
|
{
|
40
50
|
"description": "one hundred",
|
41
51
|
"property": "say",
|
42
|
-
"input":
|
52
|
+
"input": {
|
53
|
+
"number": 100
|
54
|
+
},
|
43
55
|
"expected": "one hundred"
|
44
56
|
},
|
45
57
|
{
|
46
58
|
"description": "one hundred twenty-three",
|
47
59
|
"property": "say",
|
48
|
-
"input":
|
60
|
+
"input": {
|
61
|
+
"number": 123
|
62
|
+
},
|
49
63
|
"expected": "one hundred twenty-three"
|
50
64
|
},
|
51
65
|
{
|
52
66
|
"description": "one thousand",
|
53
67
|
"property": "say",
|
54
|
-
"input":
|
68
|
+
"input": {
|
69
|
+
"number": 1000
|
70
|
+
},
|
55
71
|
"expected": "one thousand"
|
56
72
|
},
|
57
73
|
{
|
58
74
|
"description": "one thousand two hundred thirty-four",
|
59
75
|
"property": "say",
|
60
|
-
"input":
|
76
|
+
"input": {
|
77
|
+
"number": 1234
|
78
|
+
},
|
61
79
|
"expected": "one thousand two hundred thirty-four"
|
62
80
|
},
|
63
81
|
{
|
64
82
|
"description": "one million",
|
65
83
|
"property": "say",
|
66
|
-
"input":
|
84
|
+
"input": {
|
85
|
+
"number": 1000000
|
86
|
+
},
|
67
87
|
"expected": "one million"
|
68
88
|
},
|
69
89
|
{
|
70
90
|
"description": "one million two thousand three hundred forty-five",
|
71
91
|
"property": "say",
|
72
|
-
"input":
|
92
|
+
"input": {
|
93
|
+
"number": 1002345
|
94
|
+
},
|
73
95
|
"expected": "one million two thousand three hundred forty-five"
|
74
96
|
},
|
75
97
|
{
|
76
98
|
"description": "one billion",
|
77
99
|
"property": "say",
|
78
|
-
"input":
|
100
|
+
"input": {
|
101
|
+
"number": 1000000000
|
102
|
+
},
|
79
103
|
"expected": "one billion"
|
80
104
|
},
|
81
105
|
{
|
82
106
|
"description": "a big number",
|
83
107
|
"property": "say",
|
84
|
-
"input":
|
108
|
+
"input": {
|
109
|
+
"number": 987654321123
|
110
|
+
},
|
85
111
|
"expected": "nine hundred eighty-seven billion six hundred fifty-four million three hundred twenty-one thousand one hundred twenty-three"
|
86
112
|
},
|
87
113
|
{
|
88
114
|
"description": "numbers below zero are out of range",
|
89
115
|
"property": "say",
|
90
|
-
"input":
|
116
|
+
"input": {
|
117
|
+
"number": -1
|
118
|
+
},
|
91
119
|
"expected": -1
|
92
120
|
},
|
93
121
|
{
|
94
122
|
"description": "numbers above 999,999,999,999 are out of range",
|
95
123
|
"property": "say",
|
96
|
-
"input":
|
124
|
+
"input": {
|
125
|
+
"number": 1000000000000
|
126
|
+
},
|
97
127
|
"expected": -1
|
98
128
|
}
|
99
129
|
]
|
100
|
-
}
|
130
|
+
}
|