Game21Test::testDrawForPlayer()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 25
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 14
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 25
rs 9.7998
1
<?php
2
3
namespace App\Tests\Card;
4
5
use PHPUnit\Framework\TestCase;
6
use App\Card\Game21;
7
use App\Card\Deck;
8
use App\Card\CardHand;
9
use App\Card\Card;
10
11
/**
12
 * Test cases for class Game21.
13
 */
14
class Game21Test extends TestCase
15
{
16
    /**
17
     * Test init of the Game21 instance with mock dependencies.
18
     */
19
    public function testGame21Init(): void
20
    {
21
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\Deck $deck */
22
        $deck = $this->createMock(Deck::class);
23
24
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\CardHand $playerHand */
25
        $playerHand = $this->createMock(CardHand::class);
26
27
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\CardHand $bankHand */
28
        $bankHand = $this->createMock(CardHand::class);
29
30
        $game = new Game21($deck, $playerHand, $bankHand);
31
32
        $this->assertInstanceOf(Game21::class, $game);
33
    }
34
35
    /**
36
     * Test the getters for player and bank hands.
37
     */
38
    public function testGetPlayerHandAndBankHand(): void
39
    {
40
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\Deck $deck */
41
        $deck = $this->createMock(Deck::class);
42
43
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\CardHand $playerHand */
44
        $playerHand = $this->createMock(CardHand::class);
45
46
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\CardHand $bankHand */
47
        $bankHand = $this->createMock(CardHand::class);
48
49
        $game = new Game21($deck, $playerHand, $bankHand);
50
51
        $this->assertSame($playerHand, $game->getPlayerHand());
52
        $this->assertSame($bankHand, $game->getBankHand());
53
    }
54
55
    /**
56
     * Test drawing a card for the player:
57
     * - Add the card to player's hand,
58
     * - Update total,
59
     * - Check if game ends when player > 21,
60
     * - Verifies result message.
61
     */
62
    public function testDrawForPlayer(): void
63
    {
64
        $card = new Card("Hearts", "7");
65
66
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\Deck $deck */
67
        $deck = $this->createMock(Deck::class);
68
69
        $deck->method('drawCard')->willReturn($card);
70
71
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\CardHand $playerHand */
72
        $playerHand = $this->createMock(CardHand::class);
73
        $playerHand->expects($this->once())->method('addCard')->with($card);
74
        $playerHand->method('getTotal')->willReturn(22);
75
        $playerHand->method('getCards')->willReturn([$card]);
76
77
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\CardHand $bankHand */
78
        $bankHand = $this->createMock(CardHand::class);
79
80
        $game = new Game21($deck, $playerHand, $bankHand);
81
        $game->drawForPlayer();
82
83
        $this->assertCount(1, $game->getPlayerHand()->getCards());
84
        $this->assertSame($card, $game->getPlayerHand()->getCards()[0]);
85
        $this->assertTrue($game->isGameOver());
86
        $this->assertSame("Du har över 21! Du förlorade!", $game->getResult());
87
    }
88
89
    /**
90
     * Test drawing a card for the bank when the deck is empty:
91
     */
92
    public function testDrawForBankBreakIfDeckEmpty(): void
93
    {
94
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\Deck $deck */
95
        $deck = $this->createMock(Deck::class);
96
        $deck->method('drawCard')->willReturn(null);
97
98
        $bankHand = new CardHand();
99
100
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\CardHand $playerHand */
101
        $playerHand = $this->createMock(CardHand::class);
102
103
        $game = new Game21($deck, $playerHand, $bankHand);
104
105
        $game->drawForBank();
106
107
        $this->assertCount(0, $bankHand->getCards());
108
    }
109
110
    /**
111
     * Test drawing cards for the bank:
112
     * - Bank draws cards until 17 points.
113
     * - Verify total of bank hand matches expected value.
114
     */
115
    public function testDrawForBank(): void
116
    {
117
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\Deck $deck */
118
        $deck = $this->createMock(Deck::class);
119
        $deck->method('drawCard')->willReturnOnConsecutiveCalls(
120
            new Card('hearts', '5'),
121
            new Card('spades', '6'),
122
            new Card('clubs', '6')
123
        );
124
125
        $game = new Game21($deck, new CardHand(), new CardHand());
126
        $game->drawForBank();
127
128
        $this->assertSame(17, $game->getBankHand()->getTotal());
129
    }
130
131
    /**
132
     * Test compare game results for different player and bank hand totals.
133
     */
134
    public function testCompareResults(): void
135
    {
136
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\Deck $deck */
137
        $deck = $this->createMock(Deck::class);
138
139
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\CardHand $playerHand1 */
140
        $playerHand1 = $this->createMock(CardHand::class);
141
142
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\CardHand $bankHand1 */
143
        $bankHand1 = $this->createMock(CardHand::class);
144
145
        $playerHand1->method('getTotal')->willReturn(23);
146
        $bankHand1->method('getTotal')->willReturn(18);
147
        $game = new Game21($deck, $playerHand1, $bankHand1);
148
        $this->assertSame("Du förlorade!", $game->compareResults());
149
150
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\CardHand $playerHand2 */
151
        $playerHand2 = $this->createMock(CardHand::class);
152
153
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\CardHand $bankHand2 */
154
        $bankHand2 = $this->createMock(CardHand::class);
155
156
        $playerHand2->method('getTotal')->willReturn(18);
157
        $bankHand2->method('getTotal')->willReturn(18);
158
        $game = new Game21($deck, $playerHand2, $bankHand2);
159
        $this->assertSame("Du förlorade!", $game->compareResults());
160
161
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\CardHand $playerHand3 */
162
        $playerHand3 = $this->createMock(CardHand::class);
163
164
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\CardHand $bankHand3 */
165
        $bankHand3 = $this->createMock(CardHand::class);
166
167
        $playerHand3->method('getTotal')->willReturn(20);
168
        $bankHand3->method('getTotal')->willReturn(17);
169
        $game = new Game21($deck, $playerHand3, $bankHand3);
170
        $this->assertSame("Du vann!", $game->compareResults());
171
172
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\CardHand $playerHand4 */
173
        $playerHand4 = $this->createMock(CardHand::class);
174
175
        /** @var \PHPUnit\Framework\MockObject\MockObject&\App\Card\CardHand $bankHand4 */
176
        $bankHand4 = $this->createMock(CardHand::class);
177
178
        $playerHand4->method('getTotal')->willReturn(18);
179
        $bankHand4->method('getTotal')->willReturn(23);
180
        $game = new Game21($deck, $playerHand4, $bankHand4);
181
        $this->assertSame("Du vann!", $game->compareResults());
182
    }
183
}
184