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.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/problem-specifications/exercises/grains/canonical-data.json +1 -1
- data/problem-specifications/exercises/isbn-verifier/description.md +1 -1
- data/tracks/dart/exercises/anagram/pubspec.lock +10 -10
- data/tracks/dart/exercises/bob/pubspec.lock +4 -4
- data/tracks/dart/exercises/difference-of-squares/pubspec.lock +4 -4
- data/tracks/dart/exercises/gigasecond/pubspec.lock +4 -4
- data/tracks/dart/exercises/hamming/pubspec.lock +4 -4
- data/tracks/dart/exercises/hello-world/pubspec.lock +4 -4
- data/tracks/dart/exercises/leap/pubspec.lock +4 -4
- data/tracks/dart/exercises/phone-number/pubspec.lock +4 -4
- data/tracks/dart/exercises/raindrops/pubspec.lock +17 -5
- data/tracks/dart/exercises/rna-transcription/pubspec.lock +4 -4
- data/tracks/dart/exercises/word-count/pubspec.lock +4 -4
- data/tracks/dart/pubspec.lock +3 -3
- data/tracks/fsharp/exercises/largest-series-product/Example.fs +18 -4
- data/tracks/fsharp/exercises/largest-series-product/LargestSeriesProduct.fs +1 -1
- data/tracks/fsharp/exercises/largest-series-product/LargestSeriesProductTest.fs +80 -36
- data/tracks/fsharp/generators/Exercise.fs +1 -1
- data/tracks/fsharp/generators/Generators.fs +10 -0
- data/tracks/gnu-apl/config.json +14 -0
- data/tracks/gnu-apl/exercises/difference-of-squares/README.md +19 -0
- data/tracks/gnu-apl/exercises/difference-of-squares/difference-of-squares-example.apl +13 -0
- data/tracks/gnu-apl/exercises/difference-of-squares/difference-of-squares.tc +38 -0
- data/tracks/gnu-apl/exercises/pangram/README.md +15 -0
- data/tracks/gnu-apl/exercises/pangram/pangram-example.apl +14 -0
- data/tracks/gnu-apl/exercises/pangram/pangram.tc +40 -0
- data/tracks/gnu-apl/exercises/raindrops/raindrops.tc +1 -1
- data/tracks/java/exercises/bracket-push/.meta/version +1 -0
- data/tracks/java/exercises/complex-numbers/.meta/version +1 -0
- data/tracks/java/exercises/ocr-numbers/.meta/version +1 -0
- data/tracks/java/exercises/queen-attack/.meta/version +1 -0
- data/tracks/java/exercises/rectangles/.meta/version +1 -0
- data/tracks/java/exercises/robot-simulator/.meta/version +1 -0
- data/tracks/java/exercises/secret-handshake/.meta/version +1 -0
- data/tracks/java/exercises/sublist/.meta/version +1 -0
- data/tracks/perl6/exercises/accumulate/accumulate.t +1 -6
- data/tracks/perl6/exercises/all-your-base/all-your-base.t +14 -19
- data/tracks/perl6/exercises/allergies/Allergies.pm6 +1 -1
- data/tracks/perl6/exercises/allergies/Example.pm6 +1 -1
- data/tracks/perl6/exercises/allergies/allergies.t +25 -29
- data/tracks/perl6/exercises/allergies/example.yaml +11 -10
- data/tracks/perl6/exercises/anagram/anagram.t +14 -19
- data/tracks/perl6/exercises/atbash-cipher/atbash-cipher.t +14 -19
- data/tracks/perl6/exercises/bob/bob.t +16 -23
- data/tracks/perl6/exercises/bob/example.yaml +1 -3
- data/tracks/perl6/exercises/clock/clock.t +14 -19
- data/tracks/perl6/exercises/flatten-array/flatten-array.t +14 -19
- data/tracks/perl6/exercises/grade-school/grade-school.t +1 -6
- data/tracks/perl6/exercises/grains/grains.t +15 -20
- data/tracks/perl6/exercises/hello-world/example.yaml +1 -3
- data/tracks/perl6/exercises/hello-world/hello-world.t +16 -23
- data/tracks/perl6/exercises/leap/leap.t +14 -19
- data/tracks/perl6/exercises/linked-list/example.yaml +59 -59
- data/tracks/perl6/exercises/linked-list/linked-list.t +59 -64
- data/tracks/perl6/exercises/luhn/luhn.t +14 -19
- data/tracks/perl6/exercises/phone-number/phone-number.t +14 -19
- data/tracks/perl6/exercises/raindrops/raindrops.t +14 -19
- data/tracks/perl6/exercises/rna-transcription/rna-transcription.t +14 -19
- data/tracks/perl6/exercises/robot-name/robot-name.t +1 -6
- data/tracks/perl6/exercises/scrabble-score/scrabble-score.t +14 -19
- data/tracks/perl6/exercises/space-age/space-age.t +14 -19
- data/tracks/perl6/exercises/word-count/word-count.t +14 -19
- data/tracks/perl6/exercises/wordy/wordy.t +14 -19
- data/tracks/perl6/templates/test.mustache +19 -25
- data/tracks/purescript/config.json +12 -0
- data/tracks/purescript/exercises/sum-of-multiples/README.md +15 -0
- data/tracks/purescript/exercises/sum-of-multiples/bower.json +26 -0
- data/tracks/purescript/exercises/sum-of-multiples/examples/src/SumOfMultiples.purs +16 -0
- data/tracks/purescript/exercises/sum-of-multiples/src/SumOfMultiples.purs +3 -0
- data/tracks/purescript/exercises/sum-of-multiples/test/Main.purs +63 -0
- data/tracks/python/README.md +5 -1
- data/tracks/python/config.json +52 -9
- data/tracks/python/exercises/allergies/allergies_test.py +7 -7
- data/tracks/python/exercises/allergies/example.py +1 -1
- data/tracks/python/exercises/binary-search/binary_search_test.py +8 -5
- data/tracks/python/exercises/binary/binary_test.py +8 -4
- data/tracks/python/exercises/book-store/example.py +1 -1
- data/tracks/python/exercises/clock/clock.py +3 -0
- data/tracks/python/exercises/clock/clock_test.py +16 -16
- data/tracks/python/exercises/clock/example.py +1 -1
- data/tracks/python/exercises/list-ops/example.py +10 -29
- data/tracks/python/exercises/list-ops/list_ops.py +8 -12
- data/tracks/python/exercises/list-ops/list_ops_test.py +55 -86
- data/tracks/python/exercises/meetup/meetup_test.py +2 -2
- data/tracks/python/exercises/minesweeper/minesweeper_test.py +6 -3
- data/tracks/python/exercises/ocr-numbers/ocr_numbers_test.py +11 -8
- data/tracks/python/exercises/pangram/pangram_test.py +25 -16
- data/tracks/python/exercises/point-mutations/point_mutations.py +1 -1
- data/tracks/python/exercises/pythagorean-triplet/pythagorean_triplet_test.py +2 -1
- data/tracks/python/exercises/saddle-points/saddle_points_test.py +2 -1
- data/tracks/python/exercises/simple-cipher/simple_cipher_test.py +4 -2
- data/tracks/python/exercises/triangle/triangle_test.py +10 -5
- data/tracks/python/exercises/wordy/wordy_test.py +8 -5
- data/tracks/python/exercises/zipper/README.md +43 -0
- data/tracks/python/exercises/zipper/example.py +41 -0
- data/tracks/python/exercises/zipper/zipper.py +28 -0
- data/tracks/python/exercises/zipper/zipper_test.py +82 -0
- data/tracks/racket/.travis.yml +1 -1
- data/tracks/racket/config.json +14 -0
- data/tracks/racket/exercises/meetup/README.md +54 -0
- data/tracks/racket/exercises/meetup/example.rkt +45 -0
- data/tracks/racket/exercises/meetup/meetup-test.rkt +39 -0
- data/tracks/racket/exercises/meetup/meetup.rkt +3 -0
- 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,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)
|
data/tracks/python/README.md
CHANGED
@@ -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
|
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).
|
data/tracks/python/config.json
CHANGED
@@ -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.
|
16
|
-
self.
|
17
|
-
self.
|
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.
|
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.
|
25
|
-
self.
|
26
|
-
self.
|
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, [])
|
@@ -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
|
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
|
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
|
37
|
-
|
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
|
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
|
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
|
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
|
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
|
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
|
+
return BOOK_PRICE * size * (1 - discounts[size - 1])
|
9
9
|
|
10
10
|
|
11
11
|
def calculate_total(books, price_so_far=0.):
|
@@ -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)
|
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)
|
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)
|
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)
|
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)
|
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)
|
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)
|
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)
|
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)
|
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)
|
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)
|
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)
|
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)
|
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)
|
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)
|
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)
|
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):
|