trackler 2.1.0.6 → 2.1.0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/common/exercises/rail-fence-cipher/canonical-data.json +7 -7
  3. data/common/exercises/scrabble-score/description.md +2 -2
  4. data/lib/trackler/version.rb +1 -1
  5. data/tracks/delphi/exercises/clock/uClockExample.pas +5 -5
  6. data/tracks/delphi/exercises/clock/uClockTest.pas +435 -49
  7. data/tracks/ocaml/exercises/triangle/example.ml +1 -1
  8. data/tracks/ocaml/exercises/triangle/test.ml +8 -8
  9. data/tracks/ocaml/exercises/triangle/triangle.mli +1 -1
  10. data/tracks/ocaml/tools/test-generator/templates/triangle/template.ml +3 -3
  11. data/tracks/perl6/exercises/all-your-base/AllYourBase.pm6 +1 -1
  12. data/tracks/perl6/exercises/all-your-base/Example.pm +2 -2
  13. data/tracks/perl6/exercises/all-your-base/all-your-base.t +215 -138
  14. data/tracks/perl6/exercises/all-your-base/example.yaml +14 -0
  15. data/tracks/ruby/exercises/acronym/.meta/generator/acronym_cases.rb +1 -1
  16. data/tracks/ruby/exercises/all-your-base/.meta/generator/all_your_base_cases.rb +4 -10
  17. data/tracks/ruby/exercises/all-your-base/all_your_base_test.rb +3 -0
  18. data/tracks/ruby/exercises/alphametics/.meta/generator/alphametics_cases.rb +1 -1
  19. data/tracks/ruby/exercises/alphametics/{example.tt → .meta/generator/test_template.erb} +0 -0
  20. data/tracks/ruby/exercises/anagram/.meta/generator/anagram_cases.rb +1 -1
  21. data/tracks/ruby/exercises/beer-song/.meta/generator/beer_song_cases.rb +3 -6
  22. data/tracks/ruby/exercises/beer-song/beer_song_test.rb +1 -1
  23. data/tracks/ruby/exercises/binary/.meta/generator/binary_cases.rb +1 -1
  24. data/tracks/ruby/exercises/bowling/.meta/generator/bowling_cases.rb +1 -1
  25. data/tracks/ruby/exercises/bowling/{example.tt → .meta/generator/test_template.erb} +0 -0
  26. data/tracks/ruby/exercises/bracket-push/.meta/generator/bracket_push_cases.rb +1 -1
  27. data/tracks/ruby/exercises/clock/.meta/generator/clock_cases.rb +1 -1
  28. data/tracks/ruby/exercises/connect/.meta/generator/connect_cases.rb +1 -1
  29. data/tracks/ruby/exercises/connect/{example.tt → .meta/generator/test_template.erb} +0 -0
  30. data/tracks/ruby/exercises/custom-set/.meta/generator/custom_set_cases.rb +1 -1
  31. data/tracks/ruby/exercises/difference-of-squares/.meta/generator/difference_of_squares_cases.rb +1 -1
  32. data/tracks/ruby/exercises/difference-of-squares/difference_of_squares_test.rb +0 -6
  33. data/tracks/ruby/exercises/dominoes/.meta/generator/dominoes_cases.rb +1 -1
  34. data/tracks/ruby/exercises/dominoes/{example.tt → .meta/generator/test_template.erb} +0 -0
  35. data/tracks/ruby/exercises/etl/.meta/generator/etl_cases.rb +1 -1
  36. data/tracks/ruby/exercises/gigasecond/.meta/generator/gigasecond_cases.rb +1 -1
  37. data/tracks/ruby/exercises/gigasecond/gigasecond_test.rb +3 -5
  38. data/tracks/ruby/exercises/grains/.meta/generator/grains_cases.rb +1 -1
  39. data/tracks/ruby/exercises/hamming/.meta/generator/hamming_cases.rb +1 -1
  40. data/tracks/ruby/exercises/hello-world/.meta/generator/hello_world_cases.rb +1 -1
  41. data/tracks/ruby/exercises/hello-world/{example.tt → .meta/generator/test_template.erb} +0 -0
  42. data/tracks/ruby/exercises/isogram/.meta/generator/isogram_cases.rb +1 -1
  43. data/tracks/ruby/exercises/largest-series-product/.meta/generator/largest_series_product_cases.rb +1 -1
  44. data/tracks/ruby/exercises/leap/.meta/generator/leap_cases.rb +1 -1
  45. data/tracks/ruby/exercises/leap/{example.tt → .meta/generator/test_template.erb} +0 -0
  46. data/tracks/ruby/exercises/luhn/.meta/generator/luhn_cases.rb +1 -1
  47. data/tracks/ruby/exercises/nth-prime/.meta/generator/nth_prime_cases.rb +1 -1
  48. data/tracks/ruby/exercises/ocr-numbers/.meta/generator/ocr_numbers_cases.rb +1 -1
  49. data/tracks/ruby/exercises/pangram/.meta/generator/pangram_cases.rb +1 -1
  50. data/tracks/ruby/exercises/pig-latin/.meta/generator/pig_latin_cases.rb +1 -1
  51. data/tracks/ruby/exercises/queen-attack/.meta/generator/queen_attack_cases.rb +1 -1
  52. data/tracks/ruby/exercises/raindrops/.meta/generator/raindrops_cases.rb +1 -1
  53. data/tracks/ruby/exercises/rna-transcription/.meta/generator/rna_transcription_cases.rb +1 -1
  54. data/tracks/ruby/exercises/roman-numerals/.meta/generator/roman_numerals_cases.rb +1 -1
  55. data/tracks/ruby/exercises/run-length-encoding/.meta/generator/run_length_encoding_cases.rb +1 -1
  56. data/tracks/ruby/exercises/say/.meta/generator/say_cases.rb +1 -1
  57. data/tracks/ruby/exercises/sieve/.meta/generator/sieve_cases.rb +1 -1
  58. data/tracks/ruby/exercises/tournament/.meta/generator/tournament_cases.rb +7 -24
  59. data/tracks/ruby/exercises/tournament/tournament_test.rb +37 -38
  60. data/tracks/ruby/exercises/transpose/.meta/generator/transpose_cases.rb +7 -23
  61. data/tracks/ruby/exercises/transpose/transpose_test.rb +22 -22
  62. data/tracks/ruby/exercises/triangle/.meta/generator/triangle_cases.rb +1 -1
  63. data/tracks/ruby/exercises/two-bucket/.meta/generator/two_bucket_cases.rb +1 -1
  64. data/tracks/ruby/exercises/word-count/.meta/generator/word_count_cases.rb +1 -1
  65. data/tracks/ruby/exercises/wordy/.meta/generator/wordy_cases.rb +1 -1
  66. data/tracks/ruby/lib/generator/exercise_case/assertion.rb +33 -0
  67. data/tracks/ruby/lib/generator/exercise_cases.rb +46 -49
  68. data/tracks/ruby/lib/generator/files/generator_cases.rb +0 -14
  69. data/tracks/ruby/test/fixtures/xruby/{lib → exercises/alpha/.meta/generator}/alpha_cases.rb +0 -0
  70. data/tracks/ruby/test/fixtures/xruby/exercises/beta/.meta/generator/beta_cases.rb +1 -1
  71. data/tracks/ruby/test/generator/case_values_test.rb +5 -5
  72. data/tracks/ruby/test/generator/exercise_case/assertion_test.rb +46 -0
  73. data/tracks/ruby/test/generator/exercise_cases_test.rb +47 -0
  74. data/tracks/ruby/test/generator/files/generate_cases_test.rb +0 -12
  75. metadata +13 -15
  76. data/tracks/ruby/exercises/all-your-base/example.tt +0 -18
  77. data/tracks/ruby/exercises/beer-song/example.tt +0 -24
  78. data/tracks/ruby/exercises/difference-of-squares/example.tt +0 -27
  79. data/tracks/ruby/exercises/gigasecond/example.tt +0 -23
  80. data/tracks/ruby/exercises/tournament/example.tt +0 -25
  81. data/tracks/ruby/exercises/transpose/example.tt +0 -24
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 620261476b48055d0323fba94bb437ce706ec439
4
- data.tar.gz: 947ffcea3e9587dec2b25a7dd129e6e590039380
3
+ metadata.gz: fd504af139fa45ae5513151366c8818ea57e2fbb
4
+ data.tar.gz: 0cce774742047e9f10dc01981ff963006a496460
5
5
  SHA512:
6
- metadata.gz: 743e170938414ca4ac8c659f12e491a1fc936e13e80a3ca925bca14d5e0aabeea17c232cbebaadc1502591643ace81d067d279168a2cb6bb255dd094a442edf5
7
- data.tar.gz: 3a4063e9244b78cf505ded3ba77399b212bd12810dd644f3f3d14e5e2ae7a13a869a15e8f2418dbfe056a771d97101ea9f13d10eaada279bd973b14b28320a16
6
+ metadata.gz: 5091f1ee03cd4c80ea4f58f8d277cb50ce9ee4ab19756141dac7772513e71cb0645090340d8802d78fce6b4cea258e0ff7e86ea282b4255e4ff663ff900baabb
7
+ data.tar.gz: 18356fcddbde78e9add3e74d6565bad7f11f177ee93266bf47731fc35decea27af19f7861df4ce268866de7749d0c8520030cd957fc6b6ba337e4bcd8a144b4d
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "exercise": "rail-fence-cipher",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "comments": [
5
5
  "The tests do not expect any normalization or cleaning.",
6
6
  "That trade is tested in enough other exercises."
@@ -10,21 +10,21 @@
10
10
  "description": "encode",
11
11
  "cases": [
12
12
  {
13
- "description": "test to encode with two rails",
13
+ "description": "encode with two rails",
14
14
  "property": "encode",
15
15
  "msg": "XOXOXOXOXOXOXOXOXO",
16
16
  "rails": 2,
17
17
  "expected": "XXXXXXXXXOOOOOOOOO"
18
18
  },
19
19
  {
20
- "description": "test to encode with three rails",
20
+ "description": "encode with three rails",
21
21
  "property": "encode",
22
22
  "msg": "WEAREDISCOVEREDFLEEATONCE",
23
23
  "rails": 3,
24
24
  "expected": "WECRLTEERDSOEEFEAOCAIVDEN"
25
25
  },
26
26
  {
27
- "description": "test to encode with ending in the middle",
27
+ "description": "encode with ending in the middle",
28
28
  "property": "encode",
29
29
  "msg": "EXERCISES",
30
30
  "rails": 4,
@@ -36,21 +36,21 @@
36
36
  "description": "decode",
37
37
  "cases": [
38
38
  {
39
- "description": "test to decode with three rails",
39
+ "description": "decode with three rails",
40
40
  "property": "decode",
41
41
  "msg": "TEITELHDVLSNHDTISEIIEA",
42
42
  "rails": 3,
43
43
  "expected": "THEDEVILISINTHEDETAILS"
44
44
  },
45
45
  {
46
- "description": "test to decode with five rails",
46
+ "description": "decode with five rails",
47
47
  "property": "decode",
48
48
  "msg": "EIEXMSMESAORIWSCE",
49
49
  "rails": 5,
50
50
  "expected": "EXERCISMISAWESOME"
51
51
  },
52
52
  {
53
- "description": "test to decode with six rails",
53
+ "description": "decode with six rails",
54
54
  "property": "decode",
55
55
  "msg": "133714114238148966225439541018335470986172518171757571896261",
56
56
  "rails": 6,
@@ -30,5 +30,5 @@ And to total:
30
30
  - = 14
31
31
 
32
32
  ## Extensions
33
- - You can play a `:double` or a `:triple` letter.
34
- - You can play a `:double` or a `:triple` word.
33
+ - You can play a double or a triple letter.
34
+ - You can play a double or a triple word.
@@ -1,3 +1,3 @@
1
1
  module Trackler
2
- VERSION = "2.1.0.6"
2
+ VERSION = "2.1.0.7"
3
3
  end
@@ -12,8 +12,8 @@ type
12
12
  public
13
13
  constructor SetHands(aHours: integer; aMinutes: integer=0);
14
14
  function Add(minutesToAdd: integer): Clock;
15
- function Subtract(minutesToSubtract: integer): Clock;
16
15
  function ToString: string;
16
+ function Equal(aClock: Clock): Boolean;
17
17
  End;
18
18
 
19
19
  implementation
@@ -30,14 +30,14 @@ begin
30
30
  result := Clock.SetHands(hours, minutes + minutesToAdd);
31
31
  end;
32
32
 
33
- function Clock.Subtract(minutesToSubtract: Integer): Clock;
33
+ function Clock.ToString: string;
34
34
  begin
35
- result := Clock.SetHands(hours, minutes - minutesToSubtract);
35
+ result := format('%.2d:%.2d',[hours, minutes]);
36
36
  end;
37
37
 
38
- function Clock.ToString: string;
38
+ function Clock.Equal(aClock: Clock): Boolean;
39
39
  begin
40
- result := format('%.2d:%.2d',[hours, minutes]);
40
+ result := (aClock.hours = hours) and (aClock.minutes = minutes);
41
41
  end;
42
42
 
43
43
  class function Clock.fltMod(x, y: double): integer;
@@ -6,48 +6,140 @@ uses
6
6
 
7
7
  type
8
8
 
9
- [TestFixture]
10
- TClockTest = class(TObject)
9
+ [TestFixture('Create a new clock with an initial time')]
10
+ TClockTest = class(TObject)
11
11
  public
12
12
  [Test]
13
13
  // [Ignore('Comment the "[Ignore]" statement to run the test')]
14
- procedure Prints_the_hour_8;
14
+ procedure On_the_hour;
15
15
 
16
16
  [Test]
17
17
  [Ignore]
18
- procedure Prints_the_hour_9;
18
+ procedure Past_the_hour;
19
19
 
20
20
  [Test]
21
21
  [Ignore]
22
- procedure Can_add_minutes;
22
+ procedure Midnight_is_zero_hours;
23
23
 
24
24
  [Test]
25
25
  [Ignore]
26
- procedure Can_add_over_an_hour;
26
+ procedure Hour_rolls_over;
27
27
 
28
28
  [Test]
29
29
  [Ignore]
30
- procedure Can_add_over_more_than_one_day;
30
+ procedure Hour_rolls_over_continuously;
31
31
 
32
32
  [Test]
33
33
  [Ignore]
34
- procedure Can_subtract_minutes;
34
+ procedure Sixty_minutes_is_next_hour;
35
+
36
+ [Test]
37
+ [Ignore]
38
+ procedure Minutes_roll_over;
39
+
40
+ [Test]
41
+ [Ignore]
42
+ procedure Minutes_roll_over_continuously;
43
+
44
+ [Test]
45
+ [Ignore]
46
+ procedure Hour_and_minute_roll_over;
47
+
48
+ [Test]
49
+ [Ignore]
50
+ procedure Hour_and_minute_roll_over_continuously;
51
+
52
+ [Test]
53
+ [Ignore]
54
+ procedure Hour_and_minute_roll_over_to_exactly_midnight;
35
55
 
36
56
  [Test]
37
57
  [Ignore]
38
- procedure Can_subtract_to_previous_hour;
58
+ procedure Negative_hour;
39
59
 
40
60
  [Test]
41
61
  [Ignore]
42
- procedure Can_subtract_over_an_hour;
62
+ procedure Negative_hour_rolls_over;
43
63
 
44
64
  [Test]
45
65
  [Ignore]
46
- procedure Wraps_around_midnight;
66
+ procedure Negative_hour_rolls_over_continuously;
47
67
 
48
68
  [Test]
49
69
  [Ignore]
50
- procedure Wraps_around_midnight_backwards;
70
+ procedure Negative_minutes;
71
+
72
+ [Test]
73
+ [Ignore]
74
+ procedure Negative_minutes_roll_over;
75
+
76
+ [Test]
77
+ [Ignore]
78
+ procedure Negative_minutes_roll_over_continuously;
79
+
80
+ [Test]
81
+ [Ignore]
82
+ procedure Negative_hour_and_minutes_both_roll_over_continuously;
83
+ end;
84
+
85
+ [TestFixture('Add minutes')]
86
+ TAddMinutes = class(TObject)
87
+ public
88
+ [Test]
89
+ [Ignore]
90
+ procedure Add_minutes;
91
+
92
+ [Test]
93
+ [Ignore]
94
+ procedure Add_no_minutes;
95
+
96
+ [Test]
97
+ [Ignore]
98
+ procedure Add_to_next_hour;
99
+
100
+ [Test]
101
+ [Ignore]
102
+ procedure Add_more_than_one_hour;
103
+
104
+ [Test]
105
+ [Ignore]
106
+ procedure Add_more_than_two_hours_with_carry;
107
+
108
+ [Test]
109
+ [Ignore]
110
+ procedure Add_across_midnight;
111
+
112
+ [Test]
113
+ [Ignore]
114
+ procedure Add_more_than_one_day; //1500 min = 25 hrs
115
+
116
+ [Test]
117
+ [Ignore]
118
+ procedure Add_more_than_two_days;
119
+ end;
120
+
121
+ [TestFixture('Subtract minutes')]
122
+ TSubtractMinutes = class(TObject)
123
+ public
124
+ [Test]
125
+ [Ignore]
126
+ procedure Subtract_minutes;
127
+
128
+ [Test]
129
+ [Ignore]
130
+ procedure Subtract_to_previous_hour;
131
+
132
+ [Test]
133
+ [Ignore]
134
+ procedure Subtract_more_than_one_hour;
135
+
136
+ [Test]
137
+ [Ignore]
138
+ procedure Subtract_across_midnight;
139
+
140
+ [Test]
141
+ [Ignore]
142
+ procedure Subtract_more_than_two_hours;
51
143
 
52
144
  [Test]
53
145
  [Ignore]
@@ -55,111 +147,405 @@ type
55
147
 
56
148
  [Test]
57
149
  [Ignore]
58
- procedure Sixty_minutes_is_next_hour;
150
+ procedure Subtract_more_than_two_hours_with_borrow;
151
+
152
+ [Test]
153
+ [Ignore]
154
+ procedure Subtract_more_than_one_day; //(1500 min = 25 hrs)
155
+
156
+ [Test]
157
+ [Ignore]
158
+ procedure Subtract_more_than_two_days;
159
+ end;
160
+
161
+ [TestFixture('Compare two clocks for equality')]
162
+ TCompareClocks = class(TObject)
163
+ public
164
+ [Test]
165
+ [Ignore]
166
+ procedure Clocks_with_same_time;
167
+
168
+ [Test]
169
+ [Ignore]
170
+ procedure Clocks_a_minutes_apart;
171
+
172
+ [Test]
173
+ [Ignore]
174
+ procedure Clocks_an_hour_apart;
175
+
176
+ [Test]
177
+ [Ignore]
178
+ procedure Clocks_with_hour_overflow;
179
+
180
+ [Test]
181
+ [Ignore]
182
+ procedure Clocks_with_hour_overflow_by_several_days;
183
+
184
+ [Test]
185
+ [Ignore]
186
+ procedure Clocks_with_negative_hour;
187
+
188
+ [Test]
189
+ [Ignore]
190
+ procedure Clocks_with_negative_hour_that_wraps;
191
+
192
+ [Test]
193
+ [Ignore]
194
+ procedure Clocks_with_negative_hour_that_wraps_multiple_times;
195
+
196
+ [Test]
197
+ [Ignore]
198
+ procedure Clocks_with_minute_overflow;
199
+
200
+ [Test]
201
+ [Ignore]
202
+ procedure Clocks_with_minute_overflow_by_serveral_days;
203
+
204
+ [Test]
205
+ [Ignore]
206
+ procedure Clocks_with_negative_minute;
59
207
 
60
208
  [Test]
61
209
  [Ignore]
62
- procedure Clocks_with_same_time_are_equal;
210
+ procedure Clocks_with_negative_minute_that_wraps;
63
211
 
64
212
  [Test]
65
213
  [Ignore]
66
- procedure Clocks_with_different_time_are_not_equal;
214
+ procedure Clocks_with_negative_minute_that_wraps_multiple_times;
67
215
 
68
216
  [Test]
69
217
  [Ignore]
70
- procedure Overflown_clocks_with_same_time_are_equal;
218
+ procedure Clocks_with_negative_hours_and_minutes;
219
+
220
+ [Test]
221
+ [Ignore]
222
+ procedure Clocks_with_negative_hours_and_minutes_that_wrap;
71
223
  end;
72
224
 
73
225
  implementation
74
226
  uses uClock;
75
227
 
76
- procedure TClockTest.Prints_the_hour_8;
228
+ {$region 'TClockTest'}
229
+ procedure TClockTest.On_the_hour;
77
230
  begin
78
231
  Assert.AreEqual('08:00', Clock.SetHands(8).ToString);
79
232
  end;
80
233
 
81
- procedure TClockTest.Prints_the_hour_9;
234
+ procedure TClockTest.Past_the_hour;
82
235
  begin
83
- Assert.AreEqual('09:00', Clock.SetHands(9).ToString);
236
+ Assert.AreEqual('11:09', Clock.SetHands(11, 9).ToString);
84
237
  end;
85
238
 
86
- procedure TClockTest.Can_add_minutes;
239
+ procedure TClockTest.Midnight_is_zero_hours;
87
240
  begin
88
- Assert.AreEqual('10:03', Clock.SetHands(10).Add(3).ToString);
241
+ Assert.AreEqual('00:00', Clock.SetHands(24).ToString);
89
242
  end;
90
243
 
91
- procedure TClockTest.Can_add_over_an_hour;
244
+ procedure TClockTest.Hour_rolls_over;
92
245
  begin
93
- Assert.AreEqual('11:03', Clock.SetHands(10).Add(63).ToString);
246
+ Assert.AreEqual('01:00', Clock.SetHands(25).ToString);
94
247
  end;
95
248
 
96
- procedure TClockTest.Can_add_over_more_than_one_day;
249
+ procedure TClockTest.Hour_rolls_over_continuously;
97
250
  begin
98
- Assert.AreEqual('10:24', Clock.SetHands(10).Add(7224).ToString);
251
+ Assert.AreEqual('04:00', Clock.SetHands(100).ToString);
99
252
  end;
100
253
 
101
- procedure TClockTest.Can_subtract_minutes;
254
+ procedure TClockTest.Sixty_minutes_is_next_hour;
102
255
  begin
103
- Assert.AreEqual('10:00', Clock.SetHands(10, 3).Subtract(3).ToString);
256
+ Assert.AreEqual('02:00', Clock.SetHands(1, 60).ToString);
104
257
  end;
105
258
 
106
- procedure TClockTest.Can_subtract_to_previous_hour;
259
+ procedure TClockTest.Minutes_roll_over;
107
260
  begin
108
- Assert.AreEqual('09:33', Clock.SetHands(10, 3).Subtract(30).ToString);
261
+ Assert.AreEqual('02:40', Clock.SetHands(0, 160).ToString);
109
262
  end;
110
263
 
111
- procedure TClockTest.Can_subtract_over_an_hour;
264
+ procedure TClockTest.Minutes_roll_over_continuously;
112
265
  begin
113
- Assert.AreEqual('08:53', Clock.SetHands(10, 3).Subtract(70).ToString);
266
+ Assert.AreEqual('04:43', Clock.SetHands(0, 1723).ToString);
114
267
  end;
115
268
 
116
- procedure TClockTest.Wraps_around_midnight;
269
+ procedure TClockTest.Hour_and_minute_roll_over;
270
+ begin
271
+ Assert.AreEqual('03:40', Clock.SetHands(25, 160).ToString);
272
+ end;
273
+
274
+ procedure TClockTest.Hour_and_minute_roll_over_continuously;
275
+ begin
276
+ Assert.AreEqual('11:01', Clock.SetHands(201, 3001).ToString);
277
+ end;
278
+
279
+ procedure TClockTest.Hour_and_minute_roll_over_to_exactly_midnight;
280
+ begin
281
+ Assert.AreEqual('00:00', Clock.SetHands(72, 8640).ToString);
282
+ end;
283
+
284
+ procedure TClockTest.Negative_hour;
285
+ begin
286
+ Assert.AreEqual('23:15', Clock.SetHands(-1, 15).ToString);
287
+ end;
288
+
289
+ procedure TClockTest.Negative_hour_rolls_over;
290
+ begin
291
+ Assert.AreEqual('23:00', Clock.SetHands(-25).ToString);
292
+ end;
293
+
294
+ procedure TClockTest.Negative_hour_rolls_over_continuously;
295
+ begin
296
+ Assert.AreEqual('05:00', Clock.SetHands(-91).ToString);
297
+ end;
298
+
299
+ procedure TClockTest.Negative_minutes;
300
+ begin
301
+ Assert.AreEqual('00:20', Clock.SetHands(1, -40).ToString);
302
+ end;
303
+
304
+ procedure TClockTest.Negative_minutes_roll_over;
305
+ begin
306
+ Assert.AreEqual('22:20', Clock.SetHands(1, -160).ToString);
307
+ end;
308
+
309
+ procedure TClockTest.Negative_minutes_roll_over_continuously;
310
+ begin
311
+ Assert.AreEqual('16:40', Clock.SetHands(1, -4820).ToString);
312
+ end;
313
+
314
+ procedure TClockTest.Negative_hour_and_minutes_both_roll_over_continuously;
315
+ begin
316
+ Assert.AreEqual('22:10', Clock.SetHands(-121, -5810).ToString);
317
+ end;
318
+ {$endregion}
319
+
320
+ {$region 'TAddMinutes'}
321
+ procedure TAddMinutes.Add_minutes;
322
+ begin
323
+ Assert.AreEqual('10:03', Clock.SetHands(10).Add(3).ToString);
324
+ end;
325
+
326
+ procedure TAddMinutes.Add_no_minutes;
327
+ begin
328
+ Assert.AreEqual('06:41', Clock.SetHands(6, 41).Add(0).ToString);
329
+ end;
330
+
331
+ procedure TAddMinutes.Add_to_next_hour;
332
+ begin
333
+ Assert.AreEqual('01:25', Clock.SetHands(0, 45).Add(40).ToString);
334
+ end;
335
+
336
+ procedure TAddMinutes.Add_more_than_one_hour;
337
+ begin
338
+ Assert.AreEqual('11:01', Clock.SetHands(10).Add(61).ToString);
339
+ end;
340
+
341
+ procedure TAddMinutes.Add_more_than_two_hours_with_carry;
342
+ begin
343
+ Assert.AreEqual('03:25', Clock.SetHands(0, 45).Add(160).ToString);
344
+ end;
345
+
346
+ procedure TAddMinutes.Add_across_midnight;
117
347
  begin
118
348
  Assert.AreEqual('00:01', Clock.SetHands(23, 59).Add(2).ToString);
119
349
  end;
120
350
 
121
- procedure TClockTest.Wraps_around_midnight_backwards;
351
+ procedure TAddMinutes.Add_more_than_one_day;
352
+ begin
353
+ Assert.AreEqual('06:32', Clock.SetHands(5, 32).Add(1500).ToString);
354
+ end;
355
+
356
+ procedure TAddMinutes.Add_more_than_two_days;
357
+ begin
358
+ Assert.AreEqual('11:21', Clock.SetHands(1, 1).Add(3500).ToString);
359
+ end;
360
+ {$endregion}
361
+
362
+ {$region 'TSubtractMinutes'}
363
+ procedure TSubtractMinutes.Subtract_minutes;
364
+ begin
365
+ Assert.AreEqual('10:00', Clock.SetHands(10, 3).Add(-3).ToString);
366
+ end;
367
+
368
+ procedure TSubtractMinutes.Subtract_to_previous_hour;
122
369
  begin
123
- Assert.AreEqual('23:59', Clock.SetHands(0, 1).Subtract(2).ToString);
370
+ Assert.AreEqual('09:33', Clock.SetHands(10, 3).Add(-30).ToString);
124
371
  end;
125
372
 
126
- procedure TClockTest.Midnight_is_zero_hundred_hours;
373
+ procedure TSubtractMinutes.Subtract_more_than_one_hour;
374
+ begin
375
+ Assert.AreEqual('08:53', Clock.SetHands(10, 3).Add(-70).ToString);
376
+ end;
377
+
378
+ procedure TSubtractMinutes.Subtract_across_midnight;
379
+ begin
380
+ Assert.AreEqual('23:59', Clock.SetHands(0, 3).Add(-4).ToString);
381
+ end;
382
+
383
+ procedure TSubtractMinutes.Subtract_more_than_two_hours;
384
+ begin
385
+ Assert.AreEqual('21:20', Clock.SetHands(0, 0).Add(-160).ToString);
386
+ end;
387
+
388
+ procedure TSubtractMinutes.Midnight_is_zero_hundred_hours;
127
389
  begin
128
390
  Assert.AreEqual('00:00', Clock.SetHands(24).ToString);
129
391
  end;
130
392
 
131
- procedure TClockTest.Sixty_minutes_is_next_hour;
393
+ procedure TSubtractMinutes.Subtract_more_than_two_hours_with_borrow;
132
394
  begin
133
- Assert.AreEqual('02:00', Clock.SetHands(1, 60).ToString);
395
+ Assert.AreEqual('03:35', Clock.SetHands(6, 15).Add(-160).ToString);
396
+ end;
397
+
398
+ procedure TSubtractMinutes.Subtract_more_than_one_day;
399
+ begin
400
+ Assert.AreEqual('04:32', Clock.SetHands(5, 32).Add(-1500).ToString);
401
+ end;
402
+
403
+ procedure TSubtractMinutes.Subtract_more_than_two_days;
404
+ begin
405
+ Assert.AreEqual('00:20', Clock.SetHands(2, 20).Add(-3000).ToString);
406
+ end;
407
+ {$endregion}
408
+
409
+ {$region 'TCompareClocks'}
410
+ procedure TCompareClocks.Clocks_with_same_time;
411
+ var Clock1, Clock2: Clock;
412
+ begin
413
+ Clock1 := Clock.SetHands(15, 37);
414
+ Clock2 := Clock.SetHands(15, 37);
415
+
416
+ Assert.IsTrue(Clock1.Equal(Clock2));
417
+ end;
418
+
419
+ procedure TCompareClocks.Clocks_a_minutes_apart;
420
+ var Clock1, Clock2: Clock;
421
+ begin
422
+ Clock1 := Clock.SetHands(15, 36);
423
+ Clock2 := Clock.SetHands(15, 37);
424
+
425
+ Assert.IsFalse(Clock1.Equal(Clock2));
426
+ end;
427
+
428
+ procedure TCompareClocks.Clocks_an_hour_apart;
429
+ var Clock1, Clock2: Clock;
430
+ begin
431
+ Clock1 := Clock.SetHands(14, 37);
432
+ Clock2 := Clock.SetHands(15, 37);
433
+
434
+ Assert.IsFalse(Clock1.Equal(Clock2));
435
+ end;
436
+
437
+ procedure TCompareClocks.Clocks_with_hour_overflow;
438
+ var Clock1, Clock2: Clock;
439
+ begin
440
+ Clock1 := Clock.SetHands(10, 37);
441
+ Clock2 := Clock.SetHands(34, 37);
442
+
443
+ Assert.IsTrue(Clock1.Equal(Clock2));
444
+ end;
445
+
446
+ procedure TCompareClocks.Clocks_with_hour_overflow_by_several_days;
447
+ var Clock1, Clock2: Clock;
448
+ begin
449
+ Clock1 := Clock.SetHands(3, 11);
450
+ Clock2 := Clock.SetHands(99, 11);
451
+
452
+ Assert.IsTrue(Clock1.Equal(Clock2));
453
+ end;
454
+
455
+ procedure TCompareClocks.Clocks_with_negative_hour;
456
+ var Clock1, Clock2: Clock;
457
+ begin
458
+ Clock1 := Clock.SetHands(22, 40);
459
+ Clock2 := Clock.SetHands(-2, 40);
460
+
461
+ Assert.IsTrue(Clock1.Equal(Clock2));
462
+ end;
463
+
464
+ procedure TCompareClocks.Clocks_with_negative_hour_that_wraps;
465
+ var Clock1, Clock2: Clock;
466
+ begin
467
+ Clock1 := Clock.SetHands(17, 3);
468
+ Clock2 := Clock.SetHands(-31, 3);
469
+
470
+ Assert.IsTrue(Clock1.Equal(Clock2));
471
+ end;
472
+
473
+ procedure TCompareClocks.Clocks_with_negative_hour_that_wraps_multiple_times;
474
+ var Clock1, Clock2: Clock;
475
+ begin
476
+ Clock1 := Clock.SetHands(13, 49);
477
+ Clock2 := Clock.SetHands(-83, 49);
478
+
479
+ Assert.IsTrue(Clock1.Equal(Clock2));
480
+ end;
481
+
482
+ procedure TCompareClocks.Clocks_with_minute_overflow;
483
+ var Clock1, Clock2: Clock;
484
+ begin
485
+ Clock1 := Clock.SetHands(0, 1);
486
+ Clock2 := Clock.SetHands(0, 1441);
487
+
488
+ Assert.IsTrue(Clock1.Equal(Clock2));
489
+ end;
490
+
491
+ procedure TCompareClocks.Clocks_with_minute_overflow_by_serveral_days;
492
+ var Clock1, Clock2: Clock;
493
+ begin
494
+ Clock1 := Clock.SetHands(2, 2);
495
+ Clock2 := Clock.SetHands(2, 4322);
496
+
497
+ Assert.IsTrue(Clock1.Equal(Clock2));
498
+ end;
499
+
500
+ procedure TCompareClocks.Clocks_with_negative_minute;
501
+ var Clock1, Clock2: Clock;
502
+ begin
503
+ Clock1 := Clock.SetHands(2, 40);
504
+ Clock2 := Clock.SetHands(3, -20);
505
+
506
+ Assert.IsTrue(Clock1.Equal(Clock2));
507
+ end;
508
+
509
+ procedure TCompareClocks.Clocks_with_negative_minute_that_wraps;
510
+ var Clock1, Clock2: Clock;
511
+ begin
512
+ Clock1 := Clock.SetHands(4, 10);
513
+ Clock2 := Clock.SetHands(5, -1490);
514
+
515
+ Assert.IsTrue(Clock1.Equal(Clock2));
134
516
  end;
135
517
 
136
- procedure TClockTest.Clocks_with_same_time_are_equal;
518
+ procedure TCompareClocks.Clocks_with_negative_minute_that_wraps_multiple_times;
137
519
  var Clock1, Clock2: Clock;
138
520
  begin
139
- Clock1 := Clock.SetHands(14, 30);
140
- Clock2 := Clock.SetHands(14, 30);
521
+ Clock1 := Clock.SetHands(6, 15);
522
+ Clock2 := Clock.SetHands(6, -4305);
141
523
 
142
- Assert.AreEqual(Clock1, Clock2);
524
+ Assert.IsTrue(Clock1.Equal(Clock2));
143
525
  end;
144
526
 
145
- procedure TClockTest.Clocks_with_different_time_are_not_equal;
527
+ procedure TCompareClocks.Clocks_with_negative_hours_and_minutes;
146
528
  var Clock1, Clock2: Clock;
147
529
  begin
148
- Clock1 := Clock.SetHands(15, 30);
149
- Clock2 := Clock.SetHands(14, 30);
530
+ Clock1 := Clock.SetHands(7, 32);
531
+ Clock2 := Clock.SetHands(-12, -268);
150
532
 
151
- Assert.AreNotEqual(Clock1, Clock2);
533
+ Assert.IsTrue(Clock1.Equal(Clock2));
152
534
  end;
153
535
 
154
- procedure TClockTest.Overflown_clocks_with_same_time_are_equal;
536
+ procedure TCompareClocks.Clocks_with_negative_hours_and_minutes_that_wrap;
155
537
  var Clock1, Clock2: Clock;
156
538
  begin
157
- Clock1 := Clock.SetHands(14, 30);
158
- Clock2 := Clock.SetHands(38, 30);
539
+ Clock1 := Clock.SetHands(18, 7);
540
+ Clock2 := Clock.SetHands(-54, -11513);
159
541
 
160
- Assert.AreEqual(Clock1, Clock2);
542
+ Assert.IsTrue(Clock1.Equal(Clock2));
161
543
  end;
544
+ {$endregion}
162
545
 
163
546
  initialization
164
547
  TDUnitX.RegisterTestFixture(TClockTest);
548
+ TDUnitX.RegisterTestFixture(TAddMinutes);
549
+ TDUnitX.RegisterTestFixture(TSubtractMinutes);
550
+ TDUnitX.RegisterTestFixture(TCompareClocks);
165
551
  end.