From 2c3c3f85fbddccbd63f8a0c8a1e982561cd4c033 Mon Sep 17 00:00:00 2001 From: HD-40307g <152268341+HD-40307g@users.noreply.github.com> Date: Fri, 20 Dec 2024 12:12:08 +0100 Subject: [PATCH 1/5] Add LuhnAlgorithm.js and LuhnAlgorithm.test.js --- Maths/LuhnAlgorithm.js | 95 ++++++++++++++++++++++++++++++++ Maths/test/LuhnAlgorithm.test.js | 72 ++++++++++++++++++++++++ 2 files changed, 167 insertions(+) create mode 100644 Maths/LuhnAlgorithm.js create mode 100644 Maths/test/LuhnAlgorithm.test.js diff --git a/Maths/LuhnAlgorithm.js b/Maths/LuhnAlgorithm.js new file mode 100644 index 0000000000..af8ea8845e --- /dev/null +++ b/Maths/LuhnAlgorithm.js @@ -0,0 +1,95 @@ +/** + * Luhn algorithm, also known as the “Modulus 10” or “mod 10” algorithm. + * This algorithm is a simple checksum formula used to validate the authenticity of credit card numbers. + * The Luhn algorithm works by doubling every second digit from right to left, adding the resulting digits, and then checking if the total is divisible by 10. + * If it is, the credit card number is considered valid. + * The Luhn algorithm is widely used in credit card verification and is specified in ISO/IEC 7812-1. + * It is not intended to be a cryptographically secure hash function but rather a simple method to detect accidental errors, not malicious attacks. + */ + +// Valid credit card numbers +export const valid1 = [4, 5, 3, 9, 6, 7, 7, 9, 0, 8, 0, 1, 6, 8, 0, 8]; +export const valid2 = [5, 5, 3, 5, 7, 6, 6, 7, 6, 8, 7, 5, 1, 4, 3, 9]; +export const valid3 = [6, 0, 1, 1, 1, 4, 4, 3, 4, 0, 6, 8, 2, 9, 0, 5]; +export const valid4 = [3, 7, 1, 6, 1, 2, 0, 1, 9, 9, 8, 5, 2, 3, 6]; +export const valid5 = [4, 5, 3, 9, 4, 0, 4, 9, 6, 7, 8, 6, 9, 6, 6, 6]; + +// Invalid credit card numbers +export const invalid1 = [4, 5, 3, 2, 7, 7, 8, 7, 7, 1, 0, 9, 1, 7, 9, 5]; +export const invalid2 = [5, 7, 9, 5, 5, 9, 3, 3, 9, 2, 1, 3, 4, 6, 4, 3]; +export const invalid3 = [3, 7, 5, 7, 9, 6, 0, 8, 4, 4, 5, 9, 9, 1, 4]; +export const invalid4 = [6, 0, 1, 1, 1, 2, 7, 9, 6, 1, 7, 7, 7, 9, 3, 5]; +export const invalid5 = [5, 3, 8, 2, 0, 1, 9, 7, 7, 2, 8, 8, 3, 8, 5, 4]; + +// Mixed batch of credit card numbers +export const mystery1 = [3, 4, 4, 8, 0, 1, 9, 6, 8, 3, 0, 5, 4, 1, 4]; +export const mystery2 = [5, 4, 6, 6, 1, 0, 0, 8, 6, 1, 6, 2, 0, 2, 3, 9]; +export const mystery3 = [6, 0, 1, 1, 3, 7, 7, 0, 2, 0, 9, 6, 2, 6, 5, 6, 2, 0, 3]; +export const mystery4 = [4, 9, 2, 9, 8, 7, 7, 1, 6, 9, 2, 1, 7, 0, 9, 3]; +export const mystery5 = [4, 9, 1, 3, 5, 4, 0, 4, 6, 3, 0, 7, 2, 5, 2, 3]; + +export const batch = [valid1, valid2, valid3, valid4, valid5, invalid1, invalid2, invalid3, invalid4, invalid5, mystery1, mystery2, mystery3, mystery4, mystery5]; + +/** + * Validates a credit card number using the Luhn Algorithm. + * @param {number[]} numArr - Array representing the credit card number. + * @returns {boolean} - True if the card is valid, false otherwise. + */ +export function validateCred(numArr) { + let total = 0; + for (let i = numArr.length - 1; i >= 0; i--) { + let currValue = numArr[i]; + // Double every other digit starting from the second-to-last + if ((numArr.length - 1 - i) % 2 === 1) { + currValue *= 2; + if (currValue > 9) { + currValue -= 9; + } + } + total += currValue; + } + return total % 10 === 0; +}; + +/** + * Finds invalid credit card numbers from a batch. + * @param {number[][]} cards - Array of credit card numbers. + * @returns {number[][]} - Array of invalid credit card numbers. + */ +export function findInvalidCards(cards) { + return cards.filter(card => !validateCred(card)); +}; + +/** + * Identifies credit card companies that issued invalid card numbers. + * @param {number[][]} invalidBatch - Array of invalid credit card numbers. + * @returns {string[]} - Array of company names. + */ +export function idInvalidCardCompanies(invalidBatch) { + const companies = new Set(); + invalidBatch.forEach(card => { + switch (card[0]) { + case 3: + companies.add('Amex'); + break; + case 4: + companies.add('Visa'); + break; + case 5: + companies.add('Mastercard'); + break; + case 6: + companies.add('Discover'); + break; + default: + console.warn('Company not found for card starting with:', card[0]); + } + }); + return Array.from(companies); +}; + +// Example Usage +console.log(validateCred(valid1)); // Should print true +console.log(validateCred(invalid1)); // Should print false +console.log(findInvalidCards(batch)); // Find all invalid cards +console.log(idInvalidCardCompanies(findInvalidCards(batch))); // Find companies of invalid cards diff --git a/Maths/test/LuhnAlgorithm.test.js b/Maths/test/LuhnAlgorithm.test.js new file mode 100644 index 0000000000..8eab8eee9f --- /dev/null +++ b/Maths/test/LuhnAlgorithm.test.js @@ -0,0 +1,72 @@ +// Import the functions to be tested +import { validateCred, findInvalidCards, idInvalidCardCompanies } from '../LuhnAlgorithm.js'; + +// Import credit card numbers to be tested +import { valid1, valid2, valid4, valid3, valid5, invalid1, invalid2, invalid3, invalid4, invalid5, batch} from '../LuhnAlgorithm.js' + +// Test suite for credit card validation + + //Test validateCred function + function testValidateCred() { + console.log('Running tests for validateCred...'); + + // Valid test cases + if (![valid1, valid2, valid3, valid4, valid5].every(card => validateCred(card))) { + console.error('FAILED: validateCred should return true for all valid cards'); + } + if ([invalid1, invalid2, invalid3, invalid4, invalid5].some(card => validateCred(card))) { + console.error('FAILED: validateCred should return false for all invalid cards'); + } else { + console.log('PASSED: Valid card test'); + }; + + // Invalid test cases + if (validateCred(invalid1 || invalid2 || invalid3 || invalid4 || invalid5)) { + console.error('FAILED: validateCred should return false for invalid cards'); + } else { + console.log('PASSED: Invalid card test'); + } + }; + + //Test findInvalidCards function + function testFindInvalidCards(batch) { + console.log('Running tests for findInvalidCards...'); + const invalidCards = findInvalidCards(batch); + + // Check if the result only contains invalid cards + const allInvalid = invalidCards.every(card => !validateCred(card)); + + if (!allInvalid) { + console.error('FAILED: findInvalidCards should return only invalid cards'); + } else { + console.log('PASSED: Find invalid cards test'); + } + }; + + // Test idInvalidCardCompanies function + function testIdInvalidCardCompanies() { + console.log('Running tests for idInvalidCardCompanies...'); + const companies = idInvalidCardCompanies(batch); + + if (!companies.includes('Visa') || !companies.includes('Mastercard') || !companies.includes('Amex') || !companies.includes('Discover')) { + console.error('FAILED: idInvalidCardCompanies should include all expected companies'); + } else if (companies.includes('Unknown')) { + console.error('FAILED: idInvalidCardCompanies should not include unrecognized prefixes'); + } else { + console.log('PASSED: Identify invalid card companies test'); + } + }; + + //Run all tests + function runAllTests() { + console.log('Starting test suite...'); + testValidateCred(); + testFindInvalidCards(batch); + testIdInvalidCardCompanies(); + console.log('Testing edge cases...'); + console.assert(findInvalidCards([[]]).length === 0, 'FAILED: findInvalidCards should handle empty arrays'); + console.log('All tests completed.'); + }; + + // Run the test suite + runAllTests(); From 52cf1cdb19ecce215705f09c21e2885d176b4890 Mon Sep 17 00:00:00 2001 From: HD-40307g <152268341+HD-40307g@users.noreply.github.com> Date: Fri, 20 Dec 2024 13:37:36 +0100 Subject: [PATCH 2/5] Add URL to LuhnAlgorithm.js --- Maths/LuhnAlgorithm.js | 1 + 1 file changed, 1 insertion(+) diff --git a/Maths/LuhnAlgorithm.js b/Maths/LuhnAlgorithm.js index af8ea8845e..3c7a25ab00 100644 --- a/Maths/LuhnAlgorithm.js +++ b/Maths/LuhnAlgorithm.js @@ -5,6 +5,7 @@ * If it is, the credit card number is considered valid. * The Luhn algorithm is widely used in credit card verification and is specified in ISO/IEC 7812-1. * It is not intended to be a cryptographically secure hash function but rather a simple method to detect accidental errors, not malicious attacks. + * https://en.wikipedia.org/wiki/Luhn_algorithm */ // Valid credit card numbers From ba306aa3c7e0a9cc30d6acf77858df47a1d3d413 Mon Sep 17 00:00:00 2001 From: HD-40307g <152268341+HD-40307g@users.noreply.github.com> Date: Fri, 20 Dec 2024 17:34:06 +0100 Subject: [PATCH 3/5] rewrite LuhnAlgorithm.test.js to be Jest-compatible describe/test/it block --- Maths/test/LuhnAlgorithm.test.js | 127 ++++++++++++++----------------- 1 file changed, 58 insertions(+), 69 deletions(-) diff --git a/Maths/test/LuhnAlgorithm.test.js b/Maths/test/LuhnAlgorithm.test.js index 8eab8eee9f..d512b7efb4 100644 --- a/Maths/test/LuhnAlgorithm.test.js +++ b/Maths/test/LuhnAlgorithm.test.js @@ -1,72 +1,61 @@ // Import the functions to be tested import { validateCred, findInvalidCards, idInvalidCardCompanies } from '../LuhnAlgorithm.js'; - // Import credit card numbers to be tested -import { valid1, valid2, valid4, valid3, valid5, invalid1, invalid2, invalid3, invalid4, invalid5, batch} from '../LuhnAlgorithm.js' - -// Test suite for credit card validation - - //Test validateCred function - function testValidateCred() { - console.log('Running tests for validateCred...'); - - // Valid test cases - if (![valid1, valid2, valid3, valid4, valid5].every(card => validateCred(card))) { - console.error('FAILED: validateCred should return true for all valid cards'); - } - if ([invalid1, invalid2, invalid3, invalid4, invalid5].some(card => validateCred(card))) { - console.error('FAILED: validateCred should return false for all invalid cards'); - } else { - console.log('PASSED: Valid card test'); - }; - - // Invalid test cases - if (validateCred(invalid1 || invalid2 || invalid3 || invalid4 || invalid5)) { - console.error('FAILED: validateCred should return false for invalid cards'); - } else { - console.log('PASSED: Invalid card test'); - } - }; - - //Test findInvalidCards function - function testFindInvalidCards(batch) { - console.log('Running tests for findInvalidCards...'); - const invalidCards = findInvalidCards(batch); - - // Check if the result only contains invalid cards - const allInvalid = invalidCards.every(card => !validateCred(card)); - - if (!allInvalid) { - console.error('FAILED: findInvalidCards should return only invalid cards'); - } else { - console.log('PASSED: Find invalid cards test'); - } - }; - - // Test idInvalidCardCompanies function - function testIdInvalidCardCompanies() { - console.log('Running tests for idInvalidCardCompanies...'); - const companies = idInvalidCardCompanies(batch); - - if (!companies.includes('Visa') || !companies.includes('Mastercard') || !companies.includes('Amex') || !companies.includes('Discover')) { - console.error('FAILED: idInvalidCardCompanies should include all expected companies'); - } else if (companies.includes('Unknown')) { - console.error('FAILED: idInvalidCardCompanies should not include unrecognized prefixes'); - } else { - console.log('PASSED: Identify invalid card companies test'); - } - }; - - //Run all tests - function runAllTests() { - console.log('Starting test suite...'); - testValidateCred(); - testFindInvalidCards(batch); - testIdInvalidCardCompanies(); - console.log('Testing edge cases...'); - console.assert(findInvalidCards([[]]).length === 0, 'FAILED: findInvalidCards should handle empty arrays'); - console.log('All tests completed.'); - }; - - // Run the test suite - runAllTests(); +import { valid1, valid2, valid3, valid4, valid5, invalid1, invalid2, invalid3, invalid4, invalid5, batch } from '../LuhnAlgorithm.js'; + +describe('Luhn Algorithm Tests', () => { + // Test for validateCred function + describe('validateCred', () => { + test('should return true for valid credit cards', () => { + const validCards = [valid1, valid2, valid3, valid4, valid5]; + validCards.forEach(card => { + expect(validateCred(card)).toBe(true); + }); + }); + + test('should return false for invalid credit cards', () => { + const invalidCards = [invalid1, invalid2, invalid3, invalid4, invalid5]; + invalidCards.forEach(card => { + expect(validateCred(card)).toBe(false); + }); + }); + }); + + // Test for findInvalidCards function + describe('findInvalidCards', () => { + test('should return only invalid credit cards from a batch', () => { + const invalidCards = findInvalidCards(batch); + const allInvalid = invalidCards.every(card => !validateCred(card)); + expect(allInvalid).toBe(true); + }); + + test('should return an empty array if no invalid cards are found', () => { + const validCards = [valid1, valid2, valid3, valid4, valid5]; + const invalidCards = findInvalidCards(validCards); + expect(invalidCards).toEqual([]); + }); + }); + + // Test for idInvalidCardCompanies function + describe('idInvalidCardCompanies', () => { + test('should identify all companies that issued invalid cards', () => { + const invalidCards = findInvalidCards(batch); + const companies = idInvalidCardCompanies(invalidCards); + + // Expect the companies array to include known companies + expect(companies).toEqual(expect.arrayContaining(['Visa', 'Mastercard', 'Amex', 'Discover'])); + }); + + test('should return an empty array if no invalid cards are found', () => { + const validCards = [valid1, valid2, valid3, valid4, valid5]; + const companies = idInvalidCardCompanies(validCards); + expect(companies).toEqual([]); + }); + + test('should handle unknown card companies gracefully', () => { + const unknownCard = [9, 3, 1, 8, 2, 0, 7, 4, 5, 6, 7, 8, 9]; + const companies = idInvalidCardCompanies([unknownCard]); + expect(companies).not.toContain('Unknown'); + }); + }); +}); From 4141a381b970a7c438f4043d9c9ff91596fb8bb1 Mon Sep 17 00:00:00 2001 From: HD-40307g <152268341+HD-40307g@users.noreply.github.com> Date: Fri, 20 Dec 2024 17:58:08 +0100 Subject: [PATCH 4/5] fix: fixed error at idInvalidCardCompanies function test --- Maths/test/LuhnAlgorithm.test.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Maths/test/LuhnAlgorithm.test.js b/Maths/test/LuhnAlgorithm.test.js index d512b7efb4..6256e29058 100644 --- a/Maths/test/LuhnAlgorithm.test.js +++ b/Maths/test/LuhnAlgorithm.test.js @@ -48,7 +48,8 @@ describe('Luhn Algorithm Tests', () => { test('should return an empty array if no invalid cards are found', () => { const validCards = [valid1, valid2, valid3, valid4, valid5]; - const companies = idInvalidCardCompanies(validCards); + const invalidCards = findInvalidCards(validCards); // Ensure only invalid cards are processed + const companies = idInvalidCardCompanies(invalidCards); expect(companies).toEqual([]); }); From 64317c92dc2e9929d75279cc4385583897e3d401 Mon Sep 17 00:00:00 2001 From: HD-40307g <152268341+HD-40307g@users.noreply.github.com> Date: Fri, 20 Dec 2024 18:04:30 +0100 Subject: [PATCH 5/5] reformat LuhnAlgorithm.js and LuhnAlgorithm.test.js using Prettier --- Maths/LuhnAlgorithm.js | 136 +++++++++++++++++-------------- Maths/test/LuhnAlgorithm.test.js | 134 +++++++++++++++++------------- 2 files changed, 153 insertions(+), 117 deletions(-) diff --git a/Maths/LuhnAlgorithm.js b/Maths/LuhnAlgorithm.js index 3c7a25ab00..d338190d08 100644 --- a/Maths/LuhnAlgorithm.js +++ b/Maths/LuhnAlgorithm.js @@ -1,35 +1,53 @@ /** - * Luhn algorithm, also known as the “Modulus 10” or “mod 10” algorithm. + * Luhn algorithm, also known as the “Modulus 10” or “mod 10” algorithm. * This algorithm is a simple checksum formula used to validate the authenticity of credit card numbers. - * The Luhn algorithm works by doubling every second digit from right to left, adding the resulting digits, and then checking if the total is divisible by 10. + * The Luhn algorithm works by doubling every second digit from right to left, adding the resulting digits, and then checking if the total is divisible by 10. * If it is, the credit card number is considered valid. - * The Luhn algorithm is widely used in credit card verification and is specified in ISO/IEC 7812-1. + * The Luhn algorithm is widely used in credit card verification and is specified in ISO/IEC 7812-1. * It is not intended to be a cryptographically secure hash function but rather a simple method to detect accidental errors, not malicious attacks. * https://en.wikipedia.org/wiki/Luhn_algorithm */ // Valid credit card numbers -export const valid1 = [4, 5, 3, 9, 6, 7, 7, 9, 0, 8, 0, 1, 6, 8, 0, 8]; -export const valid2 = [5, 5, 3, 5, 7, 6, 6, 7, 6, 8, 7, 5, 1, 4, 3, 9]; -export const valid3 = [6, 0, 1, 1, 1, 4, 4, 3, 4, 0, 6, 8, 2, 9, 0, 5]; -export const valid4 = [3, 7, 1, 6, 1, 2, 0, 1, 9, 9, 8, 5, 2, 3, 6]; -export const valid5 = [4, 5, 3, 9, 4, 0, 4, 9, 6, 7, 8, 6, 9, 6, 6, 6]; +export const valid1 = [4, 5, 3, 9, 6, 7, 7, 9, 0, 8, 0, 1, 6, 8, 0, 8] +export const valid2 = [5, 5, 3, 5, 7, 6, 6, 7, 6, 8, 7, 5, 1, 4, 3, 9] +export const valid3 = [6, 0, 1, 1, 1, 4, 4, 3, 4, 0, 6, 8, 2, 9, 0, 5] +export const valid4 = [3, 7, 1, 6, 1, 2, 0, 1, 9, 9, 8, 5, 2, 3, 6] +export const valid5 = [4, 5, 3, 9, 4, 0, 4, 9, 6, 7, 8, 6, 9, 6, 6, 6] // Invalid credit card numbers -export const invalid1 = [4, 5, 3, 2, 7, 7, 8, 7, 7, 1, 0, 9, 1, 7, 9, 5]; -export const invalid2 = [5, 7, 9, 5, 5, 9, 3, 3, 9, 2, 1, 3, 4, 6, 4, 3]; -export const invalid3 = [3, 7, 5, 7, 9, 6, 0, 8, 4, 4, 5, 9, 9, 1, 4]; -export const invalid4 = [6, 0, 1, 1, 1, 2, 7, 9, 6, 1, 7, 7, 7, 9, 3, 5]; -export const invalid5 = [5, 3, 8, 2, 0, 1, 9, 7, 7, 2, 8, 8, 3, 8, 5, 4]; +export const invalid1 = [4, 5, 3, 2, 7, 7, 8, 7, 7, 1, 0, 9, 1, 7, 9, 5] +export const invalid2 = [5, 7, 9, 5, 5, 9, 3, 3, 9, 2, 1, 3, 4, 6, 4, 3] +export const invalid3 = [3, 7, 5, 7, 9, 6, 0, 8, 4, 4, 5, 9, 9, 1, 4] +export const invalid4 = [6, 0, 1, 1, 1, 2, 7, 9, 6, 1, 7, 7, 7, 9, 3, 5] +export const invalid5 = [5, 3, 8, 2, 0, 1, 9, 7, 7, 2, 8, 8, 3, 8, 5, 4] // Mixed batch of credit card numbers -export const mystery1 = [3, 4, 4, 8, 0, 1, 9, 6, 8, 3, 0, 5, 4, 1, 4]; -export const mystery2 = [5, 4, 6, 6, 1, 0, 0, 8, 6, 1, 6, 2, 0, 2, 3, 9]; -export const mystery3 = [6, 0, 1, 1, 3, 7, 7, 0, 2, 0, 9, 6, 2, 6, 5, 6, 2, 0, 3]; -export const mystery4 = [4, 9, 2, 9, 8, 7, 7, 1, 6, 9, 2, 1, 7, 0, 9, 3]; -export const mystery5 = [4, 9, 1, 3, 5, 4, 0, 4, 6, 3, 0, 7, 2, 5, 2, 3]; +export const mystery1 = [3, 4, 4, 8, 0, 1, 9, 6, 8, 3, 0, 5, 4, 1, 4] +export const mystery2 = [5, 4, 6, 6, 1, 0, 0, 8, 6, 1, 6, 2, 0, 2, 3, 9] +export const mystery3 = [ + 6, 0, 1, 1, 3, 7, 7, 0, 2, 0, 9, 6, 2, 6, 5, 6, 2, 0, 3 +] +export const mystery4 = [4, 9, 2, 9, 8, 7, 7, 1, 6, 9, 2, 1, 7, 0, 9, 3] +export const mystery5 = [4, 9, 1, 3, 5, 4, 0, 4, 6, 3, 0, 7, 2, 5, 2, 3] -export const batch = [valid1, valid2, valid3, valid4, valid5, invalid1, invalid2, invalid3, invalid4, invalid5, mystery1, mystery2, mystery3, mystery4, mystery5]; +export const batch = [ + valid1, + valid2, + valid3, + valid4, + valid5, + invalid1, + invalid2, + invalid3, + invalid4, + invalid5, + mystery1, + mystery2, + mystery3, + mystery4, + mystery5 +] /** * Validates a credit card number using the Luhn Algorithm. @@ -37,20 +55,20 @@ export const batch = [valid1, valid2, valid3, valid4, valid5, invalid1, invalid2 * @returns {boolean} - True if the card is valid, false otherwise. */ export function validateCred(numArr) { - let total = 0; - for (let i = numArr.length - 1; i >= 0; i--) { - let currValue = numArr[i]; - // Double every other digit starting from the second-to-last - if ((numArr.length - 1 - i) % 2 === 1) { - currValue *= 2; - if (currValue > 9) { - currValue -= 9; - } + let total = 0 + for (let i = numArr.length - 1; i >= 0; i--) { + let currValue = numArr[i] + // Double every other digit starting from the second-to-last + if ((numArr.length - 1 - i) % 2 === 1) { + currValue *= 2 + if (currValue > 9) { + currValue -= 9 + } } - total += currValue; - } - return total % 10 === 0; -}; + total += currValue + } + return total % 10 === 0 +} /** * Finds invalid credit card numbers from a batch. @@ -58,8 +76,8 @@ export function validateCred(numArr) { * @returns {number[][]} - Array of invalid credit card numbers. */ export function findInvalidCards(cards) { - return cards.filter(card => !validateCred(card)); -}; + return cards.filter((card) => !validateCred(card)) +} /** * Identifies credit card companies that issued invalid card numbers. @@ -67,30 +85,30 @@ export function findInvalidCards(cards) { * @returns {string[]} - Array of company names. */ export function idInvalidCardCompanies(invalidBatch) { - const companies = new Set(); - invalidBatch.forEach(card => { - switch (card[0]) { - case 3: - companies.add('Amex'); - break; - case 4: - companies.add('Visa'); - break; - case 5: - companies.add('Mastercard'); - break; - case 6: - companies.add('Discover'); - break; - default: - console.warn('Company not found for card starting with:', card[0]); - } - }); - return Array.from(companies); -}; + const companies = new Set() + invalidBatch.forEach((card) => { + switch (card[0]) { + case 3: + companies.add('Amex') + break + case 4: + companies.add('Visa') + break + case 5: + companies.add('Mastercard') + break + case 6: + companies.add('Discover') + break + default: + console.warn('Company not found for card starting with:', card[0]) + } + }) + return Array.from(companies) +} // Example Usage -console.log(validateCred(valid1)); // Should print true -console.log(validateCred(invalid1)); // Should print false -console.log(findInvalidCards(batch)); // Find all invalid cards -console.log(idInvalidCardCompanies(findInvalidCards(batch))); // Find companies of invalid cards +console.log(validateCred(valid1)) // Should print true +console.log(validateCred(invalid1)) // Should print false +console.log(findInvalidCards(batch)) // Find all invalid cards +console.log(idInvalidCardCompanies(findInvalidCards(batch))) // Find companies of invalid cards diff --git a/Maths/test/LuhnAlgorithm.test.js b/Maths/test/LuhnAlgorithm.test.js index 6256e29058..e8812a3033 100644 --- a/Maths/test/LuhnAlgorithm.test.js +++ b/Maths/test/LuhnAlgorithm.test.js @@ -1,62 +1,80 @@ // Import the functions to be tested -import { validateCred, findInvalidCards, idInvalidCardCompanies } from '../LuhnAlgorithm.js'; +import { + validateCred, + findInvalidCards, + idInvalidCardCompanies +} from '../LuhnAlgorithm.js' // Import credit card numbers to be tested -import { valid1, valid2, valid3, valid4, valid5, invalid1, invalid2, invalid3, invalid4, invalid5, batch } from '../LuhnAlgorithm.js'; +import { + valid1, + valid2, + valid3, + valid4, + valid5, + invalid1, + invalid2, + invalid3, + invalid4, + invalid5, + batch +} from '../LuhnAlgorithm.js' describe('Luhn Algorithm Tests', () => { - // Test for validateCred function - describe('validateCred', () => { - test('should return true for valid credit cards', () => { - const validCards = [valid1, valid2, valid3, valid4, valid5]; - validCards.forEach(card => { - expect(validateCred(card)).toBe(true); - }); - }); - - test('should return false for invalid credit cards', () => { - const invalidCards = [invalid1, invalid2, invalid3, invalid4, invalid5]; - invalidCards.forEach(card => { - expect(validateCred(card)).toBe(false); - }); - }); - }); - - // Test for findInvalidCards function - describe('findInvalidCards', () => { - test('should return only invalid credit cards from a batch', () => { - const invalidCards = findInvalidCards(batch); - const allInvalid = invalidCards.every(card => !validateCred(card)); - expect(allInvalid).toBe(true); - }); - - test('should return an empty array if no invalid cards are found', () => { - const validCards = [valid1, valid2, valid3, valid4, valid5]; - const invalidCards = findInvalidCards(validCards); - expect(invalidCards).toEqual([]); - }); - }); - - // Test for idInvalidCardCompanies function - describe('idInvalidCardCompanies', () => { - test('should identify all companies that issued invalid cards', () => { - const invalidCards = findInvalidCards(batch); - const companies = idInvalidCardCompanies(invalidCards); - - // Expect the companies array to include known companies - expect(companies).toEqual(expect.arrayContaining(['Visa', 'Mastercard', 'Amex', 'Discover'])); - }); - - test('should return an empty array if no invalid cards are found', () => { - const validCards = [valid1, valid2, valid3, valid4, valid5]; - const invalidCards = findInvalidCards(validCards); // Ensure only invalid cards are processed - const companies = idInvalidCardCompanies(invalidCards); - expect(companies).toEqual([]); - }); - - test('should handle unknown card companies gracefully', () => { - const unknownCard = [9, 3, 1, 8, 2, 0, 7, 4, 5, 6, 7, 8, 9]; - const companies = idInvalidCardCompanies([unknownCard]); - expect(companies).not.toContain('Unknown'); - }); - }); -}); + // Test for validateCred function + describe('validateCred', () => { + test('should return true for valid credit cards', () => { + const validCards = [valid1, valid2, valid3, valid4, valid5] + validCards.forEach((card) => { + expect(validateCred(card)).toBe(true) + }) + }) + + test('should return false for invalid credit cards', () => { + const invalidCards = [invalid1, invalid2, invalid3, invalid4, invalid5] + invalidCards.forEach((card) => { + expect(validateCred(card)).toBe(false) + }) + }) + }) + + // Test for findInvalidCards function + describe('findInvalidCards', () => { + test('should return only invalid credit cards from a batch', () => { + const invalidCards = findInvalidCards(batch) + const allInvalid = invalidCards.every((card) => !validateCred(card)) + expect(allInvalid).toBe(true) + }) + + test('should return an empty array if no invalid cards are found', () => { + const validCards = [valid1, valid2, valid3, valid4, valid5] + const invalidCards = findInvalidCards(validCards) + expect(invalidCards).toEqual([]) + }) + }) + + // Test for idInvalidCardCompanies function + describe('idInvalidCardCompanies', () => { + test('should identify all companies that issued invalid cards', () => { + const invalidCards = findInvalidCards(batch) + const companies = idInvalidCardCompanies(invalidCards) + + // Expect the companies array to include known companies + expect(companies).toEqual( + expect.arrayContaining(['Visa', 'Mastercard', 'Amex', 'Discover']) + ) + }) + + test('should return an empty array if no invalid cards are found', () => { + const validCards = [valid1, valid2, valid3, valid4, valid5] + const invalidCards = findInvalidCards(validCards) // Ensure only invalid cards are processed + const companies = idInvalidCardCompanies(invalidCards) + expect(companies).toEqual([]) + }) + + test('should handle unknown card companies gracefully', () => { + const unknownCard = [9, 3, 1, 8, 2, 0, 7, 4, 5, 6, 7, 8, 9] + const companies = idInvalidCardCompanies([unknownCard]) + expect(companies).not.toContain('Unknown') + }) + }) +})