summaryrefslogtreecommitdiff
path: root/src/test/PythonTest.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/PythonTest.py')
-rw-r--r--src/test/PythonTest.py239
1 files changed, 239 insertions, 0 deletions
diff --git a/src/test/PythonTest.py b/src/test/PythonTest.py
new file mode 100644
index 0000000..21dd68b
--- /dev/null
+++ b/src/test/PythonTest.py
@@ -0,0 +1,239 @@
+# -*- coding: utf-8 -*-
+# libavg - Media Playback Engine.
+# Copyright (C) 2003-2014 Ulrich von Zadow
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Current versions can be found at www.libavg.de
+#
+
+import os
+import time
+import tempfile
+
+from libavg import geom, statemachine, persist
+
+from testcase import *
+
+def getTempFileName():
+ return os.path.join(tempfile.gettempdir(), 'libavg.%d' % time.time())
+
+
+class PythonTestCase(AVGTestCase):
+ def __init__(self, testFuncName):
+ AVGTestCase.__init__(self, testFuncName)
+
+ def testRoundedRect(self):
+ def setPos():
+ self.rect.pos = (20.5, 3.5)
+
+ def setSize():
+ self.rect.size = (40, 20)
+
+ def setRadius(r):
+ self.rect.radius = r
+
+ def setFill():
+ self.rect.fillcolor = "0000FF"
+ self.rect.fillopacity = 0.5
+
+ def createDegenRect():
+ self.rect.unlink(True)
+ rect = geom.RoundedRect(parent=root, pos=(10.5,10.5), size=(10,10), radius=6,
+ fillopacity=0.5, color="FFFFFF")
+ self.assert_(rect.radius == 6)
+
+ root = self.loadEmptyScene()
+ self.rect = geom.RoundedRect(parent=root, pos=(2.5,2.5),
+ size=(64,64), radius=5, color="FF0000")
+ self.start(False,
+ (lambda: self.compareImage("testRoundedRect1"),
+ setPos,
+ lambda: self.compareImage("testRoundedRect2"),
+ setSize,
+ lambda: self.compareImage("testRoundedRect3"),
+ lambda: setRadius(10),
+ lambda: self.compareImage("testRoundedRect4"),
+ setFill,
+ lambda: self.compareImage("testRoundedRect5"),
+ createDegenRect,
+ lambda: self.compareImage("testRoundedRect6"),
+ ))
+
+ def testPieSlice(self):
+ def changeAttrs():
+ self.pieSlice.startangle = -1
+ self.pieSlice.endangle = 3.14
+ self.pieSlice.radius = 50
+ self.pieSlice.pos = (80.5, 60.5)
+ self.pieSlice.fillcolor = "00FFFF"
+ self.pieSlice.fillopacity = 0.5
+
+ def makeSmall():
+ self.pieSlice.radius = 0.6
+
+ root = self.loadEmptyScene()
+ self.pieSlice = geom.PieSlice(parent=root, pos=(20.5,20.5),
+ radius=40, startangle=0, endangle=1.57, color="FF0000")
+
+ self.start(False,
+ (lambda: self.compareImage("testPieSlice1"),
+ changeAttrs,
+ lambda: self.compareImage("testPieSlice2"),
+ makeSmall,
+ lambda: self.compareImage("testPieSlice3"),
+ ))
+
+ def testArc(self):
+ def changeAttrs():
+ self.arc.startangle = -1
+ self.arc.endangle = 3.14
+ self.arc.radius = 50
+ self.arc.pos = (80.5, 60.5)
+
+ root = self.loadEmptyScene()
+ self.arc = geom.Arc(parent=root, pos=(20.5,20.5),
+ radius=40, startangle=0, endangle=1.57, color="FF0000")
+
+ self.start(False,
+ (lambda: self.compareImage("testArc1"),
+ changeAttrs,
+ lambda: self.compareImage("testArc2"),
+ ))
+
+ def btoa(self):
+ # Test for member function handling in StateMachine.
+ self.btoaCalled = True
+
+ def testStateMachine(self):
+ def atob(oldState, newState):
+ self.atobCalled = True
+
+ def btoc(dummy):
+ # Dummy argument so we can test handling of lambda expressions.
+ self.btocCalled = True
+
+ def aEntered():
+ self.aEnteredCalled = True
+
+ def aLeft():
+ self.aLeftCalled = True
+
+ self.atobCalled = False
+ self.btocCalled = False
+ self.btoaCalled = False
+ self.aLeftCalled = False
+ self.aEnteredCalled = False
+ machine = statemachine.StateMachine("testmachine", 'A')
+ machine.addState('A', {'B': atob, 'nostate': atob}, aEntered, aLeft)
+ machine.addState('B', {'C': lambda: btoc("dummy"), 'A': self.btoa})
+ machine.addState('C', {'A': None})
+ self.assertException(lambda: machine.addState('C', {'A': None}))
+ self.assertException(lambda: machine.changeState('C'))
+ self.assertException(lambda: machine.changeState('nostate'))
+ machine.changeState('B')
+ self.assert_(self.atobCalled)
+ self.assert_(self.aLeftCalled)
+ machine.changeState('A')
+ self.assert_(self.aEnteredCalled)
+ self.assert_(self.btoaCalled)
+ machine.changeState('B')
+ machine.changeState('C')
+ self.assert_(self.btocCalled)
+ machine.changeState('A')
+ self.assertEqual(machine.state, 'A')
+# machine.dump()
+
+ self.assertException(lambda: machine.addState('illegal', {}))
+
+ # Create a machine without transition callbacks
+ machine = statemachine.StateMachine("testmachine", 'A')
+ machine.addState('A', ('B',), aEntered, aLeft)
+ machine.addState('B', ('C', 'A'))
+ machine.addState('C', ('A',))
+ machine.changeState('B')
+
+ # Make a machine with a transition to a nonexistent state.
+ kaputtMachine = statemachine.StateMachine("kaputt", 'A')
+ kaputtMachine.addState('A', {'B': None})
+ self.assertException(lambda: kaputtMachine.changeState('B'))
+
+ def testStateMachineDiagram(self):
+ def aEntered():
+ pass
+
+ if not(self._isCurrentDirWriteable()):
+ self.skip("Current dir not writeable")
+ return
+
+ machine = statemachine.StateMachine("testmachine", 'A')
+ machine.addState('A', {'B': None, 'nostate': None}, aEntered)
+ machine.addState('B', {'C': None, 'A': self.btoa})
+ machine.addState('C', {'A': None})
+
+ imageFName = AVGTestCase.imageResultDirectory + "/stateMachineGraphViz.png"
+ try:
+ machine.makeDiagram(imageFName)
+ except RuntimeError:
+ self.skip("graphviz not installed.")
+
+ def testPersistStore(self):
+ testFile = getTempFileName()
+ p = persist.Persist(testFile, {})
+ self.assertEqual(p.storeFile, testFile)
+ self.assertEqual(p.data, {})
+ p.data['test'] = 1
+ p.commit()
+ p = persist.Persist(testFile, {})
+ self.assert_('test' in p.data)
+ self.assertEqual(p.data['test'], 1)
+ os.unlink(testFile)
+
+ def testPersistCorrupted(self):
+ logger.configureCategory("APP", logger.Severity.ERR);
+ testFile = getTempFileName()
+ f = open(testFile, 'w')
+ f.write('garbage')
+ f.close()
+ p = persist.Persist(testFile, {})
+ self.assertEqual(p.data, {})
+ os.unlink(testFile)
+ logger.configureCategory("APP", logger.Severity.WARN);
+
+ def testPersistValidation(self):
+ logger.configureCategory("APP", logger.Severity.ERR);
+ testFile = getTempFileName()
+ p = persist.Persist(testFile, {'test': 1})
+ p.commit()
+ p = persist.Persist(testFile, [], validator=lambda v: isinstance(v, list))
+ self.assertEqual(p.data, [])
+ os.unlink(testFile)
+ logger.configureCategory("APP", logger.Severity.WARN);
+
+
+def pythonTestSuite(tests):
+ availableTests = (
+ "testRoundedRect",
+ "testPieSlice",
+ "testArc",
+ "testStateMachine",
+ "testStateMachineDiagram",
+ "testPersistStore",
+ "testPersistCorrupted",
+ "testPersistValidation",
+ )
+
+ return createAVGTestSuite(availableTests, PythonTestCase, tests)
+