-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Description
Hi,
During a review, the person ask me if his code check if the X character is only acceptable at the end of the ISBN. So I look at the test and I see this test:
def test_x_is_only_valid_as_a_check_digit(self):
self.assertIs(is_valid("3-598-2X507-9"), False)I think this is the test that test it. But here is the problem I have.
The sum % 11 is not equal to 0.
Here is his solution:
def is_valid(isbn):
isbn = isbn.replace('-', '')
if len(isbn) != 10:
return False
sum = 0
for index, digit in enumerate(list(isbn)):
if digit.isdecimal():
sum += int(digit) * (10 - index)
elif digit == 'X':
sum += 10
else:
return False
return sum % 11 == 0 Here the operation his code is doing:
3 * 10 + 5 * 9 + 9 * 8 + 8 * 7 + 2 * 6 + 10 + 5 * 4 + 0 * 3 + 7 * 2 + 9 * 1 = 268
268 % 11 = 4
As you can see the 10 (replacing the X value) is not multiplied (this is how he write his solution). Because of this his test pass but not for the good reason. It pass because the sum % 11 != 0 and not because X is valid only as a check character.
I think we should add the test case where the ISBN is "3-598-2X507-5". This is a case where the sum is 264 (and 264 % 11 == 0). Doing so will handle that sum % 11 == 0 and the X character is not at the end.