Passed
Push — main ( a57e19...f52e71 )
by Vedrana
28:10
created

BlackJackTest::testDrawForPlayer()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 26
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 16
nc 1
nop 0
dl 0
loc 26
rs 9.7333
c 1
b 0
f 0
1
<?php
2
3
namespace App\Tests\Card;
4
5
use PHPUnit\Framework\TestCase;
6
use App\Card\BlackJack;
7
use App\Card\Deck;
8
use App\Card\Card;
9
use App\Card\PayoutBlackJack;
10
use App\Card\BlackJackRules;
11
12
/**
13
 * Test cases for class Black Jack.
14
 */
15
class BlackJackTest extends TestCase
16
{
17
    /**
18
     * Test init of the BlackJack instance with mock dependencies.
19
     */
20
    public function testBlackJackInit(): void
21
    {
22
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\Deck $deck */
23
        $deck = $this->createMock(Deck::class);
24
25
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\BlackJackRules $rules */
26
        $rules = $this->createMock(BlackJackRules::class);
27
28
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\PayoutBlackJack $payout */
29
        $payout = $this->createMock(PayoutBlackJack::class);
30
31
        $game = new BlackJack($deck, $rules, $payout);
32
33
        $this->assertInstanceOf(BlackJack::class, $game);
34
        $this->assertEquals([], $game->getPlayerHands());
35
    }
36
37
    public function testStartGameOneHand(): void
38
    {
39
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\Deck $deck */
40
        $deck = $this->createMock(Deck::class);
41
        $deck->method('drawCard')->willReturnOnConsecutiveCalls(
42
            new Card('Spades', 'Ace'),
43
            new Card('Hearts', 'King'),
44
            new Card('Spades', '9'),
45
            new Card('Diamonds', '7')
46
        );
47
48
        $rules = new BlackJackRules();
49
        $payout = new PayoutBlackJack();
50
51
        $game = new BlackJack($deck, $rules, $payout);
52
        $game->setBet(100);
53
        $game->setBalance(800);
54
55
        $game->startGame(1);
56
57
        $this->assertCount(1, $game->getPlayerHands());
58
        $this->assertCount(2, $game->getPlayerHands()[0]->getCards());
59
        $this->assertCount(2, $game->getBankHand()->getCards());
60
        // Check if bet is subtracted
61
        $this->assertEquals(700, $game->getBalance());
62
    }
63
64
    public function testStartGameThreeHands(): void
65
    {
66
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\Deck $deck */
67
        $deck = $this->createMock(Deck::class);
68
        $deck->method('drawCard')->willReturnOnConsecutiveCalls(
69
            new Card('Spades', 'Ace'),
70
            new Card('Hearts', 'King'),
71
            new Card('Spades', '10'),
72
            new Card('Diamonds', '9'),
73
            new Card('Hearts', 'Ace'),
74
            new Card('Hearts', '2'),
75
            new Card('Spades', '3'),
76
            new Card('Diamonds', '7')
77
        );
78
79
        $rules = new BlackJackRules();
80
        $payout = new PayoutBlackJack();
81
82
        $game = new BlackJack($deck, $rules, $payout);
83
        $game->setBet(100);
84
        $game->setBalance(700);
85
86
        $game->startGame(3);
87
88
        $this->assertCount(3, $game->getPlayerHands());
89
        foreach ($game->getPlayerHands() as $hand) {
90
            $this->assertCount(2, $hand->getCards());
91
        }
92
        $this->assertCount(2, $game->getBankHand()->getCards());
93
        $this->assertEquals(400, $game->getBalance());
94
    }
95
96
    public function testDrawForPlayer(): void
97
    {
98
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\Deck $deck */
99
        $deck = $this->createMock(Deck::class);
100
        $deck->method('drawCard')->willReturn(new Card('Spades', '10'));
101
102
        $rules = new BlackJackRules();
103
        $payout = new PayoutBlackJack();
104
105
        $game = new BlackJack($deck, $rules, $payout);
106
        $game->setBet(100);
107
        $game->setBalance(500);
108
109
        $game->startGame(1);
110
        $game->setPlayerName("Ved");
111
112
        // force bust -> move to next hand/bank
113
        $hand = $game->getCurrentHand();
114
        $this->assertNotNull($hand);
115
        $hand->addCard(new Card('Clubs', '10'));
116
        $hand->addCard(new Card('Diamonds', '10'));
117
118
        $game->drawForPlayer();
119
120
        $this->assertEquals(1, $game->getCurrentHandIndex());
121
        $this->assertEquals("Ved", $game->getPlayerName());
122
    }
123
124
    public function testCompareResults(): void
125
    {
126
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\Deck $deck */
127
        $deck = $this->createMock(Deck::class);
128
        $deck->method('drawCard')->willReturnOnConsecutiveCalls(
129
            new Card('Spades', '10'),
130
            new Card('Hearts', '9'),
131
            new Card('Clubs', '7'),
132
            new Card('Diamonds', '8')
133
        );
134
135
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\BlackJackRules $rules */
136
        $rules = $this->createMock(BlackJackRules::class);
137
        $rules->method('determineResult')->willReturn([
138
            'result' => 'win',
139
            'message' => 'Du vann!'
140
        ]);
141
142
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\PayoutBlackJack $payout */
143
        $payout = $this->createMock(PayoutBlackJack::class);
144
        $payout->method('payout')->with('win', 100)->willReturn(200);
145
146
        $game = new BlackJack($deck, $rules, $payout);
147
        $game->setBet(100);
148
        $game->setBalance(500);
149
150
        $game->startGame(1);
151
        $game->compareResults();
152
153
        $this->assertTrue($game->isGameOver());
154
        $this->assertGreaterThanOrEqual(400, $game->getBalance());
155
        $this->assertStringContainsString('Du vann!', $game->getResults()[0]);
156
        $this->assertEquals(100, $game->getBet());
157
    }
158
159
    public function testPlayerHasBlackJack(): void
160
    {
161
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\Deck $deck */
162
        $deck = $this->createMock(Deck::class);
163
        $deck->method('drawCard')->willReturnOnConsecutiveCalls(
164
            new Card('Spades', 'Ace'),
165
            new Card('Hearts', 'King'),
166
            new Card('Clubs', '8'),
167
            new Card('Diamonds', '9')
168
        );
169
170
        $rules = new BlackJackRules();
171
        $payout = new PayoutBlackJack();
172
173
        $game = new BlackJack($deck, $rules, $payout);
174
        $game->setBet(100);
175
        $game->setBalance(800);
176
177
        $game->startGame(1);
178
        $game->compareResults();
179
180
        $this->assertStringContainsString("Du vann med Blackjack!", $game->getResults()[0]);
181
    }
182
183
    public function testDrawForBank(): void
184
    {
185
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\Deck $deck */
186
        $deck = $this->createMock(Deck::class);
187
        $deck->method('drawCard')->willReturnOnConsecutiveCalls(
188
            new Card('Hearts', '8'),
189
            new Card('Clubs', '2'),
190
            new Card('Spades', '7'),
191
            new Card('Diamonds', '9'),
192
            new Card('Clubs', '10'),
193
            new Card('Hearts', '6')
194
        );
195
196
        $rules = new BlackJackRules();
197
        $payout = new PayoutBlackJack();
198
199
        $game = new BlackJack($deck, $rules, $payout);
200
        $game->setBet(100);
201
        $game->setBalance(800);
202
203
        $game->startGame(1);
204
        $game->drawForBank();
205
206
        $this->assertGreaterThanOrEqual(17, $game->getBankHand()->getTotalBlackJack());
207
    }
208
209
    public function testStayMoveToNextHand(): void
210
    {
211
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\Deck $deck */
212
        $deck = $this->createMock(Deck::class);
213
        $deck->method('drawCard')->willReturn(new Card('Hearts', '8'));
214
215
        $rules = new BlackJackRules();
216
        $payout = new PayoutBlackJack();
217
218
        $game = new BlackJack($deck, $rules, $payout);
219
        $game->setBet(100);
220
        $game->setBalance(800);
221
222
        $game->startGame(2);
223
224
        $this->assertEquals(0, $game->getCurrentHandIndex());
225
        $game->stay();
226
        $this->assertEquals(1, $game->getCurrentHandIndex());
227
    }
228
229
    public function testStartGameInvalid(): void
230
    {
231
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\Deck $deck */
232
        $deck = $this->createMock(Deck::class);
233
        $deck->method('drawCard')->willReturn(new Card('Hearts', '10'));
234
235
        $rules = new BlackJackRules();
236
        $payout = new PayoutBlackJack();
237
238
        $game = new BlackJack($deck, $rules, $payout);
239
        $game->setBet(100);
240
        $game->setBalance(800);
241
242
        $game->startGame(0); // invalid
243
        $this->assertCount(1, $game->getPlayerHands());
244
245
        $game->startGame(5); // too many
246
        $this->assertCount(1, $game->getPlayerHands());
247
    }
248
249
    public function testDrawForPlayerNoHand(): void
250
    {
251
        $deck = new Deck();
252
        $rules = new BlackJackRules();
253
        $payout = new PayoutBlackJack();
254
        $game = new BlackJack($deck, $rules, $payout);
255
256
        $game->drawForPlayer();  // should trigger the early return
257
258
        $this->assertNull($game->getCurrentHand());
259
    }
260
}
261