summaryrefslogtreecommitdiff
path: root/src/test/DynamicsTest.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/DynamicsTest.py')
-rw-r--r--src/test/DynamicsTest.py380
1 files changed, 380 insertions, 0 deletions
diff --git a/src/test/DynamicsTest.py b/src/test/DynamicsTest.py
new file mode 100644
index 0000000..522c2f0
--- /dev/null
+++ b/src/test/DynamicsTest.py
@@ -0,0 +1,380 @@
+#!/usr/bin/python
+# -*- 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
+#
+
+from libavg import avg, player
+from testcase import *
+
+class DynamicsTestCase(AVGTestCase):
+ def __init__(self, testFuncName):
+ AVGTestCase.__init__(self, testFuncName)
+
+ def __runDynamicsTest(self, createFunc, testName, isVideo = False,
+ warnOnImageDiff = False):
+
+ def createNode1(useXml):
+
+ def setNodeID():
+ node.id = "bork"
+
+ node = createFunc(useXml)
+ node.id = "nodeid1"
+ node.x = 10
+ node.y = 20
+ self.root.appendChild(node)
+ self.assertException(setNodeID)
+ self.assertEqual(self.root.indexOf(player.getElementByID("nodeid1")), 0)
+ self.assertException(lambda: self.root.indexOf(self.root))
+
+ def createNode2(useXml):
+ node = createFunc(useXml)
+ node.id = "nodeid2"
+ oldNode = player.getElementByID("nodeid1")
+ self.root.insertChildBefore(node, oldNode)
+
+ def reorderNode():
+ self.root.reorderChild(0, 1)
+ node = player.getElementByID("nodeid1")
+ self.root.reorderChild(node, 0)
+
+ def removeNodes():
+ self.node = player.getElementByID("nodeid1")
+ self.root.removeChild(self.root.indexOf(self.node))
+ node2 = player.getElementByID("nodeid2")
+ self.root.removeChild(node2)
+ self.assertEqual(player.getElementByID("nodeid1"), None)
+
+ def reAddNode():
+ self.root.appendChild(self.node)
+ if isVideo:
+ self.node.play()
+ self.node = None
+
+ def killNode():
+ self.node = player.getElementByID("nodeid1")
+ self.node.unlink(True)
+ gone = player.getElementByID("nodeid1")
+ self.assertEqual(gone, None)
+
+ def removeAgain():
+ node = player.getElementByID("nodeid1")
+ node.unlink()
+ gone = player.getElementByID("nodeid1")
+ self.assertEqual(gone, None)
+
+ def runTest(useXml):
+ self.root = self.loadEmptyScene()
+ createNode1(useXml)
+ player.stop()
+ self.root = self.loadEmptyScene()
+ player.setFakeFPS(25)
+ self.start(warnOnImageDiff,
+ (lambda: createNode1(useXml),
+ lambda: self.compareImage(testName+"1"),
+ lambda: createNode2(useXml),
+ lambda: self.compareImage(testName+"2"),
+ reorderNode,
+ lambda: self.compareImage(testName+"3"),
+ removeNodes,
+ lambda: self.compareImage(testName+"4"),
+ reAddNode,
+ lambda: self.compareImage(testName+"5"),
+ killNode,
+ reAddNode,
+ removeAgain
+ ))
+
+ runTest(True)
+ runTest(False)
+
+ def testImgDynamics(self):
+ def createImg(useXml):
+ if useXml:
+ node = player.createNode("<image href='rgb24-64x64.png'/>")
+ else:
+ node = player.createNode("image", {"href":"rgb24-64x64.png"})
+ return node
+
+ self.__runDynamicsTest(createImg, "testImgDynamics")
+
+ def testVideoDynamics(self):
+ def createVideo(useXml):
+ if useXml:
+ node = player.createNode(
+ "<video href='mpeg1-48x48.mov' threaded='false'/>")
+ else:
+ node = player.createNode("video",
+ {"href":"mpeg1-48x48.mov", "threaded":False})
+ node.play()
+ return node
+
+ self.__runDynamicsTest(createVideo, "testVideoDynamics", True)
+
+ def testWordsDynamics(self):
+ def createWords(useXml):
+ if useXml:
+ node = player.createNode("<words text='test'/>")
+ else:
+ node = player.createNode("words", {"text":"test"})
+ node.font="Bitstream Vera Sans"
+ node.fontsize=12
+ node.width=200
+ return node
+
+ self.__runDynamicsTest(createWords, "testWordsDynamics", False, True)
+
+ def testDivDynamics(self):
+ def createDiv(useXml):
+ if useXml:
+ node = player.createNode("""
+ <div>
+ <image href='rgb24-64x64.png'/>
+ </div>
+ """)
+ else:
+ node = avg.DivNode()
+ avg.ImageNode(href="rgb24-64x64.png", parent=node)
+ return node
+
+ self.__runDynamicsTest(createDiv, "testDivDynamics")
+
+ def testDuplicateID(self):
+ root = self.loadEmptyScene()
+ avg.ImageNode(href="rgb24-64x64.png", id="testdup", parent=root)
+ self.assertException(lambda: avg.ImageNode(href="rgb24-64x64.png",
+ id="testdup", parent=root))
+ self.start(False,
+ (self.assertException(lambda: avg.ImageNode(href="rgb24-64x64.png",
+ id="testdup", parent=root)),
+ ))
+
+ def testChangeParentError(self):
+ def changeParent():
+ div = avg.DivNode()
+ img = avg.ImageNode(href="additive/rgb24-64x64.png", parent=div)
+ root.appendChild(img)
+
+ root = self.loadEmptyScene()
+ self.assertException(changeParent)
+ self.start(False, (self.assertException(changeParent),))
+
+ def testDynamicEventCapture(self):
+ # Tests if deleting a node that has events captured works.
+ def createImg():
+ parentNode = root
+ node = player.createNode("image", {"id": "img", "href":"rgb24-64x64.png"})
+ parentNode.appendChild(node)
+ node.subscribe(avg.Node.CURSOR_DOWN, captureMouseDown)
+ parentNode.subscribe(avg.Node.CURSOR_UP, mainMouseUp)
+
+ def setEventCapture():
+ player.getElementByID("img").setEventCapture()
+
+ def deleteImg():
+ parentNode = root
+ node = player.getElementByID("img")
+ parentNode.removeChild(parentNode.indexOf(node))
+
+ def captureMouseDown(event):
+ self.captureMouseDownCalled = True
+
+ def mainMouseUp(event):
+ self.mainMouseUpCalled = True
+
+ self.captureMouseDownCalled = False
+ self.mainMouseUpCalled = False
+ root = self.loadEmptyScene()
+ self.start(False,
+ (createImg,
+ setEventCapture,
+ lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 100, 10),
+ lambda: self.assert_(self.captureMouseDownCalled),
+ deleteImg,
+ lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 100, 10),
+ lambda: self.assert_(self.mainMouseUpCalled)
+ ))
+
+ def testEventBubbling(self):
+ def click (x, y):
+ self.fakeClick(x, y)
+
+ def createNodes():
+ def appendEventString (s):
+ self.__eventString += s
+ return True
+
+ def setHandler (node, s, swallow = False):
+ node.setEventHandler(avg.Event.CURSOR_DOWN, avg.Event.MOUSE,
+ lambda e: appendEventString(s) and swallow)
+
+ parentNode = root
+ node = player.createNode("div", {'x':0,'y':0,'width':50, 'height':50})
+ setHandler (node, 'a')
+ parentNode.appendChild(node)
+ node = player.createNode("div", {'x':0,'y':0,'width':100, 'height':100})
+ setHandler (node, 'b')
+ parentNode.insertChild(node,0)
+ parentNode = node
+ node = player.createNode("div", {'x':40,'y':40,'width':30, 'height':30})
+ setHandler (node, 'c')
+ parentNode.appendChild(node)
+ node = player.createNode("div", {'x':60,'y':40,'width':30, 'height':30})
+ setHandler (node, 'd', True)
+ parentNode.appendChild(node)
+
+ def resetEventString():
+ self.__eventString = ''
+
+ root = self.loadEmptyScene()
+ self.start(False,
+ (createNodes,
+ resetEventString,
+ lambda: click (10,10),
+ lambda: self.assertEqual(self.__eventString, 'a'),
+ resetEventString,
+ lambda: click (55,55),
+ lambda: self.assertEqual(self.__eventString, 'cb'),
+ resetEventString,
+ lambda: click (65,55),
+ lambda: self.assertEqual(self.__eventString, 'd'),
+ ))
+
+ def testComplexDiv(self):
+ def setImageID(imgNode):
+ imgNode.id = "imageid"
+
+ def createDiv():
+ imgNode = player.createNode("image",
+ {"id":"imageid", "href":"rgb24-64x64.png"})
+ node = player.createNode("div", {"id":"divid"})
+ node.appendChild(imgNode)
+ imgNode.id = "imageid"
+ root.appendChild(node)
+ self.assertException(lambda: setImageID(imgNode))
+
+ def removeDiv():
+ node = player.getElementByID("divid")
+ imgNode = player.getElementByID("imageid")
+ node.unlink()
+ imgNode.id = "imageid"
+ imgNode.unlink()
+ root.appendChild(node)
+ node.appendChild(imgNode)
+ self.assertException(lambda: setImageID(imgNode))
+
+ root = self.loadEmptyScene()
+ createDiv()
+ removeDiv()
+ player.stop()
+ root = self.loadEmptyScene()
+ player.setFakeFPS(25)
+ self.start(False,
+ (createDiv,
+ lambda: self.compareImage("testComplexDiv1"),
+ removeDiv,
+ lambda: self.compareImage("testComplexDiv1"),
+ ))
+
+ def testNodeCustomization(self):
+ def testNodePythonAttribute():
+ node1 = player.createNode("image", {"id":"foo", "pos":(23, 42)})
+ root.appendChild(node1)
+ node1.customAttribute = "bbb"
+ node2 = player.getElementByID("foo")
+ self.assertEqual(node1, node2)
+ self.assertEqual(node2.customAttribute, "bbb")
+ node1.unlink(True)
+
+ def testNodePythonSubclass():
+
+ class CustomImageNode(avg.ImageNode):
+ def __init__(self, p, parent=None, **kwargs):
+ avg.ImageNode.__init__(self, pos=p, href="rgb24-64x64.png", **kwargs)
+ self.registerInstance(self, parent)
+
+ def customMethod(self):
+ pass
+
+ class CustomDivNode(avg.DivNode):
+ def __init__(self, parent=None, **kwargs):
+ avg.DivNode.__init__(self, **kwargs)
+ self.registerInstance(self, parent)
+ CustomImageNode((23,42), parent=self)
+
+
+ customNode = CustomImageNode((23, 42), parent=root)
+ retrievedImage = root.getChild(0)
+ self.assertEqual(type(retrievedImage), CustomImageNode)
+ self.assertEqual(retrievedImage.pos, (23,42))
+ self.assertEqual(retrievedImage.href, "rgb24-64x64.png")
+ retrievedImage.customMethod()
+ customNode.unlink(True)
+
+ CustomDivNode(parent=player.getRootNode())
+ retrievedDiv = player.getRootNode().getChild(0)
+ self.assertEqual(type(retrievedDiv), CustomDivNode)
+ retrievedImage = retrievedDiv.getChild(0)
+ self.assertEqual(type(retrievedImage), CustomImageNode)
+ retrievedDiv = retrievedImage.parent
+ self.assertEqual(type(retrievedDiv), CustomDivNode)
+ retrievedDiv.unlink(True)
+
+ customNode = CustomImageNode((23,42))
+ root.appendChild(customNode)
+ retrievedImage = root.getChild(0)
+ self.assertEqual(type(retrievedImage), CustomImageNode)
+
+ root = self.loadEmptyScene()
+ testNodePythonAttribute()
+ testNodePythonSubclass()
+
+ def testDynamicMediaDir(self):
+ def attachNode():
+ root.appendChild(imageNode1)
+
+ root = self.loadEmptyScene()
+ root.mediadir="testmediadir"
+ imageNode1 = player.createNode("image", {"href": "rgb24-64x64a.png"})
+ imageNode2 = player.createNode("image", {"href": "rgb24-64x64a.png", "x":30})
+ root.appendChild(imageNode2)
+ self.start(False,
+ (lambda: self.compareImage("testDynamicMediaDir1"),
+ attachNode,
+ lambda: self.compareImage("testDynamicMediaDir2")
+ ))
+
+
+def dynamicsTestSuite(tests):
+ availableTests = (
+ "testImgDynamics",
+ "testVideoDynamics",
+ "testWordsDynamics",
+ "testDivDynamics",
+ "testEventBubbling",
+ "testDuplicateID",
+ "testChangeParentError",
+ "testDynamicEventCapture",
+ "testComplexDiv",
+ "testNodeCustomization",
+ "testDynamicMediaDir",
+ )
+
+ return createAVGTestSuite(availableTests, DynamicsTestCase, tests)