/**
 * Test class for CustomizedHangman
 * Focus: module testing, practice JUnit
 */

package examples.junit;

import sut.CustomizedHangman;

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

import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;


public class CustomizedHangmanTest 
{
   private CustomizedHangman hangman, hangman1, hangman2;
   
   @BeforeEach
   public void setUp()
   {
      hangman = null;
      hangman1 = null;
      hangman2 = null;
   }
	
   @AfterEach
   public void tearDown()
   {
      hangman = null;       // redundant in this example
   }
   
   @Test
   public void testCreateCustomizedHangman()     // test constructor
   {
      hangman = new CustomizedHangman("Moon Star");
      assertEquals("Moon Star", hangman.getName());
      assertEquals(5, hangman.getSticksRemaining());
   }
   
   @Test
   public void testCreateOctopusCustomizedHangman()   // test constructor with given sticks
   {
      hangman = new CustomizedHangman("Octopus Sun", 8);
      assertEquals("Octopus Sun", hangman.getName());
      assertEquals(8, hangman.getSticksRemaining());     
   }
   
   @Test 
   public void testSetName()
   {
      hangman = new CustomizedHangman("McDonald Arby");
      assertEquals("McDonald Arby", hangman.getName());
      hangman.setName("Arby McDonald");
      assertEquals("Arby McDonald", hangman.getName());
   }

   @Test
   public void testlostStick()
   {
      hangman = new CustomizedHangman("McDonald Arby");
      assertEquals(5, hangman.getSticksRemaining());
      hangman.lostStick();
      assertEquals(4, hangman.getSticksRemaining());
   }

   @Test
   public void testlostStick_2()   // to detect fault in lostStick()
   {
	  int num = 6;      // number of sticks
      hangman = new CustomizedHangman("McDonald Arby", num);
      for (int i=num; i>0; i--)
      { 
         hangman.lostStick();
         System.out.println(i + " " + hangman.getSticksRemaining());
         assertEquals(i-1, hangman.getSticksRemaining());         
      }
      // check if allow to lost stick when there is no more stick
      hangman.lostStick();
      assertEquals(0, hangman.getSticksRemaining());
   }
     
   @Test
   public void testIsDead()
   {
      hangman = new CustomizedHangman("McDonald Arby");
      assertFalse(hangman.isDead());
      hangman.lostStick();             // stick #1
      assertFalse(hangman.isDead());
      hangman.lostStick();             // stick #2
      assertFalse(hangman.isDead());
      hangman.lostStick();             // stick #3
      assertFalse(hangman.isDead());
      hangman.lostStick();             // stick #4
      assertFalse(hangman.isDead());
      hangman.lostStick();             // stick #5   -- oh no!!
      assertTrue(hangman.isDead());     
   }
   
   @Test
   public void testIsDead_2()
   {
      hangman = new CustomizedHangman("McDonald Arby", 8);
      assertFalse(hangman.isDead());
      for (int i=0; i<8; i++)
      {              
         assertFalse(hangman.isDead());
         hangman.lostStick();       
      }
      assertTrue(hangman.isDead());     
   }
   
  

}
