# testlab.py
# Steve Marschner (SRM2) and Lillian Lee (LJL2)
# Feb 25, 2013
""" Test cases for iterative.py"""

from cunittest2 import *
from iterative import *

def test_numberof():
    mylist = [5, 3, 3455, 74, 74, 74, 3]
    assert_equals(3, numberof(mylist,74))
    assert_equals(2, numberof(mylist,3))
    assert_equals(0, numberof(mylist,4))
    assert_equals(1, numberof([4],4))
    assert_equals(0, numberof([],4))

def test_replace():
    assert_equals([4], replace([5],5,4))
    assert_equals([], replace([], 1, 2))
    mylist = [5, 3, 3455, 74, 74, 74, 3]
    assert_equals([5, 20, 3455, 74, 74, 74, 20], replace(mylist,3, 20))
    assert_equals([5, 3, 3455, 74, 74, 74, 3], replace(mylist, 1, 3))
    
def test_remove_dups():
    assert_equals([], remove_dups([]))
    assert_equals([3], remove_dups([3,3]))
    assert_equals([4], remove_dups([4]))
    assert_equals([5], remove_dups([5, 5]))
    assert_equals([1,2,3,4,5,1], remove_dups([1,2,2,3,3,3,4,5,1,1,1]))
    
    # test for whether the code is really returning a copy of the original list
    mylist = [3]
    assert_equals(False, mylist is remove_dups(mylist))
 
def test_remove_dups2():
    assert_equals([], remove_dups2([], 5))
    assert_equals([3], remove_dups2([3,3], 2))
    assert_equals([4], remove_dups2([4], 5))
    assert_equals([5], remove_dups2([5, 5]))
    assert_equals([], remove_dups2([5, 5], 0))
    assert_equals([1,2,3,4], remove_dups2([1,2,2,3,3,3,4,5,1,1,1], 4))
    
    # test for whether the code is really returning a copy of the original list
    mylist = [3]
    assert_equals(False, mylist is remove_dups(mylist))
 
def test_remove_first():
    assert_equals([],remove_first([],3))
    assert_equals([],remove_first([3],3))
    assert_equals([3],remove_first([3],4))
    assert_equals([3, 4, 4, 5],remove_first([3, 4, 4, 4, 5],4))
    assert_equals([3, 5, 4, 4, 4],remove_first([3, 4, 5, 4, 4, 4],4))
 
def test_into():
    assert_equals(0, into(5,3))
    assert_equals(1, into(6, 3))
    assert_equals(4, into(3*3*3*3*7,3))
    
def test_num_digits():
    assert_equals(1, num_digits(0))
    assert_equals(1, num_digits(3))
    assert_equals(2, num_digits(34))
    assert_equals(4, num_digits(1356))
    
def test_sum_digits():
    assert_equals(0, sum_digits(0))
    assert_equals(3, sum_digits(3))
    assert_equals(7, sum_digits(34))
    assert_equals(12, sum_digits(345))
    
def test_reverse1():
    assert_equals([], reverse1([]))
    assert_equals([3], reverse1([3]))
    assert_equals([1,2,3], reverse1([3,2,1]))
    mylist = [3]
    assert_equals(False, mylist is reverse1(mylist))
 
def test_reverse2():
    assert_equals([], reverse2([]))
    assert_equals([3], reverse2([3]))
    assert_equals([1,2,3], reverse2([3,2,1]))
    mylist = [3]
    assert_equals(False, mylist is reverse2(mylist))
 
def test_sum_list():
    assert_equals(0, sum_list([]))
    assert_equals(34, sum_list([34]))
    assert_equals(46, sum_list([7,34,1,2,2]))
    
def test_sum_to():
    assert_equals(1, sum_to(1))
    assert_equals(6, sum_to(3))
    assert_equals(15, sum_to(5))
    
def test_number_not():
    mylist = [5, 3, 3455, 74, 74, 74, 3]
    assert_equals(4, number_not(mylist,74))
    assert_equals(5, number_not(mylist,3))
    assert_equals(7, number_not(mylist,4))
    assert_equals(1, number_not([3],4))
    assert_equals(0, number_not([],4))
    
def test_number2():
    assert_equals(0, number2(0))
    assert_equals(1, number2(2))
    assert_equals(3, number2(234252))
    
def test_exp():
    assert_equals(1, exp(3, 0))
    assert_equals(9, exp(3, 2))
    assert_equals(32, exp(2,5))
    
    
# Application Code
if __name__ == "__main__":
    test_numberof()
    test_replace()
    test_remove_dups()
    test_remove_dups2()
    test_remove_first()
    test_into()
    test_num_digits()
    test_sum_digits()
    test_reverse1()
    test_reverse2()
    test_sum_list()
    test_sum_to()
    test_number_not()
    test_number2()
    test_exp()
    print "Module iterative.py is working correctly"