package com.oreilly.jent.people;

/**
 * In general, you may use the code in this book in your programs and 
 * documentation. You do not need to contact us for permission unless 
 * you're reproducing a significant portion of the code. For example, 
 * writing a program that uses several chunks of code from this book does 
 * not require permission. Selling or distributing a CD-ROM of examples 
 * from O'Reilly books does require permission. Answering a question by 
 * citing this book and quoting example code does not require permission. 
 * Incorporating a significant amount of example code from this book into 
 * your product's documentation does require permission.
 * 
 * We appreciate, but do not require, attribution. An attribution usually 
 * includes the title, author, publisher, and ISBN. For example: 
 * 
 *   "Java Enterprise in a Nutshell, Third Edition, 
 *    by Jim Farley and William Crawford 
 *    with Prakash Malani, John G. Norman, and Justin Gehtland. 
 *    Copyright 2006 O'Reilly Media, Inc., 0-596-10142-2."
 *  
 *  If you feel your use of code examples falls outside fair use or the 
 *  permission given above, feel free to contact us at 
 *  permissions@oreilly.com.
 */

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import junit.textui.TestRunner;

public class TestPerson extends TestCase {
    private Person mPerson = null;

    /**
     * Default constructor.
     */
    public TestPerson() {
        super();
    }

    /**
     * @param name Name to be used for this test case.
     */
    public TestPerson(String name) {
        super(name);
    }

    /** Set up the test fixture before each test */
    protected void setUp() {
        mPerson = new Person();
        mPerson.setFirstName("John");
        mPerson.setLastName("Smith");
    }
    
    /** Clean up the test fixture after each test */
    protected void tearDown() {
        mPerson = null;
    }
    
    /** Test the name accessors */
    public void testSetName() {
        String fName = "Jane";
        String lName = "Doe";
        mPerson.setFirstName(fName);
        mPerson.setLastName(lName);
        assertNotNull(mPerson.getFirstName());
        assertTrue(mPerson.getFirstName().equals(fName));
        assertNotNull(mPerson.getLastName());
        assertTrue(mPerson.getLastName().equals(lName));
        // fail("Something bad happened");
    }
    
    /** Test the addition of email addresses */
    public void testAddEmail() {
        String addr = "jsmith@anywhere.com";
        mPerson.addEmailAddress(addr);
        // There should only be a single email address on the person
        assertEquals(mPerson.getEmailAddresses().length, 1);
        // The email address should be the value we just added
        String addrR = (String)mPerson.getEmailAddresses()[0];
        assertNotNull(addrR);
        assertEquals(addr, addrR);
    }
    
    /** Test the equals() method on Person */
    public void testEquals() {
        try {
            // The equals implementation on Person should
            // always return true when a Person is compared
            // to itself
            assertTrue(mPerson.equals(mPerson));
        }
        catch (Exception e) {
            // Fail if the equals method generates any exceptions
            fail("Unexpected exception: " + e.getMessage());
        }
    }
    
    static public Test suite() {
        TestSuite suite = new TestSuite();
        suite.addTest(new TestPerson("testSetName"));
        suite.addTest(new TestPerson("testAddEmail"));
        return suite;
    }
    
    static public void main(String[] args) {
        TestRunner runner = new TestRunner();
        runner.doRun(suite());
    }
}
