-
Notifications
You must be signed in to change notification settings - Fork 0
/
deck_test.go
332 lines (315 loc) · 9.59 KB
/
deck_test.go
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
package deckofcards
import (
"fmt"
"strings"
"testing"
)
func TestNewDeck(t *testing.T) {
deck := NewDeck(1)
if deck == nil {
t.Logf("Failed to create deck\n")
t.FailNow()
}
if !deck.Success {
t.Logf("Deck not properly initialized. Expected a success on a successful creation\n")
t.FailNow()
}
if deck.Remaining != len(deck.cards) {
t.Logf("Deck not properly initialized. Expected amount of cards remaining and the length of the cards slice to be equavalent after a new deck is created.\n")
t.FailNow()
}
if strings.EqualFold(deck.DeckID, "\n") {
t.Logf("Deck not properly initialized. Expected a non empty DeckID\n")
t.FailNow()
}
if deck.Shuffled {
t.Logf("Deck not properly initialized. Expected an unshuffled deck\n")
t.FailNow()
}
for _, card := range deck.cards {
if !strings.EqualFold(deck.DeckID, card.DeckID) {
t.Logf("The card's DeckID differs from the deck it belongs to.\n")
t.FailNow()
}
}
}
func TestNewDeckWithNegativeNumber(t *testing.T) {
deck := NewDeck(-1)
if deck == nil {
t.Logf("Failed to create deck\n")
t.FailNow()
}
if deck.Success {
t.Logf("Deck not properly initialized failed deck. Expected a false on a unsuccessful creation\n")
t.FailNow()
}
if deck.Remaining > 0 {
t.Logf("Deck not properly initialized. Expected zero cards as it failed do create a deck\n")
t.FailNow()
}
if strings.EqualFold(deck.DeckID, "") {
t.Logf("Deck not properly initialized. Expected a non empty DeckID\n")
t.FailNow()
}
if deck.Shuffled {
t.Logf("Deck not properly initialized. Expected an unshuffled deck\n")
t.FailNow()
}
}
func TestInjectionOfUnsupportedSuit(t *testing.T) {
suits[0] = "F"
deck := NewDeck(1)
if deck == nil {
t.Logf("Failed to create deck\n")
t.FailNow()
}
if deck.Success {
t.Logf("Deck not properly initialized failed deck. Expected a false on a unsuccessful creation\n")
t.FailNow()
}
if deck.Remaining > 0 {
t.Logf("Deck not properly initialized. Expected zero cards as it failed do create a deck\n")
t.FailNow()
}
if !strings.EqualFold(deck.DeckID, "") {
t.Logf("Deck not properly initialized. Expected an empty DeckID\n")
t.FailNow()
}
if deck.Shuffled {
t.Logf("Deck not properly initialized. Expected an unshuffled deck\n")
t.FailNow()
}
suits[0] = "S"
}
func TestNewDeckWithJokers(t *testing.T) {
deck := NewDeckWithJokers(1)
if deck == nil {
t.Logf("Failed to create deck\n")
t.FailNow()
}
if !deck.Success {
t.Logf("Deck not properly initialized. Expected a success on a successful creation\n")
t.FailNow()
}
if deck.Remaining != len(deck.cards) && len(deck.cards) != 54 {
t.Logf("Deck not properly initialized. Expected amount of cards remaining and the length of the cards slice to be equavalent after a new deck is created.\n")
t.FailNow()
}
if strings.EqualFold(deck.DeckID, "\n") {
t.Logf("Deck not properly initialized. Expected a non empty DeckID\n")
t.FailNow()
}
if deck.Shuffled {
t.Logf("Deck not properly initialized. Expected an unshuffled deck\n")
t.FailNow()
}
if !strings.EqualFold(deck.cards[53].Value, "JOKER\n") && !strings.EqualFold(deck.cards[53].Suit, "NONE") && !strings.EqualFold(deck.cards[52].Value, "JOKER\n") && !strings.EqualFold(deck.cards[52].Suit, "NONE") {
t.Logf("Deck not properly initialized. Expected last two cards on an unshuffled deck to be JOKERS.\n")
t.FailNow()
}
}
func TestNewDeckWithJokerWithNegativeNumber(t *testing.T) {
deck := NewDeckWithJokers(-1)
if deck == nil {
t.Logf("Failed to create deck\n")
t.FailNow()
}
if deck.Success {
t.Logf("Deck not properly initialized failed deck. Expected a false on a unsuccessful creation\n")
t.FailNow()
}
if deck.Remaining > 0 {
t.Logf("Deck not properly initialized. Expected zero cards as it failed do create a deck\n")
t.FailNow()
}
if strings.EqualFold(deck.DeckID, "") {
t.Logf("Deck not properly initialized. Expected a non empty DeckID\n")
t.FailNow()
}
if deck.Shuffled {
t.Logf("Deck not properly initialized. Expected an unshuffled deck\n")
t.FailNow()
}
}
func TestInjectionOfUnsupportedSuitWhileRunningNewDeckWithJoker(t *testing.T) {
suits[0] = "F"
deck := NewDeckWithJokers(1)
if deck == nil {
t.Logf("Failed to create deck\n")
t.FailNow()
}
if deck.Success {
t.Logf("Deck not properly initialized failed deck. Expected a false on a unsuccessful creation\n")
t.FailNow()
}
if deck.Remaining > 0 {
t.Logf("Deck not properly initialized. Expected zero cards as it failed do create a deck\n")
t.FailNow()
}
if !strings.EqualFold(deck.DeckID, "") {
t.Logf("Deck not properly initialized. Expected an empty DeckID\n")
t.FailNow()
}
if deck.Shuffled {
t.Logf("Deck not properly initialized. Expected an unshuffled deck\n")
t.FailNow()
}
suits[0] = "S"
}
func TestShuffleDeck(t *testing.T) {
deck := NewDeckWithJokers(1)
t.Logf("Deck is being shuffled\n")
deck = ShuffleDeck(deck)
if !deck.Shuffled {
t.Logf("Deck not properly shuffled. Expected an shuffled deck\n")
t.FailNow()
}
if strings.EqualFold(deck.cards[53].Value, "JOKER\n") && strings.EqualFold(deck.cards[53].Suit, "NONE") && strings.EqualFold(deck.cards[52].Value, "JOKER") && strings.EqualFold(deck.cards[52].Suit, "NONE") {
t.Logf("Deck not properly shuffled. Expected last two cards on an shuffled deck to not be JOKERS.\n")
t.FailNow()
}
}
func TestDrawWithValidNumber(t *testing.T) {
deck := NewDeckWithJokers(1)
remaining := deck.Remaining
drawAmount := 2
codeOfCard1, codeOfCard2 := deck.cards[0].Code, deck.cards[1].Code
draw := deck.Draw(drawAmount)
if deck.Remaining != remaining-drawAmount {
t.Logf("Draw did not reduce the number of remaining cards\n")
t.FailNow()
}
if len(draw.Cards) != drawAmount {
t.Logf("The length of the drawn cards is not the same as the amount we drew.\n")
t.FailNow()
}
if !deck.cards[0].drawn && !deck.cards[1].drawn {
t.Logf("The cards that should have been drawn is not\n")
t.FailNow()
}
if !strings.EqualFold(draw.Cards[0].Code, codeOfCard1) && !strings.EqualFold(draw.Cards[1].Code, codeOfCard2) {
t.Logf("The draw did not have the expected cards from the top of the deck\n")
t.FailNow()
}
if !draw.Success {
t.Logf("The draw reports it was not successful\n")
t.FailNow()
}
if draw.Remaining != 2 {
t.Logf("The draw's Remaining and the deck's Remaining cards does not match.\n")
t.FailNow()
}
}
func TestDrawWithMoreThanRemainingNumberOfCards(t *testing.T) {
deck := NewDeckWithJokers(1)
deck.Remaining = 2
remaining := deck.Remaining
drawAmount := remaining + 2
draw := deck.Draw(drawAmount)
if deck.Remaining != 0 {
t.Logf("Draw reduced the number of remaining cards by more than possible.\n")
t.FailNow()
}
if len(draw.Cards) != remaining {
t.Logf("The length of the drawn cards is not the same as the amount of remaining cards.\n")
t.FailNow()
}
if !draw.Success {
t.Logf("The draw reports it was not successful\n")
t.FailNow()
}
if draw.Remaining != remaining {
t.Logf("The draw's Remaining and the deck's Remaining cards does not match.\n")
t.FailNow()
}
}
func TestDrawWithNoMoreCardsRemaining(t *testing.T) {
deck := NewDeckWithJokers(1)
deck.Remaining = 0
remaining := deck.Remaining
drawAmount := remaining + 2
draw := deck.Draw(drawAmount)
if deck.Remaining != 0 {
t.Logf("Draw reduced the number of remaining cards by more than possible.\n")
t.FailNow()
}
if len(draw.Cards) != remaining {
t.Logf("The length of the drawn cards is not the same as the amount of remaining cards.\n")
t.FailNow()
}
if draw.Success {
t.Logf("The draw reports it was successful but it should be unsuccessful.\n")
t.FailNow()
}
if draw.Remaining != deck.Remaining {
t.Logf("The draw's Remaining and the deck's Remaining cards does not match.\n")
t.FailNow()
}
}
func TestDrawWithInvalidNumber(t *testing.T) {
deck := NewDeckWithJokers(1)
remaining := deck.Remaining
drawAmount := -1
draw := deck.Draw(drawAmount)
if deck.Remaining != remaining {
t.Logf("Drawing an invalid amount did reduce the number of remaining cards\n")
t.FailNow()
}
if len(draw.Cards) != 0 {
t.Logf("The draw should have returned no cards for a invalid draw\n")
t.FailNow()
}
}
func TestDeckString(t *testing.T) {
deck := NewDeck(1)
id := fmt.Sprintf("DeckID: %s", deck.DeckID)
remaining := fmt.Sprintf("Remaining: %d", deck.Remaining)
success := fmt.Sprintf("Success: %t", deck.Success)
shuffled := fmt.Sprintf("Shuffled: %t", deck.Shuffled)
deckString := deck.String()
if !strings.Contains(deckString, id) {
t.Logf("The string needs to contain the DeckID\n")
t.FailNow()
}
if !strings.Contains(deckString, success) {
t.Logf("The string needs to contain a success string\n")
t.FailNow()
}
if !strings.Contains(deckString, shuffled) {
t.Logf("The string needs to contain a shuffled string\n")
t.FailNow()
}
if !strings.Contains(deckString, remaining) {
t.Logf("The string needs to contain a remaining string that contains the exact amount of cards remaining.\n")
t.FailNow()
}
}
func TestUnmarshal(t *testing.T) {
deck := NewDeck(1)
marshalDeck, err := deck.Marshal()
if err != nil {
t.Logf("There was an error marshaling the deck: %s\n", err.Error())
t.FailNow()
}
udeck, err := UnmarshalDeck(marshalDeck)
if err != nil {
t.Logf("There was an error unmarshaling the deck: %s\n", err.Error())
t.FailNow()
}
if deck.DeckID != udeck.DeckID {
t.Logf("The DeckID's do not match\n")
t.FailNow()
}
if deck.Remaining != udeck.Remaining {
t.Logf("The Remaining cards do not match\n")
t.FailNow()
}
if deck.Success != udeck.Success {
t.Logf("The Success property do not match\n")
t.FailNow()
}
if deck.Shuffled != udeck.Shuffled {
t.Logf("The Shuffled property do not match\n")
t.FailNow()
}
}