package hw03;

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

class DeckTest {
	Deck deck;
	private final String[] suits = {"Hearts","Spades","Diamonds","Clubs"};
	private final String[] names = {"2","3","4","5","6","7","8","9","10","J","Q","K","A" };
	private final int[] values = { 2,3,4,5,6,7,8,9,10,11,12,13,14};
	private boolean found[][];

	@BeforeEach
	void setUp() throws Exception {
		deck = new Deck();
		found=new boolean[4][13];
	}

	@Test
	void testDeal() { 
		Player players[]=new Player[5];
		for(int i=0;i<5;i++) { players[i] = new Player("P" + i); }
		deck.deal(players);
		assertEquals(11,players[0].handSize(),"Player P0 has 11 cards");
		assertEquals(11,players[1].handSize(),"Player P1 has 11 cards");
		assertEquals(10,players[2].handSize(),"Player P2 has 10 cards");
		assertEquals(10,players[3].handSize(),"Player P3 has 10 cards");
		assertEquals(10,players[4].handSize(),"Player P4 has 10 cards");
		
		for(Player p : players) {
			while(true) {
				Card c = p.getCard();
				if (c==null) break;
				int si;
				int ci;
				for(si=0;si<4;si++) {
					if (c.getSuit().equals(suits[si])) break;
				}
				for(ci=0;ci<13;ci++) {
					if (c.getName().equals(names[ci])) break;
				}
				assertEquals(values[ci],c.getValue());
				assertFalse(found[si][ci],"Card already found " + c);
				found[si][ci]=true;
			}
		}
		for(int si=0;si<4;si++) {
			for (int ci=0;ci<13;ci++) {
				assertTrue(found[si][ci],"Card not dealt... si=" + si + ", ci=" + ci);
			}
		}
		
	}

}
