# 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'