2023-09-27 23:07:03 -04:00

94 lines
2.3 KiB
Python

class CreditCard:
card_types = [
('4', 'VISA'),
('34', 'AMEX'),
('37', 'AMEX'),
('51', 'MASTERCARD'),
('52', 'MASTERCARD'),
('53', 'MASTERCARD'),
('54', 'MASTERCARD'),
('55', 'MASTERCARD'),
('6011', 'DISCOVER'),
]
@classmethod
def luna_check(cls, card_number):
digits = []
for index, digit in enumerate(card_number[::-1]):
if index % 2:
digits += [int(i) for i in str(int(digit)*2)]
else:
digits.append(int(digit))
return not bool(sum(digits) % 10)
def __init__(self, card_number):
self.card_number = card_number
@property
def card_type(self):
for start, type in self.card_types:
if self.card_number.startswith(start):
return type
#Create and add your method called `check_length` to the CreditCard class here:
def check_length(self):
pass
@property
def is_valid(self):
return self.luna_check(self.card_number), self.card_type
#Create and add your method called 'validate' to the CreditCard class here:
# print(CreditCard.luna_check('4485040993287616'))
cc = CreditCard('4485040993287616')
print(cc.is_valid)
exit(0)
#do not modify assert statements
cc = CreditCard('9999999999999999')
assert cc.is_valid == False, "Credit Card number cannot start with 9"
assert cc.card_type == "INVALID", "99... card type is INVALID"
cc = CreditCard('4440')
assert cc.is_valid == False, "4440 is too short to be valid"
assert cc.card_type == "INVALID", "4440 card type is INVALID"
cc = CreditCard('5515460934365316')
assert cc.is_valid == True, "Mastercard is Valid"
assert cc.card_type == "MASTERCARD", "card_type is MASTERCARD"
cc = CreditCard('6011053711075799')
assert cc.is_valid == True, "Discover Card is Valid"
assert cc.card_type == "DISCOVER", "card_type is DISCOVER"
cc = CreditCard('379179199857686')
assert cc.is_valid == True, "AMEX is Valid"
assert cc.card_type == "AMEX", "card_type is AMEX"
cc = CreditCard('4929896355493470')
assert cc.is_valid == True, "Visa Card is Valid"
assert cc.card_type == "VISA", "card_type is VISA"
cc = CreditCard('4329876355493470')
assert cc.is_valid == False, "This card does not meet mod10"
assert cc.card_type == "INVALID", "card_type is INVALID"
cc = CreditCard('339179199857685')
assert cc.is_valid == False, "Validates mod10, but invalid starting numbers for AMEX"
assert cc.card_type == "INVALID", "card_type is INVALID"