Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion string_utils/validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,8 @@ def is_isbn_10(self) -> bool:

try:
for index, digit in enumerate(self.input_string):
product += int(digit) * (index + 1)
value = 10 if index == 9 and digit == 'X' else int(digit)
product += value * (index + 1)

return product % 11 == 0

Expand Down
16 changes: 15 additions & 1 deletion tests/test_is_isbn_10.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from unittest import TestCase

from string_utils.errors import InvalidInputError
from string_utils.validation import is_isbn_10
from string_utils.validation import is_isbn, is_isbn_10


class IsISBN10TestCase(TestCase):
Expand All @@ -26,6 +26,20 @@ def test_returns_true_for_valid_isbn_10(self):
self.assertTrue(is_isbn_10('0718079183'))
self.assertTrue(is_isbn_10('8830102180'))

def test_x_check_digit(self):
for isbn in ('080442957X', '0-8044-2957-X', '097522980X'):
with self.subTest(isbn=isbn):
self.assertTrue(is_isbn_10(isbn))
self.assertTrue(is_isbn(isbn))
self.assertTrue(is_isbn_10('080442957X', normalize=False))
self.assertFalse(is_isbn_10('0-8044-2957-X', normalize=False))

def test_invalid_x_check_digit(self):
for isbn in ('080442958X', 'X804429570', '08044295XX', '080442957x'):
with self.subTest(isbn=isbn):
self.assertFalse(is_isbn_10(isbn))
self.assertFalse(is_isbn(isbn))

def test_dashes_are_not_considered_by_default(self):
# isbn numbers have been taken from actual books on amazon
self.assertTrue(is_isbn_10('150-6715214'))
Expand Down