Skip to content

Commit 327cc0a

Browse files
committed
add card-validator code and tests
1 parent 071f6b3 commit 327cc0a

2 files changed

Lines changed: 129 additions & 0 deletions

File tree

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
function validateCreditCardNumber(cardNumber) {
2+
// Check if the card number is a positive integer.
3+
if (typeof cardNumber !== "number" || cardNumber < 0) {
4+
return false;
5+
}
6+
7+
const cardNumberString = String(cardNumber);
8+
// Check if the card number has at least two different digits
9+
const uniqueDigits = new Set(cardNumberString);
10+
11+
if (uniqueDigits.size < 2) {
12+
return false;
13+
}
14+
15+
// Check if the card number has exactly 16 digits.
16+
if (cardNumberString.length !== 16) {
17+
return false;
18+
}
19+
20+
// Check if the last digit is even
21+
if (Number(cardNumberString.slice(-1)) % 2 !== 0) {
22+
return false;
23+
}
24+
25+
// Check if the sum of all the digits is greater than 16
26+
const sumOfAllDigits = Array.from(cardNumberString).reduce(
27+
(sum, digit) => sum + Number(digit),
28+
0
29+
);
30+
31+
if (sumOfAllDigits <= 16) {
32+
return false;
33+
}
34+
35+
return true;
36+
}
37+
38+
module.exports = validateCreditCardNumber;
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
const validateCreditCardNumber = require("./card-validator");
2+
3+
test("Number must be 16 digits, all of them must be numbers.", () => {
4+
// Arrange
5+
const cardNumber = 1234567890123456;
6+
// Act
7+
const result = validateCreditCardNumber(cardNumber);
8+
// Assert
9+
expect(result).toEqual(true);
10+
});
11+
12+
test("Credit card number must have at least two different digits.", () => {
13+
// Arrange
14+
const cardNumber = 6262826262628262;
15+
// Act
16+
const result = validateCreditCardNumber(cardNumber);
17+
// Assert
18+
expect(result).toEqual(true);
19+
});
20+
21+
test("Credit card with only one repeating digit is invalid.", () => {
22+
// Arrange
23+
const cardNumber = 8888888888888888;
24+
// Act
25+
const result = validateCreditCardNumber(cardNumber);
26+
// Assert
27+
expect(result).toEqual(false);
28+
});
29+
30+
test("Credit card number cannot have an odd last digit.", () => {
31+
// Arrange
32+
const cardNumber = 1234567890123457;
33+
// Act
34+
const result = validateCreditCardNumber(cardNumber);
35+
// Assert
36+
expect(result).toEqual(false);
37+
});
38+
39+
test("Credit card number sum of all digits cannot be less than or equal to 16.", () => {
40+
// Arrange
41+
const cardNumber = 1000000000000000;
42+
// Act
43+
const result = validateCreditCardNumber(cardNumber);
44+
// Assert
45+
expect(result).toEqual(false);
46+
});
47+
48+
test("Credit card number sum of all digits must be greater than 16.", () => {
49+
// Arrange
50+
const cardNumber = 1234567890123452;
51+
// Act
52+
const result = validateCreditCardNumber(cardNumber);
53+
// Assert
54+
expect(result).toEqual(true);
55+
});
56+
57+
test("Credit card number must not be negative.", () => {
58+
// Arrange
59+
const cardNumber = -1234567890123456;
60+
// Act
61+
const result = validateCreditCardNumber(cardNumber);
62+
// Assert
63+
expect(result).toEqual(false);
64+
});
65+
66+
test("Credit card number must be a number.", () => {
67+
// Arrange
68+
const cardNumber = "1234567890123456";
69+
// Act
70+
const result = validateCreditCardNumber(cardNumber);
71+
// Assert
72+
expect(result).toEqual(false);
73+
});
74+
75+
test("Credit card number must have exactly 16 digits.", () => {
76+
// Arrange
77+
const cardNumber = 212222222212222;
78+
// Act
79+
const result = validateCreditCardNumber(cardNumber);
80+
// Assert
81+
expect(result).toEqual(false);
82+
});
83+
84+
test("Credit card number cannot have less or more than 16 digits.", () => {
85+
// Arrange
86+
const cardNumber = 212222222212222;
87+
// Act
88+
const result = validateCreditCardNumber(cardNumber);
89+
// Assert
90+
expect(result).toEqual(false);
91+
});

0 commit comments

Comments
 (0)