/** * 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.data; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import org.jskat.AbstractJSkatTest; import org.jskat.data.GameAnnouncement.GameAnnouncementFactory; import org.jskat.util.Card; import org.jskat.util.CardList; import org.jskat.util.GameType; import org.junit.Before; import org.junit.Test; /** * Tests for {@link GameAnnouncement} */ public class GameAnnouncementTest extends AbstractJSkatTest { private static final CardList VALID_DISCARDED_CARDS = new CardList(Card.CJ, Card.SJ); private static Set<GameAnnouncement> validAnnouncements = new HashSet<GameAnnouncement>(); @Before public void createAllValidGameAnnouncements() { validAnnouncements.add(createNullWithoutDiscardedCards()); validAnnouncements.add(createNull()); validAnnouncements.add(createNullHand()); validAnnouncements.add(createNullOuvert()); validAnnouncements.add(createNullOuvertWithoutDiscardedCards()); validAnnouncements.add(createNullHandOuvert()); for (final GameType suitGrand : Arrays.asList(GameType.GRAND, GameType.CLUBS, GameType.SPADES, GameType.HEARTS, GameType.DIAMONDS)) { validAnnouncements .add(createSuitGrandWithoutDiscardedCards(suitGrand)); validAnnouncements.add(createSuitGrand(suitGrand)); validAnnouncements.add(createSuitGrandHand(suitGrand)); validAnnouncements.add(createSuitGrandHandSchneider(suitGrand)); validAnnouncements .add(createSuitGrandHandSchneiderSchwarz(suitGrand)); validAnnouncements.add(createSuitGrandOuvert(suitGrand)); } validAnnouncements.add(createRamsch()); validAnnouncements.add(createPassedIn()); assertEquals(38, validAnnouncements.size()); } private static GameAnnouncement createRamsch() { final GameAnnouncement result = new GameAnnouncement(); result.gameType = GameType.RAMSCH; return result; } private static GameAnnouncement createPassedIn() { final GameAnnouncement result = new GameAnnouncement(); result.gameType = GameType.PASSED_IN; return result; } private static GameAnnouncement createSuitGrand(final GameType gameType) { final GameAnnouncement result = new GameAnnouncement(); result.gameType = gameType; result.discardedCards = VALID_DISCARDED_CARDS; return result; } @Deprecated private static GameAnnouncement createSuitGrandWithoutDiscardedCards( final GameType gameType) { final GameAnnouncement result = new GameAnnouncement(); result.gameType = gameType; return result; } private static GameAnnouncement createSuitGrandHand(final GameType gameType) { final GameAnnouncement result = new GameAnnouncement(); result.gameType = gameType; result.hand = Boolean.TRUE; return result; } private static GameAnnouncement createSuitGrandHandSchneider( final GameType gameType) { final GameAnnouncement result = new GameAnnouncement(); result.gameType = gameType; result.hand = Boolean.TRUE; result.schneider = Boolean.TRUE; return result; } private static GameAnnouncement createSuitGrandHandSchneiderSchwarz( final GameType gameType) { final GameAnnouncement result = new GameAnnouncement(); result.gameType = gameType; result.hand = Boolean.TRUE; result.schneider = Boolean.TRUE; result.schwarz = Boolean.TRUE; return result; } private static GameAnnouncement createSuitGrandOuvert( final GameType gameType) { GameAnnouncement.getFactory(); final GameAnnouncement result = new GameAnnouncement(); result.gameType = gameType; result.hand = Boolean.TRUE; result.ouvert = Boolean.TRUE; result.schneider = Boolean.TRUE; result.schwarz = Boolean.TRUE; return result; } @Deprecated private static GameAnnouncement createNullWithoutDiscardedCards() { final GameAnnouncement result = new GameAnnouncement(); result.gameType = GameType.NULL; return result; } private static GameAnnouncement createNull() { final GameAnnouncement result = new GameAnnouncement(); result.gameType = GameType.NULL; result.discardedCards = VALID_DISCARDED_CARDS; return result; } private GameAnnouncement createNullHand() { final GameAnnouncement result = new GameAnnouncement(); result.gameType = GameType.NULL; result.hand = Boolean.TRUE; return result; } @Deprecated private GameAnnouncement createNullOuvertWithoutDiscardedCards() { final GameAnnouncement result = new GameAnnouncement(); result.gameType = GameType.NULL; result.ouvert = Boolean.TRUE; return result; } private GameAnnouncement createNullOuvert() { final GameAnnouncement result = new GameAnnouncement(); result.gameType = GameType.NULL; result.ouvert = Boolean.TRUE; result.discardedCards = VALID_DISCARDED_CARDS; return result; } private GameAnnouncement createNullHandOuvert() { final GameAnnouncement result = new GameAnnouncement(); result.gameType = GameType.NULL; result.hand = Boolean.TRUE; result.ouvert = Boolean.TRUE; return result; } @Test public void testEmptyGameType() { final GameAnnouncementFactory factory = GameAnnouncement.getFactory(); final GameAnnouncement announcement = factory.getAnnouncement(); assertNull(announcement); } @Test public void testAllAnnouncementPermutations() { for (final GameType gameType : GameType.values()) { for (final Boolean isHand : getAllBooleanExpressions()) { for (final Boolean isOuvert : getAllBooleanExpressions()) { for (final Boolean isSchneider : getAllBooleanExpressions()) { for (final Boolean isSchwarz : getAllBooleanExpressions()) { for (final CardList discardedCards : getAllDiscardedCardsExpressions()) { final GameAnnouncement announcement = prepareAnnouncement( gameType, isHand, isOuvert, isSchneider, isSchwarz, discardedCards); testAnnouncement(announcement, gameType, isHand, isOuvert, isSchneider, isSchwarz, discardedCards); } } } } } } } private void testAnnouncement(final GameAnnouncement announcement, final GameType gameType, final Boolean isHand, final Boolean isOuvert, final Boolean isSchneider, final Boolean isSchwarz, final CardList discardedCards) { if (isValidAnnouncement(announcement)) { checkAnnouncement(announcement, gameType, isHand, isOuvert, isSchneider, isSchwarz, discardedCards); } else { // cross check final GameAnnouncement ann = new GameAnnouncement(); ann.gameType = gameType; ann.hand = isHand; ann.ouvert = isOuvert; ann.schneider = isSchneider; ann.schwarz = isSchwarz; ann.discardedCards = discardedCards; assertFalse( "Not in valid set or created as null object: " + ann, validAnnouncements.contains(ann)); //$NON-NLS-1$ assertNull("Wrong created announcement: " + announcement, //$NON-NLS-1$ announcement); } } private GameAnnouncement prepareAnnouncement(final GameType gameType, final Boolean isHand, final Boolean isOuvert, final Boolean isSchneider, final Boolean isSchwarz, final CardList discardedCards) { final GameAnnouncementFactory factory = GameAnnouncement.getFactory(); factory.setGameType(gameType); factory.setHand(isHand); factory.setOuvert(isOuvert); factory.setSchneider(isSchneider); factory.setSchwarz(isSchwarz); factory.setDiscardedCards(discardedCards); final GameAnnouncement announcement = factory.getAnnouncement(); return announcement; } private static void checkAnnouncement(final GameAnnouncement announcement, final GameType gameType, final Boolean isHand, final Boolean isOuvert, final Boolean isSchneider, final Boolean isSchwarz, final CardList discardedCards) { assertEquals(gameType, announcement.gameType); assertEquals(isHand, announcement.hand); assertEquals(isOuvert, announcement.ouvert); assertEquals(isSchneider, announcement.schneider); assertEquals(isSchwarz, announcement.schwarz); assertEquals(discardedCards, announcement.discardedCards); } private static boolean isValidAnnouncement( final GameAnnouncement announcement) { return validAnnouncements.contains(announcement); } private static List<CardList> getAllDiscardedCardsExpressions() { return Arrays.asList(new CardList(), new CardList(Arrays.asList(Card.CJ)), VALID_DISCARDED_CARDS, new CardList(Arrays.asList(Card.CJ, Card.SJ, Card.HJ))); } private static List<Boolean> getAllBooleanExpressions() { return Arrays.asList(Boolean.TRUE, Boolean.FALSE); } }