/** * Copyright (C) 2017 Jan Schäfer (jansch@users.sourceforge.net) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jskat.player; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import org.jskat.data.GameAnnouncement; import org.jskat.data.GameAnnouncement.GameAnnouncementFactory; import org.jskat.data.Trick; import org.jskat.util.Card; import org.jskat.util.CardDeck; import org.jskat.util.CardList; import org.jskat.util.GameType; import org.jskat.util.Player; import org.jskat.util.Suit; import org.junit.Before; import org.junit.Test; public class PlayerKnowledgeTest2 { private PlayerKnowledge knowledge; CardList playerCards = new CardList(Card.CJ, Card.SJ, Card.CA, Card.CT, Card.C9, Card.SA, Card.ST, Card.S9, Card.HA, Card.HT); CardList opponentCards = new CardList(Card.HJ, Card.DJ, Card.CK, Card.CQ, Card.SK, Card.SQ, Card.HK, Card.HQ, Card.D8, Card.D9, Card.DT, Card.C7, Card.C8, Card.S7, Card.S8, Card.H8, Card.H9, Card.DA, Card.DK, Card.DQ); CardList skatCards = new CardList(Card.H7, Card.D7); /** * Setting up all variables */ @Before public void setUp() { knowledge = new PlayerKnowledge(); } @Test public void beforeDealing() { knowledge.resetCurrentGameData(); assertThat(knowledge.getTrumpCount(), is(0)); for (Card card : Card.values()) { assertCardCouldBeEverywhere(card); } for (Card card : opponentCards) { assertCardCouldBeEverywhere(card); } for (Card card : skatCards) { assertCardCouldBeEverywhere(card); } assertTrue(knowledge.couldHaveSuit(Player.FOREHAND, Suit.CLUBS)); assertTrue(knowledge.couldHaveSuit(Player.FOREHAND, Suit.SPADES)); assertTrue(knowledge.couldHaveSuit(Player.FOREHAND, Suit.HEARTS)); assertTrue(knowledge.couldHaveSuit(Player.FOREHAND, Suit.DIAMONDS)); assertTrue(knowledge.couldHaveSuit(Player.MIDDLEHAND, Suit.CLUBS)); assertTrue(knowledge.couldHaveSuit(Player.MIDDLEHAND, Suit.SPADES)); assertTrue(knowledge.couldHaveSuit(Player.MIDDLEHAND, Suit.HEARTS)); assertTrue(knowledge.couldHaveSuit(Player.MIDDLEHAND, Suit.DIAMONDS)); assertTrue(knowledge.couldHaveSuit(Player.REARHAND, Suit.CLUBS)); assertTrue(knowledge.couldHaveSuit(Player.REARHAND, Suit.SPADES)); assertTrue(knowledge.couldHaveSuit(Player.REARHAND, Suit.HEARTS)); assertTrue(knowledge.couldHaveSuit(Player.REARHAND, Suit.DIAMONDS)); } @Test public void afterDealing() { knowledge.resetCurrentGameData(); knowledge.setPlayerPosition(Player.FOREHAND); knowledge.addOwnCards(playerCards); gameAnnouncement(GameType.CLUBS, Player.FOREHAND); assertThat(knowledge.getTrumpCount(), is(5)); for (Card card : playerCards) { assertTrue(knowledge.couldHaveCard(Player.FOREHAND, card)); assertFalse(knowledge.couldHaveCard(Player.MIDDLEHAND, card)); assertFalse(knowledge.couldHaveCard(Player.REARHAND, card)); assertFalse(knowledge.couldLieInSkat(card)); } for (Card card : opponentCards) { assertFalse(knowledge.couldHaveCard(Player.FOREHAND, card)); assertTrue(knowledge.couldHaveCard(Player.MIDDLEHAND, card)); assertTrue(knowledge.couldHaveCard(Player.REARHAND, card)); assertTrue(knowledge.couldLieInSkat(card)); } for (Card card : skatCards) { assertFalse(knowledge.couldHaveCard(Player.FOREHAND, card)); assertTrue(knowledge.couldHaveCard(Player.MIDDLEHAND, card)); assertTrue(knowledge.couldHaveCard(Player.REARHAND, card)); assertTrue(knowledge.couldLieInSkat(card)); } assertTrue(knowledge.couldOpponentsHaveTrump()); assertTrue(knowledge.couldHaveSuit(Player.FOREHAND, Suit.CLUBS)); assertTrue(knowledge.couldHaveSuit(Player.FOREHAND, Suit.SPADES)); assertTrue(knowledge.couldHaveSuit(Player.FOREHAND, Suit.HEARTS)); assertFalse(knowledge.couldHaveSuit(Player.FOREHAND, Suit.DIAMONDS)); assertTrue(knowledge.couldHaveSuit(Player.MIDDLEHAND, Suit.CLUBS)); assertTrue(knowledge.couldHaveSuit(Player.MIDDLEHAND, Suit.SPADES)); assertTrue(knowledge.couldHaveSuit(Player.MIDDLEHAND, Suit.HEARTS)); assertTrue(knowledge.couldHaveSuit(Player.MIDDLEHAND, Suit.DIAMONDS)); assertTrue(knowledge.couldHaveSuit(Player.REARHAND, Suit.CLUBS)); assertTrue(knowledge.couldHaveSuit(Player.REARHAND, Suit.SPADES)); assertTrue(knowledge.couldHaveSuit(Player.REARHAND, Suit.HEARTS)); assertTrue(knowledge.couldHaveSuit(Player.REARHAND, Suit.DIAMONDS)); } @Test public void trickPlaying() { knowledge.resetCurrentGameData(); knowledge.setPlayerPosition(Player.FOREHAND); knowledge.addOwnCards(playerCards); gameAnnouncement(GameType.CLUBS, Player.FOREHAND); // 1st trick knowledge.setNextTrick(0, Player.FOREHAND); assertTrue(knowledge.getCompletedTricks().isEmpty()); knowledge.setCardPlayed(Player.FOREHAND, Card.CJ); assertCardCouldBeNowhere(Card.CJ); knowledge.setCardPlayed(Player.MIDDLEHAND, Card.D8); assertCardCouldBeNowhere(Card.D8); assertCouldNotHaveCardOfSuit(Player.MIDDLEHAND, Suit.CLUBS); assertCouldNotHaveCards(Player.MIDDLEHAND, Card.HJ, Card.DJ); knowledge.setCardPlayed(Player.REARHAND, Card.CK); assertCardCouldBeNowhere(Card.CK); Trick trick = new Trick(0, Player.FOREHAND); trick.addCard(Card.CJ); trick.addCard(Card.D8); trick.addCard(Card.CK); trick.setTrickWinner(Player.FOREHAND); knowledge.addCompletedTrick(trick); assertThat(knowledge.getCompletedTricks().size(), is(1)); // 2nd trick knowledge.setNextTrick(1, Player.FOREHAND); assertThat(knowledge.getCompletedTricks().size(), is(1)); knowledge.setCardPlayed(Player.FOREHAND, Card.SJ); assertCardCouldBeNowhere(Card.SJ); knowledge.setCardPlayed(Player.MIDDLEHAND, Card.D9); assertCardCouldBeNowhere(Card.D9); assertCouldHaveCards(Player.MIDDLEHAND, Card.SK, Card.SQ, Card.S8, Card.S7); knowledge.setCardPlayed(Player.REARHAND, Card.CQ); assertCouldHaveCards(Player.REARHAND, Card.SK, Card.SQ, Card.S8, Card.S7); assertCardCouldBeNowhere(Card.CQ); trick = new Trick(1, Player.FOREHAND); trick.addCard(Card.SJ); trick.addCard(Card.D9); trick.addCard(Card.CQ); trick.setTrickWinner(Player.FOREHAND); knowledge.addCompletedTrick(trick); assertThat(knowledge.getCompletedTricks().size(), is(2)); // 3rd trick knowledge.setNextTrick(2, Player.FOREHAND); assertThat(knowledge.getCompletedTricks().size(), is(2)); knowledge.setCardPlayed(Player.FOREHAND, Card.SA); assertCardCouldBeNowhere(Card.SA); knowledge.setCardPlayed(Player.MIDDLEHAND, Card.H8); assertCardCouldBeNowhere(Card.H8); assertCouldNotHaveCardOfSuit(Player.MIDDLEHAND, Suit.SPADES); knowledge.setCardPlayed(Player.REARHAND, Card.S8); assertCardCouldBeNowhere(Card.S8); trick = new Trick(2, Player.FOREHAND); trick.addCard(Card.SA); trick.addCard(Card.H8); trick.addCard(Card.S8); trick.setTrickWinner(Player.FOREHAND); knowledge.addCompletedTrick(trick); assertThat(knowledge.getCompletedTricks().size(), is(3)); // 4th trick knowledge.setNextTrick(3, Player.FOREHAND); assertThat(knowledge.getCompletedTricks().size(), is(3)); knowledge.setCardPlayed(Player.FOREHAND, Card.HA); assertCardCouldBeNowhere(Card.HA); knowledge.setCardPlayed(Player.MIDDLEHAND, Card.H9); assertCardCouldBeNowhere(Card.H9); knowledge.setCardPlayed(Player.REARHAND, Card.S9); assertCardCouldBeNowhere(Card.S9); assertCouldHaveCards(Player.REARHAND, Card.HJ, Card.DJ); } private void assertCouldHaveCards(Player player, Card... cards) { for (Card card : cards) { assertTrue(knowledge.couldHaveCard(player, card)); } } private void assertCouldNotHaveCards(Player player, Card... cards) { for (Card card : cards) { assertFalse(knowledge.couldHaveCard(player, card)); } } private void assertCouldNotHaveCardOfSuit(Player player, Suit suit) { assertFalse(knowledge.couldHaveSuit(player, suit)); for (Card card : CardDeck.SUIT_CARDS.get(suit)) { assertFalse(knowledge.couldHaveCard(player, card)); } } private void assertCardCouldBeNowhere(Card card) { assertFalse(knowledge.couldHaveCard(Player.FOREHAND, card)); assertFalse(knowledge.couldHaveCard(Player.MIDDLEHAND, card)); assertFalse(knowledge.couldHaveCard(Player.REARHAND, card)); assertFalse(knowledge.couldLieInSkat(card)); } private void assertCardCouldBeEverywhere(Card card) { assertTrue(knowledge.couldHaveCard(Player.FOREHAND, card)); assertTrue(knowledge.couldHaveCard(Player.MIDDLEHAND, card)); assertTrue(knowledge.couldHaveCard(Player.REARHAND, card)); assertTrue(knowledge.couldLieInSkat(card)); } private void gameAnnouncement(GameType gameType, Player declarer) { GameAnnouncementFactory factory = GameAnnouncement.getFactory(); factory.setGameType(gameType); knowledge.setDeclarer(declarer); knowledge.setGame(factory.getAnnouncement()); } }