trackler 2.2.1.48 → 2.2.1.49

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/grains/canonical-data.json +1 -1
  4. data/problem-specifications/exercises/isbn-verifier/description.md +1 -1
  5. data/tracks/dart/exercises/anagram/pubspec.lock +10 -10
  6. data/tracks/dart/exercises/bob/pubspec.lock +4 -4
  7. data/tracks/dart/exercises/difference-of-squares/pubspec.lock +4 -4
  8. data/tracks/dart/exercises/gigasecond/pubspec.lock +4 -4
  9. data/tracks/dart/exercises/hamming/pubspec.lock +4 -4
  10. data/tracks/dart/exercises/hello-world/pubspec.lock +4 -4
  11. data/tracks/dart/exercises/leap/pubspec.lock +4 -4
  12. data/tracks/dart/exercises/phone-number/pubspec.lock +4 -4
  13. data/tracks/dart/exercises/raindrops/pubspec.lock +17 -5
  14. data/tracks/dart/exercises/rna-transcription/pubspec.lock +4 -4
  15. data/tracks/dart/exercises/word-count/pubspec.lock +4 -4
  16. data/tracks/dart/pubspec.lock +3 -3
  17. data/tracks/fsharp/exercises/largest-series-product/Example.fs +18 -4
  18. data/tracks/fsharp/exercises/largest-series-product/LargestSeriesProduct.fs +1 -1
  19. data/tracks/fsharp/exercises/largest-series-product/LargestSeriesProductTest.fs +80 -36
  20. data/tracks/fsharp/generators/Exercise.fs +1 -1
  21. data/tracks/fsharp/generators/Generators.fs +10 -0
  22. data/tracks/gnu-apl/config.json +14 -0
  23. data/tracks/gnu-apl/exercises/difference-of-squares/README.md +19 -0
  24. data/tracks/gnu-apl/exercises/difference-of-squares/difference-of-squares-example.apl +13 -0
  25. data/tracks/gnu-apl/exercises/difference-of-squares/difference-of-squares.tc +38 -0
  26. data/tracks/gnu-apl/exercises/pangram/README.md +15 -0
  27. data/tracks/gnu-apl/exercises/pangram/pangram-example.apl +14 -0
  28. data/tracks/gnu-apl/exercises/pangram/pangram.tc +40 -0
  29. data/tracks/gnu-apl/exercises/raindrops/raindrops.tc +1 -1
  30. data/tracks/java/exercises/bracket-push/.meta/version +1 -0
  31. data/tracks/java/exercises/complex-numbers/.meta/version +1 -0
  32. data/tracks/java/exercises/ocr-numbers/.meta/version +1 -0
  33. data/tracks/java/exercises/queen-attack/.meta/version +1 -0
  34. data/tracks/java/exercises/rectangles/.meta/version +1 -0
  35. data/tracks/java/exercises/robot-simulator/.meta/version +1 -0
  36. data/tracks/java/exercises/secret-handshake/.meta/version +1 -0
  37. data/tracks/java/exercises/sublist/.meta/version +1 -0
  38. data/tracks/perl6/exercises/accumulate/accumulate.t +1 -6
  39. data/tracks/perl6/exercises/all-your-base/all-your-base.t +14 -19
  40. data/tracks/perl6/exercises/allergies/Allergies.pm6 +1 -1
  41. data/tracks/perl6/exercises/allergies/Example.pm6 +1 -1
  42. data/tracks/perl6/exercises/allergies/allergies.t +25 -29
  43. data/tracks/perl6/exercises/allergies/example.yaml +11 -10
  44. data/tracks/perl6/exercises/anagram/anagram.t +14 -19
  45. data/tracks/perl6/exercises/atbash-cipher/atbash-cipher.t +14 -19
  46. data/tracks/perl6/exercises/bob/bob.t +16 -23
  47. data/tracks/perl6/exercises/bob/example.yaml +1 -3
  48. data/tracks/perl6/exercises/clock/clock.t +14 -19
  49. data/tracks/perl6/exercises/flatten-array/flatten-array.t +14 -19
  50. data/tracks/perl6/exercises/grade-school/grade-school.t +1 -6
  51. data/tracks/perl6/exercises/grains/grains.t +15 -20
  52. data/tracks/perl6/exercises/hello-world/example.yaml +1 -3
  53. data/tracks/perl6/exercises/hello-world/hello-world.t +16 -23
  54. data/tracks/perl6/exercises/leap/leap.t +14 -19
  55. data/tracks/perl6/exercises/linked-list/example.yaml +59 -59
  56. data/tracks/perl6/exercises/linked-list/linked-list.t +59 -64
  57. data/tracks/perl6/exercises/luhn/luhn.t +14 -19
  58. data/tracks/perl6/exercises/phone-number/phone-number.t +14 -19
  59. data/tracks/perl6/exercises/raindrops/raindrops.t +14 -19
  60. data/tracks/perl6/exercises/rna-transcription/rna-transcription.t +14 -19
  61. data/tracks/perl6/exercises/robot-name/robot-name.t +1 -6
  62. data/tracks/perl6/exercises/scrabble-score/scrabble-score.t +14 -19
  63. data/tracks/perl6/exercises/space-age/space-age.t +14 -19
  64. data/tracks/perl6/exercises/word-count/word-count.t +14 -19
  65. data/tracks/perl6/exercises/wordy/wordy.t +14 -19
  66. data/tracks/perl6/templates/test.mustache +19 -25
  67. data/tracks/purescript/config.json +12 -0
  68. data/tracks/purescript/exercises/sum-of-multiples/README.md +15 -0
  69. data/tracks/purescript/exercises/sum-of-multiples/bower.json +26 -0
  70. data/tracks/purescript/exercises/sum-of-multiples/examples/src/SumOfMultiples.purs +16 -0
  71. data/tracks/purescript/exercises/sum-of-multiples/src/SumOfMultiples.purs +3 -0
  72. data/tracks/purescript/exercises/sum-of-multiples/test/Main.purs +63 -0
  73. data/tracks/python/README.md +5 -1
  74. data/tracks/python/config.json +52 -9
  75. data/tracks/python/exercises/allergies/allergies_test.py +7 -7
  76. data/tracks/python/exercises/allergies/example.py +1 -1
  77. data/tracks/python/exercises/binary-search/binary_search_test.py +8 -5
  78. data/tracks/python/exercises/binary/binary_test.py +8 -4
  79. data/tracks/python/exercises/book-store/example.py +1 -1
  80. data/tracks/python/exercises/clock/clock.py +3 -0
  81. data/tracks/python/exercises/clock/clock_test.py +16 -16
  82. data/tracks/python/exercises/clock/example.py +1 -1
  83. data/tracks/python/exercises/list-ops/example.py +10 -29
  84. data/tracks/python/exercises/list-ops/list_ops.py +8 -12
  85. data/tracks/python/exercises/list-ops/list_ops_test.py +55 -86
  86. data/tracks/python/exercises/meetup/meetup_test.py +2 -2
  87. data/tracks/python/exercises/minesweeper/minesweeper_test.py +6 -3
  88. data/tracks/python/exercises/ocr-numbers/ocr_numbers_test.py +11 -8
  89. data/tracks/python/exercises/pangram/pangram_test.py +25 -16
  90. data/tracks/python/exercises/point-mutations/point_mutations.py +1 -1
  91. data/tracks/python/exercises/pythagorean-triplet/pythagorean_triplet_test.py +2 -1
  92. data/tracks/python/exercises/saddle-points/saddle_points_test.py +2 -1
  93. data/tracks/python/exercises/simple-cipher/simple_cipher_test.py +4 -2
  94. data/tracks/python/exercises/triangle/triangle_test.py +10 -5
  95. data/tracks/python/exercises/wordy/wordy_test.py +8 -5
  96. data/tracks/python/exercises/zipper/README.md +43 -0
  97. data/tracks/python/exercises/zipper/example.py +41 -0
  98. data/tracks/python/exercises/zipper/zipper.py +28 -0
  99. data/tracks/python/exercises/zipper/zipper_test.py +82 -0
  100. data/tracks/racket/.travis.yml +1 -1
  101. data/tracks/racket/config.json +14 -0
  102. data/tracks/racket/exercises/meetup/README.md +54 -0
  103. data/tracks/racket/exercises/meetup/example.rkt +45 -0
  104. data/tracks/racket/exercises/meetup/meetup-test.rkt +39 -0
  105. data/tracks/racket/exercises/meetup/meetup.rkt +3 -0
  106. metadata +29 -2
@@ -261,6 +261,18 @@
261
261
  "arithmetics",
262
262
  "maybe"
263
263
  ]
264
+ },
265
+ {
266
+ "uuid": "ee76a602-0eae-2680-b0d6-b804a419ed267ef04c2",
267
+ "slug": "sum-of-multiples",
268
+ "core": false,
269
+ "unlocked_by": null,
270
+ "difficulty": 1,
271
+ "topics": [
272
+ "arithmetics",
273
+ "arrays",
274
+ "modulo"
275
+ ]
264
276
  }
265
277
  ],
266
278
  "foregone": [
@@ -0,0 +1,15 @@
1
+ # Sum Of Multiples
2
+
3
+ Given a number, find the sum of all the multiples of particular numbers up to
4
+ but not including that number.
5
+
6
+ If we list all the natural numbers up to but not including 20 that are
7
+ multiples of either 3 or 5, we get 3, 5, 6 and 9, 10, 12, 15, and 18.
8
+
9
+ The sum of these multiples is 78.
10
+ ## Source
11
+
12
+ A variation on Problem 1 at Project Euler [http://projecteuler.net/problem=1](http://projecteuler.net/problem=1)
13
+
14
+ ## Submitting Incomplete Solutions
15
+ It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "sum-of-multiples",
3
+ "ignore": [
4
+ "**/.*",
5
+ "node_modules",
6
+ "bower_components",
7
+ "output"
8
+ ],
9
+ "dependencies": {
10
+ "purescript-console": "^3.0.0",
11
+ "purescript-datetime": "^3.4.0",
12
+ "purescript-either": "^3.1.0",
13
+ "purescript-enums": "^3.2.1",
14
+ "purescript-integers": "^3.1.0",
15
+ "purescript-lists": "^4.10.0",
16
+ "purescript-maps": "^3.5.2",
17
+ "purescript-prelude": "^3.1.0",
18
+ "purescript-sets": "^3.0.0",
19
+ "purescript-strings": "^3.3.1",
20
+ "purescript-unicode": "^3.0.1"
21
+ },
22
+ "devDependencies": {
23
+ "purescript-psci-support": "^3.0.0",
24
+ "purescript-test-unit": "^13.0.0"
25
+ }
26
+ }
@@ -0,0 +1,16 @@
1
+ module SumOfMultiples
2
+ ( sumOfMultiples
3
+ ) where
4
+
5
+ import Prelude
6
+ import Data.Array ((..), filter)
7
+ import Data.Foldable (any, sum)
8
+
9
+ sumOfMultiples :: Array Int -> Int -> Int
10
+ sumOfMultiples factors limit = sum $ filter (any isMultiple factors) rangeToCheck
11
+ where
12
+ rangeToCheck :: Array Int
13
+ rangeToCheck = 1..(limit - 1)
14
+
15
+ isMultiple :: Int -> Int -> Boolean
16
+ isMultiple factor x = x `mod` factor == 0
@@ -0,0 +1,3 @@
1
+ module SumOfMultiples
2
+ ( sumOfMultiples
3
+ ) where
@@ -0,0 +1,63 @@
1
+ module Test.Main where
2
+
3
+ import Prelude
4
+
5
+ import Control.Monad.Aff.AVar (AVAR)
6
+ import Control.Monad.Eff (Eff)
7
+ import Control.Monad.Eff.Console (CONSOLE)
8
+ import SumOfMultiples (sumOfMultiples)
9
+ import Test.Unit (TestSuite, suite, test)
10
+ import Test.Unit.Assert as Assert
11
+ import Test.Unit.Console (TESTOUTPUT)
12
+ import Test.Unit.Main (runTest)
13
+
14
+ main :: forall eff
15
+ . Eff ( avar :: AVAR
16
+ , console :: CONSOLE
17
+ , testOutput :: TESTOUTPUT
18
+ | eff
19
+ )
20
+ Unit
21
+ main = runTest suites
22
+
23
+ suites :: forall e. TestSuite e
24
+ suites = do
25
+ suite "SumOfMultiples.sumOfMultiples" do
26
+ test "multiples of 3 or 5 up to 1" do
27
+ Assert.equal 0 (sumOfMultiples [3, 5] 1)
28
+
29
+ test "multiples of 3 or 5 up to 4" do
30
+ Assert.equal 3 (sumOfMultiples [3, 5] 4)
31
+
32
+ test "multiples of 3 up to 7" do
33
+ Assert.equal 9 (sumOfMultiples [3] 7)
34
+
35
+ test "multiples of 3 or 5 up to 10" do
36
+ Assert.equal 23 (sumOfMultiples [3, 5] 10)
37
+
38
+ test "multiples of 3 or 5 up to 100" do
39
+ Assert.equal 2318 (sumOfMultiples [3, 5] 100)
40
+
41
+ test "multiples of 3 or 5 up to 1000" do
42
+ Assert.equal 233168 (sumOfMultiples [3, 5] 1000)
43
+
44
+ test "multiples of 7, 13 or 17 up to 20" do
45
+ Assert.equal 51 (sumOfMultiples [7, 13, 17] 20)
46
+
47
+ test "multiples of 4 or 6 up to 15" do
48
+ Assert.equal 30 (sumOfMultiples [4, 6] 15)
49
+
50
+ test "multiples of 5, 6 or 8 up to 150" do
51
+ Assert.equal 4419 (sumOfMultiples [5, 6, 8] 150)
52
+
53
+ test "multiples of 5 or 25 up to 51" do
54
+ Assert.equal 275 (sumOfMultiples [5, 25] 51)
55
+
56
+ test "multiples of 43 or 47 up to 10000" do
57
+ Assert.equal 2203160 (sumOfMultiples [43, 47] 10000)
58
+
59
+ test "multiples of 1 up to 100" do
60
+ Assert.equal 4950 (sumOfMultiples [1] 100)
61
+
62
+ test "multiples of an empty list up to 10000" do
63
+ Assert.equal 0 (sumOfMultiples [] 10000)
@@ -22,6 +22,7 @@ A list of missing exercise can be found here: http://exercism.io/languages/pytho
22
22
  - We use minimalistic stub files for all exercises (#272).
23
23
  - We use `unittest` (Python Standard Library) and no 3rd-party-framework.
24
24
  - We use the parameter order `self.assertEqual(actual, expected)` (#440).
25
+ - We use context managers (`with self.assertRaises(\<exception type\>):`) for testing for exceptions (#477).
25
26
 
26
27
 
27
28
  ### Testing
@@ -50,7 +51,7 @@ This repo uses [flake8](http://flake8.readthedocs.org/en/latest/) with default s
50
51
 
51
52
  This repo uses `travis-ci` in the following configuration: [travis.yml](https://github.com/exercism/python/blob/master/.travis.yml)
52
53
 
53
- It will check automatically the code style, the problem configuration and runns the unittests with all supported Python versions.
54
+ It will automatically check the code style, the problem configuration, and run the unittests with all supported Python versions.
54
55
 
55
56
 
56
57
  ## Pull Requests
@@ -71,3 +72,6 @@ If you're new to Git take a look at [this short guide](https://github.com/exerci
71
72
 
72
73
  ## Python icon
73
74
  The Python logo is an unregistered trademark. We are using a derived logo with the permission of the Python Software Foundation.
75
+
76
+ ## License
77
+ This repository uses the [MIT License](/LICENSE).
@@ -118,7 +118,9 @@
118
118
  "unlocked_by": null,
119
119
  "difficulty": 1,
120
120
  "topics": [
121
-
121
+ "strings",
122
+ "equality",
123
+ "conditionals"
122
124
  ]
123
125
  },
124
126
  {
@@ -140,7 +142,11 @@
140
142
  "unlocked_by": null,
141
143
  "difficulty": 1,
142
144
  "topics": [
143
-
145
+ "strings",
146
+ "conditionals",
147
+ "dates",
148
+ "parsing",
149
+ "pattern_recognition"
144
150
  ]
145
151
  },
146
152
  {
@@ -503,7 +509,11 @@
503
509
  "unlocked_by": null,
504
510
  "difficulty": 1,
505
511
  "topics": [
506
-
512
+ "algorithms",
513
+ "conditionals",
514
+ "classes",
515
+ "exception_handling",
516
+ "queues"
507
517
  ]
508
518
  },
509
519
  {
@@ -537,7 +547,10 @@
537
547
  "unlocked_by": null,
538
548
  "difficulty": 1,
539
549
  "topics": [
540
-
550
+ "algorithms",
551
+ "cryptography",
552
+ "text_formatting",
553
+ "lists"
541
554
  ]
542
555
  },
543
556
  {
@@ -560,7 +573,13 @@
560
573
  "unlocked_by": null,
561
574
  "difficulty": 1,
562
575
  "topics": [
563
-
576
+ "algorithms",
577
+ "conditionals",
578
+ "lists",
579
+ "loops",
580
+ "mathematics",
581
+ "matrices",
582
+ "sets"
564
583
  ]
565
584
  },
566
585
  {
@@ -582,7 +601,10 @@
582
601
  "unlocked_by": null,
583
602
  "difficulty": 1,
584
603
  "topics": [
585
-
604
+ "algorithms",
605
+ "loops",
606
+ "mathematics",
607
+ "logic"
586
608
  ]
587
609
  },
588
610
  {
@@ -632,7 +654,10 @@
632
654
  "unlocked_by": null,
633
655
  "difficulty": 1,
634
656
  "topics": [
635
-
657
+ "recursion",
658
+ "strings",
659
+ "stacks",
660
+ "parsing"
636
661
  ]
637
662
  },
638
663
  {
@@ -642,7 +667,11 @@
642
667
  "unlocked_by": null,
643
668
  "difficulty": 1,
644
669
  "topics": [
645
-
670
+ "lists",
671
+ "parsing",
672
+ "transformation",
673
+ "loops",
674
+ "games"
646
675
  ]
647
676
  },
648
677
  {
@@ -696,7 +725,9 @@
696
725
  "unlocked_by": null,
697
726
  "difficulty": 1,
698
727
  "topics": [
699
-
728
+ "lists",
729
+ "parsing",
730
+ "pattern_recognition"
700
731
  ]
701
732
  },
702
733
  {
@@ -1043,6 +1074,18 @@
1043
1074
  "conditionals"
1044
1075
  ]
1045
1076
  },
1077
+ {
1078
+ "uuid": "4f5f890d-0db4-5480-f79a-21057c37871b15133dc",
1079
+ "slug": "zipper",
1080
+ "core": false,
1081
+ "unlocked_by": null,
1082
+ "difficulty": 8,
1083
+ "topics": [
1084
+ "recursion",
1085
+ "searching",
1086
+ "trees"
1087
+ ]
1088
+ },
1046
1089
  {
1047
1090
  "uuid": "e7351e8e-d3ff-4621-b818-cd55cf05bffd",
1048
1091
  "slug": "accumulate",
@@ -12,18 +12,18 @@ if not hasattr(unittest.TestCase, 'assertCountEqual'):
12
12
  class AllergiesTests(unittest.TestCase):
13
13
  def test_no_allergies_means_not_allergic(self):
14
14
  allergies = Allergies(0)
15
- self.assertFalse(allergies.is_allergic_to('peanuts'))
16
- self.assertFalse(allergies.is_allergic_to('cats'))
17
- self.assertFalse(allergies.is_allergic_to('strawberries'))
15
+ self.assertIs(allergies.is_allergic_to('peanuts'), False)
16
+ self.assertIs(allergies.is_allergic_to('cats'), False)
17
+ self.assertIs(allergies.is_allergic_to('strawberries'), False)
18
18
 
19
19
  def test_is_allergic_to_eggs(self):
20
- self.assertTrue(Allergies(1).is_allergic_to('eggs'))
20
+ self.assertIs(Allergies(1).is_allergic_to('eggs'), True)
21
21
 
22
22
  def test_allergic_to_eggs_in_addition_to_other_stuff(self):
23
23
  allergies = Allergies(5)
24
- self.assertTrue(allergies.is_allergic_to('eggs'))
25
- self.assertTrue(allergies.is_allergic_to('shellfish'))
26
- self.assertFalse(allergies.is_allergic_to('strawberries'))
24
+ self.assertIs(allergies.is_allergic_to('eggs'), True)
25
+ self.assertIs(allergies.is_allergic_to('shellfish'), True)
26
+ self.assertIs(allergies.is_allergic_to('strawberries'), False)
27
27
 
28
28
  def test_no_allergies_at_all(self):
29
29
  self.assertEqual(Allergies(0).lst, [])
@@ -15,7 +15,7 @@ class Allergies(object):
15
15
  self.score = score
16
16
 
17
17
  def is_allergic_to(self, allergy):
18
- return self.score & 1 << self._allergies.index(allergy)
18
+ return bool(self.score & 1 << self._allergies.index(allergy))
19
19
 
20
20
  @property
21
21
  def lst(self):
@@ -27,17 +27,20 @@ class BinarySearchTests(unittest.TestCase):
27
27
  5)
28
28
 
29
29
  def test_identifies_value_missing(self):
30
- self.assertRaises(ValueError, binary_search, [1, 3, 4, 6, 8, 9, 11], 7)
30
+ with self.assertRaises(ValueError):
31
+ binary_search([1, 3, 4, 6, 8, 9, 11], 7)
31
32
 
32
33
  def test_value_smaller_than_arrays_minimum(self):
33
- self.assertRaises(ValueError, binary_search, [1, 3, 4, 6, 8, 9, 11], 0)
34
+ with self.assertRaises(ValueError):
35
+ binary_search([1, 3, 4, 6, 8, 9, 11], 0)
34
36
 
35
37
  def test_value_larger_than_arrays_maximum(self):
36
- self.assertRaises(ValueError, binary_search, [1, 3, 4, 6, 8, 9, 11],
37
- 13)
38
+ with self.assertRaises(ValueError):
39
+ binary_search([1, 3, 4, 6, 8, 9, 11], 13)
38
40
 
39
41
  def test_empty_array(self):
40
- self.assertRaises(ValueError, binary_search, [], 1)
42
+ with self.assertRaises(ValueError):
43
+ binary_search([], 1)
41
44
 
42
45
 
43
46
  if __name__ == '__main__':
@@ -32,16 +32,20 @@ class BinaryTests(unittest.TestCase):
32
32
  self.assertEqual(parse_binary("10001101000"), 1128)
33
33
 
34
34
  def test_invalid_binary_text_only(self):
35
- self.assertRaises(ValueError, parse_binary, "carrot")
35
+ with self.assertRaises(ValueError):
36
+ parse_binary("carrot")
36
37
 
37
38
  def test_invalid_binary_number_not_base2(self):
38
- self.assertRaises(ValueError, parse_binary, "102011")
39
+ with self.assertRaises(ValueError):
40
+ parse_binary("102011")
39
41
 
40
42
  def test_invalid_binary_numbers_with_text(self):
41
- self.assertRaises(ValueError, parse_binary, "10nope")
43
+ with self.assertRaises(ValueError):
44
+ parse_binary("10nope")
42
45
 
43
46
  def test_invalid_binary_text_with_numbers(self):
44
- self.assertRaises(ValueError, parse_binary, "nope10")
47
+ with self.assertRaises(ValueError):
48
+ parse_binary("nope10")
45
49
 
46
50
 
47
51
  if __name__ == '__main__':
@@ -5,7 +5,7 @@ def _group_price(size):
5
5
  discounts = [0, .05, .1, .2, .25]
6
6
  if not (0 < size <= 5):
7
7
  raise ValueError('size must be in 1..' + len(discounts))
8
- return 8 * size * (1 - discounts[size - 1])
8
+ return BOOK_PRICE * size * (1 - discounts[size - 1])
9
9
 
10
10
 
11
11
  def calculate_total(books, price_so_far=0.):
@@ -1,3 +1,6 @@
1
1
  class Clock(object):
2
2
  def __init__(self, hour, minute):
3
3
  pass
4
+
5
+ def __add__(self, other):
6
+ pass
@@ -64,52 +64,52 @@ class ClockTest(unittest.TestCase):
64
64
 
65
65
  # Test adding and subtracting minutes.
66
66
  def test_add_minutes(self):
67
- self.assertEqual(str(Clock(10, 0).add(3)), '10:03')
67
+ self.assertEqual(str(Clock(10, 0) + 3), '10:03')
68
68
 
69
69
  def test_add_no_minutes(self):
70
- self.assertEqual(str(Clock(6, 41).add(0)), '06:41')
70
+ self.assertEqual(str(Clock(6, 41) + 0), '06:41')
71
71
 
72
72
  def test_add_to_next_hour(self):
73
- self.assertEqual(str(Clock(0, 45).add(40)), '01:25')
73
+ self.assertEqual(str(Clock(0, 45) + 40), '01:25')
74
74
 
75
75
  def test_add_more_than_one_hour(self):
76
- self.assertEqual(str(Clock(10, 0).add(61)), '11:01')
76
+ self.assertEqual(str(Clock(10, 0) + 61), '11:01')
77
77
 
78
78
  def test_add_more_than_two_hours_with_carry(self):
79
- self.assertEqual(str(Clock(0, 45).add(160)), '03:25')
79
+ self.assertEqual(str(Clock(0, 45) + 160), '03:25')
80
80
 
81
81
  def test_add_across_midnight(self):
82
- self.assertEqual(str(Clock(23, 59).add(2)), '00:01')
82
+ self.assertEqual(str(Clock(23, 59) + 2), '00:01')
83
83
 
84
84
  def test_add_more_than_one_day(self):
85
- self.assertEqual(str(Clock(5, 32).add(1500)), '06:32')
85
+ self.assertEqual(str(Clock(5, 32) + 1500), '06:32')
86
86
 
87
87
  def test_add_more_than_two_days(self):
88
- self.assertEqual(str(Clock(1, 1).add(3500)), '11:21')
88
+ self.assertEqual(str(Clock(1, 1) + 3500), '11:21')
89
89
 
90
90
  def test_subtract_minutes(self):
91
- self.assertEqual(str(Clock(10, 3).add(-3)), '10:00')
91
+ self.assertEqual(str(Clock(10, 3) + -3), '10:00')
92
92
 
93
93
  def test_subtract_to_previous_hour(self):
94
- self.assertEqual(str(Clock(10, 3).add(-3)), '10:00')
94
+ self.assertEqual(str(Clock(10, 3) + -3), '10:00')
95
95
 
96
96
  def test_subtract_more_than_an_hour(self):
97
- self.assertEqual(str(Clock(10, 3).add(-30)), '09:33')
97
+ self.assertEqual(str(Clock(10, 3) + -30), '09:33')
98
98
 
99
99
  def test_subtract_across_midnight(self):
100
- self.assertEqual(str(Clock(10, 3).add(-70)), '08:53')
100
+ self.assertEqual(str(Clock(10, 3) + -70), '08:53')
101
101
 
102
102
  def test_subtract_more_than_two_hours(self):
103
- self.assertEqual(str(Clock(0, 0).add(-160)), '21:20')
103
+ self.assertEqual(str(Clock(0, 0) + -160), '21:20')
104
104
 
105
105
  def test_subtract_more_than_two_hours_with_borrow(self):
106
- self.assertEqual(str(Clock(6, 15).add(-160)), '03:35')
106
+ self.assertEqual(str(Clock(6, 15) + -160), '03:35')
107
107
 
108
108
  def test_subtract_more_than_one_day(self):
109
- self.assertEqual(str(Clock(5, 32).add(-1500)), '04:32')
109
+ self.assertEqual(str(Clock(5, 32) + -1500), '04:32')
110
110
 
111
111
  def test_subtract_more_than_two_days(self):
112
- self.assertEqual(str(Clock(2, 20).add(-3000)), '00:20')
112
+ self.assertEqual(str(Clock(2, 20) + -3000), '00:20')
113
113
 
114
114
  # Construct two separate clocks, set times, test if they are equal.
115
115
  def test_clocks_with_same_time(self):