# Part of the A-A-P recipe executive: unit-Testing # Copyright (C) 2002-2003 Stichting NLnet Labs # Permission to copy and use this file is specified in the file COPYING. # If this file is missing you can find it here: http://www.a-a-p.org/COPYING import sys import string # Although the docs say Python looks in the current dir for modules, it needs # to be told explicitly. sys.path.insert(0, ".") import Process from Process import assert_var_name from Error import * from Util import * # Setup Internationalisation (defines _()) i18n_init() try: import unittest except ImportError: print "--------------------------" print "Could not import the unittest module.\n" while 1: r = raw_input('Do you want to download the unittest module now?\n' "y: Yes (requires an internet connection)\n" "c: Continue (install it yourself first)\n" "n: No (abort testing)\n" "Choice: ") if r: if r[0] == "y" or r[0] == 'Y': from CopyMove import remote_copy_move # Obtain unittest.py from the A-A-P web server. failed = remote_copy_move([], {}, 1, [{"name" : "http://www.a-a-p.org/packages/unittest.py"}], {"name" : "unittest.py"}, {}, 0, errmsg = 1) if failed: print "Sorry, downloading unittest.py didn't work" sys.exit(1) break if r[0] == "c" or r[0] == 'C': break if r[0] == "n" or r[0] == 'N': sys.exit(1) continue import unittest # Test assert_var_name() class Grabwrite: def __init__(self): self.file = sys.stdout self.written = '' def write(self, arg): self.written = self.written + arg def __getattr__(self, attr): return getattr(self.file, attr) class varnameTestCase(unittest.TestCase): def testLegalVarnames(self): for name in ["foo", "_f19_AZ_", "1234", "a", "this_is_a_long_name"+2000*"x"]: assert_var_name([], name) def testIllegalVarnames(self): for name in ["foo#", "-f19", ",ddd" ]: # assert that calling "assert_var_name" with params ([], name) # will cause an UserError: self.assertRaises(UserError, assert_var_name, [], name) class utilTestCase(unittest.TestCase): def testIsWhite(self): for str in [" ", "\t"]: self.failUnless(is_white(str), msg = "str '%s' should be detected as whitespace" % str) for str in ["f", "\n", "_", "", ]: self.failIf(is_white(str), msg = "str '%s' should not be detected as whitespace" % str) def testSkipWhite(self): for str, start, ret in [ (" x", 0, 2), (" xx", 1, 1), (" x", 2, 2), ("89 \t4", 2, 4), (" _ ", 2, 2), ("", 0, 0)]: n = skip_white(str, start) self.failUnlessEqual(n, ret, msg = "skip_white(%s, %d) returned %d instead of %d" % (str, start, n, ret)) def testSkipToWhite(self): for str, start, ret in [ ("xx ", 0, 2), ("x x", 1, 1), (" x", 2, 2), ("89\t 4", 0, 2), (" a__ ", 1, 4), ("", 0, 0)]: n = skip_to_white(str, start) self.failUnlessEqual(n, ret, msg = "skip_to_white(%s, %d) returned %d instead of %d" % (str, start, n, ret)) def testGetToken(self): for str, start, rets, reti in [ ("xx ", 0, "xx", 2), ("x x", 1, " ", 2), (" \t x", 0, " \t ", 3), (" 'as df' ", 1, "'as df'", 8), ("'a s'\"d f\" ' ", 0, "'a s'\"d f\"", 10), ("x \"a\ts\"\t'd'", 2, "\"a\ts\"", 7), ]: s, i = get_token(str, start) self.failIf(s != rets or i != reti, msg = "get_token('%s', %d) returned '%s', %d instead of '%s', %d" % (str, start, s, i, rets, reti)) def testCheckExists(self): self.assertRaises(UserError, check_exists, [], "test.aap") check_exists([], "notatest.aax") def testVarchar(self): for c, res in [('a', 1), ('z', 1), ('0', 1), ('9', 1), ('_', 1), ('A', 1), ('Z', 1), ('-', 0), ('+', 0), ('@', 0), ('\t', 0), (' ', 0), ('&', 0), ('$', 0), ('\033', 0), ('\n', 0)]: self.failUnlessEqual(varchar(c), res, msg = "varchar(%s) returned %d instead of %d" % (c, varchar(c), res)) def testUnquote(self): for inp, res, m in [('a b c', 'a b c', ''), ('a "b" c', 'a b c', ''), ("a 'b' c", 'a b c', ''), ("a '\"b' c", 'a "b c', ''), ('"a \'b\' c"', "a 'b' c", ''), ('"a \'b"\' c"', "a 'b c\"", 'Missing quote'), ]: grab = Grabwrite() sys.stdout = grab got = unquote(globals(), inp) sys.stdout = grab.file self.failUnlessEqual(got, res, msg = "unquote(%s) returned =%s= instead of =%s=" % (inp, got, res)) # Only compare empty vs non-empty, translations get in the way. self.failIf((grab.written != '') != (m!= ''), msg = 'unquote(%s) gave message "%s" instead of "%s"' % (inp, grab.written, m)) def testShortenName(self): cwd = os.getcwd() os_sep_save = os.sep os.sep = "/" for name, dir, res in [ ("/foo/bar", "/foo", "bar"), ("/foo/bar", "/foo/bar", "../bar"), ("/foo/burp/bar", "/foo/bar", "../burp/bar"), (cwd, cwd, ""), (cwd, cwd + "/foo", ".."), ("/foo/bar", "/foo/bar/burp", "../../bar"), ]: got = shorten_name(name, dir) self.failUnlessEqual(got, res, msg = "shorten_name(%s, %s) returned =%s= instead of =%s=" % (name, dir, got, res)) os.sep = os_sep_save class RecPythonTestCase(unittest.TestCase): def testSufreplace(self): from RecPython import sufreplace # these calls should work for suffrom, sufto, var, expected in [ (".x", ".y", "huhu.x", "huhu.y"), (".cpp", ".o", "huhu.cpp", "huhu.o"), ("", ".foo", "huhu huhu.cpp", "huhu huhu.foo"), (None, ".foo", "huhu huhu.cpp huhu.x/huhu huhu.x/huhu.x", "huhu.foo huhu.foo huhu.x/huhu.foo huhu.x/huhu.foo"), (".c", ".o", "huhu.c/spp.k", "huhu.c/spp.k"), (".c", ".o", "huhu.c ba.x foo.c bar.k", "huhu.o ba.x foo.o bar.k"), (".c", ".o", "huhu.c", "huhu.o"), (".123456789", ".Z", "huhu.123456789", "huhu.Z"), ]: result = sufreplace(suffrom, sufto, var) self.failUnlessEqual(result, expected, msg = ("sufreplace('%s', '%s', '%s') = '%s' != '%s'" % (suffrom, sufto, var, result, expected))) # these calls should raise for suffrom, sufto, var in [ ("x", "y", "huhu"), # first arg doesn't start with dot (".(?)", ".y", "huhu.x") # invalid regexp ]: # print 'Calling sufreplace("%s", "%s", "%s")' % (suffrom, sufto, var) self.assertRaises(UserError, sufreplace, suffrom, sufto, var) def testSufadd(self): from RecPython import sufadd # these calls should work for suf, var, all, expected in [ (".y", "huhu.x", None, "huhu.x"), (".y", "huhu.x", 0, "huhu.x"), (".y", "huhu.x", 1, "huhu.x.y"), (".foo", "huhu huhu.x/asdf asdf.xx", None, "huhu.foo huhu.x/asdf.foo asdf.xx"), (".foo", "huhu huhu.x/asdf asdf.xx", 0, "huhu.foo huhu.x/asdf.foo asdf.xx"), (".foo", "huhu huhu.x/asdf asdf.xx", 9, "huhu.foo huhu.x/asdf.foo asdf.xx.foo"), ]: if all == None: result = sufadd(suf, var) allstr = '' else: result = sufadd(suf, var, all) allstr = ", '%s'" % all self.failUnlessEqual(result, expected, msg = ("sufall('%s', '%s'%s) = '%s' != '%s'" % (suf, var, allstr, result, expected))) # these calls should raise for suf, var, all in [ ("x", "huhu", 1), # first arg doesn't start with dot ("", "huhu", 0), # first arg is empty ]: # print 'Calling sufadd("%s", "%s", "%s")' % (suffrom, sufto, var) self.assertRaises(UserError, sufadd, suf, var, all) if __name__ == "__main__": unittest.main() # vim: set sw=4 et sts=4 tw=79 fo+=l: