-
-
Notifications
You must be signed in to change notification settings - Fork 337
Expand file tree
/
Copy path3-get-card-value.js
More file actions
146 lines (119 loc) · 3.81 KB
/
3-get-card-value.js
File metadata and controls
146 lines (119 loc) · 3.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
// This problem involves playing cards: https://en.wikipedia.org/wiki/Standard_52-card_deck
// Implement a function getCardValue, when given a string representing a playing card,
// should return the numerical value of the card.
// A valid card string will contain a rank followed by the suit.
// The rank can be one of the following strings:
// "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"
// The suit can be one of the following emojis:
// "♠", "♥", "♦", "♣"
// For example: "A♠", "2♥", "10♥", "J♣", "Q♦", "K♦".
// When the card is an ace ("A"), the function should return 11.
// When the card is a face card ("J", "Q", "K"), the function should return 10.
// When the card is a number card ("2" to "10"), the function should return its numeric value.
// When the card string is invalid (not following the above format), the function should
// throw an error.
// Acceptance criteria:
// After you have implemented the function, write tests to cover all the cases, and
// execute the code to ensure all tests pass.
function getCardValue(card) {
// TODO: Implement this function
// 1. Define valid suits and ranks
const suits = ["♠", "♥", "♦", "♣"];
const ranks = [
"A",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"J",
"Q",
"K",
];
// 2. Basic validation: ensure card is a string and not empty
if (typeof card !== "string" || card.length === 0) {
throw new Error("Card must be a non-empty string");
}
// 3. Extract rank and suit from the card string
const rank = card.substring(0, card.length - 1);
const suit = card.substring(card.length - 1);
// 4. Validate rank and suit
if (!ranks.includes(rank)) {
throw new Error("Invalid rank");
}
if (!suits.includes(suit)) {
throw new Error("Invalid suit");
}
// 5. Return the appropriate value based on the rank
if (rank === "A") {
return 11;
} else if (["J", "Q", "K"].includes(rank)) {
return 10;
} else {
return parseInt(rank);
}
}
// The line below allows us to load the getCardValue function into tests in other files.
// This will be useful in the "rewrite tests with jest" step.
module.exports = getCardValue;
// Helper functions to make our assertions easier to read.
function assertEquals(actualOutput, targetOutput) {
console.assert(
actualOutput === targetOutput,
`Expected ${actualOutput} to equal ${targetOutput}`
);
}
// TODO: Write tests to cover all outcomes, including throwing errors for invalid cards.
// Examples:
assertEquals(getCardValue("9♠"), 9);
// Handling invalid cards
try {
getCardValue("invalid");
// This line will not be reached if an error is thrown as expected
console.error("Error was not thrown for invalid card");
} catch (e) {}
// What other invalid card cases can you think of?
try {
getCardValue("11♠");
console.error("Error was not thrown for invalid rank");
} catch (e) {}
try {
getCardValue("A♤");
console.error("Error was not thrown for invalid suit");
} catch (e) {}
try {
getCardValue("");
console.error("Error was not thrown for empty string");
} catch (e) {}
try {
getCardValue(123);
console.error("Error was not thrown for non-string input");
} catch (e) {}
try {
getCardValue("10");
console.error("Error was not thrown for missing suit");
} catch (e) {}
try {
getCardValue("♠");
console.error("Error was not thrown for missing rank");
} catch (e) {}
try {
getCardValue("A");
console.error("Error was not thrown for missing suit");
} catch (e) {}
try {
getCardValue("1♠");
console.error("Error was not thrown for invalid rank");
} catch (e) {}
try {
getCardValue("10XX");
console.error("Error was not thrown for extra characters");
} catch (e) {}
try {
getCardValue("Z♦");
console.error("Error was not thrown for invalid rank");
} catch (e) {}