diff options
Diffstat (limited to 'src/engine/SCons/ActionTests.py')
-rw-r--r-- | src/engine/SCons/ActionTests.py | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/src/engine/SCons/ActionTests.py b/src/engine/SCons/ActionTests.py new file mode 100644 index 0000000..c01f47c --- /dev/null +++ b/src/engine/SCons/ActionTests.py @@ -0,0 +1,190 @@ +# +# Copyright (c) 2001 Steven Knight +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: + +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__revision__ = "src/engine/SCons/ActionTests.py __REVISION__ __DATE__ __DEVELOPER__" + +# Define a null function for use as a builder action. +# Where this is defined in the file seems to affect its +# byte-code contents, so try to minimize changes by +# defining it here, before we even import anything. +def Func(): + pass + +import unittest + +import sys +import unittest + +import SCons.Action +import TestCmd + +class ActionTestCase(unittest.TestCase): + + def runTest(self): + """Test the Action factory + """ + def foo(): + pass + a1 = SCons.Action.Action(foo) + assert isinstance(a1, SCons.Action.FunctionAction) + + a2 = SCons.Action.Action("string") + assert isinstance(a2, SCons.Action.CommandAction) + + a3 = SCons.Action.Action(["x", a2, "y"]) + assert isinstance(a3, SCons.Action.ListAction) + + a4 = SCons.Action.Action(1) + assert a4 is None, a4 + + a5 = SCons.Action.Action(a1) + assert a5 is a1 + +class ActionBaseTestCase(unittest.TestCase): + + def test_cmp(self): + """Test Action comparison + """ + a1 = SCons.Action.Action("x") + a2 = SCons.Action.Action("x") + assert a1 == a2 + a3 = SCons.Action.Action("y") + assert a1 != a3 + assert a2 != a3 + + def test_subst_dict(self): + """Test substituting dictionary values in an Action + """ + a = SCons.Action.Action("x") + + d = a.subst_dict(env = {'a' : 'A', 'b' : 'B'}) + assert d['a'] == 'A', d + assert d['b'] == 'B', d + + d = a.subst_dict(target = 't', source = 's') + assert str(d['TARGETS']) == 't', d['TARGETS'] + assert str(d['TARGET']) == 't', d['TARGET'] + assert str(d['SOURCES']) == 's', d['SOURCES'] + + d = a.subst_dict(target = ['t1', 't2'], source = ['s1', 's2']) + TARGETS = map(lambda x: str(x), d['TARGETS']) + TARGETS.sort() + assert TARGETS == ['t1', 't2'], d['TARGETS'] + assert str(d['TARGET']) == 't1', d['TARGET'] + SOURCES = map(lambda x: str(x), d['SOURCES']) + SOURCES.sort() + assert SOURCES == ['s1', 's2'], d['SOURCES'] + +class CommandActionTestCase(unittest.TestCase): + + def test_init(self): + """Test creation of a command Action + """ + a = SCons.Action.CommandAction("xyzzy") + assert a.command == "xyzzy" + + def test_execute(self): + """Test executing a command Action + """ + pass + + def test_get_contents(self): + """Test fetching the contents of a command Action + """ + a = SCons.Action.CommandAction("| $foo | $bar |") + c = a.get_contents(foo = 'FFF', bar = 'BBB') + assert c == "| FFF | BBB |" + +class FunctionActionTestCase(unittest.TestCase): + + def test_init(self): + """Test creation of a function Action + """ + def func(): + pass + a = SCons.Action.FunctionAction(func) + assert a.function == func + + def test_execute(self): + """Test executing a function Action + """ + self.inc = 0 + def f(s): + s.inc = s.inc + 1 + return 0 + a = SCons.Action.FunctionAction(f) + a.execute(s = self) + assert self.inc == 1, self.inc + + def test_get_contents(self): + """Test fetching the contents of a function Action + """ + a = SCons.Action.FunctionAction(Func) + c = a.get_contents() + assert c == "\177\036\000\177\037\000d\000\000S", repr(c) + +class ListActionTestCase(unittest.TestCase): + + def test_init(self): + """Test creation of a list of subsidiary Actions + """ + def func(): + pass + a = SCons.Action.ListAction(["x", func, ["y", "z"]]) + assert isinstance(a.list[0], SCons.Action.CommandAction) + assert isinstance(a.list[1], SCons.Action.FunctionAction) + assert isinstance(a.list[2], SCons.Action.ListAction) + assert isinstance(a.list[2].list[0], SCons.Action.CommandAction) + assert isinstance(a.list[2].list[1], SCons.Action.CommandAction) + + def test_execute(self): + """Test executing a list of subsidiary Actions + """ + self.inc = 0 + def f(s): + s.inc = s.inc + 1 + return 0 + a = SCons.Action.ListAction([f, f, f]) + a.execute(s = self) + assert self.inc == 3, self.inc + + def test_get_contents(self): + """Test fetching the contents of a list of subsidiary Actions + """ + a = SCons.Action.ListAction(["x", "y", "z"]) + c = a.get_contents() + assert c == "xyz", c + + +if __name__ == "__main__": + suite = unittest.TestSuite() + suite.addTest(ActionTestCase()) + suite.addTest(ActionBaseTestCase("test_cmp")) + suite.addTest(ActionBaseTestCase("test_subst_dict")) + for tclass in [CommandActionTestCase, + FunctionActionTestCase, + ListActionTestCase]: + for func in ["test_init", "test_execute", "test_get_contents"]: + suite.addTest(tclass(func)) + if not unittest.TextTestRunner().run(suite).wasSuccessful(): + sys.exit(1) |