from linked_list import *
from sorted_list import *
import nose

def test_empty():
    '''Test creating an empty list.'''
    L = LinkedList()
    assert L.head == None
    assert L.length() == 0
    
def test_one():
    '''Test a list with one item.'''
    L = LinkedList()
    L.add(3)
    assert L.head.data == 3
    assert L.length() == 1
    
def test_one_delete():
    '''Test deleting from a list with one item.'''
    L = LinkedList()
    L.add(3)
    L.remove(3)
    assert L.head == None
    assert L.length() == 0
    
def test_several():
    '''Test a list with several items.'''
    L = LinkedList()
    L.add(3)
    L.add(4)
    L.add(5)
    assert L.head.data == 5
    assert L.head.next.data == 4
    assert L.head.next.next.data == 3
    assert L.length() == 3
    
def test_empty_sorted():
    '''Test creating an empty list.'''
    L = LinkedList()
    assert L.head == None
    assert L.length() == 0

def test_one_sorted():
    '''Test a sorted list with one item.'''
    L = SortedList()
    L.add(3)
    assert L.head.data == 3
    assert L.length() == 1

def test_one_delete():
    '''Test deleting from a sorted list with one item.'''
    L = SortedList()
    L.add(3)
    L.remove(3)
    assert L.head == None
    assert L.length() == 0

def test_several_sorted_forward_insert():
    '''Test a sorted list with several items inserted in order.'''
    L = SortedList()
    L.add(3)
    L.add(4)
    L.add(5)
    assert L.head.data == 3
    assert L.head.next.data == 4
    assert L.head.next.next.data == 5
    assert L.length() == 3


def test_several_sorted_delete_first():
    '''Test deleting the first item from a sorted list with several items.'''
    L = SortedList()
    L.add(3)
    L.add(4)
    L.add(5)
    L.remove(3)
    assert L.head.data == 4
    assert L.head.next.data == 5
    assert L.length() == 2


def test_several_sorted_delete_middle():
    '''Test deleting a middle item from a sorted list with several items.'''
    L = SortedList()
    L.add(3)
    L.add(4)
    L.add(5)
    L.remove(4)
    assert L.head.data == 3
    assert L.head.next.data == 5
    assert L.length() == 2

def test_several_sorted_delete_last():
    '''Test deleting the last item from a sorted list with several items.'''
    L = SortedList()
    L.add(3)
    L.add(4)
    L.add(5)
    L.remove(5)
    assert L.head.data == 3
    assert L.head.next.data == 4
    assert L.length() == 2

def test_several_sorted_reverse_insert():
    '''Test a sorted list with several items inserted in reverse order.'''
    L = SortedList()
    L.add(5)
    L.add(4)
    L.add(3)
    assert L.head.data == 3
    assert L.head.next.data == 4
    assert L.head.next.next.data == 5
    assert L.length() == 3

nose.runmodule()