Please send questions to st10@humboldt.edu .
/* Cs132LinkedListTest.java 1.2                      */
/* by Sharon Tuttle                                  */
/* last modified: 3-7-03                             */
/*                includes tests for new HW #4       */
/*                methods (and those from interface  */
/*                Cs132List)                         */

public class Cs132LinkedListTest extends JPFalt 
{
    public static void main(String[] args) 
    { 
            new Cs132LinkedListTest(); 
    }
    
    /** Test suite for the class Cs132LinkedList */
        
    /*--------------------------------------------------------------------
     Define a Cs132LinkedList object and print the member data values,
     and test accessor and modifier methods 
    --------------------------------------------------------------------*/
    void TestCs132LinkedList()
    {
        println("\nDefine Cs132LinkedList object, print member data values");

        Cs132LinkedList myList = new Cs132LinkedList();
        println("new, empty linked list:");
        println(myList);
        if (myList.getHead() != null)
        {
            println(myList.getHead());
        }
        else
        {
            println("head of linked list is null...");
        }
        println("");
        
        String stringToAdd = new String("First List Element");
        myList.addFirst(stringToAdd);
        println("linked list with 1 element:");
        println(myList);
        println(myList.getHead());
        println("");
       
        Integer intToAdd = new Integer(13);
        myList.addFirst(intToAdd);
        println("linked list with 2 elements:");
        println(myList);  
        println(myList.getHead());
        println("");    
    }
    
    /*---------------------------------------------------------------
     Test method for isEmpty()
    -----------------------------------------------------------------*/
    void isEmptyTest()
    {
        Cs132LinkedList myList = new Cs132LinkedList();

        testHeader("isEmpty");
        
        expected(true);
        actual(myList.isEmpty());
        
        String myEntry = new String("Hello");
        myList.addFirst(myEntry);

        expected(false);
        actual(myList.isEmpty());
    }
    
    /*---------------------------------------------------------------
     Test method for size()
    -----------------------------------------------------------------*/
    void sizeTest()
    {
        Cs132LinkedList myList = new Cs132LinkedList();

        testHeader("size");
        
        expected(0);
        actual(myList.size());
        
        String myEntry = new String("Hello");
        myList.addFirst(myEntry);

        expected(1);
        actual(myList.size());
        
        String myEntry2 = new String("Bonjour");
        myList.addFirst(myEntry2);
        
        expected(2);
        actual(myList.size());
    }
    
    /*---------------------------------------------------------------
     Test method for addFirst()
    -----------------------------------------------------------------*/
    void addFirstTest()
    {
        Cs132LinkedList myList = new Cs132LinkedList();

        testHeader("addFirst");
                
        expected("list is currently empty:");
        actual(myList);
                
        String myEntry = new String("Hello");
        myList.addFirst(myEntry);

        expected("list contains Hello only");
        actual(myList);
        
        String myEntry2 = new String("Bonjour");
        myList.addFirst(myEntry2);
        
        expected("Bonjour should come BEFORE Hello");
        actual(myList);
        
        Integer myEntry3 = new Integer(13);
        myList.addFirst(myEntry3);
        
        expected("13 should come BEFORE Bonjour and Hello");
        actual(myList);
    }
    
    /*---------------------------------------------------------------
     Test method for addLast()
    -----------------------------------------------------------------*/
    void addLastTest()
    {
        Cs132LinkedList myList = new Cs132LinkedList();

        testHeader("addLast");
        
        expected("list is currently empty:");
        actual(myList);
                
        String myEntry = new String("Hello");
        myList.addLast(myEntry);

        expected("list contains Hello only");
        actual(myList);
        
        String myEntry2 = new String("Bonjour");
        myList.addLast(myEntry2);
        
        expected("Bonjour should come AFTER Hello");
        actual(myList);
        
        Integer myEntry3 = new Integer(13);
        myList.addLast(myEntry3);
        
        expected("13 should come AFTER Hello and Bonjour");
        actual(myList);
    }
    
    /*---------------------------------------------------------------
     Test method for add()
    -----------------------------------------------------------------*/
    void addTest()
    {
        Cs132LinkedList myList = new Cs132LinkedList();

        testHeader("add");
        
        expected("list is currently empty:");
        actual(myList);
                
        String myEntry = new String("Hello");
        try
        {
            myList.add(0, myEntry);
        }
        catch(Exception ex) {}
        
        expected("list contains Hello only");
        actual(myList);
        
        // add to beginning
        String myEntry2 = new String("Bonjour");
        try
        {
            myList.add(0, myEntry2);
        }
        catch(Exception ex) {}
        
        expected("Bonjour should come BEFORE Hello");
        actual(myList);
        
        // add to end
        Integer myEntry3 = new Integer(13);
        try
        {
            myList.add(2, myEntry3);
        }
        catch(Exception ex) {}
        
        expected("13 should come AFTER Bonjour and Hello");
        actual(myList);
        
        // add to middle
        Double myEntry4 = new Double(13.13);
        try
        {
            myList.add(1, myEntry4);
        }
        catch(Exception ex) {}
        
        expected("13.13 should come AFTER Bonjour, BEFORE Hello and 13");
        actual(myList);
    }
    
    /*---------------------------------------------------------------
     Test method for getFirst()
    -----------------------------------------------------------------*/
    void getFirstTest()
    {
        Cs132LinkedList myList = new Cs132LinkedList();
        Object gottenObj;

        testHeader("getFirst");
        
        // what if try to getFirst() from an empty list?
        expected("ListEmptyException to be thrown");
        try
        {
            myList.getFirst();
        }
        catch(ListEmptyException ex)
        {
            actual("Exception thrown: " + ex);
        }
        catch(Exception ex)
        {
            actual("TEST FAILED --- exception thrown was: " + ex);
        }
                
        myList.addLast("First");
        expected("First");
        try
        {
            actual(myList.getFirst());
        }
        catch(Exception ex) {}
        
        myList.addLast("Second");
        myList.addLast("Third");

        expected("First");
        try
        {
            actual(myList.getFirst());
        }
        catch(Exception ex) {}
    }
    
    /*---------------------------------------------------------------
     Test method for getLast()
    -----------------------------------------------------------------*/
    void getLastTest()
    {
        Cs132LinkedList myList = new Cs132LinkedList();
        Object gottenObj;

        testHeader("getLast");
        
        // what if try to getLast() from an empty list?
        expected("ListEmptyException to be thrown");
        try
        {
            gottenObj = myList.getLast();
        }
        catch(ListEmptyException ex)
        {
            actual("Exception thrown: " + ex);
        }
        catch(Exception ex)
        {
            actual("TEST FAILED --- exception thrown was: " + ex);
        }
                
        myList.addLast("First");
        expected("First");
        try
        {
            actual(myList.getLast());
        }
        catch (Exception ex) {}
        
        myList.addLast("Second");
        myList.addLast("Third");
        expected("Third");
        try
        {
            actual(myList.getLast());
        }
        catch (Exception ex) {}
    }
    
    /*---------------------------------------------------------------
     Test method for get()
    -----------------------------------------------------------------*/
    void getTest()
    {
        Cs132LinkedList myList = new Cs132LinkedList();
        Object gottenObj;

        testHeader("get");
        
        // what if try to get() from an empty list?
        expected("ListEmptyException to be thrown");
        try
        {
            gottenObj = myList.get(0);
        }
        catch(ListEmptyException ex)
        {
            actual("Exception thrown: " + ex);
        }
        catch(Exception ex)
        {
            actual("TEST FAILED --- exception thrown was: " + ex);
        }
                        
        try
        {
            myList.add(0, "Hello");
            myList.add(1, "Bonjour");
            myList.add(2, new Integer(13));
        }
        catch(Exception ex) {}

        try
        {
            expected("Hello");
            actual(myList.get(0));
        
            expected("Bonjour");
            actual(myList.get(1));
        
            expected("13");
            actual(myList.get(2));
        }
        catch (Exception ex) {}
        
        expected("ListIndexOutOfBounds to be thrown");
        try
        {
            gottenObj = myList.get(-1);
        }
        catch(ListIndexOutOfBoundsException ex)
        {
            actual("Exception thrown: " + ex);
        }
        catch(Exception ex)
        {
            actual("TEST FAILED --- exception thrown was: " + ex);
        }
        
        expected("ListIndexOutOfBoundsException to be thrown");
        try
        {
            gottenObj = myList.get(3);
        }
        catch(ListIndexOutOfBoundsException ex)
        {
            actual("Exception thrown: " + ex);
        }
        catch(Exception ex)
        {
            actual("TEST FAILED --- exception thrown was: " + ex);
        }
    }
    
    /*---------------------------------------------------------------
     Test method for remove()
    -----------------------------------------------------------------*/
    void removeTest()
    {
        Cs132LinkedList myList = new Cs132LinkedList();
        Object gottenObj;

        testHeader("remove");
        
        // what if try to remove() from an empty list?
        expected("ListEmptyException to be thrown");
        try
        {
            gottenObj = myList.remove(0);
        }
        catch(ListEmptyException ex)
        {
            actual("Exception thrown: " + ex);
        }
        catch(Exception ex)
        {
            actual("TEST FAILED --- exception thrown was: " + ex);
        }
                    
        try
        {
            myList.add(0, "Hello");
            myList.add(1, "Bonjour");
            myList.add(2, new Integer(13));
            myList.add(3, new Double(13.13));
        }
        catch (Exception ex) {}
        
        println("List contains: " + myList);
        try
        {
            expected("Hello removed");
            actual(myList.remove(0));
            expected("List now contains Bonjour, 13, 13.13");
            actual(myList);
        
            expected(13);
            actual(myList.remove(1));
            expected("List now contains Bonjour, 13.13");
            actual(myList);
        
            expected(13.13);
            actual(myList.remove(1));
            expected("List now contains Bonjour");
            actual(myList);
        
            expected("Bonjour");
            actual(myList.remove(0));
            expected("List is now empty");
            actual(myList);
        }
        catch (Exception ex) {}
        
        try
        {
            myList.add(0, new Integer(45));
            myList.add(1, new Integer(48));
        }
        catch (Exception ex) {}
        
        expected("ListIndexOutOfBounds to be thrown");
        try
        {
            gottenObj = myList.remove(-1);
        }
        catch(ListIndexOutOfBoundsException ex)
        {
            actual("Exception thrown: " + ex);
            expected("List is still 45, 48");
            actual(myList);
        }
        catch(Exception ex)
        {
            actual("TEST FAILED --- exception thrown was: " + ex);
        }
        
        expected("ListIndexOutOfBoundsException to be thrown");
        try
        {
            gottenObj = myList.remove(2);
        }
        catch(ListIndexOutOfBoundsException ex)
        {
            actual("Exception thrown: " + ex);
            expected("List is still 45, 48");
            actual(myList);
        }
        catch(Exception ex)
        {
            actual("TEST FAILED --- exception thrown was: " + ex);
        }    
    }
    
    /*---------------------------------------------------------------
     Test method for clear()
    -----------------------------------------------------------------*/
    void clearTest()
    {
        Cs132LinkedList myList = new Cs132LinkedList();

        testHeader("clear");
        
        // what if list is empty?
        myList.clear();
        
        expected("list should be empty");
        actual(myList);
                
        try
        {
            myList.addLast("Hello");
            myList.addLast("Bonjour");
            myList.addLast(new Integer(13));
        }
        catch (Exception ex) {}
        
        expected("list has 3 elements");
        actual(myList);
        
        myList.clear();
        
        expected("list should be empty");
        actual(myList);
        
        myList.addLast("George");
        myList.addLast(new Integer(27));
        
        expected("list has 2 elements");
        actual(myList);
    }
}