package edu.wlu.cs.sprenkle.tests;

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

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import edu.wlu.cs.sprenkle.Chicken;

/**
 * Does not test everything -- trying to give examples of different
 * types of tests
 * 
 * @author Sara Sprenkle
 *
 */
class ChickenTest {

    private final static double ERROR_TOLERANCE = .0001;
    
    private Chicken maleChicken;
    private String maleName = "Fred";
    private int maleHeight = 38;
    private int femaleHeight = 30;
    
    private Chicken femaleChicken;
    
    @BeforeEach
    void setUp() throws Exception {
	maleChicken = new Chicken(maleName, maleHeight, 2.0, false);
	femaleChicken = new Chicken("Sallie Mae", femaleHeight, 1.5);
    }
    
    @Test
    final void testConstructors() {
	assertEquals(maleHeight, maleChicken.getHeight());
	assertEquals(2.0, maleChicken.getWeight(), ERROR_TOLERANCE);
	assertFalse(maleChicken.isFemale());
	assertEquals(maleName, maleChicken.getName());
	
	assertEquals(femaleHeight, femaleChicken.getHeight());
	assertEquals(1.5, femaleChicken.getWeight(), ERROR_TOLERANCE);
	assertTrue(femaleChicken.isFemale());
	assertEquals("Sallie Mae", femaleChicken.getName());
    }

    @Test
    final void testToString() {
	String expected = "Chicken name: Fred\nweight: 2.0 pounds\nheight: 38 cm\nmale";
	assertEquals(expected, maleChicken.toString());
	
	expected = "Chicken name: Sallie Mae\nweight: 1.5 pounds\nheight: " + femaleHeight + " cm\nfemale";
	assertEquals(expected, femaleChicken.toString());
    }
    
    @Test
    final void testEqualsObject() {
	Chicken anotherMale = new Chicken(maleName, maleHeight, 2.0, false);
	
	assertFalse(maleChicken.equals(femaleChicken));
	assertFalse(femaleChicken.equals(maleChicken));
	
	assertTrue(maleChicken.equals(anotherMale));
	assertTrue(anotherMale.equals(maleChicken));	
    }
    
    @Test
    final void testGetName() {
	assertEquals("Fred", maleChicken.getName());
	assertEquals("Sallie Mae", femaleChicken.getName());
	// more tests in testSetName and testConstructor
    }
    
    @Test
    final void testFeed() {
	maleChicken.feed();
	assertEquals(2.3, maleChicken.getWeight(), ERROR_TOLERANCE); // should grow by .3 lbs
	assertEquals(maleHeight + 1, maleChicken.getHeight()); // should grow by 1 cm

	maleChicken.feed();
	assertEquals(2.6, maleChicken.getWeight(), ERROR_TOLERANCE); // should grow by .3 lbs
	assertEquals(maleHeight + 2, maleChicken.getHeight()); // should grow by an additional 1
	
	maleChicken.feed();
	assertEquals(2.9, maleChicken.getWeight(), ERROR_TOLERANCE); // should grow by .3 lbs
	assertEquals(maleHeight + 3, maleChicken.getHeight()); // should grow by an additional 1

	// feed shouldn't have changed these...
	assertEquals("Fred", maleChicken.getName());
	assertFalse(maleChicken.isFemale());

	// should test female chicken too
    }

    @Test
    final void testSetName() {
	String newName = "Mr. Fred";
	maleChicken.setName(newName);
	
	assertEquals(newName, maleChicken.getName());
    }

    @Test
    final void testSetWeight() {
	double newWeight = 3.1326;
	
	femaleChicken.setWeight(newWeight);	
	assertEquals(newWeight, femaleChicken.getWeight(), ERROR_TOLERANCE);
    }

}
