# string_recursion_test.py
# Lillian Lee (LJL2), Walker M. White (wmw2)
# Mar 5, 2014
"""Unit test for (mostly) recursive string functions."""
import cornelltest
import string_recursion


def test_num_e():
    """test num_e and num_e_2"""

    for fn in [string_recursion.num_e,
               string_recursion.num_e_2,
               string_recursion.num_e_3]:
        print '     testing ' + fn.__name__

        # use python's built-in count function to test
        for test_s in ['', 'c', 'ab', 'asdfasdfadsf',
                       'e', 'eg', 'ge', 'ceceddd']:
            cornelltest.assert_equals(test_s.count('e'),
                                      fn(test_s))
    print ' finished test of "number-of-e" functions'


def test_length():
    """test length and length2"""
    for test_s in ['', 'e', 'E', 'abc', ' b d']:
        # Use python's built-in length function to test
        cornelltest.assert_equals(len(test_s),
                                  string_recursion.length(test_s))
        cornelltest.assert_equals(len(test_s),
                                  string_recursion.length2(test_s))
    print ' finished test of length functions'


def test_deblank():
    """test deblank"""
    cornelltest.assert_equals('',  string_recursion.deblank(''))
    cornelltest.assert_equals('',  string_recursion.deblank(' '))
    cornelltest.assert_equals('B',  string_recursion.deblank('B'))
    cornelltest.assert_equals('BG', string_recursion.deblank('B G'))
    cornelltest.assert_equals('',   string_recursion.deblank('         '))
    print ' finished test of deblank'


def test_reverse():
    """test reverse"""

    for test_s in ['abc', '', 'abac']:
        test_s_list = list(test_s)
        test_s_list.reverse()
        answer = ''.join(test_s_list)

        # A "pythonic" version is:
        #    answer = test_s[::-1]
        cornelltest.assert_equals(answer, test_s[::-1])

        cornelltest.assert_equals(answer, string_recursion.reverse(test_s))
    print ' finished test of reverse'

def test_case():
    """test equals_ignore_case"""

    test_s_list = ['Abc;', 'eSD', ' b Z']
    test_s_list2 = ['aBc;', 'Esd', ' B Z']

    for i in range(len(test_s_list)):
        s1 = test_s_list[i]
        s2 = test_s_list2[i]
        cornelltest.assert_true(string_recursion.equals_ignore_case(s1, s2))
        cornelltest.assert_true(string_recursion.equals_ignore_case(s1, s1.lower()))
        cornelltest.assert_true(string_recursion.equals_ignore_case(s1, s1.upper()))

    print ' finished test of equals_ignore_case'

def test_depunct():
    """test depunct"""
    cornelltest.assert_equals('', string_recursion.depunct('(@$*&@'))
    cornelltest.assert_equals('foo', string_recursion.depunct('  f,o**o!!!'))
    cornelltest.assert_equals('foo', string_recursion.depunct('f  (!*@&,.<>:\'  oo'))
    print ' finished test of depunct'

def test_palindrome_fns():
    """test ispalindrome, ispalindrome2, ispalindrome_loosely"""

    # All functions should return the same result on these test cases, so run
    # them on the exact same test cases.
    for fn in [string_recursion.ispalindrome,
               string_recursion.ispalindrome2,
               string_recursion.ispalindrome_loosely]:
        print ' testing ' + fn.__name__

        for test_s in ['', 'B', 'BB', 'BoB',
                       'ablewasiereisawelba', 'Amanaplanacanalpanama']:
            cornelltest.assert_true(fn(test_s))

        for test_s in ['BA', 'BOA', 'BABA']:
            cornelltest.assert_true(not fn(test_s))

    test_s = 'amanaplana canalpanama' # extra space = not official palindrome
    cornelltest.assert_true(not string_recursion.ispalindrome(test_s))
    cornelltest.assert_true(not string_recursion.ispalindrome2(test_s))
    cornelltest.assert_true(string_recursion.ispalindrome_loosely(test_s))

    test_s = 'A man, a plan, a canal --Panama!'
    cornelltest.assert_true(string_recursion.ispalindrome_loosely(test_s))
    test_s = 'A man, a plan, a cabal --Panama!'
    cornelltest.assert_true(not string_recursion.ispalindrome_loosely(test_s))
    print ' finished palindrome tests'



# Application Code
if __name__ == '__main__':
    test_num_e()
    test_length()
    test_deblank()
    test_reverse()
    test_case()
    test_depunct()
    test_palindrome_fns()
    print 'Module string_recursion passes all test cases'