/**
* 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.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.HashSet;
import java.util.Set;
import org.jskat.AbstractJSkatTest;
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.GameType;
import org.jskat.util.Player;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Test cases for class PlayerKnowledge
*/
public class PlayerKnowledgeTest extends AbstractJSkatTest {
private static Logger log = LoggerFactory
.getLogger(PlayerKnowledgeTest.class);
PlayerKnowledge knowledge;
Set<Card> playerCards;
Set<Card> otherCards;
/**
* Setting up all variables
*/
@Before
public void setUp() {
knowledge = new PlayerKnowledge();
knowledge.setPlayerPosition(Player.MIDDLEHAND);
// Cards for the player
playerCards = new HashSet<>();
playerCards.add(Card.CA);
playerCards.add(Card.CQ);
playerCards.add(Card.C8);
playerCards.add(Card.ST);
playerCards.add(Card.SQ);
playerCards.add(Card.DT);
playerCards.add(Card.DK);
playerCards.add(Card.D7);
playerCards.add(Card.HJ);
playerCards.add(Card.HA);
// other cards
otherCards = new HashSet<Card>();
for (Card card : Card.values()) {
if (!playerCards.contains(card)) {
otherCards.add(card);
}
}
}
/**
* Test the player knowledge after fresh initialization
*/
@Test
public void testInitialization() {
assertTrue(knowledge.getOwnCards().isEmpty());
assertEquals(0, knowledge.getTrumpCount());
for (Card card : playerCards) {
assertTrue(Player.FOREHAND + " could have card " + card, //$NON-NLS-1$
knowledge.couldHaveCard(Player.FOREHAND, card));
assertTrue(Player.MIDDLEHAND + " could have card " + card, //$NON-NLS-1$
knowledge.couldHaveCard(Player.MIDDLEHAND, card));
assertTrue(Player.REARHAND + " could have card " + card, //$NON-NLS-1$
knowledge.couldHaveCard(Player.REARHAND, card));
assertFalse("No certain information about Card " + card + " on " //$NON-NLS-1$ //$NON-NLS-2$
+ Player.FOREHAND,
knowledge.hasCard(Player.FOREHAND, card));
assertFalse("No certain information about Card " + card + " on " //$NON-NLS-1$ //$NON-NLS-2$
+ Player.MIDDLEHAND,
knowledge.hasCard(Player.MIDDLEHAND, card));
assertFalse("No certain information about Card " + card + " on " //$NON-NLS-1$ //$NON-NLS-2$
+ Player.REARHAND,
knowledge.hasCard(Player.REARHAND, card));
assertTrue("Card " + card + " could lie in skat.", //$NON-NLS-1$//$NON-NLS-2$
knowledge.couldLieInSkat(card));
}
for (Card card : otherCards) {
assertTrue("Card " + card + " should be on " + Player.FOREHAND, //$NON-NLS-1$ //$NON-NLS-2$
knowledge.couldHaveCard(Player.FOREHAND, card));
assertTrue("Card " + card + " should be on " + Player.MIDDLEHAND, //$NON-NLS-1$ //$NON-NLS-2$
knowledge.couldHaveCard(Player.MIDDLEHAND, card));
assertTrue("Card " + card + " should be on " + Player.REARHAND, //$NON-NLS-1$ //$NON-NLS-2$
knowledge.couldHaveCard(Player.REARHAND, card));
assertFalse("No certain information about Card " + card + " on " //$NON-NLS-1$ //$NON-NLS-2$
+ Player.FOREHAND,
knowledge.hasCard(Player.FOREHAND, card));
assertFalse("No certain information about Card " + card + " on " //$NON-NLS-1$ //$NON-NLS-2$
+ Player.MIDDLEHAND,
knowledge.hasCard(Player.MIDDLEHAND, card));
assertFalse("No certain information about Card " + card + " on " //$NON-NLS-1$ //$NON-NLS-2$
+ Player.REARHAND,
knowledge.hasCard(Player.REARHAND, card));
assertTrue("Card " + card + " could lie in skat.", //$NON-NLS-1$//$NON-NLS-2$
knowledge.couldLieInSkat(card));
}
}
/**
* Test player knowledge after dealing
*/
@Test
public void testDealing() {
dealPlayerCards();
assertEquals(10, knowledge.getOwnCards().size());
assertEquals(0, knowledge.getTrumpCount());
for (Card card : playerCards) {
assertFalse(Player.FOREHAND + " could not have card " + card, //$NON-NLS-1$
knowledge.couldHaveCard(Player.FOREHAND, card));
assertTrue(Player.MIDDLEHAND + " could have card " + card, //$NON-NLS-1$
knowledge.couldHaveCard(Player.MIDDLEHAND, card));
assertFalse(Player.REARHAND + " could not have card " + card, //$NON-NLS-1$
knowledge.couldHaveCard(Player.REARHAND, card));
assertFalse("No certain information about Card " + card + " on " //$NON-NLS-1$ //$NON-NLS-2$
+ Player.FOREHAND,
knowledge.hasCard(Player.FOREHAND, card));
assertTrue(Player.MIDDLEHAND + " could have card " + card, //$NON-NLS-1$
knowledge.hasCard(Player.MIDDLEHAND, card));
assertFalse("No certain information about Card " + card + " on " //$NON-NLS-1$ //$NON-NLS-2$
+ Player.REARHAND,
knowledge.hasCard(Player.REARHAND, card));
assertFalse("Card " + card + " could not lie in skat.", //$NON-NLS-1$//$NON-NLS-2$
knowledge.couldLieInSkat(card));
}
for (Card card : otherCards) {
assertCouldHaveCard(Player.FOREHAND, card);
assertCouldNotHaveCard(Player.MIDDLEHAND, card);
assertCouldHaveCard(Player.REARHAND, card);
assertHasNotCard(Player.FOREHAND, card);
assertHasNotCard(Player.MIDDLEHAND, card);
assertHasNotCard(Player.REARHAND, card);
assertTrue("Card " + card + " could lie in skat.", //$NON-NLS-1$//$NON-NLS-2$
knowledge.couldLieInSkat(card));
}
}
@Test
public void testCardPlay_SuitGame() {
dealPlayerCards();
GameAnnouncementFactory factory = GameAnnouncement.getFactory();
factory.setGameType(GameType.CLUBS);
knowledge.setGame(factory.getAnnouncement());
knowledge.setDeclarer(Player.FOREHAND);
knowledge.setNextTrick(0, Player.FOREHAND);
Card foreHandCard = Card.SA;
Card middleHandCard = Card.SQ;
Card rearHandCard = Card.H7;
// Fore hand plays
assertCouldHaveCard(Player.FOREHAND, Card.SA);
assertCouldNotHaveCard(Player.FOREHAND, Card.ST);
assertCouldHaveCard(Player.FOREHAND, Card.SK);
assertCouldNotHaveCard(Player.FOREHAND, Card.SQ);
assertCouldHaveCard(Player.FOREHAND, Card.S9);
assertCouldHaveCard(Player.FOREHAND, Card.S8);
assertCouldHaveCard(Player.FOREHAND, Card.S7);
knowledge.setCardPlayed(Player.FOREHAND, foreHandCard);
assertCouldNotHaveCard(Player.FOREHAND, Card.SA);
assertCouldNotHaveCard(Player.FOREHAND, Card.ST);
assertCouldHaveCard(Player.FOREHAND, Card.SK);
assertCouldNotHaveCard(Player.FOREHAND, Card.SQ);
assertCouldHaveCard(Player.FOREHAND, Card.S9);
assertCouldHaveCard(Player.FOREHAND, Card.S8);
assertCouldHaveCard(Player.FOREHAND, Card.S7);
assertCouldNotHaveCard(Player.MIDDLEHAND, foreHandCard);
assertCouldNotHaveCard(Player.REARHAND, foreHandCard);
// Middle hand plays
assertCouldNotHaveCard(Player.MIDDLEHAND, Card.SA);
assertCouldHaveCard(Player.MIDDLEHAND, Card.ST);
assertCouldNotHaveCard(Player.MIDDLEHAND, Card.SK);
assertCouldHaveCard(Player.MIDDLEHAND, Card.SQ);
assertCouldNotHaveCard(Player.MIDDLEHAND, Card.S9);
assertCouldNotHaveCard(Player.MIDDLEHAND, Card.S8);
assertCouldNotHaveCard(Player.MIDDLEHAND, Card.S7);
knowledge.setCardPlayed(Player.MIDDLEHAND, middleHandCard);
assertCouldNotHaveCard(Player.FOREHAND, middleHandCard);
assertCouldNotHaveCard(Player.MIDDLEHAND, middleHandCard);
assertCouldNotHaveCard(Player.REARHAND, middleHandCard);
// Rear hand plays
assertCouldHaveCard(Player.REARHAND, Card.CJ);
assertCouldHaveCard(Player.REARHAND, Card.SJ);
assertCouldNotHaveCard(Player.REARHAND, Card.HJ);
assertCouldHaveCard(Player.REARHAND, Card.DJ);
assertCouldNotHaveCard(Player.REARHAND, Card.SA);
assertCouldNotHaveCard(Player.REARHAND, Card.ST);
assertCouldHaveCard(Player.REARHAND, Card.SK);
assertCouldNotHaveCard(Player.REARHAND, Card.SQ);
assertCouldHaveCard(Player.REARHAND, Card.S9);
assertCouldHaveCard(Player.REARHAND, Card.S8);
assertCouldHaveCard(Player.REARHAND, Card.S7);
knowledge.setCardPlayed(Player.REARHAND, rearHandCard);
assertCouldNotHaveCard(Player.FOREHAND, rearHandCard);
assertCouldNotHaveCard(Player.MIDDLEHAND, rearHandCard);
assertCouldNotHaveCard(Player.REARHAND, rearHandCard);
// Rear hand has not followed suit
assertCouldHaveCard(Player.REARHAND, Card.CJ);
assertCouldHaveCard(Player.REARHAND, Card.SJ);
assertCouldNotHaveCard(Player.REARHAND, Card.HJ);
assertCouldHaveCard(Player.REARHAND, Card.DJ);
assertCouldNotHaveCard(Player.REARHAND, Card.SA);
assertCouldNotHaveCard(Player.REARHAND, Card.ST);
assertCouldNotHaveCard(Player.REARHAND, Card.SK);
assertCouldNotHaveCard(Player.REARHAND, Card.SQ);
assertCouldNotHaveCard(Player.REARHAND, Card.S9);
assertCouldNotHaveCard(Player.REARHAND, Card.S8);
assertCouldNotHaveCard(Player.REARHAND, Card.S7);
}
private void dealPlayerCards() {
// set up player cards
knowledge.setPlayerPosition(Player.MIDDLEHAND);
knowledge.addOwnCards(playerCards);
}
private void assertCouldHaveCard(final Player player, final Card card) {
assertTrue(player + " could have card " + card, //$NON-NLS-1$
knowledge.couldHaveCard(player, card));
}
private void assertCouldNotHaveCard(final Player player, final Card card) {
assertFalse(player + " could not have card " + card, //$NON-NLS-1$
knowledge.couldHaveCard(player, card));
}
private void assertHasCard(final Player player, final Card card) {
assertTrue(player + " should have card " + card, //$NON-NLS-1$
knowledge.hasCard(player, card));
}
private void assertHasNotCard(final Player player, final Card card) {
assertFalse(player + " should not have card " + card, //$NON-NLS-1$
knowledge.hasCard(player, card));
}
private void assertCouldLieInSkat(final Card card) {
assertTrue(card + " could lie in skat", //$NON-NLS-1$
knowledge.couldLieInSkat(card));
}
private void assertCouldNotLieInSkat(final Card card) {
assertFalse(card + " could not lie in skat", //$NON-NLS-1$
knowledge.couldLieInSkat(card));
}
/**
* Tests setting of tricks
*/
@Test
public void testSetTrick() {
knowledge.setNextTrick(0, Player.FOREHAND);
assertEquals(0, knowledge.getCompletedTricks().size());
knowledge.addCompletedTrick(new Trick(0, Player.FOREHAND));
assertEquals(1, knowledge.getCompletedTricks().size());
}
}