Skip to content

Commit 63fc5f0

Browse files
committed
3-get-card-value.js committed
1 parent 6563d24 commit 63fc5f0

File tree

1 file changed

+124
-0
lines changed

1 file changed

+124
-0
lines changed

Sprint-3/1-implement-and-rewrite-tests/implement/3-get-card-value.js

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
/**
2+
* Original file:
3+
*
14
// This problem involves playing cards: https://en.wikipedia.org/wiki/Standard_52-card_deck
25
36
// Implement a function getCardValue, when given a string representing a playing card,
@@ -50,3 +53,124 @@ try {
5053
} catch (e) {}
5154
5255
// What other invalid card cases can you think of?
56+
*
57+
*/
58+
59+
// Implementation
60+
61+
function getCardValue(card) {
62+
// Validate input type
63+
if (typeof card !== 'string' || card.length < 2) {
64+
throw new Error('Invalid card format');
65+
}
66+
67+
// Define valid ranks and suits
68+
const validRanks = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'];
69+
const validSuits = ['♠', '♥', '♦', '♣'];
70+
71+
// Extract rank and suit
72+
let rank, suit;
73+
74+
// Handle '10' which is 2 characters
75+
if (card.startsWith('10') && card.length === 3) {
76+
rank = '10';
77+
suit = card[2];
78+
} else if (card.length === 2) {
79+
rank = card[0];
80+
suit = card[1];
81+
} else {
82+
throw new Error('Invalid card format');
83+
}
84+
85+
// Validate rank and suit
86+
if (!validRanks.includes(rank) || !validSuits.includes(suit)) {
87+
throw new Error('Invalid card format');
88+
}
89+
90+
// Return value based on rank
91+
if (rank === 'A') {
92+
return 11;
93+
} else if (['J', 'Q', 'K'].includes(rank)) {
94+
return 10;
95+
} else {
96+
return parseInt(rank, 10);
97+
}
98+
}
99+
100+
module.exports = getCardValue;
101+
102+
function assertEquals(actualOutput, targetOutput) {
103+
console.assert(
104+
actualOutput === targetOutput,
105+
`Expected ${actualOutput} to equal ${targetOutput}`
106+
);
107+
}
108+
109+
// Helper function to test error throwing
110+
function assertThrowsError(fn, expectedErrorMessage) {
111+
try {
112+
fn();
113+
console.error(`Error was not thrown. Expected: ${expectedErrorMessage}`);
114+
} catch (e) {
115+
console.assert(
116+
e.message === expectedErrorMessage,
117+
`Expected error message "${expectedErrorMessage}" but got "${e.message}"`
118+
);
119+
}
120+
}
121+
122+
// Tests for valid cards
123+
console.log('Testing valid cards:');
124+
assertEquals(getCardValue('A♠'), 11);
125+
assertEquals(getCardValue('A♥'), 11);
126+
assertEquals(getCardValue('A♦'), 11);
127+
assertEquals(getCardValue('A♣'), 11);
128+
129+
assertEquals(getCardValue('2♠'), 2);
130+
assertEquals(getCardValue('3♥'), 3);
131+
assertEquals(getCardValue('4♦'), 4);
132+
assertEquals(getCardValue('5♣'), 5);
133+
assertEquals(getCardValue('6♠'), 6);
134+
assertEquals(getCardValue('7♥'), 7);
135+
assertEquals(getCardValue('8♦'), 8);
136+
assertEquals(getCardValue('9♣'), 9);
137+
assertEquals(getCardValue('10♠'), 10);
138+
assertEquals(getCardValue('10♥'), 10);
139+
assertEquals(getCardValue('10♦'), 10);
140+
assertEquals(getCardValue('10♣'), 10);
141+
142+
assertEquals(getCardValue('J♠'), 10);
143+
assertEquals(getCardValue('Q♥'), 10);
144+
assertEquals(getCardValue('K♦'), 10);
145+
assertEquals(getCardValue('J♣'), 10);
146+
147+
// Tests for invalid cards
148+
console.log('\nTesting invalid cards:');
149+
150+
// Invalid format
151+
assertThrowsError(() => getCardValue(''), 'Invalid card format');
152+
assertThrowsError(() => getCardValue('A'), 'Invalid card format');
153+
assertThrowsError(() => getCardValue('10'), 'Invalid card format');
154+
assertThrowsError(() => getCardValue('A♠♠'), 'Invalid card format');
155+
assertThrowsError(() => getCardValue('10♠♠'), 'Invalid card format');
156+
157+
// Invalid rank
158+
assertThrowsError(() => getCardValue('1♠'), 'Invalid card format');
159+
assertThrowsError(() => getCardValue('11♠'), 'Invalid card format');
160+
assertThrowsError(() => getCardValue('B♠'), 'Invalid card format');
161+
assertThrowsError(() => getCardValue('X♠'), 'Invalid card format');
162+
163+
// Invalid suit
164+
assertThrowsError(() => getCardValue('A♤'), 'Invalid card format'); // Using ♤ instead of ♠
165+
assertThrowsError(() => getCardValue('A♡'), 'Invalid card format'); // Using ♡ instead of ♥
166+
assertThrowsError(() => getCardValue('A♢'), 'Invalid card format'); // Using ♢ instead of ♦
167+
assertThrowsError(() => getCardValue('A♧'), 'Invalid card format'); // Using ♧ instead of ♣
168+
169+
// Invalid type
170+
assertThrowsError(() => getCardValue(123), 'Invalid card format');
171+
assertThrowsError(() => getCardValue(null), 'Invalid card format');
172+
assertThrowsError(() => getCardValue(undefined), 'Invalid card format');
173+
assertThrowsError(() => getCardValue({}), 'Invalid card format');
174+
175+
console.log('\nAll tests completed!');
176+

0 commit comments

Comments
 (0)