package com.hearthsim.test.minion;
import com.hearthsim.card.Card;
import com.hearthsim.card.CharacterIndex;
import com.hearthsim.card.Deck;
import com.hearthsim.card.basic.minion.NorthshireCleric;
import com.hearthsim.card.basic.spell.AncestralHealing;
import com.hearthsim.card.basic.spell.TheCoin;
import com.hearthsim.card.minion.Minion;
import com.hearthsim.card.minion.MinionMock;
import com.hearthsim.exception.HSException;
import com.hearthsim.model.BoardModel;
import com.hearthsim.model.PlayerModel;
import com.hearthsim.model.PlayerSide;
import com.hearthsim.util.tree.CardDrawNode;
import com.hearthsim.util.tree.HearthTreeNode;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
public class TestNorthshireCleric {
private HearthTreeNode board;
private PlayerModel currentPlayer;
private PlayerModel waitingPlayer;
private static final byte mana = 2;
private static final byte attack0 = 2;
private static final byte health0 = 3;
private static final byte health1 = 7;
@Before
public void setup() throws HSException {
Card cards[] = new Card[10];
for (int index = 0; index < 10; ++index) {
cards[index] = new TheCoin();
}
Deck deck = new Deck(cards);
board = new HearthTreeNode(new BoardModel(deck, deck));
currentPlayer = board.data_.getCurrentPlayer();
waitingPlayer = board.data_.getWaitingPlayer();
Minion minion0_0 = new MinionMock("" + 0, mana, attack0, health0, attack0, health0, health0);
Minion minion0_1 = new MinionMock("" + 0, mana, attack0, (byte)(health1 - 1), attack0, health1, health1);
Minion minion1_0 = new MinionMock("" + 0, mana, attack0, health0, attack0, health0, health0);
Minion minion1_1 = new MinionMock("" + 0, mana, attack0, (byte)(health1 - 1), attack0, health1, health1);
board.data_.placeMinion(PlayerSide.CURRENT_PLAYER, minion0_0);
board.data_.placeMinion(PlayerSide.CURRENT_PLAYER, minion0_1);
board.data_.placeMinion(PlayerSide.WAITING_PLAYER, minion1_0);
board.data_.placeMinion(PlayerSide.WAITING_PLAYER, minion1_1);
currentPlayer.setMana((byte) 10);
waitingPlayer.setMana((byte) 10);
}
@Test
public void test_deepCopy() {
Minion card1 = new NorthshireCleric();
Minion card1_cloned = (Minion)card1.deepCopy();
assertTrue(card1.equals(card1_cloned));
assertTrue(card1_cloned.equals(card1));
card1.setHealth((byte)(card1.getHealth() + 1));
assertFalse(card1.equals(card1_cloned));
assertFalse(card1_cloned.equals(card1));
card1_cloned = (Minion)card1.deepCopy();
assertTrue(card1.equals(card1_cloned));
assertTrue(card1_cloned.equals(card1));
card1.setAttack((byte)(card1.getTotalAttack() + 1));
assertFalse(card1.equals(card1_cloned));
assertFalse(card1_cloned.equals(card1));
card1_cloned = (Minion)card1.deepCopy();
assertTrue(card1.equals(card1_cloned));
assertTrue(card1_cloned.equals(card1));
card1.setDestroyOnTurnEnd(true);
assertFalse(card1.equals(card1_cloned));
assertFalse(card1_cloned.equals(card1));
card1_cloned = (Minion)card1.deepCopy();
assertTrue(card1.equals(card1_cloned));
assertTrue(card1_cloned.equals(card1));
card1.setDestroyOnTurnStart(true);
assertFalse(card1.equals(card1_cloned));
assertFalse(card1_cloned.equals(card1));
card1_cloned = (Minion)card1.deepCopy();
assertTrue(card1.equals(card1_cloned));
assertTrue(card1_cloned.equals(card1));
}
@Test
public void test1() throws HSException {
NorthshireCleric fb = new NorthshireCleric();
currentPlayer.placeCardHand(fb);
Card theCard = currentPlayer.getHand().get(0);
HearthTreeNode ret = theCard.useOn(PlayerSide.CURRENT_PLAYER, CharacterIndex.HERO, board);
assertFalse(ret == null);
assertEquals(currentPlayer.getHand().size(), 0);
assertEquals(currentPlayer.getNumMinions(), 3);
assertEquals(waitingPlayer.getNumMinions(), 2);
assertEquals(currentPlayer.getHero().getHealth(), 30);
assertEquals(waitingPlayer.getHero().getHealth(), 30);
assertEquals(currentPlayer.getCharacter(CharacterIndex.MINION_1).getHealth(), 3);
assertEquals(currentPlayer.getCharacter(CharacterIndex.MINION_2).getHealth(), health0);
assertEquals(currentPlayer.getCharacter(CharacterIndex.MINION_3).getHealth(), health1 - 1);
assertEquals(waitingPlayer.getCharacter(CharacterIndex.MINION_1).getHealth(), health0);
assertEquals(waitingPlayer.getCharacter(CharacterIndex.MINION_2).getHealth(), health1 - 1);
AncestralHealing ah = new AncestralHealing();
currentPlayer.placeCardHand(ah);
theCard = currentPlayer.getHand().get(0);
ret = theCard.useOn(PlayerSide.CURRENT_PLAYER, CharacterIndex.MINION_1, board);
assertFalse(ret == null);
assertEquals(currentPlayer.getHand().size(), 0);
assertEquals(currentPlayer.getNumMinions(), 3);
assertEquals(waitingPlayer.getNumMinions(), 2);
assertEquals(currentPlayer.getHero().getHealth(), 30);
assertEquals(waitingPlayer.getHero().getHealth(), 30);
assertEquals(currentPlayer.getCharacter(CharacterIndex.MINION_1).getHealth(), 3);
assertEquals(currentPlayer.getCharacter(CharacterIndex.MINION_2).getHealth(), health0);
assertEquals(currentPlayer.getCharacter(CharacterIndex.MINION_3).getHealth(), health1 - 1);
assertEquals(waitingPlayer.getCharacter(CharacterIndex.MINION_1).getHealth(), health0);
assertEquals(waitingPlayer.getCharacter(CharacterIndex.MINION_2).getHealth(), health1 - 1);
ah = new AncestralHealing();
currentPlayer.placeCardHand(ah);
theCard = currentPlayer.getHand().get(0);
ret = theCard.useOn(PlayerSide.CURRENT_PLAYER, CharacterIndex.MINION_3, board);
assertFalse(ret == null);
assertEquals(currentPlayer.getHand().size(), 0);
assertTrue(ret instanceof CardDrawNode);
assertEquals( ((CardDrawNode)ret).getNumCardsToDraw(), 1); //Northshire Cleric should have drawn a card, so 1 card now
assertEquals(currentPlayer.getNumMinions(), 3);
assertEquals(waitingPlayer.getNumMinions(), 2);
assertEquals(currentPlayer.getHero().getHealth(), 30);
assertEquals(waitingPlayer.getHero().getHealth(), 30);
assertEquals(currentPlayer.getCharacter(CharacterIndex.MINION_1).getHealth(), 3);
assertEquals(currentPlayer.getCharacter(CharacterIndex.MINION_2).getHealth(), health0);
assertEquals(currentPlayer.getCharacter(CharacterIndex.MINION_3).getHealth(), health1);
assertEquals(waitingPlayer.getCharacter(CharacterIndex.MINION_1).getHealth(), health0);
assertEquals(waitingPlayer.getCharacter(CharacterIndex.MINION_2).getHealth(), health1 - 1);
}
@Test
public void test2() throws HSException {
NorthshireCleric fb1 = new NorthshireCleric();
NorthshireCleric fb2 = new NorthshireCleric();
currentPlayer.placeCardHand(fb1);
currentPlayer.placeCardHand(fb2);
Card theCard = currentPlayer.getHand().get(0);
HearthTreeNode ret;
theCard.useOn(PlayerSide.CURRENT_PLAYER, CharacterIndex.MINION_2, board);
theCard = currentPlayer.getHand().get(0);
ret = theCard.useOn(PlayerSide.CURRENT_PLAYER, CharacterIndex.MINION_3, board);
assertFalse(ret == null);
assertEquals(currentPlayer.getHand().size(), 0);
assertEquals(currentPlayer.getNumMinions(), 4);
assertEquals(waitingPlayer.getNumMinions(), 2);
assertEquals(currentPlayer.getHero().getHealth(), 30);
assertEquals(waitingPlayer.getHero().getHealth(), 30);
assertEquals(currentPlayer.getCharacter(CharacterIndex.MINION_1).getHealth(), health0);
assertEquals(currentPlayer.getCharacter(CharacterIndex.MINION_2).getHealth(), health1 - 1);
assertEquals(currentPlayer.getCharacter(CharacterIndex.MINION_3).getHealth(), 3);
assertEquals(currentPlayer.getCharacter(CharacterIndex.MINION_4).getHealth(), 3);
assertEquals(waitingPlayer.getCharacter(CharacterIndex.MINION_1).getHealth(), health0);
assertEquals(waitingPlayer.getCharacter(CharacterIndex.MINION_2).getHealth(), health1 - 1);
AncestralHealing ah = new AncestralHealing();
currentPlayer.placeCardHand(ah);
theCard = currentPlayer.getHand().get(0);
ret = theCard.useOn(PlayerSide.CURRENT_PLAYER, CharacterIndex.MINION_2, board);
assertFalse(ret == null);
assertEquals(currentPlayer.getHand().size(), 0);
assertTrue(ret instanceof CardDrawNode);
assertEquals( ((CardDrawNode)ret).getNumCardsToDraw(), 2); //Two clerics, one heal means 2 new cards
assertEquals(currentPlayer.getNumMinions(), 4);
assertEquals(waitingPlayer.getNumMinions(), 2);
assertEquals(currentPlayer.getHero().getHealth(), 30);
assertEquals(waitingPlayer.getHero().getHealth(), 30);
assertEquals(currentPlayer.getCharacter(CharacterIndex.MINION_1).getHealth(), health0);
assertEquals(currentPlayer.getCharacter(CharacterIndex.MINION_2).getHealth(), health1);
assertEquals(currentPlayer.getCharacter(CharacterIndex.MINION_3).getHealth(), 3);
assertEquals(currentPlayer.getCharacter(CharacterIndex.MINION_4).getHealth(), 3);
assertEquals(waitingPlayer.getCharacter(CharacterIndex.MINION_1).getHealth(), health0);
assertEquals(waitingPlayer.getCharacter(CharacterIndex.MINION_2).getHealth(), health1 - 1);
}
}