Skip to content

Commit bad10ab

Browse files
authored
isbn-verifier: Sync tests (#706)
* sync tests * update starter file * implement tests * rewrite example solution so that it passes the tests * update config * rename test functions * move example.clj to .meta folder [no important files changed]
1 parent dd373c9 commit bad10ab

File tree

5 files changed

+111
-54
lines changed

5 files changed

+111
-54
lines changed

exercises/practice/isbn-verifier/.meta/config.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
"AndreaCrotti",
55
"haus",
66
"jgomo3",
7-
"sjwarner-bp"
7+
"sjwarner-bp",
8+
"tasxatzial"
89
],
910
"files": {
1011
"solution": [
Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,24 @@
11
(ns isbn-verifier)
22

3-
(defn is-in? [xs x] (some #(= x %) xs))
3+
(defn- get-value
4+
[ch]
5+
(if (= ch \X)
6+
10
7+
(Character/digit ^char ch 10)))
48

5-
(defn isbn-chars [isbn]
6-
(filter #(is-in? [\0 \1 \2 \3 \4 \5 \6 \7 \8 \9 \X] %) isbn))
9+
(defn- valid-isbn-value?
10+
[s]
11+
(->> (remove #{\-} s)
12+
(map get-value)
13+
(map * (range 10 0 -1))
14+
(reduce +)
15+
(#(mod % 11))
16+
zero?))
717

8-
(defn isbn? [isbn]
9-
(let [chars (isbn-chars isbn)
10-
nums (map #(if (= \X %) 10 (Character/digit % 10)) chars)]
11-
(and (-> chars butlast (is-in? \X) not)
12-
(= 10 (count chars))
13-
(as-> nums x
14-
(map #(* %1 %2) (range 10 0 -1) x)
15-
(reduce + x)
16-
(mod x 11)
17-
(zero? x)))))
18+
(defn valid-isbn-pattern?
19+
[s]
20+
(boolean (re-matches #"\d{9}(X|\d)|\d-\d{3}-\d{5}-(X|\d)" s)))
21+
22+
(defn isbn?
23+
[s]
24+
(and (valid-isbn-pattern? s) (valid-isbn-value? s)))

exercises/practice/isbn-verifier/.meta/tests.toml

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,31 @@
1-
# This is an auto-generated file. Regular comments will be removed when this
2-
# file is regenerated. Regenerating will not touch any manually added keys,
3-
# so comments can be added in a "comment" key.
1+
# This is an auto-generated file.
2+
#
3+
# Regenerating this file via `configlet sync` will:
4+
# - Recreate every `description` key/value pair
5+
# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications
6+
# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)
7+
# - Preserve any other key/value pair
8+
#
9+
# As user-added comments (using the # character) will be removed when this file
10+
# is regenerated, comments can be added via a `comment` key.
411

512
[0caa3eac-d2e3-4c29-8df8-b188bc8c9292]
6-
description = "valid isbn number"
13+
description = "valid isbn"
714

815
[19f76b53-7c24-45f8-87b8-4604d0ccd248]
916
description = "invalid isbn check digit"
1017

1118
[4164bfee-fb0a-4a1c-9f70-64c6a1903dcd]
12-
description = "valid isbn number with a check digit of 10"
19+
description = "valid isbn with a check digit of 10"
1320

1421
[3ed50db1-8982-4423-a993-93174a20825c]
1522
description = "check digit is a character other than X"
1623

24+
[9416f4a5-fe01-4b61-a07b-eb75892ef562]
25+
description = "invalid check digit in isbn is not treated as zero"
26+
1727
[c19ba0c4-014f-4dc3-a63f-ff9aefc9b5ec]
18-
description = "invalid character in isbn"
28+
description = "invalid character in isbn is not treated as zero"
1929

2030
[28025280-2c39-4092-9719-f3234b89c627]
2131
description = "X is only valid as a check digit"
@@ -48,7 +58,10 @@ description = "empty isbn"
4858
description = "input is 9 characters"
4959

5060
[ed6e8d1b-382c-4081-8326-8b772c581fec]
51-
description = "invalid characters are not ignored"
61+
description = "invalid characters are not ignored after checking length"
62+
63+
[daad3e58-ce00-4395-8a8e-e3eded1cdc86]
64+
description = "invalid characters are not ignored before checking length"
5265

5366
[fb5e48d8-7c03-4bfb-a088-b101df16fdc3]
5467
description = "input is too long but contains a valid isbn"
Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
(ns isbn-verifier)
22

3-
(defn isbn? [isbn] ;; <- arglist goes here
4-
;; your code goes here
5-
)
3+
(defn isbn?
4+
"Returns true if the given isbn is valid; otherwise, returns false"
5+
[isbn]
6+
;; function body
7+
)
Lines changed: 64 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,79 @@
11
(ns isbn-verifier-test
2-
(:require [clojure.test :refer [deftest is]]
3-
[isbn-verifier :refer [isbn?]]))
2+
(:require [clojure.test :refer [deftest testing is]]
3+
isbn-verifier))
44

5-
(deftest valid-isbn-number
6-
(is (= true (isbn? "3-598-21508-8"))))
5+
(deftest isbn?_test_1
6+
(testing "valid isbn"
7+
(is (true? (isbn-verifier/isbn? "3-598-21508-8")))))
78

8-
(deftest invalid-isbn-check-digit
9-
(is (= false (isbn? "3-598-21508-9"))))
9+
(deftest isbn?_test_2
10+
(testing "invalid isbn check digit"
11+
(is (false? (isbn-verifier/isbn? "3-598-21508-9")))))
1012

11-
(deftest valid-isbn-number-with-a-check-digit-of-10
12-
(is (= true (isbn? "3-598-21507-X"))))
13+
(deftest isbn?_test_3
14+
(testing "valid isbn with a check digit of 10"
15+
(is (true? (isbn-verifier/isbn? "3-598-21507-X")))))
1316

14-
(deftest check-digit-is-a-character-other-than-X
15-
(is (= false (isbn? "3-598-21507-A"))))
17+
(deftest isbn?_test_4
18+
(testing "check digit is a character other than X"
19+
(is (false? (isbn-verifier/isbn? "3-598-21507-A")))))
1620

17-
(deftest invalid-character-in-isbn
18-
(is (= false (isbn? "3-598-2K507-0"))))
21+
(deftest isbn?_test_5
22+
(testing "invalid check digit in isbn is not treated as zero"
23+
(is (false? (isbn-verifier/isbn? "4-598-21507-B")))))
1924

20-
(deftest X-is-only-valid-as-a-check-digit
21-
(is (= false (isbn? "3-598-2X507-9"))))
25+
(deftest isbn?_test_6
26+
(testing "invalid character in isbn is not treated as zero"
27+
(is (false? (isbn-verifier/isbn? "3-598-P1581-X")))))
2228

23-
(deftest valid-isbn-without-separating-dashes
24-
(is (= true (isbn? "3598215088"))))
29+
(deftest isbn?_test_7
30+
(testing "X is only valid as a check digit"
31+
(is (false? (isbn-verifier/isbn? "3-598-2X507-9")))))
2532

26-
(deftest isbn-without-separating-dashes-and-X-as-check-digit
27-
(is (= true (isbn? "359821507X"))))
33+
(deftest isbn?_test_8
34+
(testing "valid isbn without separating dashes"
35+
(is (true? (isbn-verifier/isbn? "3598215088")))))
2836

29-
(deftest isbn-without-check-digit-and-dashes
30-
(is (= false (isbn? "359821507"))))
37+
(deftest isbn?_test_9
38+
(testing "isbn without separating dashes and X as check digit"
39+
(is (true? (isbn-verifier/isbn? "359821507X")))))
3140

32-
(deftest too-long-isbn-and-no-dashes
33-
(is (= false (isbn? "3598215078X"))))
41+
(deftest isbn?_test_10
42+
(testing "isbn without check digit and dashes"
43+
(is (false? (isbn-verifier/isbn? "359821507")))))
3444

35-
(deftest too-short-isbn
36-
(is (= false (isbn? "00"))))
45+
(deftest isbn?_test_11
46+
(testing "too long isbn and no dashes"
47+
(is (false? (isbn-verifier/isbn? "3598215078X")))))
3748

38-
(deftest isbn-without-check-digit
39-
(is (= false (isbn? "3-598-21507"))))
49+
(deftest isbn?_test_12
50+
(testing "too short isbn"
51+
(is (false? (isbn-verifier/isbn? "00")))))
4052

41-
(deftest too-long-isbn
42-
(is (= false (isbn? "3-598-21507-XX"))))
53+
(deftest isbn?_test_13
54+
(testing "isbn without check digit"
55+
(is (false? (isbn-verifier/isbn? "3-598-21507")))))
4356

44-
(deftest check-digit-of-X-should-not-be-used-for-0
45-
(is (= false (isbn? "3-598-21515-X"))))
57+
(deftest isbn?_test_14
58+
(testing "check digit of X should not be used for 0"
59+
(is (false? (isbn-verifier/isbn? "3-598-21515-X")))))
60+
61+
(deftest isbn?_test_15
62+
(testing "empty isbn"
63+
(is (false? (isbn-verifier/isbn? "")))))
64+
65+
(deftest isbn?_test_16
66+
(testing "input is 9 characters"
67+
(is (false? (isbn-verifier/isbn? "134456729")))))
68+
69+
(deftest isbn?_test_17
70+
(testing "invalid characters are not ignored after checking length"
71+
(is (false? (isbn-verifier/isbn? "3132P34035")))))
72+
73+
(deftest isbn?_test_18
74+
(testing "invalid characters are not ignored before checking length"
75+
(is (false? (isbn-verifier/isbn? "3598P215088")))))
76+
77+
(deftest isbn?_test_19
78+
(testing "input is too long but contains a valid isbn"
79+
(is (false? (isbn-verifier/isbn? "98245726788")))))

0 commit comments

Comments
 (0)