public function testDoubleDown() { // double down win $wallet = new Wallet(1000, 200); $cards = array(new Card(new Rank(8)), new Card(new Rank(8)), new Card(new Rank(3)), new Card(new Rank(Rank::ACE)), new Card(new Rank(Rank::KING))); $game = new BlackjackGame(new TestDeck($cards)); $game->start(); $this->assertTrue($game->getState() == State::OFFER_INSURANCE); $game->buyInsurance(false); $this->assertTrue($game->getState() == State::PLAYING); $game->userDoubleDown(); $this->assertTrue($game->getDealerHand()->getScore() == 19); $this->assertTrue($game->getUserHand()->getScore() == 21); $this->assertTrue($game->getState() == State::USER_WIN); $wallet->reconcile($game); $this->assertTrue($wallet->getMoney() == 1400); $wallet->reconcile($game); $this->assertTrue($wallet->getMoney() == 1400); $wallet->reconcile($game); $this->assertTrue($wallet->getMoney() == 1400); // double down win, dealer bust $wallet = new Wallet(1000, 400); $cards = array(new Card(new Rank(2)), new Card(new Rank(8)), new Card(new Rank(3)), new Card(new Rank(Rank::ACE)), new Card(new Rank(Rank::ACE)), new Card(new Rank(3)), new Card(new Rank(Rank::KING)), new Card(new Rank(Rank::KING))); $game = new BlackjackGame(new TestDeck($cards)); $game->start(); $this->assertTrue($game->getState() == State::OFFER_INSURANCE); $game->buyInsurance(false); $this->assertTrue($game->getState() == State::PLAYING); $game->userDoubleDown(); $this->assertTrue($game->getDealerHand()->getScore() == 26); $this->assertTrue($game->getUserHand()->getScore() == 12); $this->assertTrue($game->getState() == State::DEALER_BUST); $wallet->reconcile($game); $this->assertTrue($wallet->getMoney() == 1800); $wallet->reconcile($game); // double down loss no bust $wallet = new Wallet(1000, 200); $cards = array(new Card(new Rank(3)), new Card(new Rank(5)), new Card(new Rank(5)), new Card(new Rank(Rank::ACE)), new Card(new Rank(5)), new Card(new Rank(2)), new Card(new Rank(4))); $game = new BlackjackGame(new TestDeck($cards)); $game->start(); $this->assertTrue($game->getState() == State::OFFER_INSURANCE); $game->buyInsurance(false); $this->assertTrue($game->getState() == State::PLAYING); $game->userDoubleDown(); // try to hit a few times, should do nothing $game->hitUser(); $game->hitUser(); $this->assertTrue($game->getDealerHand()->getScore() == 20); $this->assertTrue($game->getUserHand()->getScore() == 15); $this->assertTrue($game->getState() == State::DEALER_WIN); $wallet->reconcile($game); $this->assertTrue($wallet->getMoney() == 600); // double down loss via bust $wallet = new Wallet(1000, 500); $cards = array(new Card(new Rank(2)), new Card(new Rank(7)), new Card(new Rank(Rank::QUEEN)), new Card(new Rank(Rank::JACK)), new Card(new Rank(8)), new Card(new Rank(10))); $game = new BlackjackGame(new TestDeck($cards)); $game->start(); $this->assertTrue($game->getState() == State::PLAYING); $game->userDoubleDown(); // try to hit a few times, should do nothing $game->hitUser(); $game->hitUser(); $this->assertTrue($game->getDealerHand()->getScore() == 12); $this->assertTrue($game->getUserHand()->getScore() == 25); $this->assertTrue($game->getState() == State::USER_BUST); $wallet->reconcile($game); $this->assertTrue($wallet->getMoney() == 0); // double down w/ insurance & win $wallet = new Wallet(1000, 200); $cards = array(new Card(new Rank(8)), new Card(new Rank(8)), new Card(new Rank(3)), new Card(new Rank(Rank::ACE)), new Card(new Rank(Rank::KING))); $game = new BlackjackGame(new TestDeck($cards)); $game->start(); $this->assertTrue($game->getState() == State::OFFER_INSURANCE); $game->buyInsurance(true); $this->assertTrue($game->getState() == State::PLAYING); $game->userDoubleDown(); $this->assertTrue($game->getDealerHand()->getScore() == 19); $this->assertTrue($game->getUserHand()->getScore() == 21); $this->assertTrue($game->getState() == State::USER_WIN); $wallet->reconcile($game); $this->assertTrue($wallet->getMoney() == 1300); // double down w/o insurance & win $wallet = new Wallet(1000, 50); $cards = array(new Card(new Rank(4)), new Card(new Rank(6)), new Card(new Rank(5)), new Card(new Rank(Rank::ACE)), new Card(new Rank(Rank::ACE)), new Card(new Rank(Rank::QUEEN)), new Card(new Rank(3))); $game = new BlackjackGame(new TestDeck($cards)); $game->start(); $this->assertTrue($game->getState() == State::OFFER_INSURANCE); $game->buyInsurance(false); $this->assertTrue($game->getState() == State::PLAYING); $game->userDoubleDown(); $this->assertTrue($game->getDealerHand()->getScore() == 18); $this->assertTrue($game->getUserHand()->getScore() == 12); $this->assertTrue($game->getState() == State::DEALER_WIN); $wallet->reconcile($game); $this->assertTrue($wallet->getMoney() == 900); // double down w/ insurance & loss $wallet = new Wallet(1000, 200); $cards = array(new Card(new Rank(8)), new Card(new Rank(9)), new Card(new Rank(3)), new Card(new Rank(Rank::ACE)), new Card(new Rank(Rank::KING))); $game = new BlackjackGame(new TestDeck($cards)); $game->start(); $this->assertTrue($game->getState() == State::OFFER_INSURANCE); $game->buyInsurance(true); $this->assertTrue($game->getState() == State::PLAYING); $game->userDoubleDown(); $this->assertTrue($game->getDealerHand()->getScore() == 19); $this->assertTrue($game->getUserHand()->getScore() == 22); $this->assertTrue($game->getState() == State::USER_BUST); $wallet->reconcile($game); $this->assertTrue($wallet->getMoney() == 500); $wallet->reconcile($game); $this->assertTrue($wallet->getMoney() == 500); }