import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;

public class BlackjackCardTester
{
    @Test
    public void testConstants()
    {
        assertEquals(1, BlackjackCard.ACE_VALUE);
        assertEquals(11, BlackjackCard.JACK_VALUE);
        assertEquals(12, BlackjackCard.QUEEN_VALUE);
        assertEquals(13, BlackjackCard.KING_VALUE);
    }
    
    @Test
    public void testValueMethods()
    {
        BlackjackCard card = new BlackjackCard(BlackjackCard.ACE_VALUE, "H");
        assertEquals(BlackjackCard.ACE_VALUE, card.getValue());
        assertEquals(1, card.getNumericalValue());
        
        for(int pipValue = 2; pipValue <= 10; pipValue++)
        {
            card = new BlackjackCard(pipValue, "C");
            assertEquals(pipValue, card.getValue());
            assertEquals(pipValue, card.getNumericalValue());
        }
        
        card = new BlackjackCard(BlackjackCard.JACK_VALUE, "D");
        assertEquals(BlackjackCard.JACK_VALUE, card.getValue());
        assertEquals(10, card.getNumericalValue());
        
        card = new BlackjackCard(BlackjackCard.QUEEN_VALUE, "D");
        assertEquals(BlackjackCard.QUEEN_VALUE, card.getValue());
        assertEquals(10, card.getNumericalValue());
        
        card = new BlackjackCard(BlackjackCard.KING_VALUE, "D");
        assertEquals(BlackjackCard.KING_VALUE, card.getValue());
        assertEquals(10, card.getNumericalValue());
    }
    
    @Test
    public void testIsAce()
    {
        BlackjackCard card = new BlackjackCard(BlackjackCard.ACE_VALUE, "H");
        assertTrue(card.isAce());
        
        for(int pipValue = 2; pipValue <= 10; pipValue++)
        {
            card = new BlackjackCard(pipValue, "C");
            assertTrue( ! card.isAce() );
        }
        
        card = new BlackjackCard(BlackjackCard.JACK_VALUE, "D");
        assertTrue( ! card.isAce() );
        
        card = new BlackjackCard(BlackjackCard.QUEEN_VALUE, "D");
        assertTrue( ! card.isAce() );
        
        card = new BlackjackCard(BlackjackCard.KING_VALUE, "D");
        assertTrue( ! card.isAce() );
    }
    
    @Test
    public void testToStringWithExamplesFromDocumentation()
    {
        // JD, 10H, AS, 9C
        
        BlackjackCard c = new BlackjackCard(BlackjackCard.JACK_VALUE, "D");
        assertEquals("JD", c.toString());

        //toString should not be a mutator
        assertEquals(BlackjackCard.JACK_VALUE, c.getValue());
        
        c = new BlackjackCard(10, "H");
        assertEquals("10H", c.toString());
        assertEquals(10, c.getValue());
        
        c = new BlackjackCard(BlackjackCard.ACE_VALUE, "S");
        assertEquals("AS", c.toString());
        assertEquals(BlackjackCard.ACE_VALUE, c.getValue());
        
        c = new BlackjackCard(9, "C");
        assertEquals("9C", c.toString());
        assertEquals(9, c.getValue());
    }
    
    @Test
    public void testToStringWithOtherExamples()
    {
        BlackjackCard c = new BlackjackCard(BlackjackCard.ACE_VALUE, "H");
        assertEquals("AH", c.toString());
        
        c = new BlackjackCard(2, "C");
        assertEquals("2C", c.toString());
        
        c = new BlackjackCard(5, "S");
        assertEquals("5S", c.toString());
        
        c = new BlackjackCard(7, "D");
        assertEquals("7D", c.toString());
        
        c = new BlackjackCard(10, "C");
        assertEquals("10C", c.toString());
        
        c = new BlackjackCard(BlackjackCard.QUEEN_VALUE, "H");
        assertEquals("QH", c.toString());
        assertEquals(BlackjackCard.QUEEN_VALUE, c.getValue());
        
        c = new BlackjackCard(BlackjackCard.KING_VALUE, "S");
        assertEquals("KS", c.toString());
        assertEquals(BlackjackCard.KING_VALUE, c.getValue());
    }
}
