summaryrefslogtreecommitdiff
path: root/src/test/PlayerTest.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/PlayerTest.py')
-rw-r--r--src/test/PlayerTest.py853
1 files changed, 853 insertions, 0 deletions
diff --git a/src/test/PlayerTest.py b/src/test/PlayerTest.py
new file mode 100644
index 0000000..2443759
--- /dev/null
+++ b/src/test/PlayerTest.py
@@ -0,0 +1,853 @@
+# -*- 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 math
+import threading
+
+from libavg import avg, player
+from testcase import *
+
+class PlayerTestCase(AVGTestCase):
+ def __init__(self, testFuncName):
+ AVGTestCase.__init__(self, testFuncName)
+
+ def testPoint(self):
+ def testHash():
+ ptMap = {}
+ ptMap[avg.Point2D(0,0)] = 0
+ ptMap[avg.Point2D(1,0)] = 1
+ ptMap[avg.Point2D(0,0)] = 2
+ self.assertEqual(len(ptMap), 2)
+ self.assertEqual(ptMap[avg.Point2D(0,0)], 2)
+
+ def testToTupleConversion():
+ pt = avg.Point2D(10, 20)
+ tpl = tuple(pt)
+ self.assertEqual(pt.x, tpl[0])
+ self.assertEqual(pt.y, tpl[1])
+
+ def testFromTupleConversion():
+ tpl = (15, 20)
+ pt = avg.Point2D(tpl)
+ self.assertEqual(pt.x, tpl[0])
+ self.assertEqual(pt.y, tpl[1])
+
+ pt = avg.Point2D()
+ self.assertEqual(pt, avg.Point2D(0,0))
+ pt = avg.Point2D(10, 20)
+ self.assertEqual(pt[0], pt.x)
+ self.assertEqual(pt[1], pt.y)
+ pt = avg.Point2D(10, 10)
+ self.assertEqual(pt, avg.Point2D(10, 10))
+ self.assertEqual(pt, (10, 10))
+ self.assertEqual(pt, avg.Point2D([10, 10]))
+ self.assertNotEqual(pt, avg.Point2D(11, 10))
+ self.assertEqual(str(pt), "(10,10)")
+ pt2 = eval(repr(pt))
+ self.assertEqual(pt2, pt)
+ testHash()
+ testFromTupleConversion()
+ testToTupleConversion()
+ self.assertAlmostEqual(avg.Point2D(10,0).getNormalized(), avg.Point2D(1,0))
+ self.assertAlmostEqual(pt.getRotated(math.pi, (5,5)), avg.Point2D(0,0))
+ self.assertEqual(-pt, (-10, -10))
+ self.assertEqual(pt-(10,0), (0,10))
+ self.assertEqual(pt+(10,0), (20,10))
+ self.assertEqual(pt*2, (20,20))
+ self.assertEqual(2*pt, (20,20))
+ pt.x = 21
+ pt.y = 23
+ self.assertEqual(pt, avg.Point2D(21, 23))
+ pt.x -= 11
+ pt.y -= 13
+ pt += avg.Point2D(10, 10)
+ self.assertEqual(pt, avg.Point2D(20, 20))
+ pt -= avg.Point2D(6, 6)
+ self.assertEqual(pt, avg.Point2D(14, 14))
+ self.assertNotEqual(pt, avg.Point2D(13, 13))
+ pt = pt/2.
+ self.assertEqual(pt, avg.Point2D(7, 7))
+ pt = avg.Point2D((10, 10))
+ self.assertEqual(pt, (10, 10))
+ self.assertEqual(len(pt), 2)
+ self.assertEqual(pt[0], pt.x)
+ self.assertEqual(pt[1], pt.y)
+ self.assertException(lambda: pt[2])
+ self.assertAlmostEqual(avg.Point2D(10,0), avg.Point2D.fromPolar(0,10))
+ self.assertException(avg.Point2D(0,0).getNormalized)
+ self.assertException(lambda: avg.Point2D(0,))
+ self.assertException(lambda: avg.Point2D(0,1,2))
+ for point in ((10,0), (0,10), (-10,0), (0,-10)):
+ pt = avg.Point2D(point)
+ angle = pt.getAngle()
+ norm = pt.getNorm()
+ self.assertAlmostEqual(pt, avg.Point2D.fromPolar(angle,norm))
+
+ def testBasics(self):
+ def getFramerate():
+ framerate = player.getEffectiveFramerate()
+ self.assert_(framerate > 0)
+
+ def invalidCreateNode():
+ avg.ImageNode(1, 2, 3)
+
+ player.showCursor(0)
+ player.showCursor(1)
+ root = self.loadEmptyScene()
+ avg.ImageNode(href="rgb24-65x65.png", parent=root)
+ self.assertException(invalidCreateNode)
+ self.start(False,
+ (getFramerate,
+ lambda: self.compareImage("testbasics"),
+ lambda: player.setGamma(0.3, 0.3, 0.3),
+ lambda: player.showCursor(0),
+ lambda: player.showCursor(1),
+ ))
+
+ def testColorParse(self):
+ def setColor(colorName):
+ node.color = colorName
+
+ node = avg.LineNode(pos1=(0.5, 0), pos2=(0.5, 50), color="FF0000")
+ setColor("ff00ff")
+ self.assertException(lambda: setColor("foo"))
+ self.assertException(lambda: setColor("ff00f"))
+ self.assertException(lambda: setColor("ff00ffx"))
+ self.assertException(lambda: setColor("ff00fx"))
+
+ def testFakeTime(self):
+ def checkTime():
+ self.assertEqual(player.getFrameTime(), 50)
+ self.assertEqual(player.getFrameDuration(), 50)
+ self.assertEqual(player.getEffectiveFramerate(), 20)
+
+ self.loadEmptyScene()
+ player.setFakeFPS(20)
+ self.start(False,
+ (checkTime,
+ ))
+
+ def testDivResize(self):
+ def checkSize (w, h):
+ self.assertEqual(node.width, w)
+ self.assertEqual(node.height, h)
+ self.assertEqual(node.size, (w,h))
+
+ def setSize (size):
+ node.size = size
+
+ def setWidth (w):
+ node.width = w
+
+ def setHeight (h):
+ node.height = h
+
+ self.__initDefaultScene()
+ node = player.getElementByID('nestedavg')
+
+ self.start(False,
+ (lambda: checkSize(128, 32),
+ lambda: setSize((14,15)),
+ lambda: checkSize(14,15),
+ lambda: setWidth(23),
+ lambda: checkSize(23,15),
+ lambda: setHeight(22),
+ lambda: checkSize(23,22),
+ ))
+
+ def testRotate(self):
+ def onOuterDown(Event):
+ self.onOuterDownCalled = True
+
+ def fakeRotate():
+ player.getElementByID("outer").angle += 0.1
+ player.getElementByID("inner").angle -= 0.1
+
+ def testCoordConversions():
+ innerNode = player.getElementByID("inner")
+ relPos = innerNode.getRelPos((90, 80))
+ self.assertAlmostEqual(relPos, (10, 10))
+ outerNode = player.getElementByID("outer")
+ relPos = outerNode.getRelPos((90, 80))
+ self.assertAlmostEqual(relPos[0], 12.332806394528092)
+ self.assertAlmostEqual(relPos[1], 6.9211188716194592)
+ absPos = outerNode.getAbsPos(relPos)
+ self.assertAlmostEqual(absPos, (90, 80))
+ self.assertEqual(outerNode.getElementByPos((10, 10)), innerNode)
+ self.assertEqual(outerNode.getElementByPos((0, 10)), outerNode)
+ self.assertEqual(outerNode.getElementByPos((-10, -110)), None)
+
+ def disableCrop():
+ player.getElementByID("outer").crop = False
+ player.getElementByID("inner").crop = False
+
+ self.__initDefaultRotateScene()
+ player.getElementByID("outer").subscribe(avg.Node.CURSOR_DOWN, onOuterDown)
+ self.onOuterDownCalled = False
+ self.start(False,
+ (lambda: self.compareImage("testRotate1"),
+ testCoordConversions,
+ fakeRotate,
+ lambda: self.compareImage("testRotate1a"),
+ lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 85, 70),
+ lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 85, 70),
+ lambda: self.assert_(not(self.onOuterDownCalled)),
+ lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 85, 75),
+ lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 85, 75),
+ lambda: self.assert_(self.onOuterDownCalled),
+ disableCrop,
+ lambda: self.compareImage("testRotate1b"),
+ ))
+
+ def testRotate2(self):
+ root = self.loadEmptyScene()
+
+ div1 = avg.DivNode(pos=(80,0), size=(160,120), pivot=(0,0), angle=1.57,
+ parent=root)
+ avg.ImageNode(size=(16,16), href="rgb24-65x65.png", parent=div1)
+ div2 = avg.DivNode(pos=(40,0), size=(110,80), pivot=(0,0), angle=1.57,
+ crop=True, parent=div1)
+ avg.ImageNode(pos=(0,0), size=(16,16), href="rgb24-65x65.png", parent=div2)
+ avg.ImageNode(pos=(30,-6), size=(16,16), href="rgb24-65x65.png", parent=div2)
+ self.start(False, [lambda: self.compareImage("testRotate2")])
+
+ def testRotatePivot(self):
+ def setPivot (pos):
+ node.pivot = pos
+
+ def addPivot (offset):
+ node.pivot += offset
+
+ root = self.loadEmptyScene()
+ node = avg.DivNode(pos=(80,0), size=(160,120), pivot=(0,0), angle=1.57,
+ crop=True, parent=root)
+ div = avg.DivNode(pos=(40,-20), size=(160,120), pivot=(0,0), angle=0.79,
+ crop=True, parent=node)
+ avg.ImageNode(pos=(-10,-10), size=(128,128), href="rgb24-65x65.png", parent=div)
+ avg.ImageNode(pos=(0,10), size=(32,32), href="rgb24-65x65.png", parent=node)
+ self.start(False,
+ (lambda: self.compareImage("testRotatePivot1"),
+ lambda: setPivot((10, 10)),
+ lambda: self.compareImage("testRotatePivot2"),
+ lambda: addPivot((-8, 0)),
+ lambda: self.compareImage("testRotatePivot3"),
+ ))
+
+ def testOpacity(self):
+ root = self.loadEmptyScene()
+ avg.ImageNode(pos=(0,0), href="rgb24-65x65.png", opacity=0.5, parent=root)
+ avg.RectNode(pos=(0,64), size=(64,64), opacity=0.5, fillopacity=0.5,
+ fillcolor="FF0000", strokewidth=2, parent=root)
+ div = avg.DivNode(pos=(80,0), opacity=0.5, parent=root)
+ avg.ImageNode(pos=(0,0), href="rgb24-65x65.png", parent=div)
+ avg.RectNode(pos=(0,64), size=(64,64), opacity=1, fillopacity=1,
+ fillcolor="FF0000", strokewidth=2, parent=div)
+ self.start(False,
+ (lambda: self.compareImage("testOpacity"),
+ ))
+
+ def testOutlines(self):
+ root = self.__initDefaultRotateScene()
+ root.elementoutlinecolor = "FFFFFF"
+ innerDiv = player.getElementByID("inner")
+ innerDiv.size = (0, 0)
+ innerDiv.getChild(0).elementoutlinecolor = "00FF00"
+ self.start(False, [lambda: self.compareImage("testOutlines")])
+
+ def testWordsOutlines(self):
+ root = self.loadEmptyScene()
+ root.elementoutlinecolor = "FFFFFF"
+ avg.WordsNode(pos=(40,40), alignment="center", text="test", parent=root)
+ self.start(True, [lambda: self.compareImage("testWordsOutlines")])
+
+ def testError(self):
+ self.initDefaultImageScene()
+ player.setTimeout(1, lambda: undefinedFunction)
+ player.setTimeout(50, player.stop)
+ try:
+ player.play()
+ except NameError:
+ self.assert_(1)
+ else:
+ self.assert_(0)
+
+ def testExceptionInTimeout(self):
+ def throwException():
+ raise ZeroDivisionError
+
+ try:
+ self.initDefaultImageScene()
+ self.start(False, [throwException])
+ except ZeroDivisionError:
+ self.assert_(1)
+ else:
+ self.assert_(0)
+
+ def testInvalidImageFilename(self):
+ def activateNode():
+ div.active = 1
+
+ root = self.loadEmptyScene()
+ div = avg.DivNode(active=False, parent=root)
+ avg.ImageNode(href="filedoesntexist.png", parent=div)
+ self.start(False, [activateNode])
+
+ def testInvalidVideoFilename(self):
+ def tryplay():
+ assertException(lambda: video.play())
+
+ root = self.loadEmptyScene()
+ video = avg.VideoNode(href="filedoesntexist.avi", parent=root)
+ self.start(False,
+ (lambda: tryplay,
+ lambda: video.stop()
+ ))
+
+ def testTimeouts(self):
+ class TestException(Exception):
+ pass
+
+ def timeout1():
+ player.clearInterval(self.timeout1ID)
+ player.clearInterval(self.timeout2ID)
+ self.timeout1called = True
+
+ def timeout2():
+ self.timeout2called = True
+
+ def onFrame():
+ self.numOnFramesCalled += 1
+ if self.numOnFramesCalled == 3:
+ player.clearInterval(self.intervalID)
+
+ def wait():
+ pass
+
+ def throwException():
+ raise TestException
+
+ def initException():
+ self.timeout3ID = player.setTimeout(0, throwException)
+
+ def setupTimeouts():
+ self.timeout1ID = player.setTimeout(0, timeout1)
+ self.timeout2ID = player.setTimeout(1, timeout2)
+ self.intervalID = player.setOnFrameHandler(onFrame)
+
+ self.timeout1called = False
+ self.timeout2called = False
+ self.__exceptionThrown = False
+ self.numOnFramesCalled = 0
+ try:
+ self.initDefaultImageScene()
+ self.start(False,
+ (setupTimeouts,
+ None,
+ lambda: self.assert_(self.timeout1called),
+ lambda: self.assert_(not(self.timeout2called)),
+ lambda: self.assert_(self.numOnFramesCalled == 3),
+ lambda: initException(),
+ lambda: self.delay(10),
+ ))
+ except TestException:
+ self.__exceptionThrown = True
+
+ self.assert_(self.__exceptionThrown)
+ player.clearInterval(self.timeout3ID)
+
+ def testCallFromThread(self):
+
+ def onAsyncCall():
+ self.asyncCalled = True
+
+ def threadFunc():
+ player.setTimeout(0, onAsyncCall)
+
+ def startThread():
+ self.thread = threading.Thread(target=threadFunc)
+ self.thread.start()
+
+ self.initDefaultImageScene()
+ self.asyncCalled = False
+ player.setFakeFPS(-1)
+ self.start(False,
+ (startThread,
+ lambda: self.thread.join(),
+ None,
+ lambda: self.assert_(self.asyncCalled),
+ ))
+
+ def testAVGFile(self):
+ player.loadFile("image.avg")
+ self.start(False,
+ (lambda: self.compareImage("testAVGFile"),
+ ))
+ self.assertException(lambda: player.loadFile("filedoesntexist.avg"))
+
+ def testBroken(self):
+ def testBrokenString(string):
+ self.assertException(lambda: player.loadString(string))
+
+ # This isn't xml
+ testBrokenString("""
+ xxx<avg width="400" height="300">
+ </avg>
+ """)
+ # This isn't avg
+ testBrokenString("""
+ <bla>hallo
+ </bla>""")
+ testBrokenString("""
+ <avg width="640" height="480" invalidattribute="bla">
+ </avg>
+ """)
+
+ def testMove(self):
+ def moveit():
+ node = player.getElementByID("nestedimg1")
+ node.x += 50
+ node.opacity -= 0.7
+ node = player.getElementByID("nestedavg")
+ node.x += 50
+
+ def checkRelPos():
+ RelPos = player.getElementByID("obscured").getRelPos((50,52))
+ self.assertEqual(RelPos, (0, 0))
+
+ self.__initDefaultScene()
+ self.start(False,
+ (lambda: self.compareImage("testMove1"),
+ moveit,
+ checkRelPos
+ ))
+
+ def testCropImage(self):
+ def moveTLCrop():
+ node = player.getElementByID("img")
+ node.x = -20
+ node.y = -20
+
+ def moveBRCrop():
+ node = player.getElementByID("img")
+ node.x = 60
+ node.y = 40
+
+ def moveTLNegative():
+ node = player.getElementByID("img")
+ node.x = -60
+ node.y = -50
+
+ def moveBRGone():
+ node = player.getElementByID("img")
+ node.x = 140
+ node.y = 100
+
+ def rotate():
+ node = player.getElementByID("img")
+ node.x = 10
+ node.y = 10
+ player.getElementByID("nestedavg").angle = 1.0
+ player.getElementByID("bkgd").angle = 1.0
+
+ root = self.loadEmptyScene()
+ avg.ImageNode(id="bkgd", href="crop_bkgd.png", parent=root)
+ root.appendChild(
+ player.createNode("""
+ <div id="nestedavg" x="40" y="30" width="80" height="60" crop="True">
+ <div id="nestedavg2" crop="True">
+ <div id="nestedavg3" crop="True">
+ <image id="img" x="10" y="10" width="40" height="40"
+ href="rgb24-64x64.png"/>
+ </div>
+ </div>
+ </div>
+ """))
+ self.start(False,
+ (lambda: self.compareImage("testCropImage1"),
+ moveTLCrop,
+ lambda: self.compareImage("testCropImage2"),
+ moveBRCrop,
+ lambda: self.compareImage("testCropImage3"),
+ moveTLNegative,
+ lambda: self.compareImage("testCropImage4"),
+ moveBRGone,
+ lambda: self.compareImage("testCropImage5"),
+
+ rotate,
+ lambda: self.compareImage("testCropImage6"),
+ moveTLCrop,
+ lambda: self.compareImage("testCropImage7"),
+ moveBRCrop,
+ lambda: self.compareImage("testCropImage8"),
+ moveTLNegative,
+ lambda: self.compareImage("testCropImage9"),
+ moveBRGone,
+ lambda: self.compareImage("testCropImage10")
+ ))
+
+ def testCropMovie(self):
+ def playMovie():
+ node = player.getElementByID("movie")
+ node.play()
+
+ def moveTLCrop():
+ node = player.getElementByID("movie")
+ node.x = -20
+ node.y = -20
+
+ def moveBRCrop():
+ node = player.getElementByID("movie")
+ node.x = 60
+ node.y = 40
+
+ def moveTLNegative():
+ node = player.getElementByID("movie")
+ node.x = -60
+ node.y = -50
+
+ def moveBRGone():
+ node = player.getElementByID("movie")
+ node.x = 140
+ node.y = 100
+
+ def rotate():
+ node = player.getElementByID("movie")
+ node.x = 10
+ node.y = 10
+ player.getElementByID("nestedavg").angle = 1.0
+ player.getElementByID("bkgd").angle = 1.0
+
+ player.setFakeFPS(30)
+ root = self.loadEmptyScene()
+ avg.ImageNode(id="bkgd", href="crop_bkgd.png", parent=root)
+ root.appendChild(
+ player.createNode("""
+ <div id="nestedavg" x="40" y="30" width="80" height="60" crop="True">
+ <video id="movie" x="10" y="10" width="40" height="40"
+ threaded="false" href="mpeg1-48x48.mov"
+ fps="30"/>
+ </div>
+ """))
+ self.start(False,
+ (playMovie,
+ lambda: self.compareImage("testCropMovie1"),
+ moveTLCrop,
+ lambda: self.compareImage("testCropMovie2"),
+ moveBRCrop,
+ lambda: self.compareImage("testCropMovie3"),
+ moveTLNegative,
+ lambda: self.compareImage("testCropMovie4"),
+ moveBRGone,
+ lambda: self.compareImage("testCropMovie5"),
+
+ rotate,
+ lambda: self.compareImage("testCropMovie6"),
+ moveTLCrop,
+ lambda: self.compareImage("testCropMovie7"),
+ moveBRCrop,
+ lambda: self.compareImage("testCropMovie8"),
+ moveTLNegative,
+ lambda: self.compareImage("testCropMovie9"),
+ moveBRGone,
+ lambda: self.compareImage("testCropMovie10")
+ ))
+
+ def testWarp(self):
+ def moveVertex():
+ grid = image.getWarpedVertexCoords()
+ grid[1][1] = (grid[1][1][0]+0.06, grid[1][1][1]+0.06)
+ image.setWarpedVertexCoords(grid)
+ grid = video.getWarpedVertexCoords()
+ grid[0][0] = (grid[0][0][0]+0.06, grid[0][0][1]+0.06)
+ grid[1][1] = (grid[1][1][0]-0.06, grid[1][1][1]-0.06)
+ video.setWarpedVertexCoords(grid)
+
+ def flip():
+ grid = image.getOrigVertexCoords()
+ grid = [ [ (1-pos[0], pos[1]) for pos in line ] for line in grid]
+ image.setWarpedVertexCoords(grid)
+
+ root = self.loadEmptyScene()
+ image = avg.ImageNode(href="rgb24-64x64.png",
+ maxtilewidth=32, maxtileheight=16, parent=root)
+ video = avg.VideoNode(pos=(40,0), size=(80,80), opacity=0.5, loop=True,
+ href="mpeg1-48x48.mov", threaded=False, fps=30, parent=root)
+
+ self.assertException(image.getOrigVertexCoords)
+ self.assertException(image.getWarpedVertexCoords)
+ player.setFakeFPS(30)
+ self.start(False,
+ (lambda: video.play(),
+ lambda: self.compareImage("testWarp1"),
+ moveVertex,
+ lambda: self.compareImage("testWarp2"),
+ flip,
+ lambda: self.compareImage("testWarp3")
+ ))
+
+ def testMediaDir(self):
+ def createImageNode():
+ # Node is not in tree; mediadir should be root node dir.
+ node = avg.ImageNode(href="rgb24-64x64a.png")
+ self.assertEqual(node.size, avg.Point2D(0,0)) # File not found
+ node.href = "rgb24-64x64.png"
+ self.assertEqual(node.size, avg.Point2D(64,64)) # File found
+ node = avg.ImageNode(href="rgb24-64x64a.png", width=23, height=42)
+ # File not found, but custom size
+ self.assertEqual(node.size, avg.Point2D(23,42))
+ node.href = "rgb24-64x64.png"
+ # File found, custom size stays
+ self.assertEqual(node.size, avg.Point2D(23,42))
+ node.size = (0,0)
+ # File found, custom size cleared. Media size should be used.
+ self.assertEqual(node.size, avg.Point2D(64,64))
+
+ def setDir():
+ div.mediadir=""
+
+ def setAbsDir():
+ def absDir():
+ # Should not find any media here...
+ div.mediadir="/testmediadir"
+
+ self.assertException(absDir)
+
+ def createNode():
+ avg.VideoNode(href="mjpeg1-48x48.avi", fps=30)
+
+ root = self.loadEmptyScene()
+ div = avg.DivNode(mediadir="../testmediadir", parent=root)
+ image = avg.ImageNode(pos=(0,30), href="rgb24-64x64a.png", parent=div)
+ video = avg.VideoNode(href="mjpeg-48x48.avi", threaded=False, parent=div)
+ self.start(False,
+ (createImageNode,
+ lambda: video.play(),
+ lambda: self.compareImage("testMediaDir1"),
+ setDir,
+ lambda: video.play(),
+ lambda: self.compareImage("testMediaDir2"),
+ lambda: self.assertEqual(image.width, 0),
+ createNode,
+ setAbsDir
+ ))
+
+ def testMemoryQuery(self):
+ self.assertNotEqual(avg.getMemoryUsage(), 0)
+
+ def testStopOnEscape(self):
+ def pressEscape():
+ Helper = player.getTestHelper()
+ escape = 27
+ Helper.fakeKeyEvent(avg.Event.KEY_DOWN, escape, escape, "escape", escape,
+ avg.KEYMOD_NONE),
+ Helper.fakeKeyEvent(avg.Event.KEY_UP, escape, escape, "escape", escape,
+ avg.KEYMOD_NONE),
+
+ def testEscape1():
+ player.stopOnEscape(False)
+ pressEscape()
+
+ def testEscape2():
+ player.stopOnEscape(True)
+ player.stopOnEscape(False)
+ pressEscape()
+
+ def testEscape3():
+ player.stopOnEscape(True)
+ pressEscape()
+
+ def setAlive():
+ self.testStopOnEscapeAlive = True
+
+ self.testStopOnEscapeAlive = False
+ self.__initDefaultScene()
+ self.start(False,
+ (testEscape1,
+ testEscape2,
+ setAlive
+ ))
+ self.assert_(self.testStopOnEscapeAlive)
+ self.__initDefaultScene()
+ self.start(False,
+ (testEscape3, # this should exit the player
+ lambda: self.fail(),
+ ))
+
+ def testScreenDimensions(self):
+ def queryDimensions():
+ res = player.getScreenResolution()
+ self.assert_(res.x > 0 and res.y > 0 and res.x < 10000 and res.y < 10000)
+ ppmm = player.getPixelsPerMM()
+ self.assert_(ppmm > 0 and ppmm < 10000)
+ mm = player.getPhysicalScreenDimensions()
+ self.assert_(mm.x > 0 and mm.y > 0 and mm.x < 10000 and mm.y < 10000)
+ player.assumePixelsPerMM(ppmm)
+ newPPMM = player.getPixelsPerMM()
+ self.assertAlmostEqual(newPPMM, ppmm)
+ newMM = player.getPhysicalScreenDimensions()
+ self.assertEqual(newMM, mm)
+
+ queryDimensions()
+ self.__initDefaultScene()
+ self.start(False,
+ (queryDimensions,
+ ))
+
+ def testSVG(self):
+ svgFile = avg.SVG("media/rect.svg", False)
+
+ # renderElement
+ bmp = svgFile.renderElement("rect")
+ self.compareBitmapToFile(bmp, "testSvgBmp")
+ self.assertEqual(svgFile.getElementSize("rect"), avg.Point2D(22,12))
+ bmp = svgFile.renderElement("pos_rect")
+ self.compareBitmapToFile(bmp, "testSvgPosBmp")
+ bmp = svgFile.renderElement("rect", 5)
+ self.compareBitmapToFile(bmp, "testSvgScaleBmp1")
+ bmp = svgFile.renderElement("rect", (20,20))
+ self.compareBitmapToFile(bmp, "testSvgScaleBmp2")
+
+ # error handling
+ self.assertException(lambda: avg.SVG("filedoesntexist.svg", False))
+ self.assertException(lambda: svgFile.renderElement("missing_id"))
+
+ # unescapeIllustratorIDs
+ svgIllustratorFile = avg.SVG("illustratorRect.svg", True)
+ svgIllustratorFile.getElementSize("pos_rect")
+
+ # createImageNode
+ root = self.loadEmptyScene()
+ self.start(False,
+ (lambda: svgFile.createImageNode("rect", {"pos":(10,10), "parent":root}),
+ lambda: self.compareImage("testSvgNode"),
+ lambda: svgFile.createImageNode("rect", {"pos":(5,5), "parent":root},
+ 5),
+ lambda: self.compareImage("testSvgScaledNode1"),
+ lambda: svgFile.createImageNode("rect", {"pos":(1,1), "parent":root},
+ (40,40)),
+ lambda: self.compareImage("testSvgScaledNode2")
+ ))
+
+ def testGetConfigOption(self):
+ self.assert_(len(player.getConfigOption("scr", "bpp")) > 0)
+ self.assertException(lambda: player.getConfigOption("scr", "illegalOption"))
+ self.assertException(lambda:
+ player.getConfigOption("illegalGroup", "illegalOption"))
+
+ def testValidateXml(self):
+ schema = """<?xml version="1.0" encoding="UTF-8"?>
+ <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:element name="shiporder">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="orderperson" type="xs:string"/>
+ </xs:sequence>
+ <xs:attribute name="orderid" type="xs:string" use="required"/>
+ </xs:complexType>
+ </xs:element>
+
+ </xs:schema>
+ """
+ xmlString = """<?xml version="1.0" encoding="UTF-8"?>
+
+ <shiporder orderid="889923">
+ <orderperson>John Smith</orderperson>
+ </shiporder>
+ """
+ avg.validateXml(xmlString, schema, "shiporder.xml", "shiporder.xsd")
+
+ brokenSchema = "ff"+schema
+ self.assertException(lambda: avg.validateXml(xmlString, brokenSchema,
+ "shiporder.xml", "shiporder.xsd"))
+
+ brokenXml = xmlString+"ff"
+ self.assertException(lambda: avg.validateXml(brokenXml, schema,
+ "shiporder.xml", "shiporder.xsd"))
+
+ # Not executed due to bug #145 - hangs with some window managers.
+ def testWindowFrame(self):
+ def revertWindowFrame():
+ player.setWindowFrame(True)
+
+ player.setWindowFrame(False)
+ self.__initDefaultScene()
+ self.start(False, [revertWindowFrame])
+
+ def __initDefaultScene(self):
+ root = self.loadEmptyScene()
+ avg.ImageNode(id="mainimg", size=(100, 75), href="rgb24-65x65.png", parent=root)
+ div = avg.DivNode(id="nestedavg", pos=(0,32), opacity=1, size=(128, 32),
+ crop=True, parent=root)
+ avg.ImageNode(id="obscured", pos=(0,20), size=(96,40), href="rgb24-65x65.png",
+ parent=div)
+ avg.ImageNode(id="nestedimg1", size=(96,48), href="rgb24-65x65.png",
+ parent=div)
+ avg.ImageNode(id="nestedimg2", pos=(65,0), href="rgb24alpha-64x64.png",
+ parent=div)
+
+ def __initDefaultRotateScene(self):
+ root = self.loadEmptyScene()
+ div = avg.DivNode(pos=(80,10), size=(80,60), pivot=(0,0), angle=0.274,
+ crop=True, parent=root)
+ avg.ImageNode(pos=(10,10), size=(32,32), href="rgb24-65x65.png", parent=div)
+ outerDiv = avg.DivNode(id="outer", pos=(80,70), size=(80,60),
+ pivot=(0,0), angle=0.274, crop=True, parent=root)
+ innerDiv = avg.DivNode(id="inner", size=(80,60), pivot=(0,0), angle=-0.274,
+ crop=True, parent=outerDiv)
+ avg.ImageNode(pos=(10,10), size=(32,32), href="rgb24-65x65.png", parent=innerDiv)
+ return root
+
+def playerTestSuite(tests):
+ availableTests = (
+ "testPoint",
+ "testBasics",
+ "testColorParse",
+ "testFakeTime",
+ "testDivResize",
+ "testRotate",
+ "testRotate2",
+ "testRotatePivot",
+ "testOpacity",
+ "testOutlines",
+ "testWordsOutlines",
+ "testError",
+ "testExceptionInTimeout",
+ "testInvalidImageFilename",
+ "testInvalidVideoFilename",
+ "testTimeouts",
+ "testCallFromThread",
+ "testAVGFile",
+ "testBroken",
+ "testMove",
+ "testCropImage",
+ "testCropMovie",
+ "testWarp",
+ "testMediaDir",
+ "testMemoryQuery",
+ "testStopOnEscape",
+ "testScreenDimensions",
+ "testSVG",
+ "testGetConfigOption",
+ "testValidateXml",
+# "testWindowFrame",
+ )
+ return createAVGTestSuite(availableTests, PlayerTestCase, tests)