import junit.framework.TestCase;


/**
 * An instance houses testcases for class Worker.
 */
public class WorkerTester extends TestCase {
         
    /**
     * Test getters and constructor
     */
    public void testGettersAndConstructor() {
        
        int n=  Worker.getNumberOfWorkers();
        
        // Test if null boss if OK
        Worker w1= new Worker("Obama", 123456789, null);
        assertEquals("Obama", w1.getName());
        assertEquals(6789,w1.getSSN4());
        assertEquals(null, w1.getBoss());
        assertEquals(n+1, Worker.getNumberOfWorkers());
        
        // Test if non-null boss is OK
        Worker w2= new Worker("Biden", 2, w1);
        assertEquals("Biden", w2.getName());
        assertEquals(2, w2.getSSN4());
        assertEquals(w1, w2.getBoss());
        assertEquals(n+2, Worker.getNumberOfWorkers());
        
        // Test if "" last name is OK
        Worker justOneName= new Worker("", 13, w1);
        assertEquals(13, justOneName.getSSN4());
        assertEquals(w1, justOneName.getBoss());
        assertEquals(n+3, Worker.getNumberOfWorkers());
    }
        
    /** test setters */
    public void testSetters() {
    	 Worker w1= new Worker("Obama", 123456789, null);	
    	 w1.setName("Obama II");
    	 assertEquals("Obama II", w1.getName());
    	 w1.setName("");
    	 assertEquals("", w1.getName());
    	
    	 Worker w2= new Worker("Biden", 2, w1);
    	 w2.setBoss(w2); // can you set boss to yourself?
    	 assertEquals(w2, w2.getBoss());
    	 w2.setBoss(null);
    	 assertEquals(null, w2.getBoss());
    	 
    	 Worker justOneName= new Worker("", 13, null);
    	 w2.setBoss(justOneName);
    	 assertEquals(justOneName, w2.getBoss());
    }
    
    /**
     * Test toString method
     */
    public void testToString() {
        
        Worker w1= new Worker("Obama", 123456789, null);
        assertEquals("Obama, XXX-XX-6789, boss null", w1.toString());
        
        // test non-null boss case, leading zeros stripped in soc. sec. num
        Worker w2= new Worker("Biden", 2, w1);
        assertEquals("Biden, XXX-XX-2, boss Obama", w2.toString());
        
        // test "" last name
        Worker justOneName= new Worker("", 13, null);
        assertEquals(", XXX-XX-13, boss null",justOneName.toString());
    }
    
   
    public void testClashingSSNs() {

        Worker w1= new Worker("Obama", 123456789, null);
        Worker w2= new Worker("Biden", 2, w1);
        Worker w3= new Worker("Smith", 6789, w1);
        
        assertEquals(true, Worker.clashingSSNs(w1,w1));
        assertEquals(false, Worker.clashingSSNs(w1,w2));
        assertEquals(false, Worker.clashingSSNs(w2,w1));
        assertEquals(true, Worker.clashingSSNs(w1,w3));
        assertEquals(true, Worker.clashingSSNs(w3,w1));
        assertEquals(false, Worker.clashingSSNs(w1,null));
        assertEquals(false, Worker.clashingSSNs(null,w1));
        assertEquals(false, Worker.clashingSSNs(null,null));
        
    }
}

