diff options
author | Dimitri John Ledkov <dimitri.ledkov@canonical.com> | 2014-02-20 16:10:52 +0000 |
---|---|---|
committer | Dimitri John Ledkov <dimitri.ledkov@canonical.com> | 2014-02-20 19:15:57 +0000 |
commit | d20f4a64eba38690337ac914a04a113de7caf125 (patch) | |
tree | 6828990e93ca5d8847b8cde2f2febb6566b0d53f /src/test | |
parent | 28161e9209f21be1a600f637565ecede94855a36 (diff) |
New upstream release. Closes: #721047debian/1.8.0-1
Drop all patches, none are needed with this new upstream release.
Port to dh.
Specify foreign in configure.ac.
Diffstat (limited to 'src/test')
281 files changed, 5216 insertions, 3771 deletions
diff --git a/src/test/AVGAppTest.py b/src/test/AVGAppTest.py index 5c7ed1a..7c21bc8 100644 --- a/src/test/AVGAppTest.py +++ b/src/test/AVGAppTest.py @@ -1,7 +1,7 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # libavg - Media Playback Engine. -# Copyright (C) 2003-2011 Ulrich von Zadow +# 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 @@ -24,22 +24,21 @@ import os import time import libavg -from libavg import avg, Point2D +from libavg import avg, Point2D, player import testcase -g_Player = avg.Player.get() -g_helper = g_Player.getTestHelper() +g_helper = player.getTestHelper() TEST_RESOLUTION = (160, 120) class TestAppBase(libavg.AVGApp): def requestStop(self, timeout=0): - g_Player.setTimeout(timeout, g_Player.stop) + player.setTimeout(timeout, player.stop) def singleKeyPress(self, char): - g_helper.fakeKeyEvent(avg.KEYDOWN, ord(char), ord(char), char, ord(char), + g_helper.fakeKeyEvent(avg.Event.KEY_DOWN, ord(char), ord(char), char, ord(char), avg.KEYMOD_NONE) - g_helper.fakeKeyEvent(avg.KEYUP, ord(char), ord(char), char, ord(char), + g_helper.fakeKeyEvent(avg.Event.KEY_UP, ord(char), ord(char), char, ord(char), avg.KEYMOD_NONE) @@ -48,7 +47,7 @@ class AVGAppTestCase(testcase.AVGTestCase): class MinimalApp(TestAppBase): testInstance = self def init(self): - self.testInstance.assert_(not g_Player.isFullscreen()) + self.testInstance.assert_(not player.isFullscreen()) self.requestStop() if 'AVG_DEPLOY' in os.environ: @@ -59,12 +58,12 @@ class AVGAppTestCase(testcase.AVGTestCase): class FullscreenApp(TestAppBase): testInstance = self def init(self): - self.testInstance.assert_(g_Player.isFullscreen()) - rootNodeSize = g_Player.getRootNode().size + self.testInstance.assert_(player.isFullscreen()) + rootNodeSize = player.getRootNode().size self.testInstance.assertEqual(rootNodeSize, resolution) self.requestStop() - resolution = g_Player.getScreenResolution() + resolution = player.getScreenResolution() os.environ['AVG_DEPLOY'] = '1' FullscreenApp.start(resolution=resolution) del os.environ['AVG_DEPLOY'] @@ -73,11 +72,11 @@ class AVGAppTestCase(testcase.AVGTestCase): class DebugwindowApp(TestAppBase): testInstance = self def init(self): - self.testInstance.assert_(not g_Player.isFullscreen()) - rootNodeSize = g_Player.getRootNode().size + self.testInstance.assert_(not player.isFullscreen()) + rootNodeSize = player.getRootNode().size self.testInstance.assertEqual(rootNodeSize, TEST_RESOLUTION) - # windowSize = g_Player.getWindowResolution() + # windowSize = player.getWindowResolution() # self.testInstance.assertEqual(windowSize, Point2D(TEST_RESOLUTION)/2) self.requestStop() @@ -104,19 +103,19 @@ class AVGAppTestCase(testcase.AVGTestCase): raise RuntimeError('Cannot find the expected ' 'screenshot file %s' % screenshotFile) - g_Player.stop() + player.stop() class ScreenshotApp(TestAppBase): def init(self): self.singleKeyPress('s') self.singleKeyPress('s') self.timeStarted = time.time() - self.timerId = g_Player.setOnFrameHandler(self.onFrame) + self.timerId = player.subscribe(player.ON_FRAME, self.onFrame) def onFrame(self): if (os.path.exists(expectedFiles[-1]) or time.time() - self.timeStarted > 1): - g_Player.clearInterval(self.timerId) + player.clearInterval(self.timerId) checkCallback() cleanup() @@ -131,7 +130,7 @@ class AVGAppTestCase(testcase.AVGTestCase): def enableGraphs(self): self.singleKeyPress('f') self.singleKeyPress('m') - g_Player.setTimeout(500, self.disableGraphs) + player.setTimeout(500, self.disableGraphs) def disableGraphs(self): self.singleKeyPress('m') @@ -145,15 +144,15 @@ class AVGAppTestCase(testcase.AVGTestCase): class ToggleKeysApp(TestAppBase): def init(self): self.keys = TOGGLE_KEYS[:] - g_Player.setTimeout(0, self.nextKey) + player.setTimeout(0, self.nextKey) def nextKey(self): if not self.keys: - g_Player.stop() + player.stop() else: key = self.keys.pop() self.singleKeyPress(key) - g_Player.setTimeout(0, self.nextKey) + player.setTimeout(0, self.nextKey) ToggleKeysApp.start(resolution=TEST_RESOLUTION) @@ -161,9 +160,9 @@ class AVGAppTestCase(testcase.AVGTestCase): class FakeFullscreenApp(TestAppBase): fakeFullscreen = True def init(self): - g_Player.setTimeout(0, g_Player.stop) + player.setTimeout(0, player.stop) - resolution = g_Player.getScreenResolution() + resolution = player.getScreenResolution() if os.name == 'nt': FakeFullscreenApp.start(resolution=resolution) else: diff --git a/src/test/AVTest.py b/src/test/AVTest.py index bc4e752..04de91e 100644 --- a/src/test/AVTest.py +++ b/src/test/AVTest.py @@ -1,7 +1,7 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # libavg - Media Playback Engine. -# Copyright (C) 2003-2011 Ulrich von Zadow +# 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 @@ -20,7 +20,7 @@ # Current versions can be found at www.libavg.de # -from libavg import avg +from libavg import avg, player from testcase import * class AVTestCase(AVGTestCase): @@ -32,35 +32,50 @@ class AVTestCase(AVGTestCase): def testEOF(self, node): def onEOF(): - Player.stop() + player.stop() def onNoEOF(): self.fail("No EOF") + def onSubscribeEOF(): + self.eofCalled = True + + self.eofCalled = False root = self.loadEmptyScene() root.appendChild(node) node.play() node.setEOFCallback(onEOF) - Player.setTimeout(100000, onNoEOF) - Player.play() - + node.subscribe(avg.Node.END_OF_FILE, onSubscribeEOF) + player.setTimeout(100000, onNoEOF) + player.play() + self.assert_(self.eofCalled) + def testVideoInfo(self): def checkInfo(): node.pause() + self.assertEqual(node.getContainerFormat(), "avi") self.assertEqual(node.getCurFrame(), 0) self.assertEqual(node.getCurTime(), 0) self.assertEqual(node.getDuration(), 1000) self.assertEqual(node.getBitrate(), 224064) self.assertEqual(node.getVideoCodec(), "mpeg4") self.assertEqual(node.getStreamPixelFormat(), "yuv420p") + self.assertEqual(node.getVideoDuration(), 1000) if isThreaded: self.assertEqual(node.getAudioCodec(), "mp2") self.assertEqual(node.getAudioSampleRate(), 44100) self.assertEqual(node.getNumAudioChannels(), 2) + self.assert_(node.getVideoDuration() >= 1000) + + def checkEnableSound(): + node = avg.VideoNode(href="mpeg1-48x48-sound.avi", threaded=isThreaded, + enablesound=False, parent=root) + node.pause() + self.assertEqual(node.getVideoCodec(), "mpeg4") + self.assertException(node.getAudioCodec) def checkExceptions(): - node = avg.VideoNode(href="../video/testfiles/mpeg1-48x48.mpg", - threaded=isThreaded) + node = avg.VideoNode(href="mpeg1-48x48.mov", threaded=isThreaded) self.assertException(node.getDuration) self.assertException(node.getBitrate) self.assertException(node.getVideoCodec) @@ -72,24 +87,27 @@ class AVTestCase(AVGTestCase): root.appendChild(node) def checkAudioFile(): - node = avg.VideoNode(href="../video/testfiles/44.1kHz_16bit_stereo.wav", - threaded=isThreaded, parent=root) + node = avg.VideoNode(href="44.1kHz_16bit_stereo.wav", threaded=isThreaded, + parent=root) self.assertException(node.pause) + sys.stderr.write("\n") for isThreaded in (False, True): + sys.stderr.write(" Threaded: " + str(isThreaded) + "\n") root = self.loadEmptyScene() - node = avg.VideoNode(href="../video/testfiles/mpeg1-48x48-sound.avi", - threaded=isThreaded, parent=root) + node = avg.VideoNode(href="mpeg1-48x48-sound.avi", threaded=isThreaded, + parent=root) checkInfo() + checkEnableSound() checkExceptions() - self.start(( - checkInfo, + self.start(False, + (checkInfo, checkExceptions, checkAudioFile, )) + sys.stderr.write(" Nonstandard queue length\n") root = self.loadEmptyScene() - node = avg.VideoNode(href="../video/testfiles/mpeg1-48x48-sound.avi", - queuelength=23, parent=root) + node = avg.VideoNode(href="mpeg1-48x48-sound.avi", queuelength=23, parent=root) self.assertEqual(node.queuelength, 23) def testVideoFiles(self): @@ -98,11 +116,11 @@ class AVTestCase(AVGTestCase): node.volume = volume def testGetVolume(volume): - self.assertEqual(node.volume, volume) + self.assertAlmostEqual(node.volume, volume) def checkImage(filename): if not(isThreaded): - self.compareImage("testVideo-"+filename+"1", False) + self.compareImage("testVideo-"+filename+"1") def testInfo(): if filename == "mpeg1-48x48-sound.avi" and isThreaded: @@ -113,14 +131,14 @@ class AVTestCase(AVGTestCase): filename == "vp6a-yuva-48x48.flv") == node.hasAlpha()) root = self.loadEmptyScene() - node = avg.VideoNode(href="../video/testfiles/"+filename, volume=0.8, - size=(96,96), threaded=isThreaded) + node = avg.VideoNode(href=filename, volume=0.8, size=(96,96), + threaded=isThreaded) self.assertEqual(node.threaded, isThreaded) setVolume(0.6) root.appendChild(node) self.assertException(node.hasAudio) - self.start(( - lambda: setVolume(0.5), + self.start(False, + (lambda: setVolume(0.5), lambda: testGetVolume(0.5), lambda: node.play(), lambda: checkImage(filename), @@ -129,47 +147,48 @@ class AVTestCase(AVGTestCase): testInfo, lambda: node.stop() )) - videoFiles = ["mjpeg-48x48.avi", "mpeg1-48x48.mpg", "mpeg1-48x48-sound.avi", + videoFiles = ["mjpeg-48x48.avi", "mpeg1-48x48.mov", #"mpeg1-48x48-sound.avi", "rgba-48x48.mov", "h264-48x48.h264", "vp6a-yuva-48x48.flv"] - print + sys.stderr.write("\n") for filename in videoFiles: - print " " + filename + sys.stderr.write(" "+filename+"\n") for isThreaded in [False, True]: - print " threaded: ", isThreaded + sys.stderr.write(" threaded: "+str(isThreaded)+"\n") testVideoFile(filename, isThreaded) def testPlayBeforeConnect(self): - node = avg.VideoNode(href="../video/testfiles/mpeg1-48x48.mpg", threaded=False) + node = avg.VideoNode(href="media/mpeg1-48x48.mov", threaded=False) node.play() - root = self.loadEmptyScene() + player.createMainCanvas(size=(160,120)) + root = player.getRootNode() root.insertChild(node, 0) - Player.setFakeFPS(25) - self.start(( - lambda: self.assertEqual(node.size, (48, 48)), - lambda: self.compareImage("testPlayBeforeConnect", False), + player.setFakeFPS(25) + self.start(False, + (lambda: self.assertEqual(node.size, (48, 48)), + lambda: self.compareImage("testPlayBeforeConnect"), )) def testVideoState(self): for accelerated in [True, False]: root = self.loadEmptyScene() - node = avg.VideoNode(href="../video/testfiles/mpeg1-48x48.mpg", size=(96,96), - threaded=False, accelerated=accelerated, parent=root) - Player.setFakeFPS(25) - self.start(( - lambda: node.play(), - lambda: self.compareImage("testVideoState1", False), + node = avg.VideoNode(href="mpeg1-48x48.mov", size=(96,96), threaded=False, + accelerated=accelerated, parent=root) + player.setFakeFPS(25) + self.start(False, + (lambda: node.play(), + lambda: self.compareImage("testVideoState1"), lambda: node.pause(), - lambda: self.compareImage("testVideoState2", False), - lambda: self.compareImage("testVideoState2", False), + lambda: self.compareImage("testVideoState2"), + lambda: self.compareImage("testVideoState2"), lambda: node.play(), - lambda: self.compareImage("testVideoState3", False), + lambda: self.compareImage("testVideoState3"), lambda: node.stop(), - lambda: self.compareImage("testVideoState4", False), + lambda: self.compareImage("testVideoState4"), lambda: node.pause(), - lambda: self.compareImage("testVideoState5", False), - lambda: self.compareImage("testVideoState5", False), + lambda: self.compareImage("testVideoState5"), + lambda: self.compareImage("testVideoState5"), lambda: node.stop(), - lambda: self.compareImage("testVideoState4", False), + lambda: self.compareImage("testVideoState4"), )) def testVideoActive(self): @@ -180,15 +199,15 @@ class AVTestCase(AVGTestCase): node.active=1 root = self.loadEmptyScene() - node = avg.VideoNode(href="../video/testfiles/mpeg1-48x48.mpg", size=(96,96), - threaded=False, parent=root) - Player.setFakeFPS(25) - self.start(( - lambda: node.play(), + node = avg.VideoNode(href="mpeg1-48x48.mov", size=(96,96), threaded=False, + parent=root) + player.setFakeFPS(25) + self.start(False, + (lambda: node.play(), deactivate, - lambda: self.compareImage("testVideoActive1", False), + lambda: self.compareImage("testVideoActive1"), activate, - lambda: self.compareImage("testVideoActive2", False) + lambda: self.compareImage("testVideoActive2") )) def testVideoHRef(self): @@ -196,11 +215,11 @@ class AVTestCase(AVGTestCase): self.assertEqual(node.getMediaSize(), (48, 48)) def setHRefLoaded(): - node.href = "../video/testfiles/h264-48x48.h264" + node.href = "h264-48x48.h264" def setHRefUnloaded(): node = avg.VideoNode() - node.href = "../video/testfiles/h264-48x48.h264" + node.href = "h264-48x48.h264" node.play() def testVideoNotFound(): @@ -210,19 +229,24 @@ class AVTestCase(AVGTestCase): # Now libavg notices the missing file. self.assertException(node.play) + def testVideoBroken(): + node = avg.VideoNode(href="rgb24-64x64.png") + self.assertException(node.play) + root = self.loadEmptyScene() - node = avg.VideoNode(href="../video/testfiles/mpeg1-48x48.mpg", threaded=False, - parent=root) - Player.setFakeFPS(25) + node = avg.VideoNode(href="mpeg1-48x48.mov", threaded=False, parent=root) + player.setFakeFPS(25) testVideoNotFound() + testVideoBroken() setHRefUnloaded() - self.start(( - lambda: node.play(), + self.start(False, + (lambda: node.play(), testGetMediaSize, setHRefLoaded, - lambda: self.compareImage("testVideoHRef1", False), + lambda: self.compareImage("testVideoHRef1"), testGetMediaSize, - testVideoNotFound + testVideoNotFound, + testVideoBroken )) def testVideoOpacity(self): @@ -233,22 +257,22 @@ class AVTestCase(AVGTestCase): def show(): self.videoNode.opacity=1 - Player.setFakeFPS(25) + player.setFakeFPS(25) root = self.loadEmptyScene() self.videoNode = avg.VideoNode(href=filename, loop=True, threaded=False, parent=root) - self.start(( - lambda: self.videoNode.play(), + self.start(False, + (lambda: self.videoNode.play(), None, - lambda: self.compareImage(testImgName+"1", False), + lambda: self.compareImage(testImgName+"1"), hide, None, None, show, - lambda: self.compareImage(testImgName+"2", False) + lambda: self.compareImage(testImgName+"2") )) - testWithFile("../video/testfiles/rgba-48x48.mov", "testVideoOpacityRGBA") - testWithFile("../video/testfiles/mpeg1-48x48.mpg", "testVideoOpacityYUV") + testWithFile("rgba-48x48.mov", "testVideoOpacityRGBA") + testWithFile("mpeg1-48x48.mov", "testVideoOpacityYUV") def testVideoSeek(self): def seek(frame): @@ -257,53 +281,46 @@ class AVTestCase(AVGTestCase): def checkCurFrame(): self.assertEqual(videoNode.getCurFrame(), 26) - Player.setFakeFPS(25) + player.setFakeFPS(25) for useCustomFPS in [False, True]: root = self.loadEmptyScene() if useCustomFPS: videoNode = avg.VideoNode(parent=root, loop=True, size=(96,96), fps=25, - threaded=False, href="../video/testfiles/mjpeg-48x48.avi") + threaded=False, href="mjpeg-48x48.avi") else: videoNode = avg.VideoNode(parent=root, loop=True, size=(96,96), - threaded=False, href="../video/testfiles/mjpeg-48x48.avi") + threaded=False, href="mjpeg-48x48.avi") videoNode.play() seek(26) - self.start(( - checkCurFrame, - lambda: self.compareImage("testVideoSeek0", False), + self.start(False, + (checkCurFrame, + lambda: self.compareImage("testVideoSeek0"), lambda: seek(100), - lambda: self.compareImage("testVideoSeek1", False), + lambda: self.compareImage("testVideoSeek1"), lambda: videoNode.pause(), lambda: seek(26), None, - lambda: self.compareImage("testVideoSeek2", False), + lambda: self.compareImage("testVideoSeek2"), lambda: videoNode.play(), None, - lambda: self.compareImage("testVideoSeek3", False) + lambda: self.compareImage("testVideoSeek3") )) def checkSeek(): seek(26) self.assertNotEqual(videoNode.getCurFrame(), 0) - root = self.loadEmptyScene() - videoNode = avg.VideoNode(parent=root, loop=True, fps=25, - href="../video/testfiles/mjpeg-48x48.avi") - videoNode.play() - seek(5) - self.start((checkSeek,)) - def testVideoFPS(self): - Player.setFakeFPS(25) + player.setFakeFPS(25) root = self.loadEmptyScene() root = root videoNode = avg.VideoNode(size=(80,80), loop=True, threaded=False, - href="../video/testfiles/mjpeg-48x48.avi", fps=250, parent=root) - self.start(( - lambda: videoNode.play(), + href="mjpeg-48x48.avi", fps=250, parent=root) + self.start(False, + (lambda: videoNode.play(), None, - lambda: self.compareImage("testVideoFPS", False) + lambda: self.compareImage("testVideoFPS") )) def testVideoLoop(self): @@ -313,19 +330,19 @@ class AVTestCase(AVGTestCase): def onFrame(): if self.eof: if not(threaded): - self.compareImage("testVideoLoop", False) - Player.stop() + self.compareImage("testVideoLoop") + player.stop() for threaded in [False, True]: self.eof = False - Player.setFakeFPS(25) + player.setFakeFPS(25) root = self.loadEmptyScene() videoNode = avg.VideoNode(parent=root, loop=True, fps=25, size=(96,96), - threaded=threaded, href="../video/testfiles/mpeg1-48x48.mpg") - videoNode.setEOFCallback(onEOF) + threaded=threaded, href="mpeg1-48x48.mov") + videoNode.subscribe(avg.Node.END_OF_FILE, onEOF) videoNode.play() - Player.setOnFrameHandler(onFrame) - Player.play() + player.subscribe(player.ON_FRAME, onFrame) + player.play() def testVideoMask(self): def testWithFile(filename, testImgName): @@ -335,29 +352,26 @@ class AVTestCase(AVGTestCase): def setOpacity(): video.opacity = 0.5 - Player.setFakeFPS(25) + player.setFakeFPS(25) root = self.loadEmptyScene() video = avg.VideoNode(href=filename, threaded=False, parent=root) video.play() - self.start([ - lambda: setMask("mask.png"), - lambda: self.compareImage(testImgName+"1", False), + self.start(False, + (lambda: setMask("mask.png"), + lambda: self.compareImage(testImgName+"1"), lambda: video.seekToFrame(10), lambda: setMask(""), - lambda: self.compareImage(testImgName+"2", False), + lambda: self.compareImage(testImgName+"2"), lambda: setMask("mask2.png"), - lambda: self.compareImage(testImgName+"3", False), + lambda: self.compareImage(testImgName+"3"), setOpacity, - lambda: self.compareImage(testImgName+"4", False), - ]) + lambda: self.compareImage(testImgName+"4"), + )) - if not(self._hasShaderSupport()): - return - - testWithFile("../video/testfiles/mpeg1-48x48.mpg", "testVideoMaskYUV") - testWithFile("../video/testfiles/mjpeg-48x48.avi", "testVideoMaskYUVJ") - testWithFile("../video/testfiles/rgba-48x48.mov", "testVideoMaskRGBA") + testWithFile("mpeg1-48x48.mov", "testVideoMaskYUV") + testWithFile("mjpeg-48x48.avi", "testVideoMaskYUVJ") + testWithFile("rgba-48x48.mov", "testVideoMaskRGBA") def testException(self): class TestException(Exception): @@ -366,46 +380,68 @@ class AVTestCase(AVGTestCase): def throwException(): raise TestException - Player.setFakeFPS(0.1) + player.setFakeFPS(0.1) videoNode = avg.VideoNode(threaded = False) - videoNode.href = "./testmediadir/mjpeg-48x48.avi" - videoNode.setEOFCallback(throwException) + videoNode.href = "../testmediadir/mjpeg-48x48.avi" + videoNode.subscribe(avg.Node.END_OF_FILE, throwException) root = self.loadEmptyScene() - avg.Player.get().getRootNode().appendChild(videoNode) + root.appendChild(videoNode) self.__exceptionThrown = False try: - self.start(( - videoNode.pause, - lambda: videoNode.seekToFrame(videoNode.getNumFrames()), - videoNode.play, - lambda: None)) + self.start(False, + (videoNode.pause, + lambda: videoNode.seekToFrame(videoNode.getNumFrames()), + videoNode.play, + lambda: None + )) except TestException: self.__exceptionThrown = True self.assert_(self.__exceptionThrown) def testVideoEOF(self): - Player.setFakeFPS(25) - for filename in ["mpeg1-48x48.mpg", "mpeg1-48x48-sound.avi"]: - node = avg.VideoNode(href="../video/testfiles/"+filename) + player.setFakeFPS(25) + for filename in ["mpeg1-48x48.mov", "mpeg1-48x48-sound.avi"]: + node = avg.VideoNode(href=filename) self.testEOF(node) - node = avg.VideoNode(href="../video/testfiles/mpeg1-48x48.mpg", opacity=0) + node = avg.VideoNode(href="mpeg1-48x48.mov", opacity=0) self.testEOF(node) root = self.loadEmptyScene() - video = avg.VideoNode(href="../video/testfiles/mpeg1-48x48.mpg", threaded=False, + video = avg.VideoNode(href="mpeg1-48x48.mov", threaded=False, parent=root) - Player.setFakeFPS(0.1) - - video.setEOFCallback(lambda: foo) # Should never be called - self.start([ - lambda: video.setEOFCallback(None), + player.setFakeFPS(0.1) + + # Should never be called + eofID = video.subscribe(avg.Node.END_OF_FILE, lambda: self.assert_(False)) + self.start(False, + (lambda: video.unsubscribe(avg.Node.END_OF_FILE, eofID), video.play, None - ]) + )) + + def testVideoSeekAfterEOF(self): + def onEOF(): + node.seekToTime(0) + player.subscribe(avg.Player.ON_FRAME, onFrame) + def onFrame(): + if node.getCurTime() < 100: + self.compareImage("testSeekAfterEOF") + player.stop() + + def onNoEOF(): + self.fail("No EOF") + + player.setFakeFPS(25) + root = self.loadEmptyScene() + node = avg.VideoNode(href="mpeg1-48x48.mov", parent=root) + node.play() + node.subscribe(avg.VideoNode.END_OF_FILE, onEOF) + player.setTimeout(100000, onNoEOF) + player.play() def testSound(self): def testSoundFile(filename): @@ -413,13 +449,12 @@ class AVTestCase(AVGTestCase): node.volume = volume def testGetVolume(volume): - self.assertEqual(node.volume, volume) + self.assertAlmostEqual(node.volume, volume) root = self.loadEmptyScene() - node = avg.SoundNode(href="../video/testfiles/"+filename, - parent=root) - self.start(( - lambda: setVolume(0.5), + node = avg.SoundNode(href=filename, parent=root) + self.start(False, + (lambda: setVolume(0.5), lambda: testGetVolume(0.5), lambda: node.play(), None, @@ -435,10 +470,12 @@ class AVTestCase(AVGTestCase): lambda: testGetVolume(0.3), lambda: node.pause() )) - Player.setFakeFPS(-1) - Player.volume = 0 + player.setFakeFPS(-1) + player.volume = 0 + # "44.1kHz_mono.ogg" not tested for now - broken under Windows. + # Assuming buggy ffmpeg version. for filename in ["22.050Hz_16bit_mono.wav", "44.1kHz_16bit_stereo.aif", - "44.1kHz_16bit_stereo.wav", "44.1kHz_mono.ogg", "44.1kHz_stereo.mp3", + "44.1kHz_16bit_stereo.wav", "44.1kHz_stereo.mp3", "48kHz_24bit_stereo.wav"]: testSoundFile(filename) @@ -450,40 +487,50 @@ class AVTestCase(AVGTestCase): self.assertEqual(node.getNumAudioChannels(), 2) def checkExceptions(): - node = avg.SoundNode(href="../video/testfiles/44.1kHz_16bit_stereo.wav") + node = avg.SoundNode(href="44.1kHz_16bit_stereo.wav") self.assertException(node.getAudioCodec) self.assertException(node.getAudioSampleRate) self.assertException(node.getNumAudioChannels) def checkVideoFile(): - node = avg.SoundNode(href="../video/testfiles/mpeg1-48x48.mpg", - parent=root) + node = avg.SoundNode(href="mpeg1-48x48.mov", parent=root) self.assertException(node.pause) root = self.loadEmptyScene() - node = avg.SoundNode(href="../video/testfiles/44.1kHz_16bit_stereo.wav", - parent=root) + node = avg.SoundNode(href="44.1kHz_16bit_stereo.wav", parent=root) checkInfo() checkExceptions() - self.start(( - checkInfo, + self.start(False, + (checkInfo, checkExceptions, checkVideoFile, )) + def testSoundSeek(self): + player.setFakeFPS(-1) + player.volume = 0 + root = self.loadEmptyScene() + soundNode = avg.SoundNode(parent=root, href="44.1kHz_16bit_stereo.wav") + soundNode.play() + soundNode.seekToTime(500) + self.start(False, + (None, + lambda: soundNode.seekToTime(200), + )) + + def testBrokenSound(self): def openSound(): - node = avg.SoundNode(href="../video/testfiles/44.1kHz_16bit_6Chan.ogg", - parent=root) + node = avg.SoundNode(href="44.1kHz_16bit_6Chan.ogg", parent=root) self.assertException(node.play) root = self.loadEmptyScene() - self.start([openSound]) + self.start(False, [openSound]) def testSoundEOF(self): - Player.setFakeFPS(-1) - Player.volume = 0 - node = avg.SoundNode(href="../video/testfiles/44.1kHz_16bit_mono.wav") + player.setFakeFPS(-1) + player.volume = 0 + node = avg.SoundNode(href="44.1kHz_16bit_mono.wav") self.testEOF(node) def testVideoWriter(self): @@ -511,50 +558,56 @@ class AVTestCase(AVGTestCase): videoNode.opacity = 1 def checkVideo(numFrames): - savedVideoNode = avg.VideoNode(href="test.mov", pos=(48,0), threaded=False, - parent=root) + savedVideoNode = avg.VideoNode(href="../test.mov", pos=(48,0), + threaded=False, parent=root) savedVideoNode.pause() self.assertEqual(savedVideoNode.getVideoCodec(), "mjpeg") self.assertEqual(savedVideoNode.getNumFrames(), numFrames) self.assertEqual(savedVideoNode.getStreamPixelFormat(), "yuvj420p") def testCreateException(): - self.assertException(lambda: avg.VideoWriter(Player.getMainCanvas(), + self.assertException(lambda: avg.VideoWriter(player.getMainCanvas(), "nonexistentdir/test.mov", 30)) if not(self._isCurrentDirWriteable()): - self.skip("Current dir not writeable") + self.skip("Current dir not writeable.") + return + if player.isUsingGLES(): + self.skip("VideoWriter not supported under GLES.") return + self.assertException(lambda: + avg.VideoWriter(player.getMainCanvas(), "test.mov", 30, 3, 5, False)) + for useCanvas in (False, True): - Player.setFakeFPS(30) + player.setFakeFPS(30) root = self.loadEmptyScene() - videoNode = avg.VideoNode(href="../video/testfiles/mpeg1-48x48.mpg", - threaded=False) + videoNode = avg.VideoNode(href="mpeg1-48x48.mov", threaded=False) if useCanvas: - canvas = Player.createCanvas(id="canvas", size=(48,48)) + canvas = player.createCanvas(id="canvas", size=(48,48), + mediadir="media") canvas.getRootNode().appendChild(videoNode) avg.ImageNode(parent=root, href="canvas:canvas") testImageName = "testVideoWriterCanvas" else: root.appendChild(videoNode) - canvas = Player.getMainCanvas() + canvas = player.getMainCanvas() testImageName = "testVideoWriter" - self.start(( - videoNode.play, + self.start(False, + (videoNode.play, lambda: startWriter(30, True), - lambda: self.delay(66), + lambda: self.delay(100), stopWriter, killWriter, lambda: checkVideo(4), hideVideo, - lambda: self.compareImage(testImageName+"1", False), + lambda: self.compareImage(testImageName+"1"), showVideo, testCreateException, lambda: startWriter(15, False), - lambda: self.delay(100), + lambda: self.delay(150), stopWriter, killWriter, lambda: checkVideo(2), @@ -572,23 +625,22 @@ class AVTestCase(AVGTestCase): os.remove("test.mov") def test2VideosAtOnce(self): - Player.setFakeFPS(25) + player.setFakeFPS(25) self.loadEmptyScene() - root = Player.getRootNode() + root = player.getRootNode() for pos in ((0,0), (80,0)): - video = avg.VideoNode(pos=pos, threaded=False, - href="../video/testfiles/mpeg1-48x48.mpg", parent=root) + video = avg.VideoNode(pos=pos, threaded=False, href="mpeg1-48x48.mov", + parent=root) video.play() - self.start([lambda: self.compareImage("test2VideosAtOnce1", False),]) + self.start(False, + [lambda: self.compareImage("test2VideosAtOnce1"),]) def testVideoAccel(self): accelConfig = avg.VideoNode.getVideoAccelConfig() - video = avg.VideoNode(threaded=False, accelerated=False, - href="../video/testfiles/mpeg1-48x48.mpg") + video = avg.VideoNode(accelerated=False, href="media/mpeg1-48x48.mov") video.play() self.assertEqual(video.accelerated, False) - video = avg.VideoNode(threaded=False, accelerated=True, - href="../video/testfiles/mpeg1-48x48.mpg") + video = avg.VideoNode(accelerated=True, href="media/mpeg1-48x48.mov") video.play() self.assertEqual(video.accelerated, (accelConfig != avg.NO_ACCELERATION)) @@ -597,6 +649,7 @@ def AVTestSuite(tests): availableTests = [ "testSound", "testSoundInfo", + "testSoundSeek", "testBrokenSound", "testSoundEOF", "testVideoInfo", @@ -611,6 +664,7 @@ def AVTestSuite(tests): "testVideoLoop", "testVideoMask", "testVideoEOF", + "testVideoSeekAfterEOF", "testException", "testVideoWriter", "test2VideosAtOnce", @@ -618,4 +672,3 @@ def AVTestSuite(tests): ] return createAVGTestSuite(availableTests, AVTestCase, tests) -Player = avg.Player.get() diff --git a/src/test/AnimTest.py b/src/test/AnimTest.py index bdd80cc..7ba49cc 100644 --- a/src/test/AnimTest.py +++ b/src/test/AnimTest.py @@ -1,7 +1,7 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # libavg - Media Playback Engine. -# Copyright (C) 2003-2011 Ulrich von Zadow +# 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 @@ -20,9 +20,7 @@ # Current versions can be found at www.libavg.de # -import unittest - -from libavg import avg +from libavg import avg, player from testcase import * class AnimTestCase(AVGTestCase): @@ -33,7 +31,7 @@ class AnimTestCase(AVGTestCase): root = self.loadEmptyScene() self.__node = avg.ImageNode(id="test", pos=(64,30), href="rgb24-65x65.png", parent=root) - Player.setFakeFPS(10) + player.setFakeFPS(10) def testAnimType(self, curAnim, imgBaseName): def onStop(): @@ -54,27 +52,27 @@ class AnimTestCase(AVGTestCase): self.__anim.setStopCallback(onStop) self.__onStopCalled = False self.assertException(lambda: self.__anim.start()) - self.start(( - startAnim, - lambda: self.compareImage(imgBaseName+"1", False), - lambda: self.compareImage(imgBaseName+"2", False), - lambda: self.compareImage(imgBaseName+"3", False), + self.start(False, + (startAnim, + lambda: self.compareImage(imgBaseName+"1"), + lambda: self.compareImage(imgBaseName+"2"), + lambda: self.compareImage(imgBaseName+"3"), lambda: self.assert_(self.__onStopCalled), lambda: self.assert_(not(self.__anim.isRunning())), lambda: self.assertEqual(avg.getNumRunningAnims(), 0), - lambda: self.compareImage(imgBaseName+"4", False), + lambda: self.compareImage(imgBaseName+"4"), lambda: self.assertEqual(self.__node.x, 100), startAnim, - lambda: self.compareImage(imgBaseName+"1", False), + lambda: self.compareImage(imgBaseName+"1"), lambda: self.assertEqual(avg.getNumRunningAnims(), 1), abortAnim, lambda: self.assertEqual(avg.getNumRunningAnims(), 0), - lambda: self.compareImage(imgBaseName+"5", False), + lambda: self.compareImage(imgBaseName+"5"), lambda: self.assert_(not(self.__anim.isRunning())), None, lambda: self.assert_(self.__onStopCalled), startKeepAttr, - lambda: self.compareImage(imgBaseName+"6", False), + lambda: self.compareImage(imgBaseName+"6"), lambda: self.assertEqual(avg.getNumRunningAnims(), 1) )) self.__anim = None @@ -92,15 +90,15 @@ class AnimTestCase(AVGTestCase): self.__onStopBeforeOnStart = self.__onStopCalled self.initScene() - sameNode = Player.getElementByID("test") + sameNode = player.getElementByID("test") anim1 = avg.LinearAnim(self.__node, "x", 500, 0, 100, False, None, on1Stop) anim2 = avg.LinearAnim(sameNode, "x", 300, 0, 100, False, on2Start) self.__onStopCalled = False self.__onStopBeforeOnStart = False - self.start(( - lambda: anim1.start(), + self.start(False, + (lambda: anim1.start(), lambda: self.assert_(not(self.__onStopCalled)), lambda: anim2.start(), lambda: self.assert_(self.__onStopBeforeOnStart), @@ -116,11 +114,11 @@ class AnimTestCase(AVGTestCase): self.initScene() self.__node.opacity=0.5 self.__onStopCalled = False - self.start(( - lambda: avg.fadeIn(self.__node, 200, 1, onStop), - lambda: self.compareImage("testFadeIn1", False), - lambda: self.compareImage("testFadeIn2", False), - lambda: self.compareImage("testFadeIn3", False), + self.start(False, + (lambda: avg.fadeIn(self.__node, 200, 1, onStop), + lambda: self.compareImage("testFadeIn1"), + lambda: self.compareImage("testFadeIn2"), + lambda: self.compareImage("testFadeIn3"), lambda: self.assert_(self.__onStopCalled), lambda: self.assertEqual(avg.getNumRunningAnims(), 0) )) @@ -133,11 +131,11 @@ class AnimTestCase(AVGTestCase): self.initScene() self.__node.opacity=0.5 self.__onStopCalled = False - self.start(( - lambda: avg.fadeOut(self.__node, 200, onStop), - lambda: self.compareImage("testFadeOut1", False), - lambda: self.compareImage("testFadeOut2", False), - lambda: self.compareImage("testFadeOut3", False), + self.start(False, + (lambda: avg.fadeOut(self.__node, 200, onStop), + lambda: self.compareImage("testFadeOut1"), + lambda: self.compareImage("testFadeOut2"), + lambda: self.compareImage("testFadeOut3"), lambda: self.assert_(self.__onStopCalled), lambda: self.assertEqual(avg.getNumRunningAnims(), 0) )) @@ -159,9 +157,9 @@ class AnimTestCase(AVGTestCase): self.initScene() self.__anim = avg.LinearAnim(self.__node, "x", 0, 0, 100, False, None, onStop) self.__onStopCalled = False - self.start(( - startAnim, - lambda: self.compareImage("testLinearAnimZeroDurationC1", False), + self.start(False, + (startAnim, + lambda: self.compareImage("testLinearAnimZeroDurationC1"), lambda: self.assertEqual(avg.getNumRunningAnims(), 0), lambda: self.assert_(self.__onStopCalled), lambda: self.assert_(not(self.__anim.isRunning())) @@ -180,10 +178,10 @@ class AnimTestCase(AVGTestCase): anim.start() self.initScene() - self.start(( - forth, - lambda: self.delay(300), - )) + self.start(False, + (forth, + lambda: self.delay(300), + )) def testPointAnim(self): def startAnim(): @@ -196,32 +194,29 @@ class AnimTestCase(AVGTestCase): self.initScene() self.__anim = avg.LinearAnim(self.__node, "pos", 200, avg.Point2D(0,0), avg.Point2D(100,40), False) - self.start(( - startAnim, - lambda: self.compareImage("testPointAnim1", False), - lambda: self.compareImage("testPointAnim2", False), + self.start(False, + (startAnim, + lambda: self.compareImage("testPointAnim1"), + lambda: self.compareImage("testPointAnim2"), None, lambda: self.assert_(not(self.__anim.isRunning())), startKeepAttr, - lambda: self.compareImage("testPointAnim3", False), + lambda: self.compareImage("testPointAnim3"), )) def testIntAnim(self): - def startAnim(): - self.__anim.start() - self.initScene() self.__doubleAnim = avg.LinearAnim(self.__node, "x", 300, 0, 100, True) self.__pointAnim = avg.LinearAnim(self.__node, "pos", 200, avg.Point2D(0,0), avg.Point2D(100,40), True) - self.start(( - self.__doubleAnim.start, + self.start(False, + (self.__doubleAnim.start, lambda: self.delay(100), - lambda: self.compareImage("testIntAnim1", False), + lambda: self.compareImage("testIntAnim1"), self.__doubleAnim.abort, self.__pointAnim.start, lambda: self.delay(100), - lambda: self.compareImage("testIntAnim2", False), + lambda: self.compareImage("testIntAnim2"), )) def testEaseInOutAnim(self): @@ -247,17 +242,17 @@ class AnimTestCase(AVGTestCase): self.__animStarted = False self.__animStopped = False - self.start(( - self.__anim.start, + self.start(False, + (self.__anim.start, lambda: self.assert_(self.__animStarted), - lambda: self.compareImage("testContinuousAnim1", False), + lambda: self.compareImage("testContinuousAnim1"), self.__anim.abort, lambda: self.assert_(self.__animStopped), reset, self.__anim.start, self.__linearAnim.start, lambda: self.assert_(self.__animStopped), - lambda: self.compareImage("testContinuousAnim2", False), + lambda: self.compareImage("testContinuousAnim2"), self.__linearAnim.abort, )) @@ -271,8 +266,8 @@ class AnimTestCase(AVGTestCase): self.initScene() self.__endCalled = False - self.start(( - startAnim, + self.start(False, + (startAnim, lambda: self.assert_(self.anim.isRunning()), lambda: self.delay(200), lambda: self.assert_(not(self.anim.isRunning())), @@ -318,24 +313,24 @@ class AnimTestCase(AVGTestCase): node = avg.ImageNode(id=str(i), pos=(64, i*20), href="rgb24-64x64.png") root.appendChild(node) self.nodes.append(node) - Player.setFakeFPS(10) + player.setFakeFPS(10) self.__endCalled = False - self.start(( - startFireForgetAnim, + self.start(False, + (startFireForgetAnim, lambda: self.assertEqual(avg.getNumRunningAnims(), 2), None, startAnim, lambda: self.assertEqual(avg.getNumRunningAnims(), 3), - lambda: self.compareImage("testParallelAnimC1", False), + lambda: self.compareImage("testParallelAnimC1"), lambda: self.assert_(self.anim.isRunning()), lambda: self.delay(200), lambda: self.assert_(not(self.anim.isRunning())), - lambda: self.compareImage("testParallelAnimC2", False), + lambda: self.compareImage("testParallelAnimC2"), lambda: self.assert_(self.__endCalled), lambda: self.assertEqual(avg.getNumRunningAnims(), 0), startAnim, abortAnim, - lambda: self.compareImage("testParallelAnimC3", False), + lambda: self.compareImage("testParallelAnimC3"), lambda: self.assert_(self.__endCalled), lambda: self.assertEqual(avg.getNumRunningAnims(), 0), startTimedAnim, @@ -356,8 +351,8 @@ class AnimTestCase(AVGTestCase): avg.LinearAnim(self.__node, "x", 300, 0, 100, False, None).start() self.initScene() - self.start(( - makeAnims, + self.start(False, + (makeAnims, None )) @@ -387,25 +382,80 @@ class AnimTestCase(AVGTestCase): self.__state1StopCallbackCalled = False self.__state2StartCallbackCalled = False self.__stop1Start2CallbackOrder = False - self.start(( - makeAnim, - lambda: self.compareImage("testStateAnimC1", False), + self.start(False, + (makeAnim, + lambda: self.compareImage("testStateAnimC1"), lambda: self.anim.setState("STATE1"), None, - lambda: self.compareImage("testStateAnimC2", False), + lambda: self.compareImage("testStateAnimC2"), lambda: self.assertEqual(self.anim.getState(), "STATE2"), - lambda: self.compareImage("testStateAnimC3", False), + lambda: self.compareImage("testStateAnimC3"), lambda: self.assert_(self.__state1StopCallbackCalled), lambda: self.assert_(self.__state2StartCallbackCalled), lambda: self.assert_(self.__stop1Start2CallbackOrder), lambda: self.assertEqual(self.anim.getState(), "STATE3"), - lambda: self.compareImage("testStateAnimC4", False), + lambda: self.compareImage("testStateAnimC4"), lambda: self.anim.setState("STATE1"), lambda: self.assertEqual(avg.getNumRunningAnims(), 1), - lambda: self.compareImage("testStateAnimC5", False), + lambda: self.compareImage("testStateAnimC5"), killAnim, -# lambda: Player.getTestHelper().dumpObjects() +# lambda: player.getTestHelper().dumpObjects() + )) + + def testNonNodeAttrAnim(self): + class GenericClass(object): + def __init__(self): + self.numberValue = 0 + self.pointValue = avg.Point2D(0.0, 0.0) + + def on1Stop(): + self.__onStopCalled = True + + def on2Start(): + self.__onStopBeforeOnStart = self.__onStopCalled + + self.loadEmptyScene() + player.setFakeFPS(10) + genericObject1 = GenericClass() + genericObject2 = genericObject1 + genericObject3 = GenericClass() + anim1 = avg.LinearAnim(genericObject1, "numberValue", 1000, 0, 100, + False, None, on1Stop) + anim2 = avg.LinearAnim(genericObject2, "numberValue", 1200, 0, 200, + False, on2Start) + anim3 = avg.LinearAnim(genericObject1, "pointValue", 800, (0, 0), (100, 200)) + anim4 = avg.LinearAnim(genericObject3, "numberValue", 400, 0, 42) + self.__onStopCalled = False + self.__onStopBeforeOnStart = False + self.start(False, + (lambda: anim1.start(), + lambda: self.assert_(anim1.isRunning()), + lambda: self.assert_(not(self.__onStopCalled)), + lambda: anim2.start(), + lambda: self.assert_(self.__onStopBeforeOnStart), + lambda: self.assert_(not(anim1.isRunning())), + lambda: self.assert_(anim2.isRunning()), + lambda: self.assertEqual(avg.getNumRunningAnims(), 1), + lambda: anim3.start(), + lambda: self.assert_(anim2.isRunning()), + lambda: self.assert_(anim3.isRunning()), + lambda: self.assertEqual(avg.getNumRunningAnims(), 2), + lambda: anim4.start(), + lambda: self.assert_(anim4.isRunning()), + lambda: self.assertEqual(avg.getNumRunningAnims(), 3), + lambda: self.delay(200), + lambda: self.assertEqual(avg.getNumRunningAnims(), 0), + lambda: self.assert_(genericObject1.numberValue == 200), + lambda: self.assert_(genericObject2.pointValue == (100, 200)), + lambda: self.assert_(genericObject3.numberValue == 42) )) + anim1 = None + anim2 = None + anim3 = None + anim4 = None + genericObject1 = None + genericObject2 = None + genericObject3 = None def animTestSuite(tests): @@ -425,7 +475,7 @@ def animTestSuite(tests): "testParallelAnim", "testParallelAnimRegistry", "testStateAnim", + "testNonNodeAttrAnim" ) return createAVGTestSuite(availableTests, AnimTestCase, tests) -Player = avg.Player.get() diff --git a/src/test/AppTest.py b/src/test/AppTest.py new file mode 100644 index 0000000..547cf9a --- /dev/null +++ b/src/test/AppTest.py @@ -0,0 +1,314 @@ +#!/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 +# +# Original author of this file is OXullo Interecans <x at brainrapers dot org> + + +import os +import sys +import tempfile +import libavg +from libavg import player +from libavg.app import settings +from libavg.app import keyboardmanager +from libavg.app.settings import Option +import testcase + +class SuppressOutput(object): + class Blackhole(object): + def write(self, *args): + pass + + def __init__(self): + self.__savedStreams = [sys.stdout, sys.stderr] + + def __enter__(self): + sys.stdout = self.Blackhole() + sys.stderr = self.Blackhole() + + def __exit__(self, *args): + sys.stdout, sys.stderr = self.__savedStreams + + +class TestApp(libavg.app.App): + CUSTOM_SETTINGS = {'app_resolution': '160x120', 'app_window_size': '160x120'} + + def testRun(self, onFrameHandlersList=[], mainDiv=None, runtimeOptions={}): + assert type(onFrameHandlersList) == list + self.__onFrameHandlersList = onFrameHandlersList + player.subscribe(player.ON_FRAME, self.__onFrame) + player.setFramerate(10000) + player.assumePixelsPerMM(1) + for k, v in self.CUSTOM_SETTINGS.iteritems(): + self.settings.set(k, v) + + if mainDiv is None: + mainDiv = libavg.app.MainDiv() + + self.run(mainDiv, **runtimeOptions) + + def __onFrame(self): + if self.__onFrameHandlersList: + todo = self.__onFrameHandlersList.pop(0) + todo() + else: + player.stop() + + +class AppTestCase(testcase.AVGTestCase): + def testSettingsOptions(self): + self.assertRaises(ValueError, lambda: settings.Option('test', 1)) + + self.assertRaises(RuntimeError, lambda: settings.Settings( + [Option('foo', 'bar'), Option('foo', 'bar')])) + + s = settings.Settings([Option('foo', 'bar')]) + self.assertRaises(RuntimeError, lambda: s.addOption(Option('foo', 'baz'))) + + def testSettingsTypes(self): + defaults = [ + Option('test_boolean', 'True', 'help'), + Option('test_string', 'string'), + Option('another_value_int', '1234'), + Option('test_2d', '1280x1024'), + Option('test_2d_alt','1280,1024'), + Option('test_float','12.345'), + Option('test_json','[1, null,3 , "string", 12.345]') + ] + + s = settings.Settings(defaults) + + self.assertEquals(s.getBoolean('test_boolean'), True) + + self.assertEquals(type(s.get('test_string')), str) + self.assertRaises(ValueError, lambda: s.getBoolean('test_string')) + + self.assertEquals(s.getInt('another_value_int'), 1234) + self.assertRaises(ValueError, lambda: s.getInt('test_string')) + self.assertEquals(s.get('another_value_int'), '1234') + + self.assertEquals(s.getPoint2D('test_2d'), libavg.Point2D(1280, 1024)) + self.assertEquals(s.getPoint2D('test_2d_alt'), libavg.Point2D(1280, 1024)) + self.assertRaises(ValueError, lambda: s.getInt('test_2d')) + + self.assertEquals(s.getFloat('test_float'), 12.345) + + self.assertEquals(s.getJson('test_json'), [1, None, 3, 'string', 12.345]) + + def testSettingsSet(self): + s = settings.Settings() + s.addOption(Option('test_value', '')) + self.assertRaises(ValueError, lambda: s.set('test_value', 1234)) + + s.set('test_value', '1234') + self.assertEquals(s.getInt('test_value'), 1234) + + def testSettingsHasOption(self): + s = settings.Settings() + s.addOption(Option('test_value', '')) + self.assertEquals(s.hasOption('test_value'), True) + self.assertEquals(s.hasOption('test_value_foo'), False) + + def testSettingsArgvExtender(self): + s = settings.Settings([Option('foo_bar', 'bar')]) + e = settings.ArgvExtender('', args=['foo', '--foo-bar', 'baz', '-c', 'baz2']) + e.parser.add_option('-c') + s.applyExtender(e) + self.assertEquals(s.get('foo_bar'), 'baz') + self.assertEquals(e.parsedArgs[0].c, 'baz2') + self.assertEquals(e.parsedArgs[1], ['foo']) + + e = settings.ArgvExtender('', args=['foo', '--foo-baxxx', 'baz']) + with SuppressOutput(): + self.assertRaises(SystemExit, lambda: s.applyExtender(e)) + + def testSettingsKargsExtender(self): + s = settings.Settings([Option('foo_bar', 'bar')]) + e = settings.KargsExtender({'foo_bar': 'baz'}) + s.applyExtender(e) + self.assertEquals(s.get('foo_bar'), 'baz') + + e = settings.KargsExtender({'foo_baxxx': 'baz'}) + self.assertRaises(RuntimeError, lambda: s.applyExtender(e)) + + def testAppAdditionalSettings(self): + app = TestApp() + app.settings.addOption(Option('foo_bar', 'baz')) + app.settings.addOption(Option('bar_foo', 'baz')) + self.assertEquals(app.settings.get('foo_bar'), 'baz') + + def testAppRuntimeSettings(self): + app = TestApp() + app.settings.addOption(Option('foo_bar', 'baz')) + app.testRun([ + lambda: self.assertEquals(libavg.app.instance.settings.get('foo_bar'), + 'bar'), + ], + runtimeOptions={'foo_bar':'bar'}) + + def testAppRuntimeSettingsFail(self): + app = TestApp() + self.assertRaises(RuntimeError, + lambda: app.testRun(runtimeOptions={'foo_bar':'bar'})) + + def testAppInstance(self): + app = TestApp() + self.assertEquals(app, libavg.app.instance) + + def testAppResolution(self): + app = TestApp() + app.testRun([ + lambda: self.assertEquals(player.getRootNode().size, (160, 120)), + lambda: self.assert_(not player.isFullscreen()), + ]) + + def testAppDefaultWindowSize(self): + app = TestApp() + app.CUSTOM_SETTINGS = {'app_resolution': '160x120'} + app.testRun() + + def testAppFullscreen(self): + app = TestApp() + app.settings.set('app_fullscreen', 'true') + app.testRun([ + lambda: self.assert_(player.isFullscreen()), + ]) + + def testAppRotation(self): + app = TestApp() + app.settings.set('app_rotation', 'left') + app.testRun([ + lambda: self.assertEquals(player.getRootNode().size, (120, 160)), + ]) + + def testScreenshot(self): + tempDir = tempfile.gettempdir() + expectedFiles = map(lambda v: os.path.join(tempDir, v), + ['TestApp-001.png', 'TestApp-002.png']) + + def removeFiles(): + for file in expectedFiles: + if os.path.exists(file): + os.unlink(file) + + def testScreenshots(): + for file in expectedFiles: + self.assert_(os.path.exists(file)) + + removeFiles() + app = TestApp() + app.testRun([ + lambda: app.takeScreenshot(tempDir), + lambda: app.takeScreenshot(tempDir), + testScreenshots, + removeFiles, + ]) + + def testKeyboardManagerPlain(self): + tester = lambda: self.__emuKeyPress(0, 97, 'a', 97, libavg.avg.KEYMOD_NONE) + self.__testKeyboardManager('a', libavg.avg.KEYMOD_NONE, tester) + + def testKeyboardManagerPlainMod(self): + tester = lambda: self.__emuKeyPress(0, 97, 'a', 97, libavg.avg.KEYMOD_LSHIFT) + self.__testKeyboardManager('a', libavg.avg.KEYMOD_SHIFT, tester) + + def testKeyboardManagerUnicodeBinary(self): + tester = lambda: self.__emuKeyPress(53, 164, 'ö', 246, libavg.avg.KEYMOD_NONE) + self.__testKeyboardManager('ö', libavg.avg.KEYMOD_NONE, tester) + + def testKeyboardManagerUnicodeExplicit(self): + tester = lambda: self.__emuKeyPress(53, 164, 'ö', 246, libavg.avg.KEYMOD_NONE) + self.__testKeyboardManager(u'ö', libavg.avg.KEYMOD_NONE, tester) + + def testKeyboardManagerUnicodeMod(self): + tester = lambda: self.__emuKeyPress(0, 65, 'A', 65, libavg.avg.KEYMOD_LSHIFT) + self.__testKeyboardManager(u'A', keyboardmanager.KEYMOD_ANY, tester) + self.tearDown() + self.__testKeyboardManager(u'A', libavg.avg.KEYMOD_SHIFT, tester) + + def tearDown(self): + libavg.app.instance = None + + def __testKeyboardManager(self, keyString, modifiers, tester): + self.statesRecords = [False, False] + def keyDownPressed(): + self.statesRecords[0] = True + + def keyUpPressed(): + self.statesRecords[1] = True + + def bindKeys(): + keyboardmanager.bindKeyDown(keyString, keyDownPressed, '', modifiers) + keyboardmanager.bindKeyUp(keyString, keyUpPressed, '', modifiers) + + def reset(): + keyboardmanager.unbindKeyDown(keyString, modifiers) + keyboardmanager.unbindKeyUp(keyString, modifiers) + self.statesRecords = [False, False] + + def cleanup(): + del self.statesRecords + + app = TestApp() + app.testRun([ + bindKeys, + tester, + lambda: self.assert_(all(self.statesRecords)), + reset, + tester, + lambda: self.assert_(not any(self.statesRecords)), + cleanup, + ]) + + def __emuKeyPress(self, scanCode, keyCode, keyString, unicode_, modifiers): + helper = libavg.player.getTestHelper() + helper.fakeKeyEvent(libavg.avg.Event.KEY_DOWN, scanCode, keyCode, keyString, + unicode_, modifiers) + # Note: on up, unicode is always 0 + helper.fakeKeyEvent(libavg.avg.Event.KEY_UP, scanCode, keyCode, keyString, + 0, modifiers) + + +def appTestSuite(tests): + availableTests = ( + 'testSettingsOptions', + 'testSettingsTypes', + 'testSettingsSet', + 'testSettingsHasOption', + 'testSettingsArgvExtender', + 'testSettingsKargsExtender', + 'testAppAdditionalSettings', + 'testAppRuntimeSettings', + 'testAppRuntimeSettingsFail', + 'testAppInstance', + 'testAppResolution', + 'testAppDefaultWindowSize', + 'testAppFullscreen', + 'testAppRotation', + 'testScreenshot', + 'testKeyboardManagerPlain', + 'testKeyboardManagerPlainMod', + 'testKeyboardManagerUnicodeBinary', + 'testKeyboardManagerUnicodeExplicit', + 'testKeyboardManagerUnicodeMod', + ) + return testcase.createAVGTestSuite(availableTests, AppTestCase, tests) + diff --git a/src/test/DynamicsTest.py b/src/test/DynamicsTest.py index cc247f4..522c2f0 100644 --- a/src/test/DynamicsTest.py +++ b/src/test/DynamicsTest.py @@ -1,7 +1,7 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # libavg - Media Playback Engine. -# Copyright (C) 2003-2011 Ulrich von Zadow +# 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 @@ -20,7 +20,7 @@ # Current versions can be found at www.libavg.de # -from libavg import avg +from libavg import avg, player from testcase import * class DynamicsTestCase(AVGTestCase): @@ -41,25 +41,26 @@ class DynamicsTestCase(AVGTestCase): node.y = 20 self.root.appendChild(node) self.assertException(setNodeID) - self.assertEqual(self.root.indexOf(Player.getElementByID("nodeid1")), 0) + 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") + oldNode = player.getElementByID("nodeid1") self.root.insertChildBefore(node, oldNode) def reorderNode(): self.root.reorderChild(0, 1) - node = Player.getElementByID("nodeid1") + node = player.getElementByID("nodeid1") self.root.reorderChild(node, 0) def removeNodes(): - self.node = Player.getElementByID("nodeid1") + self.node = player.getElementByID("nodeid1") self.root.removeChild(self.root.indexOf(self.node)) - node2 = Player.getElementByID("nodeid2") + node2 = player.getElementByID("nodeid2") self.root.removeChild(node2) - self.assertEqual(Player.getElementByID("nodeid1"), None) + self.assertEqual(player.getElementByID("nodeid1"), None) def reAddNode(): self.root.appendChild(self.node) @@ -68,34 +69,34 @@ class DynamicsTestCase(AVGTestCase): self.node = None def killNode(): - self.node = Player.getElementByID("nodeid1") + self.node = player.getElementByID("nodeid1") self.node.unlink(True) - gone = Player.getElementByID("nodeid1") + gone = player.getElementByID("nodeid1") self.assertEqual(gone, None) def removeAgain(): - node = Player.getElementByID("nodeid1") + node = player.getElementByID("nodeid1") node.unlink() - gone = Player.getElementByID("nodeid1") + gone = player.getElementByID("nodeid1") self.assertEqual(gone, None) def runTest(useXml): self.root = self.loadEmptyScene() createNode1(useXml) - Player.stop() + player.stop() self.root = self.loadEmptyScene() - Player.setFakeFPS(25) - self.start(( - lambda: createNode1(useXml), - lambda: self.compareImage(testName+"1", warnOnImageDiff), + player.setFakeFPS(25) + self.start(warnOnImageDiff, + (lambda: createNode1(useXml), + lambda: self.compareImage(testName+"1"), lambda: createNode2(useXml), - lambda: self.compareImage(testName+"2", warnOnImageDiff), + lambda: self.compareImage(testName+"2"), reorderNode, - lambda: self.compareImage(testName+"3", warnOnImageDiff), + lambda: self.compareImage(testName+"3"), removeNodes, - lambda: self.compareImage(testName+"4", warnOnImageDiff), + lambda: self.compareImage(testName+"4"), reAddNode, - lambda: self.compareImage(testName+"5", warnOnImageDiff), + lambda: self.compareImage(testName+"5"), killNode, reAddNode, removeAgain @@ -107,9 +108,9 @@ class DynamicsTestCase(AVGTestCase): def testImgDynamics(self): def createImg(useXml): if useXml: - node = Player.createNode("<image href='rgb24-64x64.png'/>") + node = player.createNode("<image href='rgb24-64x64.png'/>") else: - node = Player.createNode("image", {"href":"rgb24-64x64.png"}) + node = player.createNode("image", {"href":"rgb24-64x64.png"}) return node self.__runDynamicsTest(createImg, "testImgDynamics") @@ -117,13 +118,11 @@ class DynamicsTestCase(AVGTestCase): def testVideoDynamics(self): def createVideo(useXml): if useXml: - node = Player.createNode( - "<video href='../video/testfiles/mpeg1-48x48.mpg'" - " threaded='false'/>") + node = player.createNode( + "<video href='mpeg1-48x48.mov' threaded='false'/>") else: - node = Player.createNode("video", - {"href":"../video/testfiles/mpeg1-48x48.mpg", - "threaded":False}) + node = player.createNode("video", + {"href":"mpeg1-48x48.mov", "threaded":False}) node.play() return node @@ -132,9 +131,9 @@ class DynamicsTestCase(AVGTestCase): def testWordsDynamics(self): def createWords(useXml): if useXml: - node = Player.createNode("<words text='test'/>") + node = player.createNode("<words text='test'/>") else: - node = Player.createNode("words", {"text":"test"}) + node = player.createNode("words", {"text":"test"}) node.font="Bitstream Vera Sans" node.fontsize=12 node.width=200 @@ -142,33 +141,17 @@ class DynamicsTestCase(AVGTestCase): self.__runDynamicsTest(createWords, "testWordsDynamics", False, True) - def testPanoDynamics(self): - def createPano(useXml): - if useXml: - node = Player.createNode(""" - <panoimage href='panoimage.png' sensorwidth='4.60' - sensorheight='3.97' focallength='12' - width='160' height='120'/> - """) - else: - node = Player.createNode("panoimage", - {"href":"panoimage.png", "sensorwidth":4.60, "sensorheight":3.97, - "focallength":12, "width":160, "height":120}) - return node - - self.__runDynamicsTest(createPano, "testPanoDynamics") - def testDivDynamics(self): def createDiv(useXml): if useXml: - node = Player.createNode(""" + node = player.createNode(""" <div> <image href='rgb24-64x64.png'/> </div> """) else: node = avg.DivNode() - imgNode = avg.ImageNode(href="rgb24-64x64.png", parent=node) + avg.ImageNode(href="rgb24-64x64.png", parent=node) return node self.__runDynamicsTest(createDiv, "testDivDynamics") @@ -178,8 +161,8 @@ class DynamicsTestCase(AVGTestCase): 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(( - self.assertException(lambda: avg.ImageNode(href="rgb24-64x64.png", + self.start(False, + (self.assertException(lambda: avg.ImageNode(href="rgb24-64x64.png", id="testdup", parent=root)), )) @@ -191,23 +174,23 @@ class DynamicsTestCase(AVGTestCase): root = self.loadEmptyScene() self.assertException(changeParent) - self.start((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"}) + node = player.createNode("image", {"id": "img", "href":"rgb24-64x64.png"}) parentNode.appendChild(node) - node.setEventHandler(avg.CURSORDOWN, avg.MOUSE, captureMouseDown) - parentNode.setEventHandler(avg.CURSORUP, avg.MOUSE, mainMouseUp) + node.subscribe(avg.Node.CURSOR_DOWN, captureMouseDown) + parentNode.subscribe(avg.Node.CURSOR_UP, mainMouseUp) def setEventCapture(): - Player.getElementByID("img").setEventCapture() + player.getElementByID("img").setEventCapture() def deleteImg(): parentNode = root - node = Player.getElementByID("img") + node = player.getElementByID("img") parentNode.removeChild(parentNode.indexOf(node)) def captureMouseDown(event): @@ -216,19 +199,16 @@ class DynamicsTestCase(AVGTestCase): def mainMouseUp(event): self.mainMouseUpCalled = True - Helper = Player.getTestHelper() self.captureMouseDownCalled = False self.mainMouseUpCalled = False root = self.loadEmptyScene() - self.start(( - createImg, + self.start(False, + (createImg, setEventCapture, - lambda: Helper.fakeMouseEvent(avg.CURSORDOWN, True, False, False, - 100, 10, 1), + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 100, 10), lambda: self.assert_(self.captureMouseDownCalled), deleteImg, - lambda: Helper.fakeMouseEvent(avg.CURSORUP, True, False, False, - 100, 10, 1), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 100, 10), lambda: self.assert_(self.mainMouseUpCalled) )) @@ -242,21 +222,21 @@ class DynamicsTestCase(AVGTestCase): return True def setHandler (node, s, swallow = False): - node.setEventHandler(avg.CURSORDOWN, avg.MOUSE, + 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}) + 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}) + 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}) + 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}) + node = player.createNode("div", {'x':60,'y':40,'width':30, 'height':30}) setHandler (node, 'd', True) parentNode.appendChild(node) @@ -264,17 +244,17 @@ class DynamicsTestCase(AVGTestCase): self.__eventString = '' root = self.loadEmptyScene() - self.start(( - 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'), + 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): @@ -282,17 +262,17 @@ class DynamicsTestCase(AVGTestCase): imgNode.id = "imageid" def createDiv(): - imgNode = Player.createNode("image", + imgNode = player.createNode("image", {"id":"imageid", "href":"rgb24-64x64.png"}) - node = Player.createNode("div", {"id":"divid"}) + 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 = player.getElementByID("divid") + imgNode = player.getElementByID("imageid") node.unlink() imgNode.id = "imageid" imgNode.unlink() @@ -303,22 +283,22 @@ class DynamicsTestCase(AVGTestCase): root = self.loadEmptyScene() createDiv() removeDiv() - Player.stop() + player.stop() root = self.loadEmptyScene() - Player.setFakeFPS(25) - self.start(( - createDiv, - lambda: self.compareImage("testComplexDiv1", False), + player.setFakeFPS(25) + self.start(False, + (createDiv, + lambda: self.compareImage("testComplexDiv1"), removeDiv, - lambda: self.compareImage("testComplexDiv1", False), + lambda: self.compareImage("testComplexDiv1"), )) def testNodeCustomization(self): def testNodePythonAttribute(): - node1 = Player.createNode("image", {"id":"foo", "pos":(23, 42)}) + node1 = player.createNode("image", {"id":"foo", "pos":(23, 42)}) root.appendChild(node1) node1.customAttribute = "bbb" - node2 = Player.getElementByID("foo") + node2 = player.getElementByID("foo") self.assertEqual(node1, node2) self.assertEqual(node2.customAttribute, "bbb") node1.unlink(True) @@ -328,8 +308,7 @@ class DynamicsTestCase(AVGTestCase): class CustomImageNode(avg.ImageNode): def __init__(self, p, parent=None, **kwargs): avg.ImageNode.__init__(self, pos=p, href="rgb24-64x64.png", **kwargs) - if parent: - parent.appendChild(self) + self.registerInstance(self, parent) def customMethod(self): pass @@ -337,28 +316,31 @@ class DynamicsTestCase(AVGTestCase): class CustomDivNode(avg.DivNode): def __init__(self, parent=None, **kwargs): avg.DivNode.__init__(self, **kwargs) - if parent: - parent.appendChild(self) + self.registerInstance(self, parent) CustomImageNode((23,42), parent=self) - customNode = avg.ImageNode(id="foo") - self.assertEqual(customNode.id, "foo") - CustomImageNode((23, 42), parent=root) + 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(1) + 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.getParent() -# print type(retrievedDiv) -# self.assertEqual(type(retrievedDiv), CustomDivNode) + 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() @@ -370,13 +352,13 @@ class DynamicsTestCase(AVGTestCase): root = self.loadEmptyScene() root.mediadir="testmediadir" - imageNode1 = Player.createNode("image", {"href": "rgb24-64x64a.png"}) - imageNode2 = Player.createNode("image", {"href": "rgb24-64x64a.png", "x":30}) + imageNode1 = player.createNode("image", {"href": "rgb24-64x64a.png"}) + imageNode2 = player.createNode("image", {"href": "rgb24-64x64a.png", "x":30}) root.appendChild(imageNode2) - self.start(( - lambda: self.compareImage("testDynamicMediaDir1", False), + self.start(False, + (lambda: self.compareImage("testDynamicMediaDir1"), attachNode, - lambda: self.compareImage("testDynamicMediaDir2", False) + lambda: self.compareImage("testDynamicMediaDir2") )) @@ -385,7 +367,6 @@ def dynamicsTestSuite(tests): "testImgDynamics", "testVideoDynamics", "testWordsDynamics", - # "testPanoDynamics", "testDivDynamics", "testEventBubbling", "testDuplicateID", @@ -393,9 +374,7 @@ def dynamicsTestSuite(tests): "testDynamicEventCapture", "testComplexDiv", "testNodeCustomization", - "testDynamicMediaDir" + "testDynamicMediaDir", ) return createAVGTestSuite(availableTests, DynamicsTestCase, tests) - -Player = avg.Player.get() diff --git a/src/test/EventTest.py b/src/test/EventTest.py index 8287be5..afdfe94 100644 --- a/src/test/EventTest.py +++ b/src/test/EventTest.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # libavg - Media Playback Engine. -# Copyright (C) 2003-2011 Ulrich von Zadow +# 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 @@ -19,13 +19,7 @@ # Current versions can be found at www.libavg.de # -import unittest - -import time -import math -import sys - -from libavg import avg +from libavg import avg, player from testcase import * def dumpMouseEvent(Event): @@ -42,12 +36,12 @@ mainMouseDownCalled = False def mainMouseUp(Event): global mainMouseUpCalled - assert (Event.type == avg.CURSORUP) + assert (Event.type == avg.Event.CURSOR_UP) mainMouseUpCalled = True def mainMouseDown(Event): global mainMouseDownCalled - assert (Event.type == avg.CURSORDOWN) + assert (Event.type == avg.Event.CURSOR_DOWN) mainMouseDownCalled = True @@ -56,28 +50,37 @@ class EventTestCase(AVGTestCase): AVGTestCase.__init__(self, testFuncName) def testKeyEvents(self): - def onKeyDown(Event): - if Event.keystring == 'A' and Event.keycode == 65 and Event.unicode == 65: + def onKeyDown(event): + if event.keystring == 'A' and event.keycode == 65 and event.unicode == 65: self.keyDownCalled = True - def onKeyUp(Event): - if Event.keystring == 'A' and Event.keycode == 65 and Event.unicode == 65: + def onKeyUp(event): + if event.keystring == 'A' and event.keycode == 65 and event.unicode == 65: self.keyUpCalled = True - + + def onSubscribeKeyDown(event): + self.subscribeKeyDownCalled = True + + def onSubscribeKeyUp(event): + self.subscribeKeyUpCalled = True + root = self.loadEmptyScene() - root.setEventHandler(avg.KEYDOWN, avg.NONE, onKeyDown) - root.setEventHandler(avg.KEYUP, avg.NONE, onKeyUp) - self.start(( - lambda: Helper.fakeKeyEvent(avg.KEYDOWN, 65, 65, "A", 65, + root.setEventHandler(avg.Event.KEY_DOWN, avg.Event.NONE, onKeyDown) + root.setEventHandler(avg.Event.KEY_UP, avg.Event.NONE, onKeyUp) + player.subscribe(avg.Player.KEY_DOWN, onSubscribeKeyDown) + player.subscribe(avg.Player.KEY_UP, onSubscribeKeyUp) + self.start(False, + (lambda: Helper.fakeKeyEvent(avg.Event.KEY_DOWN, 65, 65, "A", 65, + avg.KEYMOD_NONE), + lambda: self.assert_(self.keyDownCalled and self.subscribeKeyDownCalled), + lambda: Helper.fakeKeyEvent(avg.Event.KEY_UP, 65, 65, "A", 65, avg.KEYMOD_NONE), - lambda: self.assert_(self.keyDownCalled), - lambda: Helper.fakeKeyEvent(avg.KEYUP, 65, 65, "A", 65, avg.KEYMOD_NONE), - lambda: self.assert_(self.keyUpCalled) + lambda: self.assert_(self.keyUpCalled and self.subscribeKeyUpCalled) )) def testSimpleEvents(self): def getMouseState(): - Event = Player.getMouseState() + Event = player.getMouseState() self.assertEqual(Event.pos, avg.Point2D(10,10)) root = self.loadEmptyScene() @@ -87,45 +90,47 @@ class EventTestCase(AVGTestCase): img2 = avg.ImageNode(pos=(64,0), href="rgb24-65x65.png", parent=root) handlerTester2 = NodeHandlerTester(self, img2) - self.start(( - # down, getMouseState(), move, up. + self.start(False, + (# down, getMouseState(), move, up. # events are inside img1 but outside img2. - lambda: self.assert_(not(Player.isMultitouchAvailable())), - lambda: Helper.fakeMouseEvent(avg.CURSORDOWN, True, False, False, - 10, 10, 1), + lambda: self.assert_(not(player.isMultitouchAvailable())), + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 10, 10), lambda: handlerTester1.assertState( - down=True, up=False, over=True, out=False, move=False), - lambda: handlerTester2.assertState( - down=False, up=False, over=False, out=False, move=False), + (avg.Node.CURSOR_DOWN, avg.Node.CURSOR_OVER)), + lambda: handlerTester2.assertState(()), getMouseState, - lambda: Helper.fakeMouseEvent(avg.CURSORMOTION, True, False, False, - 12, 12, 1), - lambda: handlerTester1.assertState( - down=False, up=False, over=False, out=False, move=True), + lambda: self._sendMouseEvent(avg.Event.CURSOR_MOTION, 12, 12), + lambda: handlerTester1.assertState((avg.Node.CURSOR_MOTION,)), - lambda: Helper.fakeMouseEvent(avg.CURSORUP, False, False, False, - 12, 12, 1), - lambda: handlerTester1.assertState( - down=False, up=True, over=False, out=False, move=False) + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 12, 12), + lambda: handlerTester1.assertState((avg.Node.CURSOR_UP,)) )) def testTilted(self): root = self.loadEmptyScene() - root = root img = avg.ImageNode(pos=(0,0), href="rgb24-65x65.png", angle=0.785, parent=root) handlerTester = NodeHandlerTester(self, img) - self.start(( - lambda: Helper.fakeMouseEvent(avg.CURSORDOWN, True, False, False, - 32, 32, 1), + self.start(False, + (lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 32, 32), lambda: handlerTester.assertState( - down=True, up=False, over=True, out=False, move=False), - lambda: Helper.fakeMouseEvent(avg.CURSORUP, False, False, False, - 0, 0, 1), + (avg.Node.CURSOR_DOWN, avg.Node.CURSOR_OVER)), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 0, 0), + lambda: handlerTester.assertState((avg.Node.CURSOR_OUT,)), + )) + + def testWordsClicks(self): + root = self.loadEmptyScene() + words = avg.WordsNode(pos=(40,40), alignment="right", text="test", parent=root) + handlerTester = NodeHandlerTester(self, words) + self.start(False, + (lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 45, 45), + lambda: handlerTester.assertState(()), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 35, 45), lambda: handlerTester.assertState( - down=False, up=False, over=False, out=True, move=False), + (avg.Node.CURSOR_UP, avg.Node.CURSOR_OVER)), )) def testDivEvents(self): @@ -136,31 +141,66 @@ class EventTestCase(AVGTestCase): img = avg.ImageNode(pos=(0,0), href="rgb24-65x65.png", parent=div) imgHandlerTester = NodeHandlerTester(self, img) - self.start(( - # down, move, up. + self.start(False, + (# down, move, up. # events are inside img and therefore should bubble to div. - lambda: Helper.fakeMouseEvent(avg.CURSORDOWN, True, False, False, - 10, 10, 1), + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 10, 10), lambda: divHandlerTester.assertState( - down=True, up=False, over=True, out=False, move=False), + (avg.Node.CURSOR_DOWN, avg.Node.CURSOR_OVER)), lambda: imgHandlerTester.assertState( - down=True, up=False, over=True, out=False, move=False), + (avg.Node.CURSOR_DOWN, avg.Node.CURSOR_OVER)), - lambda: Helper.fakeMouseEvent(avg.CURSORMOTION, True, False, False, - 12, 12, 1), - lambda: divHandlerTester.assertState( - down=False, up=False, over=False, out=False, move=True), - lambda: imgHandlerTester.assertState( - down=False, up=False, over=False, out=False, move=True), + lambda: self._sendMouseEvent(avg.Event.CURSOR_MOTION, 12, 12), + lambda: divHandlerTester.assertState((avg.Node.CURSOR_MOTION,)), + lambda: imgHandlerTester.assertState((avg.Node.CURSOR_MOTION,)), - lambda: Helper.fakeMouseEvent(avg.CURSORUP, False, False, False, - 12, 12, 1), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 12, 12), + lambda: divHandlerTester.assertState((avg.Node.CURSOR_UP,)), + lambda: imgHandlerTester.assertState((avg.Node.CURSOR_UP,)) + )) + + def testDivNegativePos(self): + root = self.loadEmptyScene() + div = avg.DivNode(pos=(10,10), parent=root) + divHandlerTester = NodeHandlerTester(self, div) + + img = avg.ImageNode(pos=(-10,-10), href="rgb24-65x65.png", parent=div) + imgHandlerTester = NodeHandlerTester(self, img) + + self.start(False, + (lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 1, 1), lambda: divHandlerTester.assertState( - down=False, up=True, over=False, out=False, move=False), + (avg.Node.CURSOR_DOWN, avg.Node.CURSOR_OVER)), lambda: imgHandlerTester.assertState( - down=False, up=True, over=False, out=False, move=False) + (avg.Node.CURSOR_DOWN, avg.Node.CURSOR_OVER)), )) + def testUnlinkInHandler(self): + def onImgDown(event): + self.__imgDownCalled = True + self.div.unlink(True) + + def onDivDown(event): + self.__divDownCalled = True + + def checkState(): + self.assert_(self.__imgDownCalled and not(self.__divDownCalled)) + + self.__imgDownCalled = False + self.__divDownCalled = False + root = self.loadEmptyScene() + self.div = avg.DivNode(pos=(0,0), parent=root) + self.div.connectEventHandler(avg.Event.CURSOR_DOWN, avg.Event.MOUSE, self, + onDivDown) + + img = avg.ImageNode(pos=(0,0), href="rgb24-65x65.png", parent=self.div) + img.connectEventHandler(avg.Event.CURSOR_DOWN, avg.Event.MOUSE, self, onImgDown) + + self.start(False, + (lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 10, 10), + checkState)) + + def testConnectHandler(self): def onDown1(event): self.down1Called = True @@ -173,13 +213,17 @@ class EventTestCase(AVGTestCase): self.down2Called = False def connectTwoHandlers(): - self.img.connectEventHandler(avg.CURSORDOWN, avg.MOUSE, self, onDown1) - self.img.connectEventHandler(avg.CURSORDOWN, avg.MOUSE, self, onDown2) + self.img.connectEventHandler(avg.Event.CURSOR_DOWN, avg.Event.MOUSE, self, + onDown1) + self.img.connectEventHandler(avg.Event.CURSOR_DOWN, avg.Event.MOUSE, self, + onDown2) def connectUnlinkHandler(): self.img.disconnectEventHandler(self) - self.img.connectEventHandler(avg.CURSORDOWN, avg.MOUSE, self, unlinkHandler) - self.img.connectEventHandler(avg.CURSORDOWN, avg.MOUSE, self, onDown2) + self.img.connectEventHandler(avg.Event.CURSOR_DOWN, avg.Event.MOUSE, self, + unlinkHandler) + self.img.connectEventHandler(avg.Event.CURSOR_DOWN, avg.Event.MOUSE, self, + onDown2) def unlinkHandler(event): self.img.disconnectEventHandler(self) @@ -193,8 +237,8 @@ class EventTestCase(AVGTestCase): self.img.disconnectEventHandler(self) resetDownCalled() - self.start(( - connectTwoHandlers, + self.start(False, + (connectTwoHandlers, lambda: self.fakeClick(10,10), lambda: self.assert_(self.down1Called and self.down2Called), resetDownCalled, @@ -205,6 +249,195 @@ class EventTestCase(AVGTestCase): lambda: self.fakeClick(10,10), )) + def testPublisher(self): + def onDown(event): + self.assert_(event.type == avg.Event.CURSOR_DOWN) + curEvent = player.getCurrentEvent() + self.assert_(curEvent.type == avg.Event.CURSOR_DOWN) + self.assert_(curEvent.when == event.when) + self.downCalled = True + + def unsubscribe(): + self.assert_(self.img.isSubscribed(avg.Node.CURSOR_DOWN, onDown)) + self.img.unsubscribe(avg.Node.CURSOR_DOWN, onDown) + self.assert_(not(self.img.isSubscribed(avg.Node.CURSOR_DOWN, onDown))) + self.assert_(self.img.getNumSubscribers(avg.Node.CURSOR_DOWN) == 0) + self.downCalled = False + self.assertException( + lambda: self.img.unsubscribe(avg.Node.CURSOR_DOWN, onDown)) + + def initUnsubscribeInEvent(useMessageID): + self.subscriberID = self.img.subscribe(avg.Node.CURSOR_DOWN, + lambda event: onDownUnsubscribe(event, useMessageID)) + + def onDownUnsubscribe(event, useMessageID): + if useMessageID: + self.img.unsubscribe(avg.Node.CURSOR_DOWN, self.subscriberID) + self.assertException(lambda: + self.img.unsubscribe(avg.Node.CURSOR_DOWN, self.subscriberID)) + else: + self.img.unsubscribe(self.subscriberID) + self.assertException(lambda: self.img.unsubscribe(self.subscriberID)) + + self.downCalled = True + + def onFrame(): + self.onFrameCalled = True + + self.downCalled = False + self.onFrameCalled = False + root = self.loadEmptyScene() + player.subscribe(player.ON_FRAME, onFrame) + self.img = avg.ImageNode(pos=(0,0), href="rgb24-65x65.png", parent=root) + self.img.subscribe(avg.Node.CURSOR_DOWN, onDown) + self.assertException(lambda: self.img.subscribe(23, onDown)) + self.assertException(lambda: self.img.unsubscribe(avg.Node.CURSOR_DOWN, 23)) + self.start(False, + (lambda: self.fakeClick(10,10), + lambda: self.assert_(self.downCalled), + lambda: self.assert_(self.onFrameCalled), + + unsubscribe, + lambda: self.fakeClick(10,10), + lambda: self.assert_(not(self.downCalled)), + + lambda: initUnsubscribeInEvent(True), + lambda: self.fakeClick(10,10), + lambda: self.assert_(self.downCalled), + + lambda: initUnsubscribeInEvent(False), + lambda: self.fakeClick(10,10), + lambda: self.assert_(self.downCalled), + )) + + def testComplexPublisher(self): + def setupUnsubscribe(): + self.downCalled = [False, False] + self.msgIDs = [] + for i in range(0,2): + self.msgIDs.append(self.img.subscribe(avg.Node.CURSOR_DOWN, + lambda event, i=i: onUnsubscribeDown(i))) + + def onUnsubscribeDown(i): + self.downCalled[i] = True + for j in range(0,2): + self.img.unsubscribe(avg.Node.CURSOR_DOWN, self.msgIDs[j]) + + def assertCorrectUnsubscribe(): + # Exactly one of the two callbacks should have been invoked + self.assert_(self.downCalled[0] != self.downCalled[1]) + + def setupSubscribe(): + self.downCalled = [False, False] + self.msgIDs = [] + self.msgIDs.append(self.img.subscribe(avg.Node.CURSOR_DOWN, + lambda event: onSubscribeDown())) + + def onSubscribeDown(): + self.downCalled[0] = True + self.msgIDs.append(self.img.subscribe(avg.Node.CURSOR_DOWN, + lambda event: onSecondSubscribeDown())) + + def onSecondSubscribeDown(): + self.downCalled[1] = True + + def assertDownsCalled(expectedState): + self.assert_(self.downCalled == expectedState) + + root = self.loadEmptyScene() + self.img = avg.ImageNode(pos=(0,0), href="rgb24-65x65.png", parent=root) + + self.start(False, + (# Subscribe twice to an event, unsubscribe both during processing of the + # first. Second shouldn't be called anymore. + lambda: setupUnsubscribe(), + lambda: self.fakeClick(10,10), + assertCorrectUnsubscribe, + + # Subscribe to an event, subscribe again during event processing. + # The second one shouldn't be called immediately. + lambda: setupSubscribe(), + lambda: self.fakeClick(10,10), + lambda: assertDownsCalled([True, False]), + lambda: self.fakeClick(10,10), + lambda: assertDownsCalled([True, True]), + )) + + def testPublisherAutoDelete(self): + + class TestSubscriber(): + def __init__(self): + self.__downCalled = False + + def subscribe(self, node): + node.subscribe(avg.Node.CURSOR_DOWN, self.onDown) + + def subscribeLambda(self, node): + node.subscribe(avg.Node.CURSOR_DOWN, lambda event: self.onDown(event)) + + def onDown(self, event): + self.__downCalled = True + + def hasClicked(self): + return self.__downCalled + + def removeSubscriber(): + del self.subscriber; + + root = self.loadEmptyScene() + self.img = avg.ImageNode(pos=(0,0), href="rgb24-65x65.png", parent=root) + self.subscriber = TestSubscriber() + self.subscriber.subscribe(self.img) + self.start(False, + (lambda: self.fakeClick(10,10), + lambda: self.assert_(self.subscriber.hasClicked()), + removeSubscriber, + lambda: self.fakeClick(10,10), + lambda: self.assert_( + self.img.getNumSubscribers(avg.Node.CURSOR_DOWN) == 0) + )) + + + def testPublisherNestedUnsubscribe(self): + + class TestPublisher(avg.Publisher): + + OUTER_EVENT = avg.Publisher.genMessageID() + INNER_EVENT = avg.Publisher.genMessageID() + + def __init__(self): + super(TestPublisher, self).__init__() + self.publish(TestPublisher.OUTER_EVENT) + self.publish(TestPublisher.INNER_EVENT) + + def generateEvent(self): + self.notifySubscribers(TestPublisher.OUTER_EVENT, []) + + def generateInnerEvent(self): + self.notifySubscribers(TestPublisher.INNER_EVENT, []) + + def onEvent(): + self.publisher.generateInnerEvent() + + def onEvent2(): + self.event2Called = True; + + def onInnerEvent(): + self.publisher.unsubscribe(TestPublisher.OUTER_EVENT, onEvent) + self.publisher.unsubscribe(TestPublisher.OUTER_EVENT, onEvent2) + + self.loadEmptyScene() + self.publisher = TestPublisher() + self.publisher.subscribe(TestPublisher.OUTER_EVENT, onEvent2) + self.publisher.subscribe(TestPublisher.OUTER_EVENT, onEvent) + self.publisher.subscribe(TestPublisher.INNER_EVENT, onInnerEvent) + self.event2Called = False + self.start(False, + (self.publisher.generateEvent, + )) + self.assert_(not(self.event2Called)) + + def testObscuringEvents(self): root = self.loadEmptyScene() img1 = avg.ImageNode(pos=(0,0), href="rgb24-65x65.png", parent=root) @@ -212,29 +445,21 @@ class EventTestCase(AVGTestCase): img2 = avg.ImageNode(pos=(0,0), href="rgb24-65x65.png", parent=root) handlerTester2 = NodeHandlerTester(self, img2) - self.start(( - # down, move, up. + self.start(False, + (# down, move, up. # events should only arrive at img2 because img1 is obscured by img1. - lambda: Helper.fakeMouseEvent(avg.CURSORDOWN, True, False, False, - 10, 10, 1), - lambda: handlerTester1.assertState( - down=False, up=False, over=False, out=False, move=False), + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 10, 10), + lambda: handlerTester1.assertState(()), lambda: handlerTester2.assertState( - down=True, up=False, over=True, out=False, move=False), + (avg.Node.CURSOR_DOWN, avg.Node.CURSOR_OVER)), - lambda: Helper.fakeMouseEvent(avg.CURSORMOTION, True, False, False, - 12, 12, 1), - lambda: handlerTester1.assertState( - down=False, up=False, over=False, out=False, move=False), - lambda: handlerTester2.assertState( - down=False, up=False, over=False, out=False, move=True), + lambda: self._sendMouseEvent(avg.Event.CURSOR_MOTION, 12, 12), + lambda: handlerTester1.assertState(()), + lambda: handlerTester2.assertState((avg.Node.CURSOR_MOTION,)), - lambda: Helper.fakeMouseEvent(avg.CURSORUP, False, False, False, - 12, 12, 1), - lambda: handlerTester1.assertState( - down=False, up=False, over=False, out=False, move=False), - lambda: handlerTester2.assertState( - down=False, up=True, over=False, out=False, move=False) + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 12, 12), + lambda: handlerTester1.assertState(()), + lambda: handlerTester2.assertState((avg.Node.CURSOR_UP,)) )) def testSensitive(self): @@ -254,23 +479,18 @@ class EventTestCase(AVGTestCase): handlerTester = NodeHandlerTester(self, self.img) activateNode(self.img, useSensitiveAttr, False) - self.start(( - # Node is inactive -> no events. - lambda: Helper.fakeMouseEvent(avg.CURSORDOWN, True, False, False, - 10, 10, 1), - lambda: handlerTester.assertState( - down=False, up=False, over=False, out=False, move=False), - lambda: Helper.fakeMouseEvent(avg.CURSORUP, False, False, False, - 10, 10, 1), + self.start(False, + (# Node is inactive -> no events. + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 10, 10), + lambda: handlerTester.assertState(()), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 10, 10), # Activate the node -> events arrive. lambda: activateNode(self.img, useSensitiveAttr, True), - lambda: Helper.fakeMouseEvent(avg.CURSORDOWN, True, False, False, - 10, 10, 1), + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 10, 10), lambda: handlerTester.assertState( - down=True, up=False, over=True, out=False, move=False), - lambda: Helper.fakeMouseEvent(avg.CURSORUP, False, False, False, - 10, 10, 1), + (avg.Node.CURSOR_DOWN, avg.Node.CURSOR_OVER)), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 10, 10), )) self.img = None @@ -278,34 +498,31 @@ class EventTestCase(AVGTestCase): root = self.loadEmptyScene() self.img1 = avg.ImageNode(pos=(0,0), href="rgb24-65x65.png", parent=root) self.img2 = avg.ImageNode(pos=(64,0), href="rgb24-65x65.png", parent=root) - self.img1.connectEventHandler(avg.CURSORDOWN, avg.TOUCH, self, + self.img1.connectEventHandler(avg.Event.CURSOR_DOWN, avg.Event.TOUCH, self, lambda event: activateNode(self.img2, useSensitiveAttr, False)) - self.img2.connectEventHandler(avg.CURSORDOWN, avg.TOUCH, self, onNode2Down) + self.img2.connectEventHandler(avg.Event.CURSOR_DOWN, avg.Event.TOUCH, self, + onNode2Down) self.__node2Down = False - self.start(( - lambda: self._sendTouchEvents(( - (1, avg.CURSORDOWN, 10, 10), - (2, avg.CURSORDOWN, 80, 10),)), - lambda: self.assert_(not(self.__node2Down)), - )) + self.start(False, + (lambda: self._sendTouchEvents(( + (1, avg.Event.CURSOR_DOWN, 10, 10), + (2, avg.Event.CURSOR_DOWN, 80, 10),)), + lambda: self.assert_(not(self.__node2Down)), + )) def testChangingHandlers(self): root = self.loadEmptyScene() img = avg.ImageNode(pos=(0,0), href="rgb24-65x65.png", parent=root) handlerTester = NodeHandlerTester(self, img) - self.start(( - lambda: handlerTester.clearHandlers(), - lambda: Helper.fakeMouseEvent(avg.CURSORDOWN, True, False, False, - 10, 10, 1), - lambda: handlerTester.assertState( - down=False, up=False, over=False, out=False, move=False), + self.start(False, + (lambda: handlerTester.clearHandlers(), + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 10, 10), + lambda: handlerTester.assertState(()), lambda: handlerTester.setHandlers(), - lambda: Helper.fakeMouseEvent(avg.CURSORUP, False, False, False, - 10, 10, 1), - lambda: handlerTester.assertState( - down=False, up=True, over=False, out=False, move=False), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 10, 10), + lambda: handlerTester.assertState((avg.Node.CURSOR_UP,)), )) def testEventCapture(self): @@ -340,38 +557,30 @@ class EventTestCase(AVGTestCase): self.mainMouseDownCalled = False root = self.loadEmptyScene() - root.setEventHandler(avg.CURSORDOWN, avg.MOUSE, onMainMouseDown) + root.setEventHandler(avg.Event.CURSOR_DOWN, avg.Event.MOUSE, onMainMouseDown) self.img = avg.ImageNode(pos=(0,0), href="rgb24-65x65.png", parent=root) - self.img.setEventHandler(avg.CURSORDOWN, avg.MOUSE, onMouseDown) + self.img.setEventHandler(avg.Event.CURSOR_DOWN, avg.Event.MOUSE, onMouseDown) - self.start(( - lambda: Helper.fakeMouseEvent(avg.CURSORDOWN, True, False, False, - 10, 10, 1), + self.start(False, + (lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 10, 10), lambda: self.assert_(self.mouseDownCalled), - lambda: Helper.fakeMouseEvent(avg.CURSORUP, False, False, False, - 10, 10, 1), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 10, 10), captureEvent, - lambda: Helper.fakeMouseEvent(avg.CURSORDOWN, True, False, False, - 100, 10, 1), + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 100, 10), lambda: self.assert_(self.mouseDownCalled and self.mainMouseDownCalled), - lambda: Helper.fakeMouseEvent(avg.CURSORUP, False, False, False, - 100, 10, 1), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 100, 10), noCaptureEvent, - lambda: Helper.fakeMouseEvent(avg.CURSORDOWN, True, False, False, - 100, 10, 1), + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 100, 10), lambda: self.assert_(not(self.mouseDownCalled) and self.mainMouseDownCalled), - lambda: Helper.fakeMouseEvent(avg.CURSORUP, False, False, False, - 100, 10, 1), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 100, 10), doubleCaptureEvent, - lambda: Helper.fakeMouseEvent(avg.CURSORDOWN, True, False, False, - 100, 10, 1), + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 100, 10), lambda: self.assert_(self.mouseDownCalled and self.mainMouseDownCalled), releaseTooMuch, - lambda: Helper.fakeMouseEvent(avg.CURSORUP, False, False, False, - 100, 10, 1), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 100, 10), )) self.img = None @@ -412,26 +621,24 @@ class EventTestCase(AVGTestCase): self.img1MouseOverCalled = False def killNodeUnderCursor(): - Parent = img1.getParent() + Parent = img1.parent Parent.removeChild(Parent.indexOf(img1)) - Helper = Player.getTestHelper() root = self.loadEmptyScene() img1 = avg.ImageNode(href="rgb24-65x65.png", parent=root) div = avg.DivNode(pos=(65,0), parent=root) img3 = avg.ImageNode(href="rgb24-65x65.png", parent=div) img2 = avg.ImageNode(pos=(0,65), href="rgb24-65x65.png", parent=div) - img2.setEventHandler(avg.CURSOROVER, avg.MOUSE, onImg2MouseOver) - img2.setEventHandler(avg.CURSOROUT, avg.MOUSE, onImg2MouseOut) - div.setEventHandler(avg.CURSOROVER, avg.MOUSE, onDivMouseOver) - div.setEventHandler(avg.CURSOROUT, avg.MOUSE, onDivMouseOut) - root.setEventHandler(avg.CURSOROVER, avg.MOUSE, onAVGMouseOver) - img1.setEventHandler(avg.CURSOROVER, avg.MOUSE, onImg1MouseOver) - self.start(( - resetState, - lambda: Helper.fakeMouseEvent(avg.CURSORDOWN, True, False, False, - 70, 70, 1), + img2.setEventHandler(avg.Event.CURSOR_OVER, avg.Event.MOUSE, onImg2MouseOver) + img2.setEventHandler(avg.Event.CURSOR_OUT, avg.Event.MOUSE, onImg2MouseOut) + div.setEventHandler(avg.Event.CURSOR_OVER, avg.Event.MOUSE, onDivMouseOver) + div.setEventHandler(avg.Event.CURSOR_OUT, avg.Event.MOUSE, onDivMouseOut) + root.setEventHandler(avg.Event.CURSOR_OVER, avg.Event.MOUSE, onAVGMouseOver) + img1.setEventHandler(avg.Event.CURSOR_OVER, avg.Event.MOUSE, onImg1MouseOver) + self.start(False, + (resetState, + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 70, 70), lambda: self.assert_( self.img2MouseOverCalled and self.divMouseOverCalled and @@ -439,11 +646,9 @@ class EventTestCase(AVGTestCase): not(self.img2MouseOutCalled) and not(self.divMouseOutCalled) and not(self.img1MouseOverCalled)), - lambda: Helper.fakeMouseEvent(avg.CURSORUP, False, False, False, - 70, 70, 1), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 70, 70), resetState, - lambda: Helper.fakeMouseEvent(avg.CURSORDOWN, True, False, False, - 70, 10, 1), + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 70, 10), lambda: self.assert_( not(self.img2MouseOverCalled) and not(self.divMouseOverCalled) and @@ -451,12 +656,10 @@ class EventTestCase(AVGTestCase): self.img2MouseOutCalled and not(self.divMouseOutCalled) and not(self.img1MouseOverCalled)), - lambda: Helper.fakeMouseEvent(avg.CURSORUP, False, False, False, - 70, 10, 1), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 70, 10), resetState, - lambda: Helper.fakeMouseEvent(avg.CURSORDOWN, True, False, False, - 10, 10, 1), + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 10, 10), lambda: self.assert_( not(self.img2MouseOverCalled) and not(self.divMouseOverCalled) and @@ -467,8 +670,7 @@ class EventTestCase(AVGTestCase): resetState, killNodeUnderCursor, - lambda: Helper.fakeMouseEvent(avg.CURSORUP, False, False, False, - 10, 10, 1), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 10, 10), lambda: self.assert_( not(self.img2MouseOverCalled) and not(self.divMouseOverCalled) and @@ -477,12 +679,10 @@ class EventTestCase(AVGTestCase): not(self.divMouseOutCalled) and not(self.img1MouseOverCalled)), - lambda: Helper.fakeMouseEvent(avg.CURSORDOWN, True, False, False, - 10, 10, 1), + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 10, 10), resetState, lambda: img2.setEventCapture(), - lambda: Helper.fakeMouseEvent(avg.CURSORUP, False, False, False, - 70, 70, 1), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 70, 70), lambda: self.assert_( self.img2MouseOverCalled and self.divMouseOverCalled and @@ -491,11 +691,9 @@ class EventTestCase(AVGTestCase): not(self.divMouseOutCalled) and not(self.img1MouseOverCalled)), - lambda: Helper.fakeMouseEvent(avg.CURSORDOWN, True, False, False, - 70, 70, 1), + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 70, 70), resetState, - lambda: Helper.fakeMouseEvent(avg.CURSORUP, False, False, False, - 10, 10, 1), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 10, 10), lambda: self.assert_( not(self.img2MouseOverCalled) and not(self.divMouseOverCalled) and @@ -505,17 +703,45 @@ class EventTestCase(AVGTestCase): not(self.img1MouseOverCalled)) )) + def testMouseDisable(self): + def checkMouseWorking(working): + if working: + downTestEvents = (avg.Node.CURSOR_DOWN, avg.Node.CURSOR_OVER) + upTestEvents = (avg.Node.CURSOR_UP,) + else: + downTestEvents = () + upTestEvents = () + + return (lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 10, 10), + lambda: handlerTester.assertState(downTestEvents), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 10, 10), + lambda: handlerTester.assertState(upTestEvents) + ) + + root = self.loadEmptyScene() + img = avg.ImageNode(pos=(0,0), href="rgb24-65x65.png", parent=root) + handlerTester = NodeHandlerTester(self, img) + player.enableMouse(False) + + self.start(False, + (checkMouseWorking(False), + lambda: player.enableMouse(True), + checkMouseWorking(True), + lambda: player.enableMouse(False), + checkMouseWorking(False), + lambda: player.enableMouse(True), + )) + def testEventErr(self): def onErrMouseOver(Event): undefinedFunction() root = self.loadEmptyScene() - root.setEventHandler(avg.CURSORDOWN, avg.MOUSE, onErrMouseOver) + root.setEventHandler(avg.Event.CURSOR_DOWN, avg.Event.MOUSE, onErrMouseOver) self.assertException(lambda: - self.start(( - lambda: Helper.fakeMouseEvent(avg.CURSORDOWN, - False, False, False, 10, 10, 0), - ))) + self.start(False, + (lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 10, 10), + ))) def testEventHook(self): def resetState(): @@ -524,32 +750,32 @@ class EventTestCase(AVGTestCase): def cleanup(): resetState() - Player.setEventHook(None) + player.setEventHook(None) def handleEvent(event): - if isinstance(event, avg.MouseEvent) and event.source == avg.MOUSE: - if event.type == avg.CURSORDOWN: + if isinstance(event, avg.MouseEvent) and event.source == avg.Event.MOUSE: + if event.type == avg.Event.CURSOR_DOWN: self.ehookMouseEvent = True elif isinstance(event, avg.KeyEvent): self.ehookKeyboardEvent = True else: self.fail() - root = self.loadEmptyScene() + self.loadEmptyScene() resetState() - Player.setEventHook(handleEvent) - self.start(( - lambda: self.fakeClick(10, 10), + player.setEventHook(handleEvent) + self.start(False, + (lambda: self.fakeClick(10, 10), lambda: self.assert_(self.ehookMouseEvent), - lambda: Helper.fakeKeyEvent(avg.KEYDOWN, 65, 65, "A", 65, 0), + lambda: Helper.fakeKeyEvent(avg.Event.KEY_DOWN, 65, 65, "A", 65, 0), lambda: self.assert_(self.ehookKeyboardEvent), cleanup, lambda: self.fakeClick(10, 10), lambda: self.assert_(not self.ehookMouseEvent), - lambda: Helper.fakeKeyEvent(avg.KEYDOWN, 65, 65, "A", 65, 0), + lambda: Helper.fakeKeyEvent(avg.Event.KEY_DOWN, 65, 65, "A", 65, 0), lambda: self.assert_(not self.ehookKeyboardEvent), - )) + )) def testException(self): @@ -560,17 +786,17 @@ class EventTestCase(AVGTestCase): raise TestException rect = avg.RectNode(size = (50, 50)) - rect.setEventHandler(avg.CURSORDOWN, avg.MOUSE, throwException) + rect.setEventHandler(avg.Event.CURSOR_DOWN, avg.Event.MOUSE, throwException) root = self.loadEmptyScene() root.appendChild(rect) self.__exceptionThrown = False try: - self.start(( - lambda: Helper.fakeMouseEvent(avg.CURSORDOWN, True, False, False, 10, - 10, 0), - lambda: None)) + self.start(False, + (lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 10, 10), + lambda: None + )) except TestException: self.__exceptionThrown = True @@ -589,6 +815,8 @@ class EventTestCase(AVGTestCase): self.assertEqual(contact.events[0].pos, event.pos) self.assertEqual(len(contact.events), 1) contact.connectListener(onMotion, onUp) + contact.subscribe(avg.Contact.CURSOR_MOTION, onMotionSubscribe) + contact.subscribe(avg.Contact.CURSOR_UP, onUpSubscribe) def onMotion(event): contact = event.contact @@ -614,6 +842,12 @@ class EventTestCase(AVGTestCase): self.assert_(len(contact.events) > 1) self.numContactCallbacks += 1 + def onMotionSubscribe(event): + self.motionCalled = True + + def onUpSubscribe(event): + self.upCalled = True + def onOver(event): self.numOverCallbacks += 1 self.assertEqual(event.cursorid, event.contact.id) @@ -623,31 +857,34 @@ class EventTestCase(AVGTestCase): self.assertEqual(event.cursorid, event.contact.id) root = self.loadEmptyScene() - root.connectEventHandler(avg.CURSORDOWN, avg.TOUCH, self, onDown) + root.subscribe(avg.Node.CURSOR_DOWN, onDown) self.numContactCallbacks = 0 rect = avg.RectNode(pos=(5,5), size=(10,10), parent=root) - rect.connectEventHandler(avg.CURSOROVER, avg.TOUCH, self, onOver) + rect.subscribe(avg.Node.CURSOR_OVER, onOver) self.numOverCallbacks = 0 - rect.connectEventHandler(avg.CURSOROUT, avg.TOUCH, self, onOut) + rect.subscribe(avg.Node.CURSOR_OUT, onOut) self.numOutCallbacks = 0 - Player.setFakeFPS(25) - self.start(( - lambda: Helper.fakeTouchEvent(1, avg.CURSORDOWN, avg.TOUCH, (10,10)), - lambda: Helper.fakeTouchEvent(1, avg.CURSORMOTION, avg.TOUCH, (20,10)), - lambda: Helper.fakeTouchEvent(1, avg.CURSORUP, avg.TOUCH, (10,10)), - )) + player.setFakeFPS(25) + self.motionCalled = False + self.upCalled = False + self.start(False, + (lambda: self._sendTouchEvent(1, avg.Event.CURSOR_DOWN, 10, 10), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_MOTION, 20, 10), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_UP, 10, 10), + )) self.assertEqual(self.numContactCallbacks, 2) self.assertEqual(self.numOverCallbacks, 2) self.assertEqual(self.numOutCallbacks, 2) + self.assert_(self.motionCalled and self.upCalled) root = self.loadEmptyScene() - root.connectEventHandler(avg.CURSORDOWN, avg.MOUSE, self, onDown) + root.subscribe(avg.Node.CURSOR_DOWN, onDown) self.numContactCallbacks = 0 - self.start(( - lambda: Helper.fakeMouseEvent(avg.CURSORDOWN, 1, 0, 0, 10, 10, 0), - lambda: Helper.fakeMouseEvent(avg.CURSORMOTION, 1, 0, 0, 20, 10, 0), - lambda: Helper.fakeMouseEvent(avg.CURSORUP, 0, 0, 0, 10, 10, 0), - )) + self.start(False, + (lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 10, 10), + lambda: self._sendMouseEvent(avg.Event.CURSOR_MOTION, 20, 10), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 10, 10), + )) self.assertEqual(self.numContactCallbacks, 2) def testContactRegistration(self): @@ -658,28 +895,29 @@ class EventTestCase(AVGTestCase): def onMotion(event): contact = event.contact - self.contactID = contact.connectListener(onContactMotion, None) + self.contactID = contact.subscribe(avg.Contact.CURSOR_MOTION, onContactMotion) self.numMotionCallbacks += 1 - root.disconnectEventHandler(self) + root.unsubscribe(avg.Node.CURSOR_DOWN, onDown) + root.unsubscribe(avg.Node.CURSOR_MOTION, onMotion) def onContactMotion(event): contact = event.contact - contact.disconnectListener(self.contactID) - self.assertException(lambda: contact.disconnectListener(self.contactID)) + contact.unsubscribe(self.contactID) + self.assertException(lambda: contact.unsubscribe(self.contactID)) self.numContactCallbacks += 1 root = self.loadEmptyScene() - root.connectEventHandler(avg.CURSORDOWN, avg.TOUCH, self, onDown) + root.subscribe(avg.Node.CURSOR_DOWN, onDown) self.numMotionCallbacks = 0 - root.connectEventHandler(avg.CURSORMOTION, avg.TOUCH, self, onMotion) + root.subscribe(avg.Node.CURSOR_MOTION, onMotion) self.numContactCallbacks = 0 - Player.setFakeFPS(25) - self.start(( - lambda: Helper.fakeTouchEvent(1, avg.CURSORDOWN, avg.TOUCH, (10,10)), - lambda: Helper.fakeTouchEvent(1, avg.CURSORMOTION, avg.TOUCH, (20,10)), - lambda: Helper.fakeTouchEvent(1, avg.CURSORMOTION, avg.TOUCH, (30,10)), - lambda: Helper.fakeTouchEvent(1, avg.CURSORMOTION, avg.TOUCH, (40,10)), - )) + player.setFakeFPS(25) + self.start(False, + (lambda: self._sendTouchEvent(1, avg.Event.CURSOR_DOWN, 10, 10), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_MOTION, 20, 10), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_MOTION, 30, 10), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_MOTION, 40, 10), + )) self.assertEqual(self.numContactCallbacks, 1) self.assertEqual(self.numMotionCallbacks, 1) @@ -687,12 +925,15 @@ class EventTestCase(AVGTestCase): def onDown(event): contact = event.contact - self.contactid = contact.connectListener(onContact2, onContact2) - contact.connectListener(onContact1, onContact1) + self.motionListenerID = contact.subscribe(avg.Contact.CURSOR_MOTION, onContact2) + self.upListenerID = contact.subscribe(avg.Contact.CURSOR_UP, onContact2) + contact.subscribe(avg.Contact.CURSOR_MOTION, onContact1) + contact.subscribe(avg.Contact.CURSOR_UP, onContact1) def onContact1(event): if self.numContact1Callbacks == 0: - event.contact.disconnectListener(self.contactid) + event.contact.unsubscribe(self.motionListenerID) + event.contact.unsubscribe(self.upListenerID) self.numContact1Callbacks += 1 def onContact2(event): @@ -700,40 +941,146 @@ class EventTestCase(AVGTestCase): self.numContact2Callbacks += 1 root = self.loadEmptyScene() - root.connectEventHandler(avg.CURSORDOWN, avg.TOUCH, self, onDown) - Player.setFakeFPS(25) + root.subscribe(avg.Node.CURSOR_DOWN, onDown) + player.setFakeFPS(25) self.numContact1Callbacks = 0 self.numContact2Callbacks = 0 - self.start(( - lambda: Helper.fakeTouchEvent(1, avg.CURSORDOWN, avg.TOUCH, (10,10)), - lambda: Helper.fakeTouchEvent(1, avg.CURSORMOTION, avg.TOUCH, (20,10)), - lambda: Helper.fakeTouchEvent(1, avg.CURSORUP, avg.TOUCH, (10,10)), - )) + self.start(False, + (lambda: self._sendTouchEvent(1, avg.Event.CURSOR_DOWN, 10, 10), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_MOTION, 20, 10), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_UP, 10, 10), + )) self.assertEqual(self.numContact1Callbacks, 2) # The order of callbacks is unspecified, so onContact2 might be called once. self.assert_(self.numContact2Callbacks <= 1) + def testPlaybackMessages(self): + + self.loadEmptyScene() + messageTester = MessageTester(player, + [avg.Player.PLAYBACK_START, avg.Player.PLAYBACK_END], self) + self.start(False, + (lambda: messageTester.assertState([avg.Player.PLAYBACK_START]), + )) + messageTester.assertState([avg.Player.PLAYBACK_END]) + + def testImageSizeChanged(self): + def onResize(newSize): + self.assert_(newSize == self.sizeExpected) + self.messageReceived = True + + def changeHref(): + self.messageReceived = False + self.sizeExpected = (32,32) + self.image.href="rgb24-32x32.png" + self.assert_(self.messageReceived) + + def explicitChangeSize(): + self.messageReceived = False + self.sizeExpected = (64,64) + self.image.size = self.sizeExpected + self.assert_(self.messageReceived) + + def changeWidth(): + self.messageReceived = False + self.sizeExpected = (32,64) + self.image.width = 32 + self.assert_(self.messageReceived) + + def move(): + self.messageReceived = False + self.image.x = 4 + self.assert_(not(self.messageReceived)) + + root = self.loadEmptyScene() + self.image = avg.ImageNode(href="rgb24-64x64.png", parent=root) + self.image.subscribe(avg.AreaNode.SIZE_CHANGED, onResize) + self.sizeExpected = (64, 64) + self.start(False, + (changeHref, + explicitChangeSize, + changeWidth, + move, + )) + + def testWordsSizeChanged(self): + def onResize(newSize): + self.messageReceived = True + + def checkMessageReceived(): + self.assert_(self.messageReceived) + self.messageReceived = False + + def changeText(): + self.words.text="NewText" + checkMessageReceived() + + self.messageReceived = False + root = self.loadEmptyScene() + self.words = avg.WordsNode(text="Test", parent=root) + self.words.subscribe(self.words.SIZE_CHANGED, onResize) + self.start(False, + (checkMessageReceived, + changeText, + )) + + def testVideoSizeChanged(self): + + def onResize(newSize): + self.messageReceived = True + + self.messageReceived = False + root = self.loadEmptyScene() + self.video = avg.VideoNode(href="mpeg1-48x48.mov", parent=root) + self.video.subscribe(self.video.SIZE_CHANGED, onResize) + self.video.play() + self.assert_(self.messageReceived) + + def testRectSizeChanged(self): + + def onResize(newSize): + self.messageReceived = True + + self.messageReceived = False + root = self.loadEmptyScene() + self.rect = avg.RectNode(size=(10,10), parent=root) + self.rect.subscribe(self.rect.SIZE_CHANGED, onResize) + self.rect.size=(100,100) + self.assert_(self.messageReceived) + def eventTestSuite(tests): availableTests = ( "testKeyEvents", "testSimpleEvents", "testTilted", + "testWordsClicks", "testDivEvents", + "testDivNegativePos", + "testUnlinkInHandler", "testConnectHandler", + "testPublisher", + "testComplexPublisher", + "testPublisherAutoDelete", + "testPublisherNestedUnsubscribe", "testObscuringEvents", "testSensitive", "testChangingHandlers", "testEventCapture", "testMouseOver", + "testMouseDisable", "testEventErr", "testEventHook", "testException", "testContacts", "testContactRegistration", "testMultiContactRegistration", + "testPlaybackMessages", + "testImageSizeChanged", + "testWordsSizeChanged", + "testVideoSizeChanged", + "testRectSizeChanged", ) return createAVGTestSuite(availableTests, EventTestCase, tests) -Player = avg.Player.get() -Helper = Player.getTestHelper() +Helper = player.getTestHelper() diff --git a/src/test/FXTest.py b/src/test/FXTest.py index 043a5b2..de677a0 100644 --- a/src/test/FXTest.py +++ b/src/test/FXTest.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- # libavg - Media Playback Engine. -# Copyright (C) 2003-2011 Ulrich von Zadow +# 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 @@ -20,9 +20,10 @@ # Current versions can be found at www.libavg.de # -from libavg import avg, utils +from libavg import avg, utils, player from testcase import * + class FXTestCase(AVGTestCase): def __init__(self, testFuncName): AVGTestCase.__init__(self, testFuncName) @@ -44,6 +45,10 @@ class FXTestCase(AVGTestCase): fillcolor="FFFFFF") root.insertChild(node, 0) + def emptyImageFX(): + node = avg.ImageNode(parent=root, href="", pos=(64,0)) + node.setEffect(avg.NullFXNode()) + # Initial setup is 3x2 images: # rows: no alpha, alpha, alpha & opacity 0.6 # cols: no FX, FX @@ -67,27 +72,28 @@ class FXTestCase(AVGTestCase): opacity=0.6) configureNode(node, fx) - self.start(( - lambda: self.compareImage("testImageNullFX1", False), + self.start(False, + (lambda: self.compareImage("testImageNullFX1"), addBgNode, - lambda: self.compareImage("testImageNullFX2", False), + lambda: self.compareImage("testImageNullFX2"), activateFX, - lambda: self.compareImage("testImageNullFX2", False), + lambda: self.compareImage("testImageNullFX2"), newNode, - lambda: self.compareImage("testImageNullFX3", False), + lambda: self.compareImage("testImageNullFX3"), newFX, - lambda: self.compareImage("testImageNullFX3", False), + lambda: self.compareImage("testImageNullFX3"), + emptyImageFX, lambda: utils.initFXCache(10), )) def testVideoNullFX(self): root = self.loadEmptyScene() - Player.setFakeFPS(25) - node = avg.VideoNode(parent=root, href="../video/testfiles/mjpeg-48x48.avi", + player.setFakeFPS(25) + node = avg.VideoNode(parent=root, href="mjpeg-48x48.avi", threaded=False) node.setEffect(avg.NullFXNode()) node.play() - self.start((lambda: self.compareImage("testVideoNullFX", False),)) + self.start(False, (lambda: self.compareImage("testVideoNullFX"),)) def testWordsNullFX(self): root = self.loadEmptyScene() @@ -95,22 +101,28 @@ class FXTestCase(AVGTestCase): node.setEffect(avg.NullFXNode()) node = avg.WordsNode(parent=root, text="testtext", pos=(0,20), font="Bitstream Vera Sans") - self.start(( - lambda: self.compareImage("testWordsNullFX", True), + self.start(True, + (lambda: self.compareImage("testWordsNullFX"), )) def testCanvasNullFX(self): - def setOpacity(): + def setOuterOpacity(): node.opacity=0.6 + def setInnerOpacity(): + innerNode = canvas.getElementByID("test") + innerNode.opacity = 0.0 + root = self.loadEmptyScene() - self.__createOffscreenCanvas() + canvas = self.__createOffscreenCanvas() node = avg.ImageNode(parent=root, href="canvas:offscreen") node.setEffect(avg.NullFXNode()) - self.start(( - lambda: self.compareImage("testCanvasNullFX1", False), - setOpacity, - lambda: self.compareImage("testCanvasNullFX2", False), + self.start(False, + (lambda: self.compareImage("testCanvasNullFX1"), + setOuterOpacity, + lambda: self.compareImage("testCanvasNullFX2"), + setInnerOpacity, + lambda: self.compareImage("testCanvasNullFX3"), )) def testNodeInCanvasNullFX(self): @@ -123,20 +135,22 @@ class FXTestCase(AVGTestCase): fillopacity=1) canvas.getRootNode().insertChild(rect, 0) - self.start(( - lambda: self.compareImage("testNodeInCanvasNullFX1", False), + self.start(False, + (lambda: self.compareImage("testNodeInCanvasNullFX1"), )) def testRenderPipeline(self): - print + sys.stderr.write("\n") for useSrcCanvas in (False, True): for useDestCanvas in (False, True): for useFX in (False, True): for useColorConv in (False, True): - print " ", useSrcCanvas, useDestCanvas, useFX, useColorConv + sys.stderr.write(" "+str(useSrcCanvas)+" "+str(useDestCanvas)+ + " "+str(useFX)+" "+str(useColorConv)+"\n") root = self.loadEmptyScene() if useSrcCanvas: - srcCanvas = Player.createCanvas(id="src", size=(160,120)) + srcCanvas = player.createCanvas(id="src", size=(160,120), + mediadir="media") avg.ImageNode(href="rgb24alpha-64x64.png", parent=srcCanvas.getRootNode()) srcImg = avg.ImageNode(href="canvas:src") @@ -147,17 +161,18 @@ class FXTestCase(AVGTestCase): if useColorConv: srcImg.contrast = (1.01, 1.0, 1.0) if useDestCanvas: - destCanvas = Player.createCanvas(id="dest", size=(160,120)) + destCanvas = player.createCanvas(id="dest", + size=(160,120), mediadir="media") destCanvas.getRootNode().appendChild(srcImg) - destImg = avg.ImageNode(href="canvas:dest", parent=root) + avg.ImageNode(href="canvas:dest", parent=root) else: root.appendChild(srcImg) - self.start(( - lambda: self.compareImage("testRenderPipeline", False), + self.start(False, + (lambda: self.compareImage("testRenderPipeline"), )) def testBlurFX(self): - + def setRadius(radius): self.effect.radius = radius @@ -168,25 +183,26 @@ class FXTestCase(AVGTestCase): self.node.setEffect(self.effect) def addNewFX(): - effect = avg.BlurFXNode() - effect.radius = 8 + effect = avg.BlurFXNode(8) self.node.setEffect(effect) root = self.loadEmptyScene() self.node = avg.ImageNode(parent=root, pos=(10,10), href="rgb24-64x64.png") self.effect = avg.BlurFXNode() - self.node.setEffect(self.effect) - self.start(( - lambda: self.compareImage("testBlurFX1", False), + self.start(False, + (self.skipIfMinimalShader, + lambda: self.node.setEffect(self.effect), + lambda: self.compareImage("testBlurFX1"), lambda: setRadius(8), - lambda: self.compareImage("testBlurFX2", False), + lambda: self.compareImage("testBlurFX2"), removeFX, - lambda: self.compareImage("testBlurFX3", False), + lambda: self.compareImage("testBlurFX3"), reAddFX, - lambda: self.compareImage("testBlurFX2", False), + lambda: self.compareImage("testBlurFX2"), removeFX, addNewFX, - lambda: self.compareImage("testBlurFX2", False), + lambda: self.compareImage("testBlurFX2"), + lambda: setRadius(300), )) def testHueSatFX(self): @@ -202,20 +218,21 @@ class FXTestCase(AVGTestCase): root = self.loadEmptyScene() self.node = avg.ImageNode(parent=root, pos=(10,10), href="rgb24alpha-64x64.png") resetFX() - self.start(( - lambda: self.compareImage("testHueSatFX1", False), - lambda: setParam('saturation', -50), - lambda: self.compareImage("testHueSatFX2", False), - lambda: setParam('saturation', -100), - lambda: self.compareImage("testHueSatFX3", False), - lambda: setParam('saturation', -150), - lambda: self.compareImage("testHueSatFX3", False), - resetFX, - lambda: setParam('hue', 180), - lambda: self.compareImage("testHueSatFX4", False), - lambda: setParam('hue', -180), - lambda: self.compareImage("testHueSatFX4", False), - )) + self.start(False, + (self.skipIfMinimalShader, + lambda: self.compareImage("testHueSatFX1"), + lambda: setParam('saturation', -50), + lambda: self.compareImage("testHueSatFX2"), + lambda: setParam('saturation', -100), + lambda: self.compareImage("testHueSatFX3"), + lambda: setParam('saturation', -150), + lambda: self.compareImage("testHueSatFX3"), + resetFX, + lambda: setParam('hue', 180), + lambda: self.compareImage("testHueSatFX4"), + lambda: setParam('hue', -180), + lambda: self.compareImage("testHueSatFX4"), + )) def testInvertFX(self): @@ -227,18 +244,18 @@ class FXTestCase(AVGTestCase): self.redRect = avg.RectNode(parent=self.root, pos=(5, 5), fillcolor='FF0000', fillopacity=1, opacity=0, size=(72, 72)) self.node = avg.ImageNode(parent=self.root, pos=(10,10), - href="../graphics/testfiles/rgb24alpha-64x64.png") + href="rgb24alpha-64x64.png") resetFX() self.root = self.loadEmptyScene() - self.node = avg.ImageNode(parent=self.root, pos=(10,10), - href="../graphics/testfiles/hsl.png") + self.node = avg.ImageNode(parent=self.root, pos=(10,10), href="hsl.png") resetFX() - self.start(( - lambda: self.compareImage("testInvertFX1", False), - redAlphaScene, - lambda: self.compareImage("testInvertFX2", False), - )) + self.start(False, + (self.skipIfMinimalShader, + lambda: self.compareImage("testInvertFX1"), + redAlphaScene, + lambda: self.compareImage("testInvertFX2"), + )) def testShadowFX(self): @@ -252,33 +269,42 @@ class FXTestCase(AVGTestCase): rect = avg.RectNode(parent=root, pos=(9.5,9.5), color="0000FF") node = avg.ImageNode(parent=root, pos=(10,10), href="shadow.png") rect.size = node.size + (1, 1) - effect = avg.ShadowFXNode() - node.setEffect(effect) - self.start(( - lambda: self.compareImage("testShadowFX1", False), + effect = avg.ShadowFXNode((0,0), 1, 1, "FFFFFF") + self.start(False, + (self.skipIfMinimalShader, + lambda: node.setEffect(effect), + lambda: self.compareImage("testShadowFX1"), lambda: setParams((0,0), 3, 2, "00FFFF"), - lambda: self.compareImage("testShadowFX2", False), + lambda: self.compareImage("testShadowFX2"), lambda: setParams((2,2), 0.1, 1, "FFFFFF"), - lambda: self.compareImage("testShadowFX3", False), + lambda: self.compareImage("testShadowFX3"), lambda: setParams((-2,-2), 0.1, 1, "FFFFFF"), - lambda: self.compareImage("testShadowFX4", False), + lambda: self.compareImage("testShadowFX4"), lambda: setParams((-2,-2), 3, 1, "FFFFFF"), - lambda: self.compareImage("testShadowFX5", False), + lambda: self.compareImage("testShadowFX5"), lambda: setParams((0,0), 0, 1, "FFFFFF"), - lambda: self.compareImage("testShadowFX6", False), + lambda: self.compareImage("testShadowFX6"), )) def testWordsShadowFX(self): + + def setParams(offset, radius, opacity, color): + effect.offset = offset + effect.radius = radius + effect.opacity = opacity + effect.color = color + root = self.loadEmptyScene() node = avg.WordsNode(parent=root, pos=(10,10), text="testtext", font="Bitstream Vera Sans") effect = avg.ShadowFXNode() - effect.setParams((0,0), 1.5, 1.5, "FF0000") - node.setEffect(effect) - self.start(( - lambda: self.compareImage("testWordsShadowFX1", True), - lambda: effect.setParams((2,2), 2, 2, "00FFFF"), - lambda: self.compareImage("testWordsShadowFX2", True), + setParams((0,0), 1.5, 1.5, "FF0000") + self.start(True, + (self.skipIfMinimalShader, + lambda: node.setEffect(effect), + lambda: self.compareImage("testWordsShadowFX1"), + lambda: setParams((2,2), 2, 2, "00FFFF"), + lambda: self.compareImage("testWordsShadowFX2"), )) def testGamma(self): @@ -288,11 +314,11 @@ class FXTestCase(AVGTestCase): root = self.loadEmptyScene() node = avg.ImageNode(parent=root, href="colorramp.png", gamma=(0.5,0.5,0.5)) self.assertEqual(node.gamma, (0.5,0.5,0.5)) - self.start(( - lambda: self.compareImage("testGamma1", False), + self.start(False, + (lambda: self.compareImage("testGamma1"), lambda: setGamma((1.5,2.0,2.5)), lambda: self.assertEqual(node.gamma, (1.5,2.0,2.5)), - lambda: self.compareImage("testGamma2", False), + lambda: self.compareImage("testGamma2"), )) def testIntensity(self): @@ -302,32 +328,34 @@ class FXTestCase(AVGTestCase): def showVideo(): node.unlink(True) self.videoNode = avg.VideoNode(parent=root, size=(96,96), threaded=False, - href="../video/testfiles/mpeg1-48x48.mpg", intensity=(0.5,0.5,0.5)) + href="mpeg1-48x48.mov", intensity=(0.5,0.5,0.5)) self.videoNode.play() - def showText(): - self.videoNode.unlink(True) - textNode = avg.WordsNode(parent=root, fontsize=24, font="Bitstream Vera Sans", - intensity=(0.5,0.5,0.5), text="Half-brightness text.", - width=140) - root = self.loadEmptyScene() node = avg.ImageNode(parent=root, href="colorramp.png", intensity=(0.5,0.5,0.5)) self.assertEqual(node.intensity, (0.5,0.5,0.5)) - Player.setFakeFPS(10) - self.start(( - lambda: self.compareImage("testIntensity1", False), + player.setFakeFPS(10) + self.start(False, + (lambda: self.compareImage("testIntensity1"), lambda: setIntensity((1.5,2.0,2.5)), lambda: self.assertEqual(node.intensity, (1.5,2.0,2.5)), - lambda: self.compareImage("testIntensity2", False), + lambda: self.compareImage("testIntensity2"), showVideo, - lambda: self.compareImage("testIntensity3", False), - showText, - lambda: self.compareImage("testIntensity4", False), + lambda: self.compareImage("testIntensity3"), )) - Player.setFakeFPS(-1) + player.setFakeFPS(-1) self.videoNode = None + def testWordsIntensity(self): + root = self.loadEmptyScene() + avg.WordsNode(parent=root, fontsize=24, font="Bitstream Vera Sans", + intensity=(0.5,0.5,0.5), text="brightness", + width=140) + self.start(True, + (lambda: self.compareImage("testWordsIntensity"), + )) + + def testContrast(self): def setContrast(val): node.contrast = val @@ -335,22 +363,22 @@ class FXTestCase(AVGTestCase): def showVideo(): node.unlink(True) videoNode = avg.VideoNode(parent=root, size=(96,96), threaded=False, - href="../video/testfiles/mpeg1-48x48.mpg", contrast=(0.5,0.5,0.5)) + href="mpeg1-48x48.mov", contrast=(0.5,0.5,0.5)) videoNode.play() root = self.loadEmptyScene() node = avg.ImageNode(parent=root, href="colorramp.png", contrast=(0.5,0.5,0.5)) self.assertEqual(node.contrast, (0.5,0.5,0.5)) - Player.setFakeFPS(10) - self.start(( - lambda: self.compareImage("testContrast1", False), + player.setFakeFPS(10) + self.start(False, + (lambda: self.compareImage("testContrast1"), lambda: setContrast((1.5,2.0,2.5)), lambda: self.assertEqual(node.contrast, (1.5,2.0,2.5)), - lambda: self.compareImage("testContrast2", False), + lambda: self.compareImage("testContrast2"), showVideo, - lambda: self.compareImage("testContrast3", False), + lambda: self.compareImage("testContrast3"), )) - Player.setFakeFPS(-1) + player.setFakeFPS(-1) def testFXUpdate(self): # This tests if the FX render-on-demand functionality doesn't forget updates. @@ -372,7 +400,7 @@ class FXTestCase(AVGTestCase): def addVideo(): node.unlink(True) videoNode = avg.VideoNode(parent=root, threaded=False, size=(96,96), - href="../video/testfiles/mpeg1-48x48.mpg") + href="mpeg1-48x48.mov") effect = avg.BlurFXNode() effect.radius = 0 videoNode.setEffect(effect) @@ -382,69 +410,74 @@ class FXTestCase(AVGTestCase): node = avg.ImageNode(parent=root, href="rgb24alpha-64x64.png") effect = avg.BlurFXNode() effect.radius = 0 - node.setEffect(effect) - Player.setFakeFPS(25) - self.start(( + player.setFakeFPS(25) + self.start(False, + (self.skipIfMinimalShader, + lambda: node.setEffect(effect), changeTexture, - lambda: self.compareImage("testFXUpdateTex", False), + lambda: self.compareImage("testFXUpdateTex"), addMaskTex, - lambda: self.compareImage("testFXUpdateMaskTex1", False), + lambda: self.compareImage("testFXUpdateMaskTex1"), changeMaskTex, - lambda: self.compareImage("testFXUpdateMaskTex2", False), + lambda: self.compareImage("testFXUpdateMaskTex2"), changeMaskPos, - lambda: self.compareImage("testFXUpdateMaskPos", False), + lambda: self.compareImage("testFXUpdateMaskPos"), changeFX, - lambda: self.compareImage("testFXUpdateFX", False), + lambda: self.compareImage("testFXUpdateFX"), addVideo, None, - lambda: self.compareImage("testFXUpdateVideo", False), + lambda: self.compareImage("testFXUpdateVideo"), + )) + + def testChromaKeyFX(self): + + def setParams(htol, ltol, stol): + effect.htolerance = htol + effect.ltolerance = ltol + effect.stolerance = stol + + root = self.loadEmptyScene() + node = avg.ImageNode(parent=root, href="rgb24-64x64.png") + effect = avg.ChromaKeyFXNode() + setParams(0.01, 0.01, 0.01) + self.start(False, + (self.skipIfMinimalShader, + lambda: node.setEffect(effect), + lambda: self.compareImage("testChromaKeyFX1"), + lambda: setParams(0.2, 0.2, 0.2), + lambda: self.compareImage("testChromaKeyFX2"), + lambda: effect.__setattr__("color", "FF0000"), + lambda: self.compareImage("testChromaKeyFX3"), + lambda: effect.__setattr__("spillthreshold", 1), + lambda: self.compareImage("testChromaKeyFX4"), )) def __createOffscreenCanvas(self): - canvas = Player.createCanvas(id="offscreen", size=(160,120)) + canvas = player.createCanvas(id="offscreen", size=(160,120), mediadir="media") root = canvas.getRootNode() avg.ImageNode(href="rgb24-32x32.png", parent=root) avg.ImageNode(id="test", pos=(32,0), href="rgb24alpha-32x32.png", parent=root) return canvas -def areFXSupported(): - sceneString = """<avg id="avg" width="160" height="120"/>""" - Player.loadString(sceneString) - root = Player.getRootNode() - # XXX: The second of the following two lines prevent an opengl error in - # testImageNullFX on the Mac (Snow Leopard) for some reason. - node = avg.ImageNode(href="rgb24-65x65.png", parent=root) - node = avg.ImageNode(href="rgb24-65x65.png", parent=root) - node.setEffect(avg.BlurFXNode()) - Player.setTimeout(0, Player.stop) - try: - Player.play() - return True - except RuntimeError: - return False - def fxTestSuite(tests): - if areFXSupported(): - availableTests = [ - "testImageNullFX", - "testVideoNullFX", - "testWordsNullFX", - "testCanvasNullFX", - "testNodeInCanvasNullFX", - "testRenderPipeline", - "testBlurFX", - "testHueSatFX", - "testInvertFX", - "testShadowFX", - "testWordsShadowFX", - "testGamma", - "testIntensity", - "testContrast", - "testFXUpdate", - ] - else: - availableTests = [] + availableTests = [ + "testImageNullFX", + "testVideoNullFX", + "testWordsNullFX", + "testCanvasNullFX", + "testNodeInCanvasNullFX", + "testRenderPipeline", + "testBlurFX", + "testHueSatFX", + "testInvertFX", + "testShadowFX", + "testWordsShadowFX", + "testGamma", + "testIntensity", + "testWordsIntensity", + "testContrast", + "testFXUpdate", + "testChromaKeyFX", + ] return createAVGTestSuite(availableTests, FXTestCase, tests) - -Player = avg.Player.get() diff --git a/src/test/GestureTest.py b/src/test/GestureTest.py new file mode 100644 index 0000000..4c1a792 --- /dev/null +++ b/src/test/GestureTest.py @@ -0,0 +1,1048 @@ +# -*- 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, gesture, player + +import math +from testcase import * + +class GestureTestCase(AVGTestCase): + + def __init__(self, testFuncName): + AVGTestCase.__init__(self, testFuncName) + + def testTapRecognizer(self): + + def abort(): + self.__tapRecognizer.abort() + + def enable(isEnabled): + self.__tapRecognizer.enable(isEnabled) + + self.__initImageScene() + self.__tapRecognizer = gesture.TapRecognizer(self.image) + self.messageTester = MessageTester(self.__tapRecognizer, + [gesture.Recognizer.POSSIBLE, gesture.Recognizer.DETECTED, + gesture.Recognizer.FAILED], self) + player.setFakeFPS(10) + self.start(False, + (# Down-up: recognized as tap. + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, + [gesture.Recognizer.DETECTED]), + # Down-small move-up: recognized as tap. + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_MOTION, 31, 30, []), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, + [gesture.Recognizer.DETECTED]), + + # Down-small down-second up-second up-first: recognized as tap + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 31, 30, btn=2), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 31, 30, btn=2), + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 31, 30, btn=2), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 31, 30, btn=2), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, + [gesture.Recognizer.DETECTED]), + + # Down-big move-up: fail + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_MOTION, 80, 80, + [gesture.Recognizer.FAILED]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + # Down-Abort-Up: not recognized as tap + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + abort, + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + # Abort-Down-Up: recognized as tap + abort, + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, + [gesture.Recognizer.DETECTED]), + # Down-Abort-Up-Down-Up: recognized as tap + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + abort, + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, + [gesture.Recognizer.DETECTED]), + # Disable-Down-Up-Enable: not recognized as tap + lambda: enable(False), + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, []), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + lambda: enable(True), + # Down-Disable-Enable-Up: not recognized as tap + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + lambda: enable(False), + lambda: enable(True), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + # Down-Disable-Up-Enable-Down-Up: recognized as tap + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + lambda: enable(False), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + lambda: enable(True), + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, + [gesture.Recognizer.DETECTED]), + # Abort-Disable-Abort-Enable-Abort-Down-Up: recognized as tap + abort, + lambda: enable(False), + abort, + lambda: enable(True), + abort, + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, + [gesture.Recognizer.DETECTED]), + + # Remove node while tap is in progress. + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self.__killImageNode, + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + )) + + def testHoldRecognizer(self): + + def abort(): + self.__holdRecognizer.abort() + + def enable(isEnabled): + self.__holdRecognizer.enable(isEnabled) + + player.setFakeFPS(20) + self.__initImageScene() + self.__holdRecognizer = gesture.HoldRecognizer(self.image, + delay=1000) + self.messageTester = MessageTester(self.__holdRecognizer, + [gesture.Recognizer.POSSIBLE, gesture.Recognizer.DETECTED, + gesture.Recognizer.FAILED, gesture.Recognizer.END], self) + self.start(False, + (# Standard down-hold-up sequence. + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + lambda: self.delay(1100), + lambda: self.messageTester.assertState([gesture.Recognizer.DETECTED]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, + [gesture.Recognizer.END]), + + # down-up sequence, hold not long enough. + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, + [gesture.Recognizer.FAILED]), + + # down-move-up sequence, should fail. + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 1, 1, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_MOTION, 150, 50, + [gesture.Recognizer.FAILED]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + + # down-hold-abort-up, should be recognized, no end event. + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + lambda: self.delay(1100), + lambda: self.messageTester.assertState([gesture.Recognizer.DETECTED]), + abort, + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + + # down-abort-hold-up, should not be recognized + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + abort, + lambda: self.delay(1100), + lambda: self.messageTester.assertState([]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + + # down-hold-disabled-up-enabled, should be recognized, no end event. + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + lambda: self.delay(1100), + lambda: self.messageTester.assertState([gesture.Recognizer.DETECTED]), + lambda: enable(False), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + lambda: enable(True), + + # down-disabled-enabled-hold-up, should not be recognized + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + lambda: enable(False), + lambda: enable(True), + lambda: self.delay(1100), + lambda: self.messageTester.assertState([]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + + # Remove node while hold is in progress. + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self.__killImageNode, + lambda: self.delay(1100), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + )) + player.setFakeFPS(-1) + + + def testDoubletapRecognizer(self): + + def abort(): + self.__tapRecognizer.abort() + + def enable(isEnabled): + self.__tapRecognizer.enable(isEnabled) + + root = self.loadEmptyScene() + image = avg.ImageNode(parent=root, href="rgb24-64x64.png", size=(128,128)) + self.__tapRecognizer = gesture.DoubletapRecognizer(image) + self.messageTester = MessageTester(self.__tapRecognizer, + [gesture.Recognizer.POSSIBLE, gesture.Recognizer.DETECTED, + gesture.Recognizer.FAILED, gesture.Recognizer.END], self) + player.setFakeFPS(20) + self.start(False, + (# Down, up, down, up: click + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, []), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, + [gesture.Recognizer.DETECTED]), + # Down, move: stop + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 0, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_MOTION, 80, 30, + [gesture.Recognizer.FAILED]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 0, 30, []), + # Down, up, move: stop + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 0, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 0, 30, []), + self._genMouseEventFrames(avg.Event.CURSOR_MOTION, 80, 30, []), + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 80, 30, + [gesture.Recognizer.FAILED]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 0, 30, []), + # Down, up, down, move: stop + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 0, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 0, 30, []), + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 0, 30, []), + self._genMouseEventFrames(avg.Event.CURSOR_MOTION, 80, 30, + [gesture.Recognizer.FAILED]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 0, 30, []), + # Down,delay: stop + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + lambda: self.delay(1000), + lambda: self.messageTester.assertState([gesture.Recognizer.FAILED]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, + []), + # Down, up, delay: stop + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + lambda: self.delay(1000), + lambda: self.messageTester.assertState([gesture.Recognizer.FAILED]), + # Down, up, down, delay: stop + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, []), + lambda: self.delay(1000), + lambda: self.messageTester.assertState([gesture.Recognizer.FAILED]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, + []), + # Down, abort, up, down, up, delay: just one click + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + abort, + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + lambda: self.delay(1000), + lambda: self.messageTester.assertState([gesture.Recognizer.FAILED]), + # Down, up, abort, down, up, delay: two clicks but no double-click + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + abort, + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + lambda: self.delay(1000), + lambda: self.messageTester.assertState([gesture.Recognizer.FAILED]), + # Down, up, down, abort, up: just one click + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, []), + abort, + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + # Down, abort, up, down, up, down up: first aborted then recognized + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + abort, + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, []), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, + [gesture.Recognizer.DETECTED]), + # Disabled, down, up, down, up, enabled: nothing + lambda: enable(False), + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, []), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, []), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + lambda: enable(True), + # Down, disabled up, down, up, enabled: just one down + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + lambda: enable(False), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, []), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + lambda: enable(True), + # Down, up, disabled, down, up, enabled: just one click + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + lambda: enable(False), + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, []), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + lambda: enable(True), + # Down, up, down, disabled, up, enabled: just one click + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, []), + lambda: enable(False), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + lambda: enable(True), + # Down, disabled, enabled, up, down, up, down, up: recognized + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + lambda: enable(False), + lambda: enable(True), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, []), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, + [gesture.Recognizer.DETECTED]), + )) + + + def testSwipeRecognizer(self): + + # One finger + for direction, xdir in ( + (gesture.SwipeRecognizer.RIGHT, 1), (gesture.SwipeRecognizer.LEFT, -1)): + self.__initImageScene() + swipeRecognizer = gesture.SwipeRecognizer(self.image, minDist=20, + direction=direction) + self.messageTester = MessageTester(swipeRecognizer, + [gesture.Recognizer.POSSIBLE, gesture.Recognizer.DETECTED, + gesture.Recognizer.FAILED], + self) + self.start(False, + (self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30+xdir*30, 30, + [gesture.Recognizer.DETECTED]), + # Check angle tolerance + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30+xdir*30, 25, + [gesture.Recognizer.DETECTED]), + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30+xdir*30, 35, + [gesture.Recognizer.DETECTED]), + # Not far enough -> fail + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30+xdir*10, 30, + [gesture.Recognizer.FAILED]), + # Wrong direction -> fail + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30+xdir*30, 60, + [gesture.Recognizer.FAILED]), + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30+xdir*30, 5, + [gesture.Recognizer.FAILED]), + )) + + + def testSwipeRecognizerTwoFingers(self): + self.__initImageScene() + swipeRecognizer = gesture.SwipeRecognizer(self.image, minDist=20, numContacts=2, + maxContactDist=15, direction=gesture.SwipeRecognizer.RIGHT) + self.messageTester = MessageTester(swipeRecognizer, + [gesture.Recognizer.POSSIBLE, gesture.Recognizer.DETECTED, + gesture.Recognizer.FAILED], + self) + self.start(False, + (self._genTouchEventFrames( + [(0, avg.Event.CURSOR_DOWN, 30, 30,),], + []), + self._genTouchEventFrames( + [(1, avg.Event.CURSOR_DOWN, 40, 30,),], + [gesture.Recognizer.POSSIBLE]), + self._genTouchEventFrames( + [(1, avg.Event.CURSOR_UP, 70, 30,),], + []), + self._genTouchEventFrames( + [(0, avg.Event.CURSOR_UP, 60, 30,),], + [gesture.Recognizer.DETECTED]), + # Not enough fingers -> not recognized + self._genTouchEventFrames( + [(0, avg.Event.CURSOR_DOWN, 30, 30,),], + []), + self._genTouchEventFrames( + [(0, avg.Event.CURSOR_UP, 60, 30,),], + []), + # Fail first finger + self._genTouchEventFrames( + [(0, avg.Event.CURSOR_DOWN, 30, 30,),], + []), + self._genTouchEventFrames( + [(1, avg.Event.CURSOR_DOWN, 40, 30,),], + [gesture.Recognizer.POSSIBLE]), + self._genTouchEventFrames( + [(1, avg.Event.CURSOR_UP, 35, 30,),], + [gesture.Recognizer.FAILED]), + self._genTouchEventFrames( + [(0, avg.Event.CURSOR_UP, 60, 30,),], + []), + # Fail second finger + self._genTouchEventFrames( + [(0, avg.Event.CURSOR_DOWN, 30, 30,),], + []), + self._genTouchEventFrames( + [(1, avg.Event.CURSOR_DOWN, 40, 30,),], + [gesture.Recognizer.POSSIBLE]), + self._genTouchEventFrames( + [(1, avg.Event.CURSOR_UP, 70, 30,),], + []), + self._genTouchEventFrames( + [(0, avg.Event.CURSOR_UP, 35, 30,),], + [gesture.Recognizer.FAILED]), + # Fingers too far apart + self._genTouchEventFrames( + [(0, avg.Event.CURSOR_DOWN, 30, 30,),], + []), + self._genTouchEventFrames( + [(1, avg.Event.CURSOR_DOWN, 50, 30,),], + [gesture.Recognizer.FAILED]), + self._genTouchEventFrames( + [(1, avg.Event.CURSOR_UP, 70, 30,), + (0, avg.Event.CURSOR_UP, 60, 30,),], + []), + )) + + def testDragRecognizer(self): + + def onMove(offset): + if self.friction == -1: + self.assertEqual(offset, (40,40)) + self.messageTester.setMessageReceived(gesture.Recognizer.MOTION) + + def onUp(offset): + if self.friction == -1: + self.assertEqual(offset, (10,-10)) + self.messageTester.setMessageReceived(gesture.Recognizer.UP) + + def enable(isEnabled): + dragRecognizer.enable(isEnabled) + + def abort(): + dragRecognizer.abort() + + def setupRecognizer(friction, moveHandler=onMove, minDragDist=0, + direction=gesture.DragRecognizer.ANY_DIRECTION, **kargs): + self.__initImageScene() + dragRecognizer = gesture.DragRecognizer(self.image, moveHandler=moveHandler, + upHandler=onUp, friction=friction, minDragDist=minDragDist, + direction=direction, **kargs) + messageTester = MessageTester(dragRecognizer, [gesture.Recognizer.POSSIBLE, + gesture.Recognizer.DETECTED, gesture.Recognizer.FAILED, + gesture.Recognizer.END], + self) + return (dragRecognizer, messageTester) + + player.setFakeFPS(100) + sys.stderr.write("\n") + for self.friction in (-1, 100): + if self.friction == -1: + sys.stderr.write(" Simple drag, no inertia\n") + else: + sys.stderr.write(" Simple drag, inertia\n") + dragRecognizer, self.messageTester = setupRecognizer(friction=self.friction) + self.start(False, + (self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.DETECTED]), + self._genMouseEventFrames(avg.Event.CURSOR_MOTION, 70, 70, + [gesture.Recognizer.MOTION]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 40, 20, + [gesture.Recognizer.UP, gesture.Recognizer.END]), + lambda: enable(False), + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, []), + lambda: dragRecognizer.enable(True), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.DETECTED]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 40, 20, + [gesture.Recognizer.UP, gesture.Recognizer.END]), + + # Remove node during drag. + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.DETECTED]), + self.__killImageNode, + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, []), + )) + + # Test with constraint. + def onVertMove(offset): + if self.friction == -1: + self.assertEqual(offset, (0,40)) + self.messageTester.setMessageReceived(gesture.Recognizer.MOTION) + + for self.friction in (-1, 100): + if self.friction == -1: + sys.stderr.write(" Drag with constraint, no inertia\n") + else: + sys.stderr.write(" Drag with constraint, inertia\n") + dragRecognizer, self.messageTester = setupRecognizer(moveHandler=onVertMove, + friction=self.friction, direction=gesture.DragRecognizer.VERTICAL, + minDragDist=5) + self.start(False, + (self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_MOTION, 35, 30, []), + self._genMouseEventFrames(avg.Event.CURSOR_MOTION, 30, 70, + [gesture.Recognizer.DETECTED, gesture.Recognizer.MOTION]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 40, 20, + [gesture.Recognizer.UP, gesture.Recognizer.END]), + # Wrong direction -> stop. + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_MOTION, 70, 30, + [gesture.Recognizer.FAILED]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 70, 30, []), + + # No movement -> stop. + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 30, + [gesture.Recognizer.FAILED]), + + # Down, Abort, Motion, Motion, Up -> not recognized + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + abort, + self._genMouseEventFrames(avg.Event.CURSOR_MOTION, 35, 30, []), + self._genMouseEventFrames(avg.Event.CURSOR_MOTION, 30, 70, []), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 40, 20, []), + + # Down, Motion, Abort, Motion, Up -> not Recognized + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_MOTION, 35, 30, []), + abort, + self._genMouseEventFrames(avg.Event.CURSOR_MOTION, 30, 70, []), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 40, 20, []), + + # Down, Motion, Motion, Abort, Up -> not recognized + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_MOTION, 35, 30, []), + self._genMouseEventFrames(avg.Event.CURSOR_MOTION, 30, 70, + [gesture.Recognizer.DETECTED, gesture.Recognizer.MOTION]), + abort, + self._genMouseEventFrames(avg.Event.CURSOR_UP, 40, 20, []), + + # Down, Motion, Abort, Up, Down, Motion, Motion, Up -> Recognized + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_MOTION, 35, 30, []), + abort, + self._genMouseEventFrames(avg.Event.CURSOR_UP, 40, 20, []), + + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_MOTION, 35, 30, []), + self._genMouseEventFrames(avg.Event.CURSOR_MOTION, 30, 70, + [gesture.Recognizer.DETECTED, gesture.Recognizer.MOTION]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 40, 20, + [gesture.Recognizer.UP, gesture.Recognizer.END]), + )) + + # Test second down during inertia. + sys.stderr.write(" Down during inertia\n") + dragRecognizer, self.messageTester = setupRecognizer(friction=0.01) + self.start(False, + (lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 30, 30), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 40, 20), + self.messageTester.reset, + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 40, 20, + [gesture.Recognizer.END, gesture.Recognizer.DETECTED, + gesture.Recognizer.MOTION]), + )) + + # Test node delete during inertia + sys.stderr.write(" Delete during inertia\n") + dragRecognizer, self.messageTester = setupRecognizer(friction=0.01) + self.start(False, + (self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.DETECTED]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 40, 20, + [gesture.Recognizer.MOTION, gesture.Recognizer.UP]), + self.__killImageNode, + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 40, 20, + [gesture.Recognizer.MOTION]), + )) + + # Test second down during inertia, constrained recognizer + sys.stderr.write(" Down during inertia, constrained recognizer\n") + dragRecognizer, self.messageTester = setupRecognizer(friction=0.01, + direction=gesture.DragRecognizer.VERTICAL, minDragDist=5) + self.start(False, + (lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 30, 30), + self._genMouseEventFrames(avg.Event.CURSOR_MOTION, 30, 70, + [gesture.Recognizer.DETECTED, gesture.Recognizer.MOTION, + gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 30, 70, + [gesture.Recognizer.MOTION, gesture.Recognizer.UP]), + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.END, gesture.Recognizer.POSSIBLE, + gesture.Recognizer.MOTION]), + )) + + # Test abort in possible handler + for self.friction in (-1, 100): + if self.friction == -1: + sys.stderr.write(" Abort in possible handler, no inertia\n") + else: + sys.stderr.write(" Abort in possible handler, inertia\n") + dragRecognizer, self.messageTester = setupRecognizer(friction=self.friction, + minDragDist=5, possibleHandler=abort) + self.start(False, + (self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + self._genMouseEventFrames(avg.Event.CURSOR_MOTION, 70, 70, []), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 70, 70, []), + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 30, 30, + [gesture.Recognizer.POSSIBLE]), + )) + + player.setFakeFPS(-1) + + + def testDragRecognizerRelCoords(self): + + def onDrag(offset): + self.assertAlmostEqual(offset, (-40,-40)) + self.__onDragCalled = True + + player.setFakeFPS(100) + self.__onDragCalled = False + for self.friction in (-1, 100): + root = self.loadEmptyScene() + div = avg.DivNode(pos=(64,64), angle=math.pi, parent=root) + image = avg.ImageNode(parent=div, href="rgb24-64x64.png") + dragRecognizer = gesture.DragRecognizer(image, moveHandler=onDrag, + friction=self.friction) + self.start(False, + (lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 30, 30), + lambda: self._sendMouseEvent(avg.Event.CURSOR_MOTION, 70, 70), + )) + player.setFakeFPS(-1) + assert(self.__onDragCalled) + + + def testDragRecognizerInitialEvent(self): + + def onMotion(offset): + gesture.DragRecognizer(self.image, + detectedHandler=onDragStart, moveHandler=onDrag, + initialEvent=player.getCurrentEvent()) + self.image.unsubscribe(avg.Node.CURSOR_MOTION, onMotion) + + def onDragStart(): + self.__dragStartCalled = True + + def onDrag(offset): + self.assertEqual(offset, (10,0)) + + self.__initImageScene() + self.image.subscribe(avg.Node.CURSOR_MOTION, onMotion) + self.__dragStartCalled = False + self.start(False, + (lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 30, 30), + lambda: self._sendMouseEvent(avg.Event.CURSOR_MOTION, 40, 30), + lambda: self._sendMouseEvent(avg.Event.CURSOR_MOTION, 50, 30), + )) + assert(self.__dragStartCalled) + + + def testDragRecognizerCoordSysNode(self): + + def onDrag(offset): + self.assertEqual(offset, (40,40)) + self.__dragRecognizerCalled = True + + root = self.loadEmptyScene() + div = avg.DivNode(pos=(64,64), angle=math.pi, parent=root) + image = avg.ImageNode(parent=div, href="rgb24-64x64.png") + dragRecognizer = gesture.DragRecognizer(image, moveHandler=onDrag, + coordSysNode=div, friction=-1) + self.__dragRecognizerCalled = False + self.start(False, + (lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 30, 30), + lambda: self._sendMouseEvent(avg.Event.CURSOR_MOTION, 70, 70), + )) + assert(self.__dragRecognizerCalled) + + + def testDragRecognizerCoordSysNodeParentUnlink(self): + + def onDrag(offset): + self.assertEqual(offset, (40,40)) + self.__dragRecognizerCalled = True + + def onUp(offset): + self.__upRecognizerCalled = True + + root = self.loadEmptyScene() + div = avg.DivNode(pos=(64,64), angle=math.pi, parent=root) + image = avg.ImageNode(parent=div, href="rgb24-64x64.png") + dragRecognizer = gesture.DragRecognizer(image, moveHandler=onDrag, + coordSysNode=div, friction=-1) + self.__dragRecognizerCalled = False + self.__upRecognizerCalled = False + self.start(False, + (lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 30, 30), + lambda: self._sendMouseEvent(avg.Event.CURSOR_MOTION, 70, 70), + lambda: div.unlink(False), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 70, 70), + )) + assert(self.__dragRecognizerCalled) + assert(not self.__upRecognizerCalled) + + + def testDragRecognizerMinDist(self): + + def onMove(offset): + self.messageTester.setMessageReceived(gesture.Recognizer.MOTION) + + self.__initImageScene() + dragRecognizer = gesture.DragRecognizer(self.image, moveHandler=onMove, + minDragDist=10, friction=-1) + self.messageTester = MessageTester(dragRecognizer, [gesture.Recognizer.DETECTED], + self) + self.start(False, + (lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 30, 30), + self._genMouseEventFrames(avg.Event.CURSOR_MOTION, 30, 35, + []), + self._genMouseEventFrames(avg.Event.CURSOR_MOTION, 30, 50, + [gesture.Recognizer.DETECTED, gesture.Recognizer.MOTION]), + )) + + + def testTransformRecognizer(self): + + def onDetected(): + pass + + def onMove(transform): + self.transform = transform + + def onUp(transform): + self.transform = transform + + def checkTransform(expectedTransform): +# print self.transform +# print expectedTransform +# print + self.assertAlmostEqual(self.transform.trans, expectedTransform.trans) + self.assertAlmostEqual(self.transform.rot, expectedTransform.rot) + self.assertAlmostEqual(self.transform.scale, expectedTransform.scale) + if expectedTransform.rot != 0 or expectedTransform.scale != 1: + self.assertAlmostEqual(self.transform.pivot, expectedTransform.pivot) + + def createTransTestFrames(): + return ( + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_DOWN, 10, 10), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_UP, 20, 10), + lambda: checkTransform(gesture.Transform((10,0))), + ) + + def createRotTestFrames(expectedTransform): + return ( + lambda: self._sendTouchEvents(( + (1, avg.Event.CURSOR_DOWN, 0, 10), + (2, avg.Event.CURSOR_DOWN, 0, 20))), + lambda: self._sendTouchEvents(( + (1, avg.Event.CURSOR_MOTION, 0, 20), + (2, avg.Event.CURSOR_MOTION, 0, 10))), + lambda: checkTransform(expectedTransform), + lambda: self._sendTouchEvents(( + (1, avg.Event.CURSOR_UP, 0, 20), + (2, avg.Event.CURSOR_UP, 0, 10))), + ) + + def createScaleTestFrames(expectedTransform): + return ( + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_DOWN, 0, 10), + lambda: self._sendTouchEvent(2, avg.Event.CURSOR_DOWN, 0, 20), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_MOTION, 0, 10), + lambda: self._sendTouchEvent(2, avg.Event.CURSOR_MOTION, 0, 30), + lambda: checkTransform(expectedTransform), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_UP, 0, 10), + lambda: self._sendTouchEvent(2, avg.Event.CURSOR_UP, 0, 30), + ) + + player.setFakeFPS(100) + self.__initImageScene() + # Turn off the jitter filter. + gesture.TransformRecognizer.FILTER_MIN_CUTOFF = None + gesture.TransformRecognizer.FILTER_BETA = None + + self.__transformRecognizer = gesture.TransformRecognizer(self.image, + friction=-1, + detectedHandler=onDetected, moveHandler=onMove, upHandler=onUp) + self.start(False, + (# Check up/down handling + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_DOWN, 10, 10), + lambda: checkTransform(gesture.Transform((0,0))), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_MOTION, 20, 10), + lambda: checkTransform(gesture.Transform((10,0))), + lambda: self._sendTouchEvent(2, avg.Event.CURSOR_DOWN, 20, 20), + lambda: checkTransform(gesture.Transform((0,0))), + lambda: self._sendTouchEvents(( + (1, avg.Event.CURSOR_MOTION, 30, 10), + (2, avg.Event.CURSOR_MOTION, 30, 20))), + lambda: checkTransform(gesture.Transform((10,0))), + lambda: self._sendTouchEvent(2, avg.Event.CURSOR_UP, 30, 20), + lambda: checkTransform(gesture.Transform((0,0))), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_MOTION, 40, 10), + lambda: checkTransform(gesture.Transform((10,0))), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_UP, 50, 10), + lambda: checkTransform(gesture.Transform((10,0))), + + createRotTestFrames(gesture.Transform((0,0), math.pi, 1, (0,15))), + + createScaleTestFrames(gesture.Transform((0,5), 0, 2, (0,20))), + + # Delete node during transform + lambda: self._sendTouchEvents(( + (1, avg.Event.CURSOR_DOWN, 30, 10), + (2, avg.Event.CURSOR_DOWN, 30, 20))), + self.__killImageNode, + lambda: self._sendTouchEvents(( + (1, avg.Event.CURSOR_UP, 30, 10), + (2, avg.Event.CURSOR_UP, 30, 20))), + )) + + # Test rel. coords. + root = self.loadEmptyScene() + div = avg.DivNode(parent=root, pos=(0,10)) + image = avg.ImageNode(parent=div, href="rgb24-64x64.png") + self.__transformRecognizer = gesture.TransformRecognizer(image, friction=-1, + detectedHandler=onDetected, moveHandler=onMove, upHandler=onUp) + self.start(False, + (createTransTestFrames(), + createRotTestFrames(gesture.Transform((0,0), math.pi, 1, (0,5))), + createScaleTestFrames(gesture.Transform((0,5), 0, 2, (0,10))), + )) + + # Test coordSysNode. + root = self.loadEmptyScene() + div = avg.DivNode(parent=root, pos=(0,10)) + image = avg.ImageNode(parent=div, href="rgb24-64x64.png") + self.__transformRecognizer = gesture.TransformRecognizer(image, coordSysNode=div, + friction=-1, + detectedHandler=onDetected, moveHandler=onMove, upHandler=onUp) + self.start(False, + (createTransTestFrames(), + createRotTestFrames(gesture.Transform((0,0), math.pi, 1, (0,15))), + createScaleTestFrames(gesture.Transform((0,5), 0, 2, (0,20))), + )) + + # Test friction + root = self.loadEmptyScene() + div = avg.DivNode(parent=root, pos=(0,10)) + image = avg.ImageNode(parent=div, href="rgb24-64x64.png") + self.__transformRecognizer = gesture.TransformRecognizer(image, friction=0.01, + detectedHandler=onDetected, moveHandler=onMove, upHandler=onUp) + self.start(False, + (lambda: self._sendTouchEvent(1, avg.Event.CURSOR_DOWN, 10, 10), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_UP, 20, 10), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_DOWN, 10, 10), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_UP, 20, 10), + )) + + # Test abort + self.__initImageScene() + self.__transformRecognizer = gesture.TransformRecognizer(self.image, + detectedHandler=onDetected, moveHandler=onMove, upHandler=onUp) + self.start(False, + (self.__transformRecognizer.abort, + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_DOWN, 10, 10), + self.__transformRecognizer.abort, + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_MOTION, 20, 10), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_UP, 30, 10), + lambda: checkTransform(gesture.Transform((0,0))), + self.__transformRecognizer.abort, + )) + + # Test enable/disable + self.__initImageScene() + self.__transformRecognizer = gesture.TransformRecognizer(self.image, friction=-1, + detectedHandler=onDetected, moveHandler=onMove, upHandler=onUp) + self.start(False, + (# Regular disable + lambda: self.__transformRecognizer.enable(False), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_DOWN, 10, 10), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_MOTION, 20, 10), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_UP, 30, 10), + lambda: checkTransform(gesture.Transform((0,0))), + # Re-enable + lambda: self.__transformRecognizer.enable(True), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_DOWN, 10, 10), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_UP, 20, 10), + lambda: checkTransform(gesture.Transform((10,0))), + # Disable during gesture + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_DOWN, 10, 10), + lambda: self.__transformRecognizer.enable(False), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_UP, 20, 10), + lambda: checkTransform(gesture.Transform((0,0))), + lambda: self.__transformRecognizer.enable(True), + )) + + # Test enable/disable, friction + def disableDuringEnd(): + self.__transformRecognizer.enable(False) + + self.__initImageScene() + self.__transformRecognizer = gesture.TransformRecognizer(self.image, friction=1, + detectedHandler=onDetected, moveHandler=onMove, upHandler=onUp) + self.start(False, + (# Disable during end event + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_DOWN, 10, 10), + lambda: self.__transformRecognizer.subscribe(gesture.Recognizer.END, + disableDuringEnd), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_UP, 10, 10), + None, + )) + + # Test second down during inertia. + self.__initImageScene() + self.__transformRecognizer = gesture.TransformRecognizer(self.image, + friction=0.01, detectedHandler=onDetected, moveHandler=onMove, + upHandler=onUp) + self.start(False, + ( + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_DOWN, 10, 10), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_UP, 30, 10), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_DOWN, 30, 10), + )) + player.setFakeFPS(-1) + + def testKMeans(self): + pts = [avg.Point2D(0,0), avg.Point2D(0,1)] + means = gesture.calcKMeans(pts) + self.assertEqual(means, ([0], [1])) + + pts.append (avg.Point2D(0,4)) + means = gesture.calcKMeans(pts) + self.assertEqual(means, ([0,1], [2])) + + + def testMat3x3(self): + t = gesture.Mat3x3.translate([1,0,1]) + v = [1,0,1] + self.assertEqual(t.applyVec(v), [2,0,1]) + r = gesture.Mat3x3.rotate(math.pi/2) + self.assertAlmostEqual(r.applyVec(v), [0,1,1]) + self.assertAlmostEqual(t.applyMat(t).m, gesture.Mat3x3.translate([2,0,1]).m) + self.assertAlmostEqual(t.applyMat(r).m, gesture.Mat3x3([0,-1,1],[1,0,0]).m) + self.assertAlmostEqual(r.applyMat(t).m, gesture.Mat3x3([0,-1,0],[1,0,1]).m) + self.assertAlmostEqual(gesture.Mat3x3().m, gesture.Mat3x3().inverse().m) + m = gesture.Mat3x3([-1, 3, -3], + [ 0, -6, 5], + [-5, -3, 1]) + im = gesture.Mat3x3([3./2, 1., -1./2], + [-25./6, -8./3, 5./6], + [-5., -3., 1.]) + self.assertAlmostEqual(m.inverse().m, im.m) + + image = avg.ImageNode(pos=(10,20), size=(30,40), angle=1.57, + href="rgb24alpha-64x64.png") + mat = gesture.Mat3x3.fromNode(image) + mat.setNodeTransform(image) + self.assertAlmostEqual(image.pos, (10,20)) + self.assertAlmostEqual(image.size, (30,40)) + self.assertAlmostEqual(image.angle, 1.57) + + def __initImageScene(self): + root = self.loadEmptyScene() + self.image = avg.ImageNode(parent=root, href="rgb24-64x64.png") + + def __killImageNode(self): + self.image.unlink(True) + self.image = None + + +def gestureTestSuite(tests): + availableTests = ( + "testTapRecognizer", + "testHoldRecognizer", + "testDoubletapRecognizer", + "testSwipeRecognizer", + "testSwipeRecognizerTwoFingers", + "testDragRecognizer", + "testDragRecognizerRelCoords", + "testDragRecognizerInitialEvent", + "testDragRecognizerCoordSysNode", + "testDragRecognizerCoordSysNodeParentUnlink", + "testDragRecognizerMinDist", + "testTransformRecognizer", + "testKMeans", + "testMat3x3", + ) + + return createAVGTestSuite(availableTests, GestureTestCase, tests) diff --git a/src/test/ImageTest.py b/src/test/ImageTest.py index 5939656..f59d4ad 100644 --- a/src/test/ImageTest.py +++ b/src/test/ImageTest.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- # libavg - Media Playback Engine. -# Copyright (C) 2003-2011 Ulrich von Zadow +# 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 @@ -23,18 +23,16 @@ import shutil -from libavg import avg +from libavg import avg, player from testcase import * -g_IsMaskSupported = None - class ImageTestCase(AVGTestCase): def __init__(self, testFuncName): AVGTestCase.__init__(self, testFuncName) def testImageHRef(self): def createXmlNode(pos): - node = Player.createNode( + node = player.createNode( """<image pos="%s" href="rgb24-32x32.png"/>"""%str(pos)) self.assertEqual(node.getMediaSize(), avg.Point2D(32, 32)) return node @@ -46,7 +44,6 @@ class ImageTestCase(AVGTestCase): return node def addNodes(y): - xmlNode = createXmlNode((16, y)) root.appendChild(xmlNode) @@ -68,29 +65,29 @@ class ImageTestCase(AVGTestCase): if self._isCurrentDirWriteable(): # Can't check unicode filenames into svn or the windows client breaks. # So we rename the file locally. - shutil.copyfile("oe.png", u"ö.png") + shutil.copyfile("media/oe.png", u"media/ö.png") node = createXmlNode((16, 16)) root.appendChild(node) node.href = u"ö.png" - os.remove(u"ö.png") + os.remove(u"media/ö.png") def compareUnicode(): if self._isCurrentDirWriteable(): - self.compareImage("testImgHRef3", False) + self.compareImage("testImgHRef3") root = self.loadEmptyScene() addNodes(16) - self.start(( - lambda: self.compareImage("testImgHRef1", False), + self.start(False, + (lambda: self.compareImage("testImgHRef1"), lambda: addNodes(48), - lambda: self.compareImage("testImgHRef2", False), + lambda: self.compareImage("testImgHRef2"), setUnicodeHref, compareUnicode )) def testImagePos(self): def createXmlNode(pos): - return Player.createNode( + return player.createNode( """<image pos="%s" href="rgb24-32x32.png"/>"""%str(pos)) def createDictNode(root, p): @@ -115,15 +112,15 @@ class ImageTestCase(AVGTestCase): root = self.loadEmptyScene() addNodes(16) - self.start(( - lambda: self.compareImage("testImgPos1", False), + self.start(False, + (lambda: self.compareImage("testImgPos1"), lambda: addNodes(48), - lambda: self.compareImage("testImgPos2", False), + lambda: self.compareImage("testImgPos2"), )) def testImageSize(self): def createXmlNode(pos, size): - return Player.createNode( + return player.createNode( """<image pos="%s" size="%s" href="rgb24-64x64.png"/>""" %(str(pos), str(size))) @@ -148,10 +145,10 @@ class ImageTestCase(AVGTestCase): root = self.loadEmptyScene() addNodes(16) - self.start(( - lambda: self.compareImage("testImgSize1", False), + self.start(False, + (lambda: self.compareImage("testImgSize1"), lambda: addNodes(48), - lambda: self.compareImage("testImgSize2", False), + lambda: self.compareImage("testImgSize2"), )) def testImageWarp(self): @@ -171,15 +168,24 @@ class ImageTestCase(AVGTestCase): node.unlink() def addNode(): - node = createNode((16, 16)) - root.appendChild(node) - moveVertex(node) - + self.node = createNode((16, 16)) + root.appendChild(self.node) + moveVertex(self.node) + + def changeHref(): + self.node.href = "rgb24-65x65.png" + grid = self.node.getWarpedVertexCoords() + self.assert_(len(grid) == 10) + self.assert_(len(grid[0]) == 6) + + root = self.loadEmptyScene() testEarlyAccessException() - self.start(( - lambda: addNode(), - lambda: self.compareImage("testImgWarp1", False), + self.start(False, + (lambda: addNode(), + lambda: self.compareImage("testImgWarp1"), + lambda: changeHref(), + lambda: self.compareImage("testImgWarp2"), )) def testBitmap(self): @@ -193,35 +199,57 @@ class ImageTestCase(AVGTestCase): def loadFromBitmap(p, orighref): node = avg.ImageNode(pos=p, size=(32, 32), href=orighref) - bmp = avg.Bitmap('rgb24-65x65.png') + bmp = avg.Bitmap('media/rgb24-65x65.png') self.assertEqual(bmp.getSize(), (65,65)) node.setBitmap(bmp) self.assertEqual(node.getMediaSize(), (65,65)) root.appendChild(node) def testStringConversion(): - bmp = avg.Bitmap('rgb24-65x65.png') + bmp = avg.Bitmap('media/rgb24-65x65.png') s = bmp.getPixels() - bmp1 = avg.Bitmap(bmp.getSize(), avg.B8G8R8X8, "sample") + bmp1 = avg.Bitmap(bmp.getSize(), bmp.getFormat(), "sample") bmp1.setPixels(s) self.assert_(self.areSimilarBmps(bmp, bmp1, 0.01, 0.01)) + def testCropRect(): + bmp = avg.Bitmap('media/rgb24-65x65.png') + bmp1 = avg.Bitmap(bmp, (32,32), (64,64)) + self.assert_(bmp1.getSize() == (32,32)) + node = avg.ImageNode(pos=(96,0), parent=root) + node.setBitmap(bmp1) + + def testBlt(): + srcBmp = avg.Bitmap('media/rgb24-65x65.png') + destBmp = avg.Bitmap((65,65), srcBmp.getFormat(), "bmp") + destBmp.blt(srcBmp, (0,0)) + destBmp.blt(srcBmp, (32,32)) + node = avg.ImageNode(pos=(96,32), size=(32,32), parent=root) + node.setBitmap(destBmp) + + def testResize(): + srcBmp = avg.Bitmap('media/rgb24-32x32.png') + destBmp = srcBmp.getResized((64,64)) + self.assert_(destBmp.getSize() == (64,64)) + node = avg.ImageNode(pos=(128,0), size=(32,32), parent=root) + node.setBitmap(destBmp) + def testUnicode(): if self._isCurrentDirWriteable(): # Can't check unicode filenames into svn or the windows client breaks. # So we rename the file locally. - shutil.copyfile("oe.png", u"ö.png") - bmp = avg.Bitmap(u"ö.png") - os.remove(u"ö.png") + shutil.copyfile("media/oe.png", u"media/ö.png") + avg.Bitmap(u"media/ö.png") + os.remove(u"media/ö.png") def testGetPixel(): - bmp = avg.Bitmap('rgb24-65x65.png') + bmp = avg.Bitmap('media/rgb24-65x65.png') self.assertEqual(bmp.getPixel((1,1)), (255,0,0,255)) self.assertEqual(bmp.getPixel((33,1)), (0,255,0,255)) - bmp = avg.Bitmap('rgb24alpha-64x64.png') + bmp = avg.Bitmap('media/rgb24alpha-64x64.png') self.assertEqual(bmp.getPixel((1,1)), (0,0,0,0)) self.assertEqual(bmp.getPixel((63,1)), (83,255,83,142)) - bmp = avg.Bitmap('greyscale.png') + bmp = avg.Bitmap('media/greyscale.png') self.assertEqual(bmp.getPixel((1,1)), (255,255,255,255)) self.assertEqual(bmp.getPixel((1,63)), (0,0,0,255)) self.assertException(lambda: bmp.getPixel((64,0))) @@ -229,7 +257,13 @@ class ImageTestCase(AVGTestCase): def setNullBitmap(): node.setBitmap(None) - node = avg.ImageNode(href="rgb24-65x65.png", size=(32, 32)) + def testSubBitmap(): + srcBmp = avg.Bitmap('media/rgb24-32x32.png') + destBmp = avg.Bitmap(srcBmp, (16,16), (32,32)) + self.assertEqual(srcBmp.getPixel((16,16)), destBmp.getPixel((0,0))) + self.assertException(lambda: avg.Bitmap(srcBmp, (16,16), (16,32))) + + node = avg.ImageNode(href="media/rgb24-65x65.png", size=(32, 32)) getBitmap(node) root = self.loadEmptyScene() @@ -241,13 +275,20 @@ class ImageTestCase(AVGTestCase): loadFromBitmap((64,0), "rgb24alpha-64x64.png") testStringConversion() testUnicode() - self.start(( - lambda: getBitmap(node), + self.start(False, + (lambda: getBitmap(node), lambda: loadFromBitmap((32,32), ""), lambda: loadFromBitmap((64,32), "rgb24alpha-64x64.png"), - lambda: self.compareImage("testBitmap1", False), + lambda: self.compareImage("testBitmap1"), + testCropRect, + lambda: self.compareImage("testBitmap2"), + testBlt, + lambda: self.compareImage("testBitmap3"), + testResize, + lambda: self.compareImage("testBitmap4"), testGetPixel, - lambda: self.assertException(setNullBitmap) + lambda: self.assertException(setNullBitmap), + testSubBitmap, )) def testBitmapManager(self): @@ -262,17 +303,27 @@ class ImageTestCase(AVGTestCase): def loadValidBitmap(): def validBitmapCb(bitmap): self.assert_(not isinstance(bitmap, Exception)) - Player.setTimeout(0, loadUnexistentBitmap) + player.setTimeout(0, loadBitmapWithPixelFormat) + + avg.BitmapManager.get().loadBitmap("media/rgb24alpha-64x64.png", + validBitmapCb) + + def loadBitmapWithPixelFormat(): + def validBitmapCb(bitmap): + self.assert_(not isinstance(bitmap, Exception)) + self.assert_(bitmap.getFormat() == avg.B5G6R5) + player.setTimeout(0, loadUnexistentBitmap) - avg.BitmapManager.get().loadBitmap("rgb24alpha-64x64.png", validBitmapCb) + avg.BitmapManager.get().loadBitmap("media/rgb24alpha-64x64.png", + validBitmapCb, avg.B5G6R5) def loadUnexistentBitmap(): avg.BitmapManager.get().loadBitmap("nonexistent.png", lambda bmp: expectException( returnValue=bmp, - nextAction=lambda: Player.setTimeout(0, loadBrokenImage))) + nextAction=lambda: player.setTimeout(0, loadBrokenBitmap))) - def loadBrokenImage(): + def loadBrokenBitmap(): import tempfile tempFileName = os.path.join(tempfile.gettempdir(), "broken.png") @@ -280,27 +331,55 @@ class ImageTestCase(AVGTestCase): def cleanupAndTestReturnValue(returnValue): os.unlink(tempFileName) - expectException(returnValue=returnValue, nextAction=Player.stop) + expectException(returnValue=returnValue, nextAction=player.stop) avg.BitmapManager.get().loadBitmap(tempFileName, cleanupAndTestReturnValue) - + def reportStuck(): raise RuntimeError("BitmapManager didn't reply " "within %dms timeout" % WAIT_TIMEOUT) - Player.stop() + player.stop() - root = self.loadEmptyScene() - - Player.setTimeout(WAIT_TIMEOUT, reportStuck) - Player.setResolution(0, 0, 0, 0) - loadValidBitmap() - Player.play() + for multithread in [False, True]: + self.loadEmptyScene() + if multithread: + avg.BitmapManager.get().setNumThreads(2) + player.setTimeout(WAIT_TIMEOUT, reportStuck) + player.setResolution(0, 0, 0, 0) + loadValidBitmap() + player.play() + avg.BitmapManager.get().setNumThreads(1) + def testBitmapManagerException(self): + def bitmapCb(bitmap): + raise RuntimeError + + self.loadEmptyScene() + avg.BitmapManager.get().loadBitmap("rgb24alpha-64x64.png", bitmapCb), + self.assertException(player.play) + def testBlendMode(self): + def isBlendMinMaxSupported(): + def tryInsertNode(): + try: + avg.ImageNode(href="rgb24-65x65.png", blendmode="min", parent=root) + except RuntimeError: + self.supported = False + root = self.loadEmptyScene() + self.supported = True + self.start(False, + (tryInsertNode, + )) + return self.supported + + def setBlendMode(): blendNode.blendmode="add" + if not(isBlendMinMaxSupported()): + self.skip("Blend modes min and max not supported.") + return root = self.loadEmptyScene() avg.ImageNode(href="freidrehen.jpg", parent=root) blendNode = avg.ImageNode(opacity=0.6, href="rgb24-65x65.png", parent=root) @@ -311,10 +390,10 @@ class ImageTestCase(AVGTestCase): avg.ImageNode(pos=(48,48), opacity=1, href="rgb24-65x65.png", blendmode="max", parent=root) - self.start(( - lambda: self.compareImage("testBlend1", False), + self.start(False, + (lambda: self.compareImage("testBlend1"), setBlendMode, - lambda: self.compareImage("testBlend2", False) + lambda: self.compareImage("testBlend2") )) def testImageMask(self): @@ -342,34 +421,31 @@ class ImageTestCase(AVGTestCase): def setMaskNotFound(): node.maskhref = "nonexistentmask.png" - if not(self._hasShaderSupport()): - return root = self.loadEmptyScene() createNode((0,0)) node = root.getChild(0) setNoAttach((32,0)) setAttach((64,0)) - self.start(( - lambda: createNode((0, 32)), + self.start(False, + (lambda: createNode((0, 32)), lambda: setNoAttach((32,32)), lambda: setAttach((64,32)), - lambda: self.compareImage("testImgMask1", False), + lambda: self.compareImage("testImgMask1"), changeHRef, - lambda: self.compareImage("testImgMask2", False), + lambda: self.compareImage("testImgMask2"), changeBaseHRef, - lambda: self.compareImage("testImgMask3", False), + lambda: self.compareImage("testImgMask3"), setMaskNotFound )) def testImageMaskCanvas(self): - if not(self._hasShaderSupport()): - return root = self.loadEmptyScene() - canvas = Player.createCanvas(id="testcanvas", size=(64,64)) + canvas = player.createCanvas(id="testcanvas", size=(64,64), mediadir="media") avg.ImageNode(href="rgb24-64x64.png", parent=canvas.getRootNode()) avg.RectNode(size=(160,120), fillcolor="FFFFFF", fillopacity=1, parent=root) - node = avg.ImageNode(href="canvas:testcanvas", maskhref="mask.png", parent=root) - self.start([lambda: self.compareImage("testImgMaskCanvas", False)]) + avg.ImageNode(href="canvas:testcanvas", maskhref="mask.png", parent=root) + self.start(False, + (lambda: self.compareImage("testImgMaskCanvas"),)) def testImageMaskPos(self): def createNode(p): @@ -390,16 +466,14 @@ class ImageTestCase(AVGTestCase): node.maskpos = (32, 32) root = self.loadEmptyScene() - if not(self._hasShaderSupport()): - return createNode((0,0)) setNoAttach((32,0)) setAttach((64,0)) - self.start(( - lambda: createNode((0, 32)), + self.start(False, + (lambda: createNode((0, 32)), lambda: setNoAttach((32,32)), lambda: setAttach((64,32)), - lambda: self.compareImage("testImgMaskPos", False) + lambda: self.compareImage("testImgMaskPos") )) def testImageMaskSize(self): @@ -426,33 +500,30 @@ class ImageTestCase(AVGTestCase): node.masksize = (0, 0) root = self.loadEmptyScene() - if not(self._hasShaderSupport()): - return createNode((0,0)) node = root.getChild(0) setNoAttach((32,0)) setAttach((64,0)) - self.start(( - lambda: createNode((0, 32)), + self.start(False, + (lambda: createNode((0, 32)), lambda: setNoAttach((32,32)), lambda: setAttach((64,32)), - lambda: self.compareImage("testImgMaskSize1", False), + lambda: self.compareImage("testImgMaskSize1"), setPos, - lambda: self.compareImage("testImgMaskSize2", False), + lambda: self.compareImage("testImgMaskSize2"), resetPos, - lambda: self.compareImage("testImgMaskSize3", False) + lambda: self.compareImage("testImgMaskSize3") )) def testImageMipmap(self): root = self.loadEmptyScene() - avg.ImageNode(size=(64,64), href="checker.png", parent=root) - avg.ImageNode(pos=(64,0), size=(64,64), href="checker.png", mipmap=True, - parent=root) - self.start([lambda: self.compareImage("testMipmap", False)]) + avg.ImageNode(size=(64,64), href="checker.png", mipmap=True, parent=root) + self.start(False, + (lambda: self.compareImage("testMipmap"),)) def testImageCompression(self): def loadBitmap(): - bmp = avg.Bitmap("colorramp.png") + bmp = avg.Bitmap("media/colorramp.png") self.image.setBitmap(bmp) def relink(): @@ -466,15 +537,30 @@ class ImageTestCase(AVGTestCase): self.image = avg.ImageNode(href="rgb24-64x64.png", compression="B5G6R5", parent=root) self.assertEqual(self.image.compression, "B5G6R5") - self.start([ - lambda: self.compareImage("testTexCompression1", False), + self.start(False, + [lambda: self.compareImage("testTexCompression1"), loadBitmap, - lambda: self.compareImage("testTexCompression2", False), + lambda: self.compareImage("testTexCompression2"), relink, - lambda: self.compareImage("testTexCompression2", False), + lambda: self.compareImage("testTexCompression2"), checkAlpha, ]) + def testSpline(self): + spline = avg.CubicSpline([(0,3),(1,2),(2,1),(3,0)]) + self.assertAlmostEqual(spline.interpolate(0), 3) + self.assertAlmostEqual(spline.interpolate(0.5), 2.5) + self.assertAlmostEqual(spline.interpolate(1), 2) + self.assertAlmostEqual(spline.interpolate(-1), 4) + self.assertAlmostEqual(spline.interpolate(4), -1) + + spline = avg.CubicSpline([(2,0),(4,1),(6,3),(8,6)]) + self.assertAlmostEqual(spline.interpolate(2), 0) + self.assert_(spline.interpolate(3) < 0.5) + self.assert_(spline.interpolate(3) > 0.0) + self.assert_(spline.interpolate(7) < 4.5) + self.assert_(spline.interpolate(7) > 4) + def imageTestSuite(tests): availableTests = ( @@ -484,6 +570,7 @@ def imageTestSuite(tests): "testImageWarp", "testBitmap", "testBitmapManager", + "testBitmapManagerException", "testBlendMode", "testImageMask", "testImageMaskCanvas", @@ -491,8 +578,6 @@ def imageTestSuite(tests): "testImageMaskSize", "testImageMipmap", "testImageCompression", + "testSpline", ) return createAVGTestSuite(availableTests, ImageTestCase, tests) - -Player = avg.Player.get() - diff --git a/src/test/InputDeviceTest.py b/src/test/InputDeviceTest.py index f0bb935..c6350cb 100644 --- a/src/test/InputDeviceTest.py +++ b/src/test/InputDeviceTest.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # libavg - Media Playback Engine. -# Copyright (C) 2003-2011 Ulrich von Zadow +# 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 @@ -19,12 +19,19 @@ # Current versions can be found at www.libavg.de # -import unittest - -from libavg import avg +from libavg import avg, player from testcase import * +class CustomMouseEvent(avg.TouchEvent): + def __init__(self, eventId, eventType, pos, source): + super(CustomMouseEvent, self).__init__(eventId, eventType, pos, source) + self.customAttribute = None + + def customMethod(self): + pass + + class CustomInputDevice(avg.InputDevice): def __init__(self, eventReceiverNode=None): if eventReceiverNode: @@ -57,7 +64,7 @@ class AnonymousInputDevice(avg.InputDevice): def pollEvents(self): if self.__isInitialized: return [] self.__isInitialized = True - return [ avg.Event(avg.CUSTOMEVENT, avg.CUSTOM) ] + return [ avg.Event(avg.Event.CUSTOM_EVENT, avg.Event.CUSTOM) ] class EventTestCase(AVGTestCase): @@ -69,13 +76,20 @@ class EventTestCase(AVGTestCase): class DerivedEvent(avg.Event): def __init__(self): - super(DerivedEvent, self).__init__(avg.CUSTOMEVENT, avg.NONE) + super(DerivedEvent, self).__init__(avg.Event.CUSTOM_EVENT, avg.Event.NONE) self.property = True + class CustomMouseEvent(avg.TouchEvent): + def __init__(self): + super(CustomMouseEvent, self).__init__(42, avg.Event.CURSOR_DOWN, + (10, 10), avg.Event.TOUCH) + self.customAttribute = None + self.hasEventHandlerBeenCalled = False self.isCustomInputDeviceSet = False self.isCustomInputDeviceNameSet = False self.hasCustomEventProperty = False + self.customMouseEventHandlerCalled = False def eventHandler(event): self.hasEventHandlerBeenCalled = True @@ -85,7 +99,11 @@ class EventTestCase(AVGTestCase): def customEventEventHandler(event): self.hasCustomEventProperty = event.property - + + def customMouseEventHandler(event): + self.customMouseEventHandlerCalled = True + self.assert_(hasattr(event, "customAttribute")) + def checkAndResetResults(): if not self.hasEventHandlerBeenCalled: return False if not self.isCustomInputDeviceSet: return False @@ -97,17 +115,18 @@ class EventTestCase(AVGTestCase): return True rectNode = avg.RectNode(parent=root, pos=(0, 0), size=(50, 50)) - rectNode.setEventHandler(avg.CURSORDOWN, avg.MOUSE|avg.TOUCH, eventHandler) + rectNode.subscribe(avg.Node.CURSOR_DOWN, eventHandler) - root.setEventHandler(avg.CURSORDOWN, avg.NONE, eventHandler) - root.setEventHandler(avg.CUSTOMEVENT, avg.NONE, customEventEventHandler) + root.subscribe(avg.Node.CURSOR_DOWN, eventHandler) + root.setEventHandler(avg.Event.CUSTOM_EVENT, avg.Event.NONE, + customEventEventHandler) self.customInputDevice = CustomInputDevice() - Player.addInputDevice(self.customInputDevice) + player.addInputDevice(self.customInputDevice) - self.start(( - lambda: self.customInputDevice.feedEvent( - avg.Event(avg.CURSORDOWN, avg.NONE)), + self.start(False, + (lambda: self.customInputDevice.feedEvent( + avg.Event(avg.Event.CURSOR_DOWN, avg.Event.MOUSE)), lambda: self.assert_(checkAndResetResults()), lambda: self.customInputDevice.feedEvent( @@ -115,14 +134,20 @@ class EventTestCase(AVGTestCase): lambda: self.assert_(self.hasCustomEventProperty), lambda: self.customInputDevice.feedEvent( - avg.MouseEvent(avg.CURSORDOWN, False, False, False, (5, 5), 0)), + avg.MouseEvent(avg.Event.CURSOR_DOWN, False, False, False, + (5, 5), 0)), lambda: self.assert_(checkAndResetResults()), lambda: self.customInputDevice.feedEvent( - avg.TouchEvent(300, avg.CURSORDOWN, (5, 5), avg.TOUCH, (10,10))), - lambda: self.assert_(checkAndResetResults()) - )) - + avg.TouchEvent(300, avg.Event.CURSOR_DOWN, (5, 5), + avg.Event.TOUCH, (10,10))), + lambda: self.assert_(checkAndResetResults()), + + lambda: root.subscribe(avg.Node.CURSOR_DOWN, customMouseEventHandler), + lambda: self.customInputDevice.feedEvent(CustomMouseEvent()), + lambda: self.assert_(self.customMouseEventHandlerCalled), + )) + def testAnonymousInputDevice(self): root = self.loadEmptyScene() @@ -139,14 +164,14 @@ class EventTestCase(AVGTestCase): self.hasEventHandlerBeenCalled = False return True - root.setEventHandler(avg.CUSTOMEVENT, avg.CUSTOM, eventHandler) - Player.addInputDevice(AnonymousInputDevice()) + root.setEventHandler(avg.Event.CUSTOM_EVENT, avg.Event.CUSTOM, eventHandler) + player.addInputDevice(AnonymousInputDevice()) - self.start(( - lambda: None, + self.start(False, + (lambda: None, lambda: None, lambda: self.assert_(checkAndResetResults()) - )) + )) def testInputDeviceEventReceiverNode(self): root = self.loadEmptyScene() @@ -155,36 +180,33 @@ class EventTestCase(AVGTestCase): rectNode = avg.RectNode(id="rect", size=(50, 50), parent=root) self.customInputDevice = CustomInputDevice(divNode) - Player.addInputDevice(self.customInputDevice) + player.addInputDevice(self.customInputDevice) handlerTester = NodeHandlerTester(self, divNode) - self.start(( - lambda: self.customInputDevice.feedEvent( - avg.MouseEvent(avg.CURSORDOWN, True, False, False, (10, 10), 1)), + self.start(False, + (lambda: self.customInputDevice.feedEvent( + avg.MouseEvent(avg.Event.CURSOR_DOWN, True, False, False, + (10, 10), 1)), lambda: handlerTester.assertState( - down=True, up=False, over=True, out=False, move=False), + (avg.Node.CURSOR_DOWN, avg.Node.CURSOR_OVER)), lambda: self.customInputDevice.feedEvent(avg.MouseEvent( - avg.CURSORMOTION, True, False, False, (12, 12), 1)), - lambda: handlerTester.assertState( - down=False, up=False, over=False, out=False, move=True), + avg.Event.CURSOR_MOTION, True, False, False, (12, 12), 1)), + lambda: handlerTester.assertState((avg.Node.CURSOR_MOTION,)), lambda: self.customInputDevice.feedEvent(avg.MouseEvent( - avg.CURSORMOTION, True, False, False, (100, 100), 1)), - lambda: handlerTester.assertState( - down=False, up=False, over=False, out=True, move=False), + avg.Event.CURSOR_MOTION, True, False, False, (100, 100), 1)), + lambda: handlerTester.assertState((avg.Node.CURSOR_OUT,)), lambda: self.customInputDevice.feedEvent(avg.MouseEvent( - avg.CURSORMOTION, True, False, False, (12, 12), 1)), + avg.Event.CURSOR_MOTION, True, False, False, (12, 12), 1)), lambda: handlerTester.assertState( - down=False, up=False, over=True, out=False, move=True), + (avg.Node.CURSOR_OVER, avg.Node.CURSOR_MOTION)), lambda: self.customInputDevice.feedEvent(avg.MouseEvent( - avg.CURSORUP, False, False, False, (12, 12), 1)), - lambda: handlerTester.assertState( - down=False, up=True, over=False, out=False, move=False) - + avg.Event.CURSOR_UP, False, False, False, (12, 12), 1)), + lambda: handlerTester.assertState((avg.Node.CURSOR_UP,)), )) def inputDeviceTestSuite(tests): @@ -194,6 +216,3 @@ def inputDeviceTestSuite(tests): "testInputDeviceEventReceiverNode" ) return createAVGTestSuite(availableTests, EventTestCase, tests) - -Player = avg.Player.get() -Helper = Player.getTestHelper() diff --git a/src/test/LoggerTest.py b/src/test/LoggerTest.py new file mode 100644 index 0000000..9848dcd --- /dev/null +++ b/src/test/LoggerTest.py @@ -0,0 +1,96 @@ +# -*- 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 StringIO +import logging + +from libavg import logger + +from testcase import * + + +class LoggerTestCase(AVGTestCase): + def __init__(self, testFuncName): + AVGTestCase.__init__(self, testFuncName) + self.testMsg = u'福 means good fortune' + + def setUp(self): + self.stream = StringIO.StringIO() + self.hdlr = logging.StreamHandler(self.stream) + self.pyLogger = logging.getLogger(__name__) + self.pyLogger.addHandler(self.hdlr) + self.pyLogger.propagate = False + self.pyLogger.level = logging.DEBUG + logger.addSink(self.pyLogger) + logger.removeStdLogSink() + + def tearDown(self): + self.pyLogger.removeHandler(self.hdlr) + + def _assertMsg(self): + self.stream.flush() + self.assert_(self.stream.getvalue().decode('utf8').find(self.testMsg) != -1) + self.stream.close() + + def _assertNoMsg(self): + self.stream.flush() + self.assert_(self.stream.getvalue().decode('utf8').find(self.testMsg) == -1) + self.stream.close() + + def testRemoveSink(self): + logger.removeSink(self.pyLogger) + logger.info(self.testMsg) + self._assertNoMsg() + + def testConfigureCategory(self): + snowmanCategory = logger.configureCategory(u'☃ Category') + logger.warning(self.testMsg, snowmanCategory) + self._assertMsg() + + def testReconfigureCategory(self): + snowmanCategory = logger.configureCategory(u'☃ Category', logger.Severity.INFO) + logger.info(self.testMsg, snowmanCategory) + self._assertMsg() + + def testOmitCategory(self): + logger.configureCategory(logger.Category.APP, logger.Severity.CRIT) + logger.info(self.testMsg) + self._assertNoMsg() + + def testLogCategory(self): + logger.configureCategory(logger.Category.APP, logger.Severity.INFO) + logger.info(self.testMsg) + self._assertMsg() + + def testUnknownCategoryWarning(self): + self.assertException(lambda: logger.error("Foo", "Bar")) + + +def loggerTestSuite(tests): + availableTests = ( + "testRemoveSink", + "testConfigureCategory", + "testReconfigureCategory", + "testOmitCategory", + "testLogCategory", + "testUnknownCategoryWarning", + ) + return createAVGTestSuite(availableTests, LoggerTestCase, tests) diff --git a/src/test/Makefile.am b/src/test/Makefile.am index 215ce67..27b0e90 100644 --- a/src/test/Makefile.am +++ b/src/test/Makefile.am @@ -3,7 +3,7 @@ SUBDIRS = plugin pkgpyexec_PYTHON = testcase.py testapp.py EXTRA_DIST = $(wildcard *.avg) $(wildcard *.png) $(wildcard *.jpg) $(wildcard *.tif) \ - $(wildcard *.py) $(wildcard baseline/*.png) $(wildcard testmediadir/*) \ - $(wildcard extrafonts) $(wildcard fonts) $(wildcard *.svg) + $(wildcard *.py) $(wildcard baseline/*.png) $(wildcard testmediadir/*) \ + $(wildcard extrafonts) $(wildcard fonts) $(wildcard *.svg) $(wildcard media/*) -TESTS= Test.py +TESTS = Test.py diff --git a/src/test/Makefile.in b/src/test/Makefile.in index 550dc45..321e19d 100644 --- a/src/test/Makefile.in +++ b/src/test/Makefile.in @@ -1,9 +1,9 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -41,22 +41,23 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ac_cxx_namespaces.m4 \ $(top_srcdir)/m4/ac_path_generic.m4 \ $(top_srcdir)/m4/ax_boost_thread.m4 \ - $(top_srcdir)/m4/ax_check_gl.m4 $(top_srcdir)/m4/libtool.m4 \ - $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ - $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ - $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/m4/python_dev.m4 \ - $(top_srcdir)/configure.in + $(top_srcdir)/m4/ax_check_gl.m4 \ + $(top_srcdir)/m4/ax_python_devel.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ + $(top_srcdir)/m4/avg_version.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/src/avgconfig.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = -AM_V_GEN = $(am__v_GEN_$(V)) -am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; -AM_V_at = $(am__v_at_$(V)) -am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ SOURCES = DIST_SOURCES = @@ -88,6 +89,13 @@ am__nobase_list = $(am__nobase_strip_setup); \ am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__py_compile = PYTHON=$(PYTHON) $(SHELL) $(py_compile) am__installdirs = "$(DESTDIR)$(pkgpyexecdir)" py_compile = $(top_srcdir)/py-compile RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ @@ -135,7 +143,7 @@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_PYTHON_LIBS = @BOOST_PYTHON_LIBS@ -BOOST_THREAD_LIB = @BOOST_THREAD_LIB@ +BOOST_THREAD_LIBS = @BOOST_THREAD_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ @@ -150,6 +158,7 @@ DC1394_2_CFLAGS = @DC1394_2_CFLAGS@ DC1394_2_LIBS = @DC1394_2_LIBS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ @@ -190,6 +199,7 @@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MTDEV_CFLAGS = @MTDEV_CFLAGS@ MTDEV_LIBS = @MTDEV_LIBS@ @@ -219,11 +229,13 @@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ PYTHON = @PYTHON@ +PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ -PYTHON_INCLUDES = @PYTHON_INCLUDES@ -PYTHON_LIBS = @PYTHON_LIBS@ +PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ +PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ @@ -246,6 +258,7 @@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ @@ -280,7 +293,6 @@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ @@ -307,8 +319,8 @@ top_srcdir = @top_srcdir@ SUBDIRS = plugin pkgpyexec_PYTHON = testcase.py testapp.py EXTRA_DIST = $(wildcard *.avg) $(wildcard *.png) $(wildcard *.jpg) $(wildcard *.tif) \ - $(wildcard *.py) $(wildcard baseline/*.png) $(wildcard testmediadir/*) \ - $(wildcard extrafonts) $(wildcard fonts) $(wildcard *.svg) + $(wildcard *.py) $(wildcard baseline/*.png) $(wildcard testmediadir/*) \ + $(wildcard extrafonts) $(wildcard fonts) $(wildcard *.svg) $(wildcard media/*) TESTS = Test.py all: all-recursive @@ -368,11 +380,8 @@ install-pkgpyexecPYTHON: $(pkgpyexec_PYTHON) $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgpyexecdir)" || exit $$?; \ done || exit $$?; \ if test -n "$$dlist"; then \ - if test -z "$(DESTDIR)"; then \ - PYTHON=$(PYTHON) $(py_compile) --basedir "$(pkgpyexecdir)" $$dlist; \ - else \ - PYTHON=$(PYTHON) $(py_compile) --destdir "$(DESTDIR)" --basedir "$(pkgpyexecdir)" $$dlist; \ - fi; \ + $(am__py_compile) --destdir "$(DESTDIR)" \ + --basedir "$(pkgpyexecdir)" $$dlist; \ else :; fi uninstall-pkgpyexecPYTHON: @@ -380,14 +389,14 @@ uninstall-pkgpyexecPYTHON: @list='$(pkgpyexec_PYTHON)'; test -n "$(pkgpyexecdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ + dir='$(DESTDIR)$(pkgpyexecdir)'; \ filesc=`echo "$$files" | sed 's|$$|c|'`; \ fileso=`echo "$$files" | sed 's|$$|o|'`; \ - echo " ( cd '$(DESTDIR)$(pkgpyexecdir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(pkgpyexecdir)" && rm -f $$files || exit $$?; \ - echo " ( cd '$(DESTDIR)$(pkgpyexecdir)' && rm -f" $$filesc ")"; \ - cd "$(DESTDIR)$(pkgpyexecdir)" && rm -f $$filesc || exit $$?; \ - echo " ( cd '$(DESTDIR)$(pkgpyexecdir)' && rm -f" $$fileso ")"; \ - cd "$(DESTDIR)$(pkgpyexecdir)" && rm -f $$fileso + st=0; \ + for files in "$$files" "$$filesc" "$$fileso"; do \ + $(am__uninstall_files_from_dir) || st=$$?; \ + done; \ + exit $$st # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. @@ -605,14 +614,15 @@ check-TESTS: $(TESTS) fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ if test "$$failed" -eq 0; then \ - echo "$$grn$$dashes"; \ + col="$$grn"; \ else \ - echo "$$red$$dashes"; \ + col="$$red"; \ fi; \ - echo "$$banner"; \ - test -z "$$skipped" || echo "$$skipped"; \ - test -z "$$report" || echo "$$report"; \ - echo "$$dashes$$std"; \ + echo "$${col}$$dashes$${std}"; \ + echo "$${col}$$banner$${std}"; \ + test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \ + test -z "$$report" || echo "$${col}$$report$${std}"; \ + echo "$${col}$$dashes$${std}"; \ test "$$failed" -eq 0; \ else :; fi @@ -693,10 +703,15 @@ install-am: all-am installcheck: installcheck-recursive install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi mostlyclean-generic: clean-generic: diff --git a/src/test/OffscreenTest.py b/src/test/OffscreenTest.py index 2ea6e6b..76bff52 100644 --- a/src/test/OffscreenTest.py +++ b/src/test/OffscreenTest.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # libavg - Media Playback Engine. -# Copyright (C) 2003-2011 Ulrich von Zadow +# 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 @@ -19,9 +19,7 @@ # Current versions can be found at www.libavg.de # -import unittest - -from libavg import avg +from libavg import avg, player from testcase import * import gc @@ -43,7 +41,7 @@ class OffscreenTestCase(AVGTestCase): self.canvas2 = canvas def unlink(): - self.node = Player.getElementByID("imagenode") + self.node = player.getElementByID("imagenode") self.node.unlink() self.assertEqual(self.canvas1.getNumDependentCanvases(), 0) gc.collect() @@ -54,61 +52,61 @@ class OffscreenTestCase(AVGTestCase): self.assertEqual(self.canvas1.getNumDependentCanvases(), 1) def changeHRef(href): - Player.getElementByID("imagenode").href = href + player.getElementByID("imagenode").href = href def setBitmap(): - bitmap = avg.Bitmap("rgb24-65x65.png") - Player.getElementByID("imagenode").setBitmap(bitmap) + bitmap = avg.Bitmap("media/rgb24-65x65.png") + player.getElementByID("imagenode").setBitmap(bitmap) def deleteCanvases(): changeHRef("") firstNode.href = "" - Player.deleteCanvas("testcanvas1") + player.deleteCanvas("testcanvas1") # self.assertException(lambda: changeHRef("canvas:testcanvas1")) changeHRef("canvas:testcanvas2") -# self.assertException(lambda: Player.deleteCanvas("testcanvas2")) +# self.assertException(lambda: player.deleteCanvas("testcanvas2")) changeHRef("") - Player.deleteCanvas("testcanvas2") -# self.assertException(lambda: Player.deleteCanvas("foo")) + player.deleteCanvas("testcanvas2") +# self.assertException(lambda: player.deleteCanvas("foo")) root = self.loadEmptyScene() + root.mediadir = "media" createCanvas(True, "testcanvas1", 0) - firstNode = Player.getElementByID("imagenode") - self.start(( - lambda: self.compareImage("testOffscreen1", False), + firstNode = player.getElementByID("imagenode") + self.start(False, + (lambda: self.compareImage("testOffscreen1"), unlink, - lambda: self.compareImage("testOffscreen2", False), + lambda: self.compareImage("testOffscreen2"), relink, - lambda: self.compareImage("testOffscreen1", False), + lambda: self.compareImage("testOffscreen1"), unlink, lambda: createCanvas(False, "testcanvas2", 80), - lambda: self.compareImage("testOffscreen3", False), + lambda: self.compareImage("testOffscreen3"), lambda: changeHRef("canvas:testcanvas1"), lambda: self.assertEqual(self.canvas1.getNumDependentCanvases(), 1), lambda: self.assertEqual(self.canvas2.getNumDependentCanvases(), 0), - lambda: self.compareImage("testOffscreen1", False), + lambda: self.compareImage("testOffscreen1"), lambda: changeHRef("rgb24-65x65.png"), lambda: self.assertEqual(self.canvas1.getNumDependentCanvases(), 0), - lambda: self.compareImage("testOffscreen4", False), + lambda: self.compareImage("testOffscreen4"), lambda: changeHRef("canvas:testcanvas1"), lambda: self.assertEqual(self.canvas1.getNumDependentCanvases(), 1), - lambda: self.compareImage("testOffscreen1", False), + lambda: self.compareImage("testOffscreen1"), setBitmap, - lambda: self.compareImage("testOffscreen4", False), + lambda: self.compareImage("testOffscreen4"), deleteCanvases, - lambda: self.compareImage("testOffscreen5", False), + lambda: self.compareImage("testOffscreen5"), )) def testCanvasLoadAfterPlay(self): def createOffscreenCanvas(): - offscreenCanvas = self.__createOffscreenCanvas("offscreencanvas", False) - self.node = avg.ImageNode(parent=root, - href="canvas:offscreencanvas") + self.__createOffscreenCanvas("offscreencanvas", False) + self.node = avg.ImageNode(parent=root, href="canvas:offscreencanvas") root = self.loadEmptyScene() - self.start(( - createOffscreenCanvas, - lambda: self.compareImage("testOffscreen1", False), + self.start(False, + (createOffscreenCanvas, + lambda: self.compareImage("testOffscreen1"), )) def testCanvasResize(self): @@ -116,46 +114,46 @@ class OffscreenTestCase(AVGTestCase): self.node.size = (80, 60) mainCanvas, offscreenCanvas = self.__setupCanvas(False) - self.start(( - setSize, - lambda: self.compareImage("testCanvasResize", False) + self.start(False, + (setSize, + lambda: self.compareImage("testCanvasResize") )) def testCanvasErrors(self): self.loadEmptyScene() # Missing size self.assertException( - lambda: Player.createCanvas(id="foo")) + lambda: player.createCanvas(id="foo")) # Duplicate canvas id - Player.createCanvas(id="foo", size=(160, 120)) + player.createCanvas(id="foo", size=(160, 120)) self.assertException( - lambda: Player.createCanvas(id="foo", size=(160, 120))) + lambda: player.createCanvas(id="foo", size=(160, 120))) def testCanvasAPI(self): def checkMainScreenshot(): - bmp1 = Player.screenshot() + bmp1 = player.screenshot() bmp2 = mainCanvas.screenshot() self.assert_(self.areSimilarBmps(bmp1, bmp2, 0.01, 0.01)) def checkCanvasScreenshot(): bmp = offscreenCanvas.screenshot() - self.compareBitmapToFile(bmp, "testOffscreenScreenshot", False) + self.compareBitmapToFile(bmp, "testOffscreenScreenshot") def createCompressed(): avg.ImageNode(href="canvas:offscreencanvas", compression="B5G6R5", parent=root) root = self.loadEmptyScene() - mainCanvas = Player.getMainCanvas() + mainCanvas = player.getMainCanvas() self.assertEqual(mainCanvas.getRootNode(), root) offscreenCanvas = self.__createOffscreenCanvas("offscreencanvas", False) - self.assertEqual(offscreenCanvas, Player.getCanvas("offscreencanvas")) + self.assertEqual(offscreenCanvas, player.getCanvas("offscreencanvas")) self.assertEqual(offscreenCanvas.getElementByID("test1").href, "rgb24-65x65.png") self.assertEqual(offscreenCanvas.getElementByID("missingnode"), None) - self.assertException(Player.screenshot) + self.assertException(player.screenshot) self.assertException(createCompressed) - self.start(( - checkMainScreenshot, + self.start(False, + (checkMainScreenshot, checkCanvasScreenshot)) def testCanvasEvents(self): @@ -175,12 +173,12 @@ class OffscreenTestCase(AVGTestCase): mainCanvas, offscreenCanvas = self.__setupCanvas(True) offscreenImage = offscreenCanvas.getElementByID("test1") - offscreenImage.setEventHandler(avg.CURSORDOWN, avg.MOUSE, onOffscreenImageDown) - Player.getRootNode().setEventHandler(avg.CURSORDOWN, avg.MOUSE, onMainDown) + offscreenImage.subscribe(avg.Node.CURSOR_DOWN, onOffscreenImageDown) + player.getRootNode().subscribe(avg.Node.CURSOR_DOWN, onMainDown) self.__offscreenImageDownCalled = False self.__mainDownCalled = False - self.start(( - lambda: self.fakeClick(10, 10), + self.start(False, + (lambda: self.fakeClick(10, 10), lambda: self.assert_(self.__offscreenImageDownCalled), reset, lambda: self.fakeClick(80, 10), @@ -207,20 +205,18 @@ class OffscreenTestCase(AVGTestCase): mainCanvas, offscreenCanvas = self.__setupCanvas(True) offscreenImage = offscreenCanvas.getElementByID("test1") - offscreenImage.setEventHandler(avg.CURSORDOWN, avg.MOUSE, onOffscreenImageDown); - helper = Player.getTestHelper() + offscreenImage.subscribe(avg.Node.CURSOR_DOWN, onOffscreenImageDown); self.__offscreenImageDownCalled = False offscreenImage.setEventCapture() - self.start(( - lambda: helper.fakeMouseEvent(avg.CURSORDOWN, True, False, False, - 80, 10, 1), + self.start(False, + (lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 80, 10), lambda: self.assert_(self.__offscreenImageDownCalled), )) def testCanvasRender(self): def createCanvas(): - canvas = Player.createCanvas(id="testcanvas", size=(160,120), - autorender=False) + canvas = player.createCanvas(id="testcanvas", size=(160,120), + mediadir="media", autorender=False) avg.ImageNode(id="test", href="rgb24-65x65.png", parent=canvas.getRootNode()) return canvas @@ -230,10 +226,10 @@ class OffscreenTestCase(AVGTestCase): def renderCanvas(): self.__offscreenCanvas.render() bmp = self.__offscreenCanvas.screenshot() - self.compareBitmapToFile(bmp, "testOffscreenScreenshot", False) + self.compareBitmapToFile(bmp, "testOffscreenScreenshot") def deleteCanvas(): - Player.deleteCanvas("testcanvas") + player.deleteCanvas("testcanvas") self.__offscreenCanvas = None def recreateCanvas(): @@ -242,8 +238,8 @@ class OffscreenTestCase(AVGTestCase): self.loadEmptyScene() self.__offscreenCanvas = createCanvas() self.assertException(renderCanvas) - self.start(( - testEarlyScreenshotException, + self.start(False, + (testEarlyScreenshotException, renderCanvas, deleteCanvas, recreateCanvas, @@ -267,41 +263,43 @@ class OffscreenTestCase(AVGTestCase): root = self.loadEmptyScene() self.__offscreenCanvas = createCanvas() - self.start(( - lambda: self.assert_(self.__offscreenCanvas.autorender), - lambda: self.compareImage("testOffscreenAutoRender1", False), + self.start(False, + (lambda: self.assert_(self.__offscreenCanvas.autorender), + lambda: self.compareImage("testOffscreenAutoRender1"), disableAutoRender, lambda: self.assert_(not(self.__offscreenCanvas.autorender)), changeContent, - lambda: self.compareImage("testOffscreenAutoRender1", False), + lambda: self.compareImage("testOffscreenAutoRender1"), enableAutoRender, lambda: self.assert_(self.__offscreenCanvas.autorender), - lambda: self.compareImage("testOffscreenAutoRender2", False) + lambda: self.compareImage("testOffscreenAutoRender2") )) def testCanvasCrop(self): root = self.loadEmptyScene() - canvas = Player.createCanvas(id="testcanvas", size=(160,120)) + canvas = player.createCanvas(id="testcanvas", size=(160,120), + mediadir="media") div = avg.DivNode(pos=(40,30), size=(80,60), crop=True, parent=canvas.getRootNode()) avg.ImageNode(id="test1", pos=(-32, -32), href="rgb24-65x65.png", parent=div) avg.ImageNode(parent=root, href="canvas:testcanvas") - self.start((lambda: self.compareImage("testCanvasCrop", False),)) + self.start(False, (lambda: self.compareImage("testCanvasCrop"),)) def testCanvasAlpha(self): root = self.loadEmptyScene() - canvas = Player.createCanvas(id="testcanvas", size=(80,120)) + canvas = player.createCanvas(id="testcanvas", size=(80,120), mediadir="media") avg.ImageNode(id="test1", href="rgb24alpha-64x64.png", parent=canvas.getRootNode()) avg.RectNode(parent=root, fillcolor="FFFFFF", pos=(0.5, 0.5), size=(160, 48), fillopacity=1) avg.ImageNode(parent=root, href="canvas:testcanvas") avg.ImageNode(parent=root, x=64, href="rgb24alpha-64x64.png") - self.start((lambda: self.compareImage("testCanvasAlpha", False),)) + self.start(False, (lambda: self.compareImage("testCanvasAlpha"),)) def testCanvasBlendModes(self): def createBaseCanvas(): - canvas = Player.createCanvas(id="testcanvas", size=(64,64)) + canvas = player.createCanvas(id="testcanvas", size=(64,64), + mediadir="media") avg.ImageNode(href="rgb24alpha-64x64.png", parent=canvas.getRootNode()) return canvas @@ -316,53 +314,55 @@ class OffscreenTestCase(AVGTestCase): blendmode="add") avg.ImageNode(parent=root, pos=(64,64), href="canvas:testcanvas", opacity=0.6, blendmode="add") - self.start((lambda: self.compareImage("testCanvasBlendModes", False),)) + self.start(False, (lambda: self.compareImage("testCanvasBlendModes"),)) def testCanvasMultisampling(self): - def testIllegalSamples(): - self.canvas = Player.createCanvas(id="brokencanvas", size=(160,120), - multisamplesamples=42) + def testIllegalSamples(numSamples): + self.canvas = player.createCanvas(id="brokencanvas", size=(160,120), + multisamplesamples=numSamples) def screenshot(): bmp = self.canvas.screenshot() - self.compareBitmapToFile(bmp, "testOffscreenMultisampleScreenshot", False) + self.compareBitmapToFile(bmp, "testOffscreenMultisampleScreenshot") def createCanvas(): if not(avg.OffscreenCanvas.isMultisampleSupported()): self.skip("Offscreen multisampling not supported") - Player.stop() + player.stop() return try: - self.canvas = Player.createCanvas(id="testcanvas", size=(160,120), - multisamplesamples=2) + self.canvas = player.createCanvas(id="testcanvas", size=(160,120), + mediadir="media", multisamplesamples=2) avg.ImageNode(id="test1", href="rgb24-65x65.png", angle=0.1, parent=self.canvas.getRootNode()) except RuntimeError: self.skip("Offscreen multisampling init failed") - Player.stop() + player.stop() return self.assertEqual(self.canvas.multisamplesamples, 2) avg.ImageNode(parent=root, href="canvas:testcanvas") root = self.loadEmptyScene() - self.start(( - createCanvas, - lambda: self.compareImage("testCanvasMultisample", False), + self.start(False, + (createCanvas, + lambda: self.compareImage("testCanvasMultisample"), screenshot, - lambda: self.assertException(testIllegalSamples), + lambda: self.assertException(lambda: testIllegalSamples(42)), + lambda: self.assertException(lambda: testIllegalSamples(0)), )) self.canvas = None def testCanvasMipmap(self): root = self.loadEmptyScene() - canvas = Player.createCanvas(id="testcanvas", size=(80,120), mipmap=True) + canvas = player.createCanvas(id="testcanvas", size=(80,120), mediadir="media", + mipmap=True) avg.ImageNode(id="test1", href="rgb24alpha-64x64.png", parent=canvas.getRootNode()) avg.ImageNode(parent=root, size=(40, 30), href="canvas:testcanvas") try: - self.start((lambda: self.compareImage("testCanvasMipmap", False),)) + self.start(False, (lambda: self.compareImage("testCanvasMipmap"),)) except RuntimeError: self.skip("Offscreen mipmap init failed.") return @@ -393,11 +393,11 @@ class OffscreenTestCase(AVGTestCase): self.node.href = "canvas:offscreencanvas2" def loadCanvasDepString(): - Player.createCanvas(id="canvas1", size=(160, 120)) - canvas2 = Player.createCanvas(id="canvas2", size=(160, 120)) + player.createCanvas(id="canvas1", size=(160, 120)) + canvas2 = player.createCanvas(id="canvas2", size=(160, 120)) avg.ImageNode(href="canvas:canvas1", parent=canvas2.getRootNode()) - Player.deleteCanvas('canvas2') - Player.deleteCanvas('canvas1') + player.deleteCanvas('canvas2') + player.deleteCanvas('canvas1') root = self.loadEmptyScene() createTwoCanvases() @@ -406,29 +406,30 @@ class OffscreenTestCase(AVGTestCase): self.offscreen2 = None self.node.href = "" self.node = None - Player.deleteCanvas("offscreencanvas1") - Player.deleteCanvas("offscreencanvas2") - self.start(( - createTwoCanvases, - lambda: self.compareImage("testCanvasDependencies1", False), - exchangeCanvases, - lambda: self.compareImage("testCanvasDependencies2", False), - lambda: self.assertException(makeCircularRef), - lambda: self.assertException(makeSelfRef1), - lambda: self.assertException(makeSelfRef2), - loadCanvasDepString, - )) + player.deleteCanvas("offscreencanvas1") + player.deleteCanvas("offscreencanvas2") + self.start(False, + (createTwoCanvases, + lambda: self.compareImage("testCanvasDependencies1"), + exchangeCanvases, + lambda: self.compareImage("testCanvasDependencies2"), + lambda: self.assertException(makeCircularRef), + lambda: self.assertException(makeSelfRef1), + lambda: self.assertException(makeSelfRef2), + loadCanvasDepString, + )) def __setupCanvas(self, handleEvents): root = self.loadEmptyScene() - mainCanvas = Player.getMainCanvas() + mainCanvas = player.getMainCanvas() offscreenCanvas = self.__createOffscreenCanvas("offscreencanvas", handleEvents) self.node = avg.ImageNode(parent=root, href="canvas:offscreencanvas") return (mainCanvas, offscreenCanvas) def __createOffscreenCanvas(self, canvasName, handleEvents): - canvas=Player.createCanvas(id=canvasName, size=(160,120), + canvas = player.createCanvas(id=canvasName, size=(160,120), handleevents=handleEvents) + canvas.getRootNode().mediadir = "media" avg.ImageNode(id="test1", href="rgb24-65x65.png", parent=canvas.getRootNode()) return canvas @@ -437,13 +438,13 @@ def isOffscreenSupported(): def testOffscreenSupported(): global offscreenSupported offscreenSupported = avg.OffscreenCanvas.isSupported() - Player.stop() + player.stop() global offscreenSupported sceneString = """<avg id="avg" width="160" height="120"/>""" - Player.loadString(sceneString) - Player.setTimeout(0, testOffscreenSupported) - Player.play() + player.loadString(sceneString) + player.setTimeout(0, testOffscreenSupported) + player.play() return offscreenSupported def offscreenTestSuite(tests): @@ -467,8 +468,5 @@ def offscreenTestSuite(tests): ) return createAVGTestSuite(availableTests, OffscreenTestCase, tests) else: - print "Skipping offscreen tests - no canvas support with this graphics configuration." - return lambda x: None - - -Player = avg.Player.get() + sys.stderr.write("Skipping offscreen tests - no canvas support with this graphics configuration.\n") + return unittest.TestSuite() diff --git a/src/test/PlayerTest.py b/src/test/PlayerTest.py index e43e204..2443759 100644 --- a/src/test/PlayerTest.py +++ b/src/test/PlayerTest.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # libavg - Media Playback Engine. -# Copyright (C) 2003-2011 Ulrich von Zadow +# 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 @@ -19,10 +19,10 @@ # Current versions can be found at www.libavg.de # -import time import math +import threading -from libavg import avg +from libavg import avg, player from testcase import * class PlayerTestCase(AVGTestCase): @@ -37,12 +37,25 @@ class PlayerTestCase(AVGTestCase): 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, 10) + 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])) @@ -51,6 +64,8 @@ class PlayerTestCase(AVGTestCase): 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)) @@ -88,36 +103,46 @@ class PlayerTestCase(AVGTestCase): def testBasics(self): def getFramerate(): - framerate = Player.getEffectiveFramerate() + framerate = player.getEffectiveFramerate() self.assert_(framerate > 0) def invalidCreateNode(): avg.ImageNode(1, 2, 3) - Player.showCursor(0) - Player.showCursor(1) + player.showCursor(0) + player.showCursor(1) root = self.loadEmptyScene() - node = Player.createNode("""<image id="test1" href="rgb24-65x65.png"/>""") - root.appendChild(node) + avg.ImageNode(href="rgb24-65x65.png", parent=root) self.assertException(invalidCreateNode) - self.start(( - getFramerate, - lambda: self.compareImage("testbasics", False), - lambda: Player.setGamma(0.3, 0.3, 0.3), - lambda: Player.showCursor(0), - lambda: Player.showCursor(1), - )) + 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.assertEqual(player.getFrameTime(), 50) + self.assertEqual(player.getFrameDuration(), 50) + self.assertEqual(player.getEffectiveFramerate(), 20) self.loadEmptyScene() - Player.setFakeFPS(20) - self.start(( - checkTime, + player.setFakeFPS(20) + self.start(False, + (checkTime, )) def testDivResize(self): @@ -136,10 +161,10 @@ class PlayerTestCase(AVGTestCase): node.height = h self.__initDefaultScene() - node = Player.getElementByID('nestedavg') + node = player.getElementByID('nestedavg') - self.start(( - lambda: checkSize(128, 32), + self.start(False, + (lambda: checkSize(128, 32), lambda: setSize((14,15)), lambda: checkSize(14,15), lambda: setWidth(23), @@ -153,14 +178,14 @@ class PlayerTestCase(AVGTestCase): self.onOuterDownCalled = True def fakeRotate(): - Player.getElementByID("outer").angle += 0.1 - Player.getElementByID("inner").angle -= 0.1 + player.getElementByID("outer").angle += 0.1 + player.getElementByID("inner").angle -= 0.1 def testCoordConversions(): - innerNode = Player.getElementByID("inner") + innerNode = player.getElementByID("inner") relPos = innerNode.getRelPos((90, 80)) self.assertAlmostEqual(relPos, (10, 10)) - outerNode = Player.getElementByID("outer") + outerNode = player.getElementByID("outer") relPos = outerNode.getRelPos((90, 80)) self.assertAlmostEqual(relPos[0], 12.332806394528092) self.assertAlmostEqual(relPos[1], 6.9211188716194592) @@ -170,36 +195,26 @@ class PlayerTestCase(AVGTestCase): self.assertEqual(outerNode.getElementByPos((0, 10)), outerNode) self.assertEqual(outerNode.getElementByPos((-10, -110)), None) - def sendEvent(type, x, y): - Helper = Player.getTestHelper() - if type == avg.CURSORUP: - button = False - else: - button = True - Helper.fakeMouseEvent(type, button, False, False, - x, y, 1) - def disableCrop(): - Player.getElementByID("outer").crop = False - Player.getElementByID("inner").crop = False + player.getElementByID("outer").crop = False + player.getElementByID("inner").crop = False self.__initDefaultRotateScene() - Player.getElementByID("outer").setEventHandler( - avg.CURSORDOWN, avg.MOUSE, onOuterDown) + player.getElementByID("outer").subscribe(avg.Node.CURSOR_DOWN, onOuterDown) self.onOuterDownCalled = False - self.start(( - lambda: self.compareImage("testRotate1", False), + self.start(False, + (lambda: self.compareImage("testRotate1"), testCoordConversions, fakeRotate, - lambda: self.compareImage("testRotate1a", False), - lambda: sendEvent(avg.CURSORDOWN, 85, 70), - lambda: sendEvent(avg.CURSORUP, 85, 70), + 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: sendEvent(avg.CURSORDOWN, 85, 75), - lambda: sendEvent(avg.CURSORUP, 85, 75), + 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", False), + lambda: self.compareImage("testRotate1b"), )) def testRotate2(self): @@ -212,7 +227,7 @@ class PlayerTestCase(AVGTestCase): 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([lambda: self.compareImage("testRotate2", False)]) + self.start(False, [lambda: self.compareImage("testRotate2")]) def testRotatePivot(self): def setPivot (pos): @@ -228,27 +243,47 @@ class PlayerTestCase(AVGTestCase): 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(( - lambda: self.compareImage("testRotatePivot1", False), - lambda: setPivot((10, 10)), - lambda: self.compareImage("testRotatePivot2", False), - lambda: addPivot((-8, 0)), - lambda: self.compareImage("testRotatePivot3", False), - )) + 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" - Player.getElementByID("inner").width = 100000 - Player.getElementByID("inner").height = 100000 - self.start([lambda: self.compareImage("testOutlines", False)]) + 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) + player.setTimeout(1, lambda: undefinedFunction) + player.setTimeout(50, player.stop) try: - Player.play() + player.play() except NameError: self.assert_(1) else: @@ -260,7 +295,7 @@ class PlayerTestCase(AVGTestCase): try: self.initDefaultImageScene() - self.start([throwException]) + self.start(False, [throwException]) except ZeroDivisionError: self.assert_(1) else: @@ -273,7 +308,7 @@ class PlayerTestCase(AVGTestCase): root = self.loadEmptyScene() div = avg.DivNode(active=False, parent=root) avg.ImageNode(href="filedoesntexist.png", parent=div) - self.start([activateNode]) + self.start(False, [activateNode]) def testInvalidVideoFilename(self): def tryplay(): @@ -281,8 +316,8 @@ class PlayerTestCase(AVGTestCase): root = self.loadEmptyScene() video = avg.VideoNode(href="filedoesntexist.avi", parent=root) - self.start(( - lambda: tryplay, + self.start(False, + (lambda: tryplay, lambda: video.stop() )) @@ -291,13 +326,18 @@ class PlayerTestCase(AVGTestCase): pass def timeout1(): - Player.clearInterval(self.timeout1ID) - Player.clearInterval(self.timeout2ID) + 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 @@ -305,67 +345,66 @@ class PlayerTestCase(AVGTestCase): raise TestException def initException(): - self.timeout3ID = Player.setTimeout(0, throwException) + self.timeout3ID = player.setTimeout(0, throwException) def setupTimeouts(): - self.timeout1ID = Player.setTimeout(0, timeout1) - self.timeout2ID = Player.setTimeout(1, timeout2) + 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(( - setupTimeouts, - wait, + self.start(False, + (setupTimeouts, + None, lambda: self.assert_(self.timeout1called), lambda: self.assert_(not(self.timeout2called)), + lambda: self.assert_(self.numOnFramesCalled == 3), lambda: initException(), - wait, - wait, - wait, - wait, - wait)) + lambda: self.delay(10), + )) except TestException: self.__exceptionThrown = True self.assert_(self.__exceptionThrown) - Player.clearInterval(self.timeout3ID) + player.clearInterval(self.timeout3ID) - def testPanoImage(self): - def changeProperties(): - node = Player.getElementByID("pano") - node.sensorheight=10 - node.sensorwidth=15 - node.focallength=25 - - def loadImage(): - node = Player.getElementByID("pano") - node.href = "rgb24-65x65.png" + def testCallFromThread(self): - root = self.loadEmptyScene() - avg.ImageNode(size=(320,240), href="rgb24-65x65.png", parent=root) - avg.PanoImageNode(id="pano", size=(160,120), href="panoimage.png", - sensorwidth=4.60, sensorheight=3.97, focallength=12, parent=root) - avg.ImageNode(pos=(120,0), size=(40,40), href="rgb24-65x65.png", parent=root) - self.start(( - lambda: self.compareImage("testPanoImage", False), - lambda: time.sleep, - changeProperties, - loadImage + 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(( - lambda: self.compareImage("testAVGFile", False), + player.loadFile("image.avg") + self.start(False, + (lambda: self.compareImage("testAVGFile"), )) - self.assertException(lambda: Player.loadFile("filedoesntexist.avg")) + self.assertException(lambda: player.loadFile("filedoesntexist.avg")) def testBroken(self): def testBrokenString(string): - self.assertException(lambda: Player.loadString(string)) + self.assertException(lambda: player.loadString(string)) # This isn't xml testBrokenString(""" @@ -383,55 +422,55 @@ class PlayerTestCase(AVGTestCase): def testMove(self): def moveit(): - node = Player.getElementByID("nestedimg1") + node = player.getElementByID("nestedimg1") node.x += 50 node.opacity -= 0.7 - node = Player.getElementByID("nestedavg") + node = player.getElementByID("nestedavg") node.x += 50 def checkRelPos(): - RelPos = Player.getElementByID("obscured").getRelPos((50,52)) + RelPos = player.getElementByID("obscured").getRelPos((50,52)) self.assertEqual(RelPos, (0, 0)) self.__initDefaultScene() - self.start(( - lambda: self.compareImage("testMove1", False), + self.start(False, + (lambda: self.compareImage("testMove1"), moveit, checkRelPos )) def testCropImage(self): def moveTLCrop(): - node = Player.getElementByID("img") + node = player.getElementByID("img") node.x = -20 node.y = -20 def moveBRCrop(): - node = Player.getElementByID("img") + node = player.getElementByID("img") node.x = 60 node.y = 40 def moveTLNegative(): - node = Player.getElementByID("img") + node = player.getElementByID("img") node.x = -60 node.y = -50 def moveBRGone(): - node = Player.getElementByID("img") + node = player.getElementByID("img") node.x = 140 node.y = 100 def rotate(): - node = Player.getElementByID("img") + node = player.getElementByID("img") node.x = 10 node.y = 10 - Player.getElementByID("nestedavg").angle = 1.0 - Player.getElementByID("bkgd").angle = 1.0 + 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(""" + 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"> @@ -441,94 +480,94 @@ class PlayerTestCase(AVGTestCase): </div> </div> """)) - self.start(( - lambda: self.compareImage("testCropImage1", False), + self.start(False, + (lambda: self.compareImage("testCropImage1"), moveTLCrop, - lambda: self.compareImage("testCropImage2", False), + lambda: self.compareImage("testCropImage2"), moveBRCrop, - lambda: self.compareImage("testCropImage3", False), + lambda: self.compareImage("testCropImage3"), moveTLNegative, - lambda: self.compareImage("testCropImage4", False), + lambda: self.compareImage("testCropImage4"), moveBRGone, - lambda: self.compareImage("testCropImage5", False), + lambda: self.compareImage("testCropImage5"), rotate, - lambda: self.compareImage("testCropImage6", False), + lambda: self.compareImage("testCropImage6"), moveTLCrop, - lambda: self.compareImage("testCropImage7", False), + lambda: self.compareImage("testCropImage7"), moveBRCrop, - lambda: self.compareImage("testCropImage8", False), + lambda: self.compareImage("testCropImage8"), moveTLNegative, - lambda: self.compareImage("testCropImage9", False), + lambda: self.compareImage("testCropImage9"), moveBRGone, - lambda: self.compareImage("testCropImage10", False) + lambda: self.compareImage("testCropImage10") )) def testCropMovie(self): def playMovie(): - node = Player.getElementByID("movie") + node = player.getElementByID("movie") node.play() def moveTLCrop(): - node = Player.getElementByID("movie") + node = player.getElementByID("movie") node.x = -20 node.y = -20 def moveBRCrop(): - node = Player.getElementByID("movie") + node = player.getElementByID("movie") node.x = 60 node.y = 40 def moveTLNegative(): - node = Player.getElementByID("movie") + node = player.getElementByID("movie") node.x = -60 node.y = -50 def moveBRGone(): - node = Player.getElementByID("movie") + node = player.getElementByID("movie") node.x = 140 node.y = 100 def rotate(): - node = Player.getElementByID("movie") + node = player.getElementByID("movie") node.x = 10 node.y = 10 - Player.getElementByID("nestedavg").angle = 1.0 - Player.getElementByID("bkgd").angle = 1.0 + player.getElementByID("nestedavg").angle = 1.0 + player.getElementByID("bkgd").angle = 1.0 - Player.setFakeFPS(30) + player.setFakeFPS(30) root = self.loadEmptyScene() avg.ImageNode(id="bkgd", href="crop_bkgd.png", parent=root) root.appendChild( - Player.createNode(""" + 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="../video/testfiles/mpeg1-48x48.mpg" + threaded="false" href="mpeg1-48x48.mov" fps="30"/> </div> """)) - self.start(( - playMovie, - lambda: self.compareImage("testCropMovie1", False), + self.start(False, + (playMovie, + lambda: self.compareImage("testCropMovie1"), moveTLCrop, - lambda: self.compareImage("testCropMovie2", False), + lambda: self.compareImage("testCropMovie2"), moveBRCrop, - lambda: self.compareImage("testCropMovie3", False), + lambda: self.compareImage("testCropMovie3"), moveTLNegative, - lambda: self.compareImage("testCropMovie4", False), + lambda: self.compareImage("testCropMovie4"), moveBRGone, - lambda: self.compareImage("testCropMovie5", False), + lambda: self.compareImage("testCropMovie5"), rotate, - lambda: self.compareImage("testCropMovie6", False), + lambda: self.compareImage("testCropMovie6"), moveTLCrop, - lambda: self.compareImage("testCropMovie7", False), + lambda: self.compareImage("testCropMovie7"), moveBRCrop, - lambda: self.compareImage("testCropMovie8", False), + lambda: self.compareImage("testCropMovie8"), moveTLNegative, - lambda: self.compareImage("testCropMovie9", False), + lambda: self.compareImage("testCropMovie9"), moveBRGone, - lambda: self.compareImage("testCropMovie10", False) + lambda: self.compareImage("testCropMovie10") )) def testWarp(self): @@ -550,19 +589,18 @@ class PlayerTestCase(AVGTestCase): 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="../video/testfiles/mpeg1-48x48.mpg", threaded=False, fps=30, - parent=root) + href="mpeg1-48x48.mov", threaded=False, fps=30, parent=root) self.assertException(image.getOrigVertexCoords) self.assertException(image.getWarpedVertexCoords) - Player.setFakeFPS(30) - self.start(( - lambda: video.play(), - lambda: self.compareImage("testWarp1", False), + player.setFakeFPS(30) + self.start(False, + (lambda: video.play(), + lambda: self.compareImage("testWarp1"), moveVertex, - lambda: self.compareImage("testWarp2", False), + lambda: self.compareImage("testWarp2"), flip, - lambda: self.compareImage("testWarp3", False) + lambda: self.compareImage("testWarp3") )) def testMediaDir(self): @@ -583,7 +621,7 @@ class PlayerTestCase(AVGTestCase): self.assertEqual(node.size, avg.Point2D(64,64)) def setDir(): - div.mediadir="../video/testfiles" + div.mediadir="" def setAbsDir(): def absDir(): @@ -593,19 +631,19 @@ class PlayerTestCase(AVGTestCase): self.assertException(absDir) def createNode(): - node = avg.VideoNode(href="mjpeg1-48x48.avi", fps=30) + avg.VideoNode(href="mjpeg1-48x48.avi", fps=30) root = self.loadEmptyScene() - div = avg.DivNode(mediadir="testmediadir", parent=root) + 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(( - createImageNode, + self.start(False, + (createImageNode, lambda: video.play(), - lambda: self.compareImage("testMediaDir1", False), + lambda: self.compareImage("testMediaDir1"), setDir, lambda: video.play(), - lambda: self.compareImage("testMediaDir2", False), + lambda: self.compareImage("testMediaDir2"), lambda: self.assertEqual(image.width, 0), createNode, setAbsDir @@ -616,24 +654,24 @@ class PlayerTestCase(AVGTestCase): def testStopOnEscape(self): def pressEscape(): - Helper = Player.getTestHelper() + Helper = player.getTestHelper() escape = 27 - Helper.fakeKeyEvent(avg.KEYDOWN, escape, escape, "escape", escape, + Helper.fakeKeyEvent(avg.Event.KEY_DOWN, escape, escape, "escape", escape, avg.KEYMOD_NONE), - Helper.fakeKeyEvent(avg.KEYUP, escape, escape, "escape", escape, + Helper.fakeKeyEvent(avg.Event.KEY_UP, escape, escape, "escape", escape, avg.KEYMOD_NONE), def testEscape1(): - Player.stopOnEscape(False) + player.stopOnEscape(False) pressEscape() def testEscape2(): - Player.stopOnEscape(True) - Player.stopOnEscape(False) + player.stopOnEscape(True) + player.stopOnEscape(False) pressEscape() def testEscape3(): - Player.stopOnEscape(True) + player.stopOnEscape(True) pressEscape() def setAlive(): @@ -641,54 +679,51 @@ class PlayerTestCase(AVGTestCase): self.testStopOnEscapeAlive = False self.__initDefaultScene() - self.start(( - testEscape1, + self.start(False, + (testEscape1, testEscape2, setAlive )) self.assert_(self.testStopOnEscapeAlive) self.__initDefaultScene() - self.start(( - testEscape3, # this should exit the player + self.start(False, + (testEscape3, # this should exit the player lambda: self.fail(), )) - # 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([revertWindowFrame]) - def testScreenDimensions(self): - 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) - print res, ppmm, mm - Player.assumePixelsPerMM(ppmm) - newPPMM = Player.getPixelsPerMM() - newMM = Player.getPhysicalScreenDimensions() - self.assertAlmostEqual(newPPMM, ppmm) - self.assertEqual(newMM, mm) + 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("rect.svg", False) + svgFile = avg.SVG("media/rect.svg", False) # renderElement bmp = svgFile.renderElement("rect") - self.compareBitmapToFile(bmp, "testSvgBmp", False) + self.compareBitmapToFile(bmp, "testSvgBmp") self.assertEqual(svgFile.getElementSize("rect"), avg.Point2D(22,12)) bmp = svgFile.renderElement("pos_rect") - self.compareBitmapToFile(bmp, "testSvgPosBmp", False) + self.compareBitmapToFile(bmp, "testSvgPosBmp") bmp = svgFile.renderElement("rect", 5) - self.compareBitmapToFile(bmp, "testSvgScaleBmp1", False) + self.compareBitmapToFile(bmp, "testSvgScaleBmp1") bmp = svgFile.renderElement("rect", (20,20)) - self.compareBitmapToFile(bmp, "testSvgScaleBmp2", False) + self.compareBitmapToFile(bmp, "testSvgScaleBmp2") # error handling self.assertException(lambda: avg.SVG("filedoesntexist.svg", False)) @@ -700,17 +735,63 @@ class PlayerTestCase(AVGTestCase): # createImageNode root = self.loadEmptyScene() - self.start(( - lambda: svgFile.createImageNode("rect", {"pos":(10,10), "parent":root}), - lambda: self.compareImage("testSvgNode", False), + 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", False), + lambda: self.compareImage("testSvgScaledNode1"), lambda: svgFile.createImageNode("rect", {"pos":(1,1), "parent":root}, (40,40)), - lambda: self.compareImage("testSvgScaledNode2", False) + 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) @@ -739,18 +820,21 @@ def playerTestSuite(tests): availableTests = ( "testPoint", "testBasics", + "testColorParse", "testFakeTime", "testDivResize", "testRotate", "testRotate2", "testRotatePivot", + "testOpacity", "testOutlines", + "testWordsOutlines", "testError", "testExceptionInTimeout", "testInvalidImageFilename", "testInvalidVideoFilename", "testTimeouts", - "testPanoImage", + "testCallFromThread", "testAVGFile", "testBroken", "testMove", @@ -762,8 +846,8 @@ def playerTestSuite(tests): "testStopOnEscape", "testScreenDimensions", "testSVG", + "testGetConfigOption", + "testValidateXml", # "testWindowFrame", ) return createAVGTestSuite(availableTests, PlayerTestCase, tests) - -Player = avg.Player.get() diff --git a/src/test/PluginTest.py b/src/test/PluginTest.py index a9bd3db..186f7e4 100644 --- a/src/test/PluginTest.py +++ b/src/test/PluginTest.py @@ -1,7 +1,7 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # libavg - Media Playback Engine. -# Copyright (C) 2003-2011 Ulrich von Zadow +# 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 @@ -22,7 +22,7 @@ import platform -from libavg import avg +from libavg import player from testcase import * class PluginTestCase(AVGTestCase): @@ -32,41 +32,34 @@ class PluginTestCase(AVGTestCase): def testColorNodePlugin(self): def loadPlugin(): if platform.system() != 'Windows': - if os.getenv('srcdir') in ('.', None): - # make check or ./Test.py - addpth = './' - else: + if not(os.getenv('srcdir') in ('.', None)): # make distcheck - addpth = '../../_build/src/test/' - - Player.pluginPath += ":"+addpth+"plugin/.libs" - Player.loadPlugin("colorplugin") + player.pluginPath += ":../../_build/src/test/plugin/.libs" + player.loadPlugin("colorplugin") def usePlugin1(): node = colorplugin.ColorNode(fillcolor="7f7f00", id="mynode1") root.appendChild(node) - mynode = Player.getElementByID("mynode1") + mynode = player.getElementByID("mynode1") self.assertEqual(mynode.fillcolor, "7f7f00") def usePlugin2(): - node = Player.createNode('<colornode fillcolor="0f3f7f" id="mynode2" />') + node = player.createNode('<colornode fillcolor="0f3f7f" id="mynode2" />') root.appendChild(node) - mynode = Player.getElementByID("mynode2") + mynode = player.getElementByID("mynode2") self.assertEqual(mynode.fillcolor, "0f3f7f") root = self.loadEmptyScene() - self.start(( - loadPlugin, - usePlugin1, - lambda: self.compareImage("testplugin1", False), - usePlugin2, - lambda: self.compareImage("testplugin2", False), - )) + self.start(False, + (loadPlugin, + usePlugin1, + lambda: self.compareImage("testplugin1"), + usePlugin2, + lambda: self.compareImage("testplugin2"), + )) def pluginTestSuite (tests): availableTests = ("testColorNodePlugin",) return createAVGTestSuite(availableTests, PluginTestCase, tests) - -Player = avg.Player.get() diff --git a/src/test/PythonTest.py b/src/test/PythonTest.py index e002ffb..f4c5db3 100644 --- a/src/test/PythonTest.py +++ b/src/test/PythonTest.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # libavg - Media Playback Engine. -# Copyright (C) 2003-2011 Ulrich von Zadow +# 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 @@ -19,264 +19,22 @@ # Current versions can be found at www.libavg.de # -from libavg import avg, anim, draggable, geom, statemachine +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 testAnimType(self, curAnim, imgBaseName): - def onStop(): - self.__onStopCalled = True - - def startAnim(): - self.__onStopCalled = False - node = Player.getElementByID("test") - self.__anim.start() - - def startKeepAttr(): - node = Player.getElementByID("test") - node.x = 25 - self.__anim.start(keepAttr=True) - - def abortAnim(): - self.__anim.abort() - - self.__anim = curAnim - self.__anim.setHandler(onStop, None) - self.__onStopCalled = False - Player.setFakeFPS(10) - self.start(( - startAnim, - lambda: self.compareImage(imgBaseName+"1", False), - lambda: self.assertEqual(anim.getNumRunningAnims(), 1), - None, - None, - lambda: self.assert_(self.__onStopCalled), - lambda: self.assert_(self.__anim.isDone()), - lambda: self.compareImage(imgBaseName+"2", False), - lambda: self.assertEqual(Player.getElementByID("test").x, 100), - startAnim, - lambda: self.compareImage(imgBaseName+"1", False), - abortAnim, - lambda: self.assertEqual(anim.getNumRunningAnims(), 0), - lambda: self.compareImage(imgBaseName+"3", False), - lambda: self.assert_(self.__anim.isDone()), - None, - lambda: self.assert_(not(self.__onStopCalled)), - startAnim, - startKeepAttr, - lambda: self.assertEqual(anim.getNumRunningAnims(), 1), - abortAnim - )) - self.__anim = None - - def testLinearAnim(self): - self.initDefaultImageScene() - node = Player.getElementByID("test") - curAnim = anim.LinearAnim(node, "x", 200, 0, 100, False) - self.testAnimType(curAnim, "testLinearAnim") - - def testLinearAnimZeroDuration(self): - def onStop(): - self.__onStopCalled = True - - def startAnim(): - self.__onStopCalled = False - node = Player.getElementByID("test") - self.__anim.start() - - self.initDefaultImageScene() - node = Player.getElementByID("test") - self.__anim = anim.LinearAnim(node, "x", 0, 0, 100, False) - self.__anim.setHandler(onStop, None) - self.__onStopCalled = False - Player.setFakeFPS(10) - self.start(( - startAnim, - lambda: self.compareImage("testLinearAnimZeroDuration1", False), - lambda: self.assertEqual(anim.getNumRunningAnims(), 0), - lambda: self.assert_(self.__onStopCalled), - lambda: self.assert_(self.__anim.isDone()) - )) - self.__anim = None - - def testEaseInOutAnim(self): - self.initDefaultImageScene() - node = Player.getElementByID("test") - curAnim = anim.EaseInOutAnim(node, "x", 400, 0, 100, 100, 100, False) - self.testAnimType(curAnim, "testEaseInOutAnim") - - def testSplineAnim(self): - self.initDefaultImageScene() - node = Player.getElementByID("test") - curAnim = anim.SplineAnim(node, "x", 300, 0, 0, 100, 0, False) - self.testAnimType(curAnim, "testSplineAnim") - - def testContinuousAnim(self): - def onStart(): - Player.setTimeout(10,startAnim) - Player.setTimeout(100,lambda:self.compareImage("testContAnim1", False)) - Player.setTimeout(200,startAnim2) - Player.setTimeout(400,lambda:self.compareImage("testContAnim2", False)) - Player.setTimeout(450,startAnim3) - Player.setTimeout(700,lambda:self.compareImage("testContAnim3", False)) - Player.setTimeout(800,stopAnim) - Player.setTimeout(900,lambda:self.compareImage("testContAnim4", False)) - Player.setTimeout(1000,Player.stop) - - def startAnim(): - node=Player.getElementByID("testtiles") - self.anim=anim.ContinuousAnim(node,"angle",0,1,0) - self.anim.start() - - def startAnim2(): - node=Player.getElementByID("test") - self.anim2=anim.ContinuousAnim(node,"width",0,50,0) - self.anim2.start() - - def startAnim3(): - node=Player.getElementByID("test1") - self.anim3=anim.ContinuousAnim(node,"x",0,50,0) - self.anim3.start() - - def stopAnim(): - self.anim.abort() - self.anim2.abort() - self.anim3.abort() - self.anim = None - self.anim2 = None - self.anim3 = None - - Player.setFakeFPS(25) - anim.init(avg) - self.initDefaultImageScene() - Player.setTimeout(1, onStart) - Player.play() - - def testWaitAnim(self): - def animStopped(): - self.__endCalled = True - - def startAnim(): - self.anim = anim.WaitAnim(200, animStopped, False) - self.anim.start() - - anim.init(avg) - Player.setFakeFPS(10) - self.__endCalled = False - self.initDefaultImageScene() - self.start(( - startAnim, - lambda: self.assert_(not(self.anim.isDone())), - None, - None, - lambda: self.assert_(self.anim.isDone()), - lambda: self.assert_(self.__endCalled) - )) - - def testStateAnim(self): - def state2Callback(): - self.__state2CallbackCalled = True - - def makeAnim(): - node = Player.getElementByID("test") - self.anim = anim.StateAnim( - {"STATE1": anim.LinearAnim(node, "x", 200, 64, 128), - "STATE2": anim.LinearAnim(node, "x", 200, 128, 64), - "STATE3": anim.WaitAnim()}, - {"STATE1": anim.AnimTransition("STATE2", state2Callback), - "STATE2": anim.AnimTransition("STATE3")}) - anim.init(avg) - Player.setFakeFPS(10) - self.__state2CallbackCalled = False - self.initDefaultImageScene() - self.start(( - makeAnim, - lambda: self.compareImage("testStateAnim1", False), - lambda: self.anim.setState("STATE1"), - None, - lambda: self.compareImage("testStateAnim2", False), - lambda: self.anim.getState() == "STATE2", - lambda: self.compareImage("testStateAnim3", False), - lambda: self.assert_(self.__state2CallbackCalled), - lambda: self.anim.getState() == "STATE3", - lambda: self.compareImage("testStateAnim4", False), - lambda: self.anim.setState("STATE1"), - lambda: self.assertEqual(anim.getNumRunningAnims(), 1), - lambda: self.compareImage("testStateAnim5", False) - )) - - def testParallelAnim(self): - def animStopped(): - self.__endCalled = True - - def startAnim(): - node0 = Player.getElementByID("mainimg") - node1 = Player.getElementByID("test") - node2 = Player.getElementByID("test1") - self.anim = anim.ParallelAnim( - [ anim.SplineAnim(node1, "x", 400, 0, 40, 0, 0), - anim.EaseInOutAnim(node2, "x", 300, 129, 99, 100, 100) - ], animStopped) - self.anim.start() - - anim.init(avg) - self.__endCalled = False - Player.setFakeFPS(10) - self.initDefaultImageScene() - self.start(( - startAnim, - lambda: self.assertEqual(anim.getNumRunningAnims(), 2), - lambda: self.assert_(not(self.anim.isDone())), - lambda: self.compareImage("testParallelAnims1", False), - None, - None, - lambda: self.compareImage("testParallelAnims2", False), - lambda: self.assert_(self.anim.isDone()), - lambda: self.assert_(self.__endCalled) - )) - - def testDraggable(self): - def onDragStart(event): - self.__dragStartCalled = True - - def onDragEnd(event): - self.__dragEndCalled = True - - def startDrag(): - Helper.fakeMouseEvent(avg.CURSORDOWN, True, False, False, 140, 40, 1) - - def move(): - Helper.fakeMouseEvent(avg.CURSORMOTION, True, False, False, 150, 50, 1) - - def stop(): - Helper.fakeMouseEvent(avg.CURSORUP, False, False, False, 140, 40, 1) - - self.__dragEndCalled = False - self.__dragStartCalled = False - Helper = Player.getTestHelper() - self.initDefaultImageScene() - draggable.init(avg) - dragger = draggable.Draggable(Player.getElementByID("test1"), - onDragStart, onDragEnd) - dragger.enable() - self.start(( - startDrag, - lambda: self.assert_(self.__dragStartCalled), - move, - lambda: self.compareImage("testDraggable1", False), - stop, - lambda: self.assert_(self.__dragEndCalled), - lambda: self.compareImage("testDraggable2", False), - dragger.disable, - startDrag, - move, - lambda: self.compareImage("testDraggable2", False) - )) - def testRoundedRect(self): def setPos(): self.rect.pos = (20.5, 3.5) @@ -293,24 +51,25 @@ class PythonTestCase(AVGTestCase): def createDegenRect(): self.rect.unlink(True) - geom.RoundedRect(parent=root, pos=(10.5,10.5), size=(10,10), radius=6, + 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(( - lambda: self.compareImage("testRoundedRect1", True), + self.start(False, + (lambda: self.compareImage("testRoundedRect1"), setPos, - lambda: self.compareImage("testRoundedRect2", True), + lambda: self.compareImage("testRoundedRect2"), setSize, - lambda: self.compareImage("testRoundedRect3", True), + lambda: self.compareImage("testRoundedRect3"), lambda: setRadius(10), - lambda: self.compareImage("testRoundedRect4", True), + lambda: self.compareImage("testRoundedRect4"), setFill, - lambda: self.compareImage("testRoundedRect5", True), + lambda: self.compareImage("testRoundedRect5"), createDegenRect, - lambda: self.compareImage("testRoundedRect6", True), + lambda: self.compareImage("testRoundedRect6"), )) def testPieSlice(self): @@ -329,12 +88,12 @@ class PythonTestCase(AVGTestCase): self.pieSlice = geom.PieSlice(parent=root, pos=(20.5,20.5), radius=40, startangle=0, endangle=1.57, color="FF0000") - self.start(( - lambda: self.compareImage("testPieSlice1", True), + self.start(False, + (lambda: self.compareImage("testPieSlice1"), changeAttrs, - lambda: self.compareImage("testPieSlice2", True), + lambda: self.compareImage("testPieSlice2"), makeSmall, - lambda: self.compareImage("testPieSlice3", True), + lambda: self.compareImage("testPieSlice3"), )) def testArc(self): @@ -348,22 +107,24 @@ class PythonTestCase(AVGTestCase): self.arc = geom.Arc(parent=root, pos=(20.5,20.5), radius=40, startangle=0, endangle=1.57, color="FF0000") - self.start(( - lambda: self.compareImage("testArc1", True), + self.start(False, + (lambda: self.compareImage("testArc1"), changeAttrs, - lambda: self.compareImage("testArc2", True), + 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(): + def btoc(dummy): + # Dummy argument so we can test handling of lambda expressions. self.btocCalled = True - def btoa(oldState, newState): - self.btoaCalled = True - def aEntered(): self.aEnteredCalled = True @@ -377,7 +138,7 @@ class PythonTestCase(AVGTestCase): self.aEnteredCalled = False machine = statemachine.StateMachine("testmachine", 'A') machine.addState('A', {'B': atob, 'nostate': atob}, aEntered, aLeft) - machine.addState('B', {'C': btoc, 'A': btoa}) + 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')) @@ -393,6 +154,8 @@ class PythonTestCase(AVGTestCase): 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 @@ -407,25 +170,66 @@ class PythonTestCase(AVGTestCase): 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): + testFile = getTempFileName() + f = open(testFile, 'w') + f.write('garbage') + f.close() + p = persist.Persist(testFile, {}) + self.assertEqual(p.data, {}) + os.unlink(testFile) + + def testPersistValidation(self): + 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) + def pythonTestSuite(tests): availableTests = ( - "testLinearAnim", - "testLinearAnimZeroDuration", - "testEaseInOutAnim", - "testSplineAnim", - "testContinuousAnim", - "testWaitAnim", - "testParallelAnim", - "testStateAnim", - "testDraggable", "testRoundedRect", "testPieSlice", "testArc", "testStateMachine", + "testStateMachineDiagram", + "testPersistStore", + "testPersistCorrupted", + "testPersistValidation", ) return createAVGTestSuite(availableTests, PythonTestCase, tests) -Player = avg.Player.get() -anim.init(avg) diff --git a/src/test/Test.py b/src/test/Test.py index 929b398..4c4de8f 100755 --- a/src/test/Test.py +++ b/src/test/Test.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- # libavg - Media Playback Engine. -# Copyright (C) 2003-2011 Ulrich von Zadow +# 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 @@ -36,7 +36,7 @@ import atexit def cleanup(folder): if os.path.isdir(folder): - print 'Wiping out directory: %s' % folder + sys.stderr.write('Wiping out directory: %s\n' % folder) shutil.rmtree(folder) def symtree(src, dest): @@ -45,7 +45,7 @@ def symtree(src, dest): fpath = os.path.join(src, f) if (f and f[0] != '.' and (os.path.isdir(fpath) or - (os.path.isfile(fpath) and os.path.splitext(f)[1] == '.py'))): + (os.path.isfile(fpath) and os.path.splitext(f)[1] in ('.py', '.glsl')))): os.symlink(os.path.join(os.pardir, src, f), os.path.join(dest, f)) @@ -65,18 +65,20 @@ if sys.platform != 'win32': try: symtree('../python', 'libavg') + os.symlink('../../graphics/shaders', 'libavg/shaders') except OSError: pass else: # Running make distcheck symtree('../../../../src/python', 'libavg') + os.symlink('../../../../../src/graphics/shaders', 'libavg/shaders') # distcheck doesn't want leftovers (.pyc files) atexit.register(lambda tempPackageDir=tempPackageDir: cleanup(tempPackageDir)) if os.path.exists('../wrapper/.libs/avg.so'): # Normal case: use the local version (not the installed one) - os.symlink('../../wrapper/.libs/avg.so', 'libavg/avg.so') + shutil.copy2('../wrapper/.libs/avg.so', 'libavg/avg.so') elif os.path.exists('../../avg.so'): # Mac version after installer dmg pass @@ -91,13 +93,17 @@ if sys.platform != 'win32': # Meaningful only for distcheck os.chdir(srcDir) - import libavg - libavg.avg.Logger.get().trace(libavg.avg.Logger.APP, "Using libavg from: "+ - os.path.dirname(libavg.__file__)) +import libavg +libavg.logger.configureCategory(libavg.Logger.Category.APP, libavg.Logger.Severity.INFO) +libavg.logger.info("Using libavg from: "+ os.path.dirname(libavg.__file__), + libavg.Logger.Category.APP) +# Ensure mouse is activated +libavg.player.enableMouse(True) +import testapp + +libavg.Player.get().keepWindowOpen() -import testapp - import PluginTest import PlayerTest import OffscreenTest @@ -112,7 +118,10 @@ import AnimTest import EventTest import InputDeviceTest import AVGAppTest -import UITest +import WidgetTest +import GestureTest +import LoggerTest +import AppTest app = testapp.TestApp() @@ -129,8 +138,11 @@ app.registerSuiteFactory('python', PythonTest.pythonTestSuite) app.registerSuiteFactory('anim', AnimTest.animTestSuite) app.registerSuiteFactory('event', EventTest.eventTestSuite) app.registerSuiteFactory('inputdevice', InputDeviceTest.inputDeviceTestSuite) -app.registerSuiteFactory('ui', UITest.uiTestSuite) +app.registerSuiteFactory('widget', WidgetTest.widgetTestSuite) +app.registerSuiteFactory('gesture', GestureTest.gestureTestSuite) app.registerSuiteFactory('avgapp', AVGAppTest.avgAppTestSuite) +app.registerSuiteFactory('logger', LoggerTest.loggerTestSuite) +app.registerSuiteFactory('app', AppTest.appTestSuite) app.run() diff --git a/src/test/UITest.py b/src/test/UITest.py deleted file mode 100644 index 18f6678..0000000 --- a/src/test/UITest.py +++ /dev/null @@ -1,1370 +0,0 @@ -# -*- coding: utf-8 -*- -# libavg - Media Playback Engine. -# Copyright (C) 2003-2011 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, textarea, ui - -import math -from testcase import * - -class UITestCase(AVGTestCase): - def __init__(self, testFuncName): - AVGTestCase.__init__(self, testFuncName) - - def testKeyboard(self): - def setup(): - keyDefs = [ - [("a", "A"), ( 5, 5), (30, 30)], - [(1, ), (35, 5), (30, 30)], - ["SHIFT", (65, 5), (50, 30)]] - kbNoShift = ui.Keyboard("keyboard_bg.png", "keyboard_ovl.png", keyDefs, None, - pos=(10, 10), parent = root) - kbNoShift.setKeyHandler(onKeyDown, onKeyUp) - kbShift = ui.Keyboard("keyboard_bg.png", "keyboard_ovl.png", keyDefs, "SHIFT", - pos=(10, 60), parent = root) - kbShift.setKeyHandler(onKeyDown, onKeyUp) - - def onKeyDown(event, char, cmd): - self.__keyDown = True - self.__keyUp = False - self.__char = char - self.__cmd = cmd - - def onKeyUp(event, char, cmd): - self.__keyDown = False - self.__keyUp = True - self.__char = char - self.__cmd = cmd - - root = self.loadEmptyScene() - - self.__keyDown = False - self.__keyUp = True - self.__char = "foo" - self.__cmd = "bar" - self.start(( - setup, - lambda: self.compareImage("testUIKeyboard", False), - # test character key - lambda: self._sendMouseEvent(avg.CURSORDOWN, 30, 30), - lambda: self.assert_(self.__keyDown and not self.__keyUp), - lambda: self.assert_(self.__char == "a" and self.__cmd is None), - lambda: self.compareImage("testUIKeyboardDownA1", False), - lambda: self._sendMouseEvent(avg.CURSORUP, 30, 30), - lambda: self.assert_(not self.__keyDown and self.__keyUp), - lambda: self.assert_(self.__char == "a" and self.__cmd is None), - lambda: self.compareImage("testUIKeyboard", False), - # test command key - lambda: self._sendMouseEvent(avg.CURSORDOWN, 100, 30), - lambda: self.assert_(self.__keyDown and not self.__keyUp), - lambda: self.assert_(self.__char is None and self.__cmd == "SHIFT"), - lambda: self.compareImage("testUIKeyboardDownS1", False), - lambda: self._sendMouseEvent(avg.CURSORUP, 100, 30), - lambda: self.assert_(not self.__keyDown and self.__keyUp), - lambda: self.assert_(self.__char is None and self.__cmd == "SHIFT"), - lambda: self.compareImage("testUIKeyboard", False), - # test shift key (no shift key support) - lambda: self._sendTouchEvent(1, avg.CURSORDOWN, 100, 30), - lambda: self._sendTouchEvent(2, avg.CURSORDOWN, 30, 30), - lambda: self.assert_(self.__char == "a" and self.__cmd is None), - lambda: self._sendTouchEvent(3, avg.CURSORDOWN, 60, 30), - lambda: self.assert_(self.__char == 1 and self.__cmd is None), - lambda: self.compareImage("testUIKeyboardDownA111S1", False), - lambda: self._sendTouchEvent(2, avg.CURSORUP, 30, 30), - lambda: self.assert_(self.__char == "a" and self.__cmd is None), - lambda: self._sendTouchEvent(3, avg.CURSORUP, 60, 30), - lambda: self.assert_(self.__char == 1 and self.__cmd is None), - lambda: self._sendTouchEvent(1, avg.CURSORUP, 100, 30), - lambda: self.compareImage("testUIKeyboard", False), - # test shift key (with shift key support) - lambda: self._sendTouchEvent(1, avg.CURSORDOWN, 100, 80), - lambda: self._sendTouchEvent(2, avg.CURSORDOWN, 30, 80), - lambda: self.assert_(self.__char == "A" and self.__cmd is None), - lambda: self._sendTouchEvent(3, avg.CURSORDOWN, 60, 80), - lambda: self.assert_(self.__char == 1 and self.__cmd is None), - lambda: self.compareImage("testUIKeyboardDownA212S2", False), - lambda: self._sendTouchEvent(2, avg.CURSORUP, 30, 80), - lambda: self.assert_(self.__char == "A" and self.__cmd is None), - lambda: self._sendTouchEvent(3, avg.CURSORUP, 60, 80), - lambda: self.assert_(self.__char == 1 and self.__cmd is None), - lambda: self._sendTouchEvent(1, avg.CURSORUP, 100, 80), - lambda: self.compareImage("testUIKeyboard", False) - )) - - def testTextArea(self): - def setup(): - self.ta1 = textarea.TextArea(Player.getElementByID('ph1'), id='ta1') - self.ta1.setStyle(font='Bitstream Vera Sans', variant='Roman', - fontsize=16, multiline=True, color='FFFFFF') - self.ta1.setText('Lorem ipsum') - self.ta1.setFocus(True) # TODO: REMOVE - - self.ta2 = textarea.TextArea(Player.getElementByID('ph2'), id='ta2') - self.ta2.setStyle(font='Bitstream Vera Sans', variant='Roman', - fontsize=14, multiline=False, color='FFFFFF') - self.ta2.setText('sit dolor') - self.ta2.setFocus(True) # TODO: REMOVE - - def setAndCheck(ta, text): - ta.setText(text) - self.assertEqual(ta.getText(), text) - - def clear(ta): - ta.onKeyDown(textarea.KEYCODE_FORMFEED) - self.assertEqual(ta.getText(), '') - - def testUnicode(): - self.ta1.setText(u'some ùnìcöde') - self.ta1.onKeyDown(textarea.KEYCODES_BACKSPACE[0]) - self.assertEqual(self.ta1.getText(), u'some ùnìcöd') - self.ta1.onKeyDown(textarea.KEYCODES_BACKSPACE[1]) - self.ta1.onKeyDown(textarea.KEYCODES_BACKSPACE[0]) - self.assertEqual(self.ta1.getText(), u'some ùnìc') - self.ta1.onKeyDown(ord(u'Ä')) - self.assertEqual(self.ta1.getText(), u'some ùnìcÄ') - - def testSpecialChars(): - clear(self.ta1) - self.ta1.onKeyDown(ord(u'&')) - self.ta1.onKeyDown(textarea.KEYCODES_BACKSPACE[0]) - self.assertEqual(self.ta1.getText(), '') - - def checkSingleLine(): - text = '' - self.ta2.setText('') - while True: - self.assert_(len(text) < 20) - self.ta2.onKeyDown(ord(u'A')) - text = text + 'A' - if text != self.ta2.getText(): - self.assertEqual(len(text), 16) - break - - root = self.loadEmptyScene() - avg.DivNode(id="ph1", pos=(2,2), size=(156, 96), parent=root) - avg.DivNode(id="ph2", pos=(2,100), size=(156, 18), parent=root) - - textarea.init(avg, False) - self.start(( - setup, - lambda: self.assertEqual(self.ta1.getText(), 'Lorem ipsum'), - lambda: setAndCheck(self.ta1, ''), - lambda: setAndCheck(self.ta2, 'Lorem Ipsum'), - testUnicode, - lambda: self.compareImage("testTextArea1", True), - testSpecialChars, - checkSingleLine, - lambda: self.compareImage("testTextArea2", True), - )) - - - def testTapRecognizer(self): - - def onPossible(event): - self.__possible = True - - def onDetected(event): - self.__detected = True - - def onFail(event): - self.__failed = True - - def initState(): - self.__possible = False - self.__detected = False - self.__failed = False - - def assertEvents(possible, detected, failed): -# print (self.__possible, self.__detected, self.__failed) - self.assert_(self.__possible == possible and - self.__detected == detected and - self.__failed == failed) - - root = self.loadEmptyScene() - image = avg.ImageNode(parent=root, href="rgb24-64x64.png") - self.__tapRecognizer = ui.TapRecognizer(image, - possibleHandler=onPossible, - detectedHandler=onDetected, - failHandler=onFail) - initState() - Player.setFakeFPS(10) - self.start(( - # Down-up: recognized as tap. - lambda: self._sendMouseEvent(avg.CURSORDOWN, 30, 30), - lambda: assertEvents(True, False, False), - lambda: self._sendMouseEvent(avg.CURSORUP, 30, 30), - lambda: assertEvents(True, True, False), - # Down-small move-up: recognized as tap. - initState, - lambda: self._sendMouseEvent(avg.CURSORDOWN, 30, 30), - lambda: self._sendMouseEvent(avg.CURSORMOTION, 31, 30), - lambda: assertEvents(True, False, False), - lambda: self._sendMouseEvent(avg.CURSORUP, 30, 30), - lambda: assertEvents(True, True, False), - # Down-big move-up: fail - initState, - lambda: self._sendMouseEvent(avg.CURSORDOWN, 1, 1), - lambda: self._sendMouseEvent(avg.CURSORMOTION, 150, 50), - lambda: assertEvents(True, False, True), - lambda: self._sendMouseEvent(avg.CURSORUP, 1, 1), - lambda: assertEvents(True, False, True), - # Down-delay: fail - lambda: self._sendMouseEvent(avg.CURSORDOWN, 30, 30), - lambda: self.delay(600), - lambda: assertEvents(True, False, True), - lambda: self._sendMouseEvent(avg.CURSORUP, 30, 30), - lambda: assertEvents(True, False, True), - )) - - - def testHoldRecognizer(self): - - def onPossible(event): - self.__possible = True - - def onDetected(event): - self.__detected = True - - def onFail(event): - self.__failed = True - - def onStop(event): - self.__stopped = True - - def initState(): - self.__possible = False - self.__detected = False - self.__failed = False - self.__stopped = False - - def assertEvents(possible, detected, failed, stopped): -# print (self.__possible, self.__detected, self.__failed, self.__stopped) - self.assert_(self.__possible == possible and - self.__detected == detected and - self.__failed == failed and - self.__stopped == stopped) - - Player.setFakeFPS(2) - root = self.loadEmptyScene() - image = avg.ImageNode(parent=root, href="rgb24-64x64.png") - self.__holdRecognizer = ui.HoldRecognizer(image, - delay=1000, - possibleHandler=onPossible, - detectedHandler=onDetected, - failHandler=onFail, - stopHandler=onStop) - initState() - self.start(( - # Standard down-hold-up sequence. - lambda: self._sendMouseEvent(avg.CURSORDOWN, 30, 30), - lambda: assertEvents(True, False, False, False), - None, - lambda: assertEvents(True, True, False, False), - None, - lambda: self._sendMouseEvent(avg.CURSORUP, 30, 30), - lambda: assertEvents(True, True, False, True), - - # down-up sequence, hold not long enough. - initState, - lambda: self._sendMouseEvent(avg.CURSORDOWN, 30, 30), - lambda: self._sendMouseEvent(avg.CURSORUP, 30, 30), - lambda: assertEvents(True, False, True, False), - - # down-move-up sequence, should abort. - initState, - lambda: self._sendMouseEvent(avg.CURSORDOWN, 1, 1), - lambda: self._sendMouseEvent(avg.CURSORMOTION, 150, 50), - lambda: assertEvents(True, False, True, False), - lambda: self._sendMouseEvent(avg.CURSORUP, 150, 50), - lambda: assertEvents(True, False, True, False), - )) - Player.setFakeFPS(-1) - - - def testDoubletapRecognizer(self): - - def onPossible(event): - self.__possible = True - - def onDetected(event): - self.__detected = True - - def onFail(event): - self.__failed = True - - def initState(): - self.__possible = False - self.__detected = False - self.__failed = False - - def assertEvents(possible, detected, failed): - self.assert_(self.__possible == possible and - self.__detected == detected and - self.__failed == failed) - - root = self.loadEmptyScene() - image = avg.ImageNode(parent=root, href="rgb24-64x64.png", size=(128,128)) - self.__tapRecognizer = ui.DoubletapRecognizer(image, - possibleHandler=onPossible, - detectedHandler=onDetected, - failHandler=onFail) - initState() - Player.setFakeFPS(10) - self.start(( - # Down, up, down, up: click - lambda: self._sendMouseEvent(avg.CURSORDOWN, 30, 30), - lambda: assertEvents(True, False, False), - lambda: self._sendMouseEvent(avg.CURSORUP, 30, 30), - lambda: assertEvents(True, False, False), - lambda: self._sendMouseEvent(avg.CURSORDOWN, 30, 30), - lambda: assertEvents(True, False, False), - lambda: self._sendMouseEvent(avg.CURSORUP, 30, 30), - lambda: assertEvents(True, True, False), - # Down, move: abort - initState, - lambda: self._sendMouseEvent(avg.CURSORDOWN, 0, 30), - lambda: self._sendMouseEvent(avg.CURSORMOTION, 80, 30), - lambda: assertEvents(True, False, True), - lambda: self._sendMouseEvent(avg.CURSORUP, 0, 30), - lambda: assertEvents(True, False, True), - # Down, up, move: abort - initState, - lambda: self._sendMouseEvent(avg.CURSORDOWN, 0, 30), - lambda: self._sendMouseEvent(avg.CURSORUP, 0, 30), - lambda: self._sendMouseEvent(avg.CURSORMOTION, 80, 30), - lambda: self._sendMouseEvent(avg.CURSORDOWN, 80, 30), - lambda: assertEvents(True, False, True), - lambda: self._sendMouseEvent(avg.CURSORUP, 0, 30), - lambda: assertEvents(True, False, True), - # Down, up, down, move: abort - initState, - lambda: self._sendMouseEvent(avg.CURSORDOWN, 0, 30), - lambda: self._sendMouseEvent(avg.CURSORUP, 0, 30), - lambda: self._sendMouseEvent(avg.CURSORDOWN, 0, 30), - lambda: self._sendMouseEvent(avg.CURSORMOTION, 80, 30), - lambda: assertEvents(True, False, True), - lambda: self._sendMouseEvent(avg.CURSORUP, 0, 30), - lambda: assertEvents(True, False, True), - # Down,delay: abort - lambda: self._sendMouseEvent(avg.CURSORDOWN, 30, 30), - lambda: self.delay(600), - lambda: assertEvents(True, False, True), - lambda: self._sendMouseEvent(avg.CURSORUP, 30, 30), - lambda: assertEvents(True, False, True), - # Down, up, delay: abort - lambda: self._sendMouseEvent(avg.CURSORDOWN, 30, 30), - lambda: self._sendMouseEvent(avg.CURSORUP, 30, 30), - lambda: self.delay(600), - lambda: assertEvents(True, False, True), - # Down, up, down, delay: abort - lambda: self._sendMouseEvent(avg.CURSORDOWN, 30, 30), - lambda: self._sendMouseEvent(avg.CURSORUP, 30, 30), - lambda: self._sendMouseEvent(avg.CURSORDOWN, 30, 30), - lambda: self.delay(600), - lambda: assertEvents(True, False, True), - lambda: self._sendMouseEvent(avg.CURSORUP, 30, 30), - )) - - - def testDragRecognizer(self): - - def onDetected(event): - self.__detected = True - - def onMove(event, offset): - if self.friction == -1: - self.assertEqual(offset, (40,40)) - self.__moved = True - - def onUp(event, offset): - if self.friction == -1: - self.assertEqual(offset, (10,-10)) - self.__up = True - - def onEnd(event): - self.__ended = True - - def disable(): - dragRecognizer.enable(False) - initState() - - def initState(): - self.__detected = False - self.__moved = False - self.__up = False - self.__ended = False - - self.__possible = False - self.__failed = False - - def assertDragEvents(detected, moved, up, ended, possible=False, failed=False): -# print (self.__detected, self.__moved, self.__up, -# self.__ended, self.__possible, self.__failed) - self.assert_(self.__detected == detected and self.__moved == moved and - self.__up == up and self.__ended == ended and - self.__possible == possible and self.__failed == failed) - - Player.setFakeFPS(100) - for self.friction in (-1, 100): - root = self.loadEmptyScene() - image = avg.ImageNode(parent=root, href="rgb24-64x64.png") - dragRecognizer = ui.DragRecognizer(image, - detectedHandler=onDetected, moveHandler=onMove, upHandler=onUp, - endHandler=onEnd, friction=self.friction) - initState() - self.start(( - lambda: self._sendMouseEvent(avg.CURSORDOWN, 30, 30), - lambda: assertDragEvents(True, False, False, False), - lambda: self._sendMouseEvent(avg.CURSORMOTION, 70, 70), - lambda: assertDragEvents(True, True, False, False), - lambda: self._sendMouseEvent(avg.CURSORUP, 40, 20), - lambda: assertDragEvents(True, True, True, True), - disable, - lambda: self._sendMouseEvent(avg.CURSORDOWN, 30, 30), - lambda: assertDragEvents(False, False, False, False), - lambda: dragRecognizer.enable(True), - lambda: self._sendMouseEvent(avg.CURSORUP, 30, 30), - lambda: self._sendMouseEvent(avg.CURSORDOWN, 30, 30), - lambda: assertDragEvents(True, False, False, False), - )) - - # Test with constraint. - def onPossible(event): - self.__possible = True - - def onFail(event): - self.__failed = True - - def onVertMove(event, offset): - if self.friction == -1: - self.assertEqual(offset, (0,40)) - self.__moved = True - - for friction in (-1, 100): - root = self.loadEmptyScene() - image = avg.ImageNode(parent=root, href="rgb24-64x64.png") - dragRecognizer = ui.DragRecognizer(image, - possibleHandler=onPossible, failHandler=onFail, - detectedHandler=onDetected, - moveHandler=onVertMove, upHandler=onUp, endHandler=onEnd, - friction=self.friction, direction=ui.DragRecognizer.VERTICAL) - initState() - self.start(( - lambda: self._sendMouseEvent(avg.CURSORDOWN, 30, 30), - lambda: assertDragEvents(False, False, False, False, True, False), - lambda: self._sendMouseEvent(avg.CURSORMOTION, 35, 30), - lambda: assertDragEvents(False, False, False, False, True, False), - lambda: self._sendMouseEvent(avg.CURSORMOTION, 30, 70), - lambda: assertDragEvents(True, True, False, False, True, False), - lambda: self._sendMouseEvent(avg.CURSORUP, 40, 20), - lambda: assertDragEvents(True, True, True, True, True, False), - initState, - # Wrong direction -> abort. - lambda: self._sendMouseEvent(avg.CURSORDOWN, 30, 30), - lambda: self._sendMouseEvent(avg.CURSORMOTION, 70, 30), - lambda: assertDragEvents(False, False, False, False, True, True), - lambda: self._sendMouseEvent(avg.CURSORUP, 70, 30), - lambda: assertDragEvents(False, False, False, False, True, True), - - # No movement -> abort. - lambda: self._sendMouseEvent(avg.CURSORDOWN, 30, 30), - lambda: self._sendMouseEvent(avg.CURSORUP, 30, 30), - lambda: assertDragEvents(False, False, False, False, True, True), - )) - - Player.setFakeFPS(-1) - - - def testDragRecognizerRelCoords(self): - - def onDrag(event, offset): - self.assertAlmostEqual(offset, (-40,-40)) - - Player.setFakeFPS(100) - for self.friction in (-1, 100): - root = self.loadEmptyScene() - div = avg.DivNode(pos=(64,64), angle=math.pi, parent=root) - image = avg.ImageNode(parent=div, href="rgb24-64x64.png") - ui.DragRecognizer(image, moveHandler=onDrag, friction=self.friction) - self.start(( - lambda: self._sendMouseEvent(avg.CURSORDOWN, 30, 30), - lambda: self._sendMouseEvent(avg.CURSORMOTION, 70, 70), - )) - Player.setFakeFPS(-1) - - - def testDragRecognizerInitialEvent(self): - - def onMotion(event): - ui.DragRecognizer(self.image, - detectedHandler=onDragStart, moveHandler=onDrag, initialEvent=event) - self.image.disconnectEventHandler(self) - - def onDragStart(event): - self.__dragStartCalled = True - - def onDrag(event, offset): - self.assertEqual(offset, (10,0)) - - root = self.loadEmptyScene() - self.image = avg.ImageNode(parent=root, href="rgb24-64x64.png") - self.image.connectEventHandler(avg.CURSORMOTION, avg.MOUSE, self, onMotion) - self.__dragStartCalled = False - self.start(( - lambda: self._sendMouseEvent(avg.CURSORDOWN, 30, 30), - lambda: self._sendMouseEvent(avg.CURSORMOTION, 40, 30), - lambda: self._sendMouseEvent(avg.CURSORMOTION, 50, 30), - )) - assert(self.__dragStartCalled) - - - def testDragRecognizerCoordSysNode(self): - - def onDrag(event, offset): - self.assertEqual(offset, (40,40)) - - root = self.loadEmptyScene() - div = avg.DivNode(pos=(64,64), angle=math.pi, parent=root) - image = avg.ImageNode(parent=div, href="rgb24-64x64.png") - ui.DragRecognizer(image, moveHandler=onDrag, coordSysNode=div, friction=-1) - self.start(( - lambda: self._sendMouseEvent(avg.CURSORDOWN, 30, 30), - lambda: self._sendMouseEvent(avg.CURSORMOTION, 70, 70), - )) - - - def testTransformRecognizer(self): - - def onDetected(event): - pass - - def onMove(transform): - self.transform = transform - - def onUp(transform): - self.transform = transform - - def checkTransform(expectedTransform): -# print self.transform -# print expectedTransform -# print - self.assertAlmostEqual(self.transform.trans, expectedTransform.trans) - self.assertAlmostEqual(self.transform.rot, expectedTransform.rot) - self.assertAlmostEqual(self.transform.scale, expectedTransform.scale) - if expectedTransform.rot != 0 or expectedTransform.scale != 1: - self.assertAlmostEqual(self.transform.pivot, expectedTransform.pivot) - - def createTransTestFrames(): - return ( - lambda: self._sendTouchEvent(1, avg.CURSORDOWN, 10, 10), - lambda: self._sendTouchEvent(1, avg.CURSORUP, 20, 10), - lambda: checkTransform(ui.Transform((10,0))), - ) - - def createRotTestFrames(expectedTransform): - return ( - lambda: self._sendTouchEvents(( - (1, avg.CURSORDOWN, 0, 10), - (2, avg.CURSORDOWN, 0, 20))), - lambda: self._sendTouchEvents(( - (1, avg.CURSORMOTION, 0, 20), - (2, avg.CURSORMOTION, 0, 10))), - lambda: checkTransform(expectedTransform), - lambda: self._sendTouchEvents(( - (1, avg.CURSORUP, 0, 20), - (2, avg.CURSORUP, 0, 10))), - ) - - def createScaleTestFrames(expectedTransform): - return ( - lambda: self._sendTouchEvent(1, avg.CURSORDOWN, 0, 10), - lambda: self._sendTouchEvent(2, avg.CURSORDOWN, 0, 20), - lambda: self._sendTouchEvent(1, avg.CURSORMOTION, 0, 10), - lambda: self._sendTouchEvent(2, avg.CURSORMOTION, 0, 30), - lambda: checkTransform(expectedTransform), - lambda: self._sendTouchEvent(1, avg.CURSORUP, 0, 10), - lambda: self._sendTouchEvent(2, avg.CURSORUP, 0, 30), - ) - - root = self.loadEmptyScene() - image = avg.ImageNode(parent=root, href="rgb24-64x64.png") - self.__transformRecognizer = ui.TransformRecognizer(image, - detectedHandler=onDetected, moveHandler=onMove, upHandler=onUp) - self.start(( - # Check up/down handling - lambda: self._sendTouchEvent(1, avg.CURSORDOWN, 10, 10), - lambda: checkTransform(ui.Transform((0,0))), - lambda: self._sendTouchEvent(1, avg.CURSORMOTION, 20, 10), - lambda: checkTransform(ui.Transform((10,0))), - lambda: self._sendTouchEvent(2, avg.CURSORDOWN, 20, 20), - lambda: checkTransform(ui.Transform((0,0))), - lambda: self._sendTouchEvents(( - (1, avg.CURSORMOTION, 30, 10), - (2, avg.CURSORMOTION, 30, 20))), - lambda: checkTransform(ui.Transform((10,0))), - lambda: self._sendTouchEvent(2, avg.CURSORUP, 30, 20), - lambda: checkTransform(ui.Transform((0,0))), - lambda: self._sendTouchEvent(1, avg.CURSORMOTION, 40, 10), - lambda: checkTransform(ui.Transform((10,0))), - lambda: self._sendTouchEvent(1, avg.CURSORUP, 50, 10), - lambda: checkTransform(ui.Transform((10,0))), - - createRotTestFrames(ui.Transform((0,0), math.pi, 1, (0,15))), - - createScaleTestFrames(ui.Transform((0,5), 0, 2, (0,20))) - )) - - # Test rel. coords. - root = self.loadEmptyScene() - div = avg.DivNode(parent=root, pos=(0,10)) - image = avg.ImageNode(parent=div, href="rgb24-64x64.png") - self.__transformRecognizer = ui.TransformRecognizer(image, - detectedHandler=onDetected, moveHandler=onMove, upHandler=onUp) - self.start(( - createTransTestFrames(), - createRotTestFrames(ui.Transform((0,0), math.pi, 1, (0,5))), - createScaleTestFrames(ui.Transform((0,5), 0, 2, (0,10))), - )) - - # Test coordSysNode. - root = self.loadEmptyScene() - div = avg.DivNode(parent=root, pos=(0,10)) - image = avg.ImageNode(parent=div, href="rgb24-64x64.png") - self.__transformRecognizer = ui.TransformRecognizer(image, coordSysNode=div, - detectedHandler=onDetected, moveHandler=onMove, upHandler=onUp) - self.start(( - createTransTestFrames(), - createRotTestFrames(ui.Transform((0,0), math.pi, 1, (0,15))), - createScaleTestFrames(ui.Transform((0,5), 0, 2, (0,20))), - )) - - - def testKMeans(self): - pts = [avg.Point2D(0,0), avg.Point2D(0,1)] - means = ui.calcKMeans(pts) - self.assertEqual(means, ([0], [1])) - - pts.append (avg.Point2D(0,4)) - means = ui.calcKMeans(pts) - self.assertEqual(means, ([0,1], [2])) - - - def testMat3x3(self): - t = ui.Mat3x3.translate([1,0,1]) - v = [1,0,1] - self.assertEqual(t.applyVec(v), [2,0,1]) - r = ui.Mat3x3.rotate(math.pi/2) - self.assertAlmostEqual(r.applyVec(v), [0,1,1]) - t2 = t.applyMat(t) - self.assertAlmostEqual(t.applyMat(t).m, ui.Mat3x3.translate([2,0,1]).m) - self.assertAlmostEqual(t.applyMat(r).m, ui.Mat3x3([0,-1,1],[1,0,0]).m) - self.assertAlmostEqual(r.applyMat(t).m, ui.Mat3x3([0,-1,0],[1,0,1]).m) - self.assertAlmostEqual(ui.Mat3x3().m, ui.Mat3x3().inverse().m) - m = ui.Mat3x3([-1, 3, -3], - [ 0, -6, 5], - [-5, -3, 1]) - im = ui.Mat3x3([3./2, 1., -1./2], - [-25./6, -8./3, 5./6], - [-5., -3., 1.]) - self.assertAlmostEqual(m.inverse().m, im.m) - - image = avg.ImageNode(pos=(10,20), size=(30,40), angle=1.57, - href="rgb24alpha-64x64.png") - mat = ui.Mat3x3.fromNode(image) - mat.setNodeTransform(image) - self.assertAlmostEqual(image.pos, (10,20)) - self.assertAlmostEqual(image.size, (30,40)) - self.assertAlmostEqual(image.angle, 1.57) - - - def testFocusContext(self): - def setup(): - textarea.init(avg) - self.ctx1 = textarea.FocusContext() - self.ctx2 = textarea.FocusContext() - - self.ta1 = textarea.TextArea(Player.getElementByID('ph1'), - self.ctx1, id='ta1') - self.ta1.setStyle(font='Bitstream Vera Sans', variant='Roman', - fontsize=16, multiline=True, color='FFFFFF') - self.ta1.setText('Lorem ipsum') - - self.ta2 = textarea.TextArea(Player.getElementByID('ph2'), - self.ctx1, id='ta2') - self.ta2.setStyle(font='Bitstream Vera Sans', variant='Roman', - fontsize=14, multiline=False, color='FFFFFF') - self.ta2.setText('dolor') - - self.ta3 = textarea.TextArea(Player.getElementByID('ph3'), - self.ctx2, disableMouseFocus=True, id='ta3') - self.ta3.setStyle(font='Bitstream Vera Sans', variant='Roman', - fontsize=14, multiline=True, color='FFFFFF') - self.ta3.setText('dolor sit amet') - - textarea.setActiveFocusContext(self.ctx1) - - def writeChar(): - helper = Player.getTestHelper() - helper.fakeKeyEvent(avg.KEYDOWN, 65, 65, "A", 65, 0) - helper.fakeKeyEvent(avg.KEYUP, 65, 65, "A", 65, 0) - helper.fakeKeyEvent(avg.KEYDOWN, 66, 66, "B", 66, 0) - helper.fakeKeyEvent(avg.KEYUP, 66, 66, "B", 66, 0) - helper.fakeKeyEvent(avg.KEYDOWN, 67, 67, "C", 67, 0) - helper.fakeKeyEvent(avg.KEYUP, 67, 67, "C", 67, 0) - - def switchFocus(): - self.ctx1.cycleFocus() - - def clearFocused(): - self.ctx1.clear() - - def clickForFocus(): - self._sendMouseEvent(avg.CURSORDOWN, 20, 70) - self._sendMouseEvent(avg.CURSORUP, 20, 70) - - root = self.loadEmptyScene() - avg.DivNode(id="ph1", pos=(2,2), size=(156,54), parent=root) - avg.DivNode(id="ph2", pos=(2,58), size=(76,54), parent=root) - div3 = avg.DivNode(id="ph3", pos=(80,58), size=(76,54), parent=root) - avg.ImageNode(href="1x1_white.png", size=(76,54), parent=div3) - self.start(( - setup, - lambda: self.compareImage("testFocusContext1", True), - writeChar, - lambda: self.compareImage("testFocusContext2", True), - switchFocus, - writeChar, - lambda: self.compareImage("testFocusContext3", True), - switchFocus, - clearFocused, - lambda: self.compareImage("testFocusContext4", True), - clickForFocus, - clearFocused, - lambda: self.compareImage("testFocusContext5", True), - )) - - def testButton(self): - def onDown(event): - self.__down = True - - def onClick(event): - self.__clicked = True - - def reset(): - self.__down = False - self.__clicked = False - - def printAddress(obj): - print obj - - def setObjectActive(obj, active): - obj.active = active - - root = self.loadEmptyScene() - - b = ui.Button( - parent = root, - upNode = avg.ImageNode(href="button_up.png"), - downNode = avg.ImageNode(href="button_down.png"), - disabledNode = avg.ImageNode(href="button_disabled.png"), - pressHandler = onDown, - clickHandler = onClick) - - b1 = ui.Button(parent=root, - active=False, - pressHandler=onDown, - clickHandler=onClick) - - b.pos = (0, 0) - yOutDistance = int(b.height * 2) - - self.__down = False - self.__clicked = False - - self.start(( - # Normal click: Down & up over button - lambda: self.compareImage("testUIButtonUp", False), - lambda: self._sendMouseEvent(avg.CURSORDOWN, 0, 0), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self.assert_(self.__down and not(self.__clicked)), - lambda: self._sendMouseEvent(avg.CURSORUP, 0, 0), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self.assert_(self.__clicked), - reset, - - # Down, move away from button, move over button, up - # ==> click - lambda: self._sendMouseEvent(avg.CURSORDOWN, 0, 0), - lambda: self._sendMouseEvent(avg.CURSORMOTION, 0, yOutDistance), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self._sendMouseEvent(avg.CURSORMOTION, 0, 0), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendMouseEvent(avg.CURSORUP, 0, 0), - lambda: self.assert_(self.__down and self.__clicked), - reset, - - # Down, move away from button, up ==> no click - lambda: self._sendMouseEvent(avg.CURSORDOWN, 0, 0), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendMouseEvent(avg.CURSORMOTION, 0, yOutDistance), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self._sendMouseEvent(avg.CURSORUP, 0, yOutDistance), - lambda: self.assert_(self.__down and not(self.__clicked)), - reset, - - # Move away from button, down, mover over button, up - # ==> no click - lambda: self._sendMouseEvent(avg.CURSORDOWN, 0, yOutDistance), - lambda: self._sendMouseEvent(avg.CURSORMOTION, 0, 0), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self._sendMouseEvent(avg.CURSORUP, 0, 0), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self.assert_(not(self.__down) and not(self.__clicked)), - reset, - - # Move away from button, down, mover over button, move away from button, up - # ==> no click - lambda: self._sendMouseEvent(avg.CURSORDOWN, 0, yOutDistance), - lambda: self._sendMouseEvent(avg.CURSORMOTION, 0, 0), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self._sendMouseEvent(avg.CURSORMOTION, 0, yOutDistance), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self._sendMouseEvent(avg.CURSORUP, 0, yOutDistance), - lambda: self.assert_(not(self.__down) and not(self.__clicked)), - reset, - - # Check checkable button - # Set checkable, down, up => pressed, down, up ==> click - lambda: b.setCheckable(True), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self._sendMouseEvent(avg.CURSORDOWN, 0, 0), - lambda: self.assert_(self.__down and not(self.__clicked)), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendMouseEvent(avg.CURSORUP, 0, 0), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self.assert_(self.__down and self.__clicked), - reset, - lambda: self._sendMouseEvent(avg.CURSORDOWN, 0, 0), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendMouseEvent(avg.CURSORUP, 0, 0), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self.assert_(self.__down and self.__clicked), - reset, - - # not checked, down, out, in, up ==> pressed, click - lambda: b.setCheckable(True), - lambda: b.setChecked(False), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self._sendMouseEvent(avg.CURSORDOWN, 0, 0), - lambda: self.assert_(self.__down and not(self.__clicked)), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendMouseEvent(avg.CURSORMOTION, 0, yOutDistance), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self._sendMouseEvent(avg.CURSORMOTION, 0, 0), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendMouseEvent(avg.CURSORUP, 0, 0), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self.assert_(self.__down and self.__clicked), - reset, - - # not checked, down, out, up ==> pressed, no click - lambda: b.setCheckable(True), - lambda: b.setChecked(False), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self._sendMouseEvent(avg.CURSORDOWN, 0, 0), - lambda: self.assert_(self.__down and not(self.__clicked)), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendMouseEvent(avg.CURSORMOTION, 0, yOutDistance), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self._sendMouseEvent(avg.CURSORUP, 0, yOutDistance), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self.assert_(self.__down and not(self.__clicked)), - reset, - - # not checked, down, out, up ==> pressed, no click - lambda: b.setCheckable(True), - lambda: b.setChecked(True), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendMouseEvent(avg.CURSORDOWN, 0, 0), - lambda: self.assert_(self.__down and not(self.__clicked)), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendMouseEvent(avg.CURSORMOTION, 0, yOutDistance), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendMouseEvent(avg.CURSORUP, 0, yOutDistance), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self.assert_(self.__down and not(self.__clicked)), - reset, - - # checked, down, out, in, up ==> pressed, clicked - lambda: b.setCheckable(True), - lambda: b.setChecked(True), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendMouseEvent(avg.CURSORDOWN, 0, 0), - lambda: self.assert_(self.__down), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendMouseEvent(avg.CURSORMOTION, 0, yOutDistance), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendMouseEvent(avg.CURSORMOTION, 0, 0), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendMouseEvent(avg.CURSORUP, 0, 0), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self.assert_(self.__down and self.__clicked), - reset, - - # Test public interface - lambda: b.setCheckable(False), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self.assert_(b.isEnabled()), - lambda: self.assert_(not(b.isCheckable())), - lambda: b.setCheckable(True), - lambda: self.assert_(b.isCheckable()), - lambda: b.setChecked(True), - lambda: self.assert_(b.isChecked()), - lambda: b.setEnabled(False), - lambda: self.assert_(not(b.isEnabled())), - lambda: self.assert_(not(self.__down) and not(self.__clicked)), - lambda: b.setEnabled(True), - lambda: b.setChecked(False), - reset, - - # Disable: Various up/down combinations have no effect - lambda: b.setEnabled(False), - lambda: self._sendMouseEvent(avg.CURSORDOWN, 0, 0), - lambda: self._sendMouseEvent(avg.CURSORUP, 0, 0), - lambda: self.compareImage("testUIButtonDisabled", False), - lambda: self.assert_(not(self.__down) and not(self.__clicked)), - lambda: self._sendMouseEvent(avg.CURSORDOWN, 0, 0), - lambda: self.compareImage("testUIButtonDisabled", False), - lambda: self._sendMouseEvent(avg.CURSORUP, 0, 0), - lambda: self.compareImage("testUIButtonDisabled", False), - lambda: self.assert_(not(self.__down) and not(self.__clicked)), - lambda: self._sendMouseEvent(avg.CURSORDOWN, 0, 0), - lambda: self.compareImage("testUIButtonDisabled", False), - lambda: b.setEnabled(True), - lambda: self._sendMouseEvent(avg.CURSORUP, 0, 0), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self.assert_(not(self.__down)), - lambda: self.assert_(not(self.__clicked)), - reset, - - # Checking functionality while resetting the visible nodes - lambda: b.setNodes(upNode = avg.ImageNode(href="button_up.png"), - downNode = avg.ImageNode(href="button_down.png"), - disabledNode = avg.ImageNode(href="button_disabled.png")), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self._sendMouseEvent(avg.CURSORDOWN, 0, 0), - lambda: self._sendMouseEvent(avg.CURSORUP, 0, 0), - lambda: self.assert_(self.__down and self.__clicked), - reset, - - lambda: b.setEnabled(False), - lambda: b.setNodes(upNode = avg.ImageNode(href="button_up.png"), - downNode = avg.ImageNode(href="button_down.png"), - disabledNode = avg.ImageNode(href="button_disabled.png")), - lambda: self.compareImage("testUIButtonDisabled", False), - lambda: self._sendMouseEvent(avg.CURSORDOWN, 0, 0), - lambda: self._sendMouseEvent(avg.CURSORUP, 0, 0), - lambda: self.assert_(not(self.__down) and not(self.__clicked)), - reset, - - lambda: b.setEnabled(True), - lambda: b.setNodes(upNode = avg.ImageNode(href="button_up.png"), - downNode = avg.ImageNode(href="button_down.png"), - disabledNode = None), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self._sendMouseEvent(avg.CURSORDOWN, 0, 0), - lambda: self._sendMouseEvent(avg.CURSORUP, 0, 0), - lambda: self.assert_(self.__down and self.__clicked), - reset, - - # resetting the nodes on an empty button - lambda: setObjectActive(b, False), - lambda: setObjectActive(b1, True), - lambda: b1.setNodes(upNode = avg.ImageNode(href="button_up.png"), - downNode = avg.ImageNode(href="button_down.png"), - disabledNode = avg.ImageNode(href="button_disabled.png")), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self._sendMouseEvent(avg.CURSORDOWN, 0, 0), - lambda: self._sendMouseEvent(avg.CURSORUP, 0, 0), - lambda: self.assert_(self.__down and self.__clicked), - )) - - - def testMultitouchButton(self): - def onDown(event): - self.__down = True - - def onClick(event): - self.__clicked = True - - def reset(): - self.__down = False - self.__clicked = False - - root = self.loadEmptyScene() - b = ui.Button( - parent = root, - upNode = avg.ImageNode(href="button_up.png"), - downNode = avg.ImageNode(href="button_down.png"), - disabledNode = avg.ImageNode(href="button_disabled.png"), - pressHandler = onDown, - clickHandler = onClick, - ) - b.pos = (0,0) - yOutDistance = b.height * 2 - - self.__down = False - self.__clicked = False - self.start(( - # Two downs, two ups ==> click after second up. - lambda: self._sendTouchEvent(1, avg.CURSORDOWN, 0, 0), - lambda: self._sendTouchEvent(2, avg.CURSORDOWN, 0, 0), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self.assert_(self.__down and not(self.__clicked)), - lambda: self._sendTouchEvent(1, avg.CURSORUP, 0, 0), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self.assert_(self.__down and not(self.__clicked)), - lambda: self._sendTouchEvent(2, avg.CURSORUP, 0, 0), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self.assert_(self.__clicked), - reset, - - # Two downs, one out, out up, in up ==> click - lambda: self._sendTouchEvent(1, avg.CURSORDOWN, 0, 0), - lambda: self._sendTouchEvent(2, avg.CURSORDOWN, 0, 0), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendTouchEvent(2, avg.CURSORMOTION, 0, yOutDistance), - lambda: self._sendTouchEvent(2, avg.CURSORUP, 0, 50), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self.assert_(self.__down and not(self.__clicked)), - lambda: self._sendTouchEvent(1, avg.CURSORUP, 0, 0), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self.assert_(self.__down and self.__clicked), - reset, - - # Two down, both out, both in, both up ==> click - lambda: self._sendTouchEvent(1, avg.CURSORDOWN, 0, 0), - lambda: self._sendTouchEvent(2, avg.CURSORDOWN, 0, 0), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendTouchEvent(1, avg.CURSORMOTION, 0, yOutDistance), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendTouchEvent(2, avg.CURSORMOTION, 0, yOutDistance), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self.assert_(self.__down and not(self.__clicked)), - lambda: self._sendTouchEvent(1, avg.CURSORMOTION, 0, 0), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendTouchEvent(2, avg.CURSORMOTION, 0, 0), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendTouchEvent(1, avg.CURSORUP, 0, 0), - lambda: self._sendTouchEvent(2, avg.CURSORUP, 0, 0), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self.assert_(self.__down and self.__clicked), - reset, - - # Two down both out, both up ==> no click - lambda: self._sendTouchEvent(1, avg.CURSORDOWN, 0, 0), - lambda: self._sendTouchEvent(2, avg.CURSORDOWN, 0, 0), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendTouchEvent(1, avg.CURSORMOTION, 0, yOutDistance), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendTouchEvent(2, avg.CURSORMOTION, 0, yOutDistance), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self._sendTouchEvent(1, avg.CURSORUP, 0, yOutDistance), - lambda: self._sendTouchEvent(2, avg.CURSORUP, 0, yOutDistance), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self.assert_(self.__down and not(self.__clicked)), - reset, - - # Two downs, one out, in up, out up ==> no click - lambda: self._sendTouchEvent(1, avg.CURSORDOWN, 0, 0), - lambda: self._sendTouchEvent(2, avg.CURSORDOWN, 0, 0), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendTouchEvent(2, avg.CURSORMOTION, 0, yOutDistance), - lambda: self._sendTouchEvent(1, avg.CURSORUP, 0, yOutDistance), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self.assert_(self.__down and not(self.__clicked)), - lambda: self._sendTouchEvent(2, avg.CURSORUP, 0, yOutDistance), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self.assert_(self.__down and not(self.__clicked)), - reset, - - # Check checkable multitouch button - # 2 down, 2 up ==> pressed, clicked, - # 2 down, 2 up ==> pressed, clicked - lambda: b.setCheckable(True), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self._sendTouchEvent(1, avg.CURSORDOWN, 0, 0), - lambda: self._sendTouchEvent(2, avg.CURSORDOWN, 0, 0), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self.assert_(self.__down and not(self.__clicked)), - lambda: self._sendTouchEvent(1, avg.CURSORUP, 0, 0), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendTouchEvent(2, avg.CURSORUP, 0, 0), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self.assert_(self.__down and self.__clicked), - reset, - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendTouchEvent(1, avg.CURSORDOWN, 0, 0), - lambda: self._sendTouchEvent(2, avg.CURSORDOWN, 0, 0), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self.assert_(self.__down and not(self.__clicked)), - lambda: self._sendTouchEvent(1, avg.CURSORUP, 0, 0), - lambda: self._sendTouchEvent(2, avg.CURSORUP, 0, 0), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self.assert_(self.__down and self.__clicked), - reset, - - # not checked, 2 down, 2 out, 2 in, first up, second up - # ==> pressed, clicked - lambda: b.setChecked(False), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self._sendTouchEvent(1, avg.CURSORDOWN, 0, 0), - lambda: self._sendTouchEvent(2, avg.CURSORDOWN, 0, 0), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self.assert_(self.__down and not(self.__clicked)), - lambda: self._sendTouchEvent(1, avg.CURSORMOTION, 0, yOutDistance), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendTouchEvent(2, avg.CURSORMOTION, 0, yOutDistance), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self._sendTouchEvent(1, avg.CURSORMOTION, 0, 0), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendTouchEvent(2, avg.CURSORMOTION, 0, 0), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendTouchEvent(1, avg.CURSORUP, 0, 0), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self.assert_(self.__down and not(self.__clicked)), - lambda: self._sendTouchEvent(2, avg.CURSORUP, 0, 0), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self.assert_(self.__down and self.__clicked), - reset, - - # checked, 2 down, 2 out, 2 in, first up, second up - # ==> pressed, clicked - lambda: b.setCheckable(True), - lambda: b.setChecked(True), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendTouchEvent(1, avg.CURSORDOWN, 0, 0), - lambda: self._sendTouchEvent(2, avg.CURSORDOWN, 0, 0), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self.assert_(self.__down and not(self.__clicked)), - lambda: self._sendTouchEvent(1, avg.CURSORMOTION, 0, yOutDistance), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendTouchEvent(2, avg.CURSORMOTION, 0, yOutDistance), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendTouchEvent(1, avg.CURSORMOTION, 0, 0), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendTouchEvent(2, avg.CURSORMOTION, 0, 0), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendTouchEvent(1, avg.CURSORUP, 0, 0), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self.assert_(self.__down and not(self.__clicked)), - lambda: self._sendTouchEvent(2, avg.CURSORUP, 0, 0), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self.assert_(self.__down and self.__clicked), - reset, - - # not checked, 2 down, 2 out, first up, second up - # ==> pressed, not clicked - lambda: b.setCheckable(True), - lambda: b.setChecked(False), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self._sendTouchEvent(1, avg.CURSORDOWN, 0, 0), - lambda: self._sendTouchEvent(2, avg.CURSORDOWN, 0, 0), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self.assert_(self.__down and not(self.__clicked)), - lambda: self._sendTouchEvent(1, avg.CURSORMOTION, 0, yOutDistance), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendTouchEvent(2, avg.CURSORMOTION, 0, yOutDistance), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self._sendTouchEvent(1, avg.CURSORUP, 0, yOutDistance), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self.assert_(self.__down and not(self.__clicked)), - lambda: self._sendTouchEvent(2, avg.CURSORUP, 0, yOutDistance), - lambda: self.compareImage("testUIButtonUp", False), - lambda: self.assert_(self.__down and not(self.__clicked)), - reset, - - # checked, 2 down, 2 out, first up, second up - # ==> pressed, not clicked - lambda: b.setCheckable(True), - lambda: b.setChecked(True), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendTouchEvent(1, avg.CURSORDOWN, 0, 0), - lambda: self._sendTouchEvent(2, avg.CURSORDOWN, 0, 0), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self.assert_(self.__down and not(self.__clicked)), - lambda: self._sendTouchEvent(1, avg.CURSORMOTION, 0, yOutDistance), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendTouchEvent(2, avg.CURSORMOTION, 0, yOutDistance), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendTouchEvent(1, avg.CURSORUP, 0, yOutDistance), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self.assert_(self.__down and not(self.__clicked)), - lambda: self._sendTouchEvent(2, avg.CURSORUP, 0, yOutDistance), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self.assert_(self.__down and not(self.__clicked)), - reset, - )) - - - def testTouchButton(self): - - def onClick(): - self.clicked = True - - def reset(): - self.clicked = False - - def enable(enabled): - button.enabled = enabled - - def createScene(**kwargs): - root = self.loadEmptyScene() - return ui.TouchButton( - parent = root, - upNode = avg.ImageNode(href="button_up.png"), - downNode = avg.ImageNode(href="button_down.png"), - disabledNode = avg.ImageNode(href="button_disabled.png"), - clickHandler = onClick, - **kwargs - ) - - def runTest(): - self.clicked = False - self.start(( - # Standard down->up - lambda: self._sendTouchEvent(1, avg.CURSORDOWN, 0, 0), - lambda: self.assert_(not(self.clicked)), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendTouchEvent(1, avg.CURSORUP, 0, 0), - lambda: self.assert_(self.clicked), - lambda: self.compareImage("testUIButtonUp", False), - - # Disable, down, up -> no click - reset, - lambda: self.assert_(button.enabled), - lambda: enable(False), - lambda: self.assert_(not(button.enabled)), - lambda: self.compareImage("testUIButtonDisabled", False), - lambda: self._sendTouchEvent(2, avg.CURSORDOWN, 0, 0), - lambda: self._sendTouchEvent(2, avg.CURSORUP, 0, 0), - lambda: self.assert_(not(self.clicked)), - lambda: enable(True), - lambda: self.assert_(button.enabled), - - # Down, up further away -> no click - reset, - lambda: self._sendTouchEvent(3, avg.CURSORDOWN, 0, 0), - lambda: self._sendTouchEvent(3, avg.CURSORUP, 100, 0), - lambda: self.assert_(not(self.clicked)), - lambda: self.compareImage("testUIButtonUp", False), - - # Down, move further away, up -> no click - reset, - lambda: self._sendTouchEvent(3, avg.CURSORDOWN, 0, 0), - lambda: self._sendTouchEvent(3, avg.CURSORMOTION, 100, 0), - lambda: self._sendTouchEvent(3, avg.CURSORUP, 100, 0), - lambda: self.assert_(not(self.clicked)), - lambda: self.compareImage("testUIButtonUp", False), - - # Test if button still reacts after abort - lambda: self._sendTouchEvent(4, avg.CURSORDOWN, 0, 0), - lambda: self.assert_(not(self.clicked)), - lambda: self.compareImage("testUIButtonDown", False), - lambda: self._sendTouchEvent(4, avg.CURSORUP, 0, 0), - lambda: self.assert_(self.clicked), - lambda: self.compareImage("testUIButtonUp", False), - )) - - button = createScene() - runTest() - - button = createScene(activeAreaNode = avg.CircleNode(r=5, opacity=0)) - runTest() - - button = createScene(fatFingerEnlarge = True) - runTest() - - root = self.loadEmptyScene() - button = ui.TouchButton.fromSrc( - parent = root, - upSrc = "button_up.png", - downSrc = "button_down.png", - disabledSrc = "button_disabled.png", - clickHandler = onClick - ) - runTest() - - def testScrollPane(self): - def scrollLarge(): - scrollPane.contentpos = (-34, -34) - self.assertEqual(scrollPane.contentpos, (-32,-32)) - - def initSmallContent(): - scrollPane.size = (64, 64) - contentArea.size = (32, 32) - image.size = (32, 32) - scrollPane.contentpos = (0, 0) - self.assertEqual(scrollPane.getMaxContentPos(), (32,32)) - - def scrollSmall(): - scrollPane.contentpos = (32, 32) - - root = self.loadEmptyScene() - contentArea = avg.DivNode(size=(64,64)) - image = avg.ImageNode(href="rgb24-64x64.png", parent=contentArea) - scrollPane = ui.ScrollPane(contentDiv=contentArea, size=(32,32), parent=root) - - self.start(( - lambda: self.compareImage("testScrollPane1", False), - scrollLarge, - lambda: self.compareImage("testScrollPane2", False), - initSmallContent, - lambda: self.compareImage("testScrollPane3", False), - scrollSmall, - lambda: self.compareImage("testScrollPane4", False), - )) - - -def uiTestSuite(tests): - availableTests = ( - "testKeyboard", - "testTextArea", - "testFocusContext", - "testTapRecognizer", - "testHoldRecognizer", - "testDoubletapRecognizer", - "testDragRecognizer", - "testDragRecognizerRelCoords", - "testDragRecognizerInitialEvent", - "testDragRecognizerCoordSysNode", - "testTransformRecognizer", - "testKMeans", - "testMat3x3", - "testButton", - "testMultitouchButton", - "testTouchButton", - "testScrollPane" - ) - - return createAVGTestSuite(availableTests, UITestCase, tests) - -Player = avg.Player.get() - diff --git a/src/test/VectorTest.py b/src/test/VectorTest.py index f408aa8..af0ddaf 100644 --- a/src/test/VectorTest.py +++ b/src/test/VectorTest.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # libavg - Media Playback Engine. -# Copyright (C) 2003-2011 Ulrich von Zadow +# 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 @@ -19,9 +19,7 @@ # Current versions can be found at www.libavg.de # -import unittest - -from libavg import avg +from libavg import avg, player from testcase import * class VectorTestCase(AVGTestCase): @@ -36,7 +34,7 @@ class VectorTestCase(AVGTestCase): def testLine(self): def addLines(): def addLine(attribs): - line = Player.createNode("line", attribs) + line = player.createNode("line", attribs) canvas.appendChild(line) addLine({"pos1":(2, 2.5), "pos2":(100, 2.5)}) @@ -65,14 +63,14 @@ class VectorTestCase(AVGTestCase): canvas = self.makeEmptyCanvas() addLines() line = canvas.getChild(0) - self.start(( - lambda: self.compareImage("testline1", False), + self.start(False, + (lambda: self.compareImage("testline1"), changeLine, - lambda: self.compareImage("testline2", False), + lambda: self.compareImage("testline2"), moveLine, - lambda: self.compareImage("testline3", False), + lambda: self.compareImage("testline3"), blendMode, - lambda: self.compareImage("testline4", False) + lambda: self.compareImage("testline4") )) def testLotsOfLines(self): @@ -83,9 +81,9 @@ class VectorTestCase(AVGTestCase): canvas.appendChild(line) canvas = self.makeEmptyCanvas() - self.start(( - addLines, - lambda: self.compareImage("testlotsoflines", False), + self.start(False, + (addLines, + lambda: self.compareImage("testlotsoflines"), )) def testTexturedLine(self): @@ -106,7 +104,7 @@ class VectorTestCase(AVGTestCase): self.line.texcoord2 = 1.5 def bmpTexture(): - bmp = avg.Bitmap("rgb24alpha-64x64.png") + bmp = avg.Bitmap("media/rgb24alpha-64x64.png") self.line.setBitmap(bmp) def bmpNoTexture(): @@ -114,22 +112,22 @@ class VectorTestCase(AVGTestCase): canvas = self.makeEmptyCanvas() addLine() - self.start(( - lambda: self.compareImage("testtexturedline1", False), + self.start(False, + (lambda: self.compareImage("testtexturedline1"), removeLine, - lambda: self.compareImage("testtexturedline2", False), + lambda: self.compareImage("testtexturedline2"), addLine, - lambda: self.compareImage("testtexturedline1", False), + lambda: self.compareImage("testtexturedline1"), removeLine, - lambda: self.compareImage("testtexturedline2", False), + lambda: self.compareImage("testtexturedline2"), reAddLine, - lambda: self.compareImage("testtexturedline1", False), + lambda: self.compareImage("testtexturedline1"), moveTexture, - lambda: self.compareImage("testtexturedline3", False), + lambda: self.compareImage("testtexturedline3"), bmpTexture, - lambda: self.compareImage("testtexturedline4", False), + lambda: self.compareImage("testtexturedline4"), bmpNoTexture, - lambda: self.compareImage("testtexturedline5", False), + lambda: self.compareImage("testtexturedline5"), )) def testLineOpacity(self): @@ -142,11 +140,11 @@ class VectorTestCase(AVGTestCase): canvas.getChild(0).opacity = 0.25 canvas = self.makeEmptyCanvas() - self.start(( - addLine, - lambda: self.compareImage("testlineopacity1", False), + self.start(False, + (addLine, + lambda: self.compareImage("testlineopacity1"), changeCanvasOpacity, - lambda: self.compareImage("testlineopacity2", False), + lambda: self.compareImage("testlineopacity2"), )) def testRect(self): @@ -154,7 +152,7 @@ class VectorTestCase(AVGTestCase): rect = avg.RectNode(pos=(2, 2), size=(50, 30), fillopacity=1, strokewidth=0) canvas.appendChild(rect) - rect.setEventHandler(avg.CURSORDOWN, avg.MOUSE, onMouseDown) + rect.subscribe(avg.Node.CURSOR_DOWN, onMouseDown) return rect def moveRect(): @@ -180,20 +178,19 @@ class VectorTestCase(AVGTestCase): self.__mouseDownCalled = False canvas = self.makeEmptyCanvas() rect = addRect() - helper = Player.getTestHelper() - self.start(( - lambda: self.compareImage("testRect1", False), + self.start(False, + (lambda: self.compareImage("testRect1"), moveRect, - lambda: self.compareImage("testRect2", False), + lambda: self.compareImage("testRect2"), rotateRect, - lambda: self.compareImage("testRect3", False), + lambda: self.compareImage("testRect3"), addRect2, - lambda: self.compareImage("testRect4", False), + lambda: self.compareImage("testRect4"), lambda: self.fakeClick(100, 100), lambda: self.assertEqual(self.__mouseDownCalled, False), lambda: self.fakeClick(55, 50), lambda: self.assertEqual(self.__mouseDownCalled, False), - lambda: self.fakeClick(65, 60), + lambda: self.fakeClick(65, 65), lambda: self.assert_(self.__mouseDownCalled) )) @@ -207,7 +204,7 @@ class VectorTestCase(AVGTestCase): def newRect(): self.rect.unlink() - self.rect = Player.createNode( + self.rect = player.createNode( """<rect pos="(20, 20)" size="(50, 40)" fillopacity="1" filltexcoord1="(1,1)" filltexcoord2="(0,0)" texcoords="(0, 0.25, 0.5, 0.75, 1)" @@ -227,7 +224,7 @@ class VectorTestCase(AVGTestCase): self.rect.filltexcoord2 = (1.5, 1.5) def setFillBitmap(): - bmp = avg.Bitmap("rgb24-64x64.png") + bmp = avg.Bitmap("media/rgb24-64x64.png") self.rect.setFillBitmap(bmp) def clearFillBitmap(): @@ -241,24 +238,24 @@ class VectorTestCase(AVGTestCase): canvas = self.makeEmptyCanvas() addRect() - self.start(( - lambda: self.compareImage("testTexturedRect1", False), + self.start(False, + (lambda: self.compareImage("testTexturedRect1"), newRect, - lambda: self.compareImage("testTexturedRect2", False), + lambda: self.compareImage("testTexturedRect2"), setTexCoords, - lambda: self.compareImage("testTexturedRect3", False), + lambda: self.compareImage("testTexturedRect3"), setFillTex, - lambda: self.compareImage("testTexturedRect4", False), + lambda: self.compareImage("testTexturedRect4"), setFillTexCoords, - lambda: self.compareImage("testTexturedRect5", False), + lambda: self.compareImage("testTexturedRect5"), setFillBitmap, - lambda: self.compareImage("testTexturedRect6", False), + lambda: self.compareImage("testTexturedRect6"), clearFillBitmap, - lambda: self.compareImage("testTexturedRect7", False), + lambda: self.compareImage("testTexturedRect7"), setFillBitmap, - lambda: self.compareImage("testTexturedRect6", False), + lambda: self.compareImage("testTexturedRect6"), # setTransparentBorder, -# lambda: self.compareImage("testTexturedRect8", False), +# lambda: self.compareImage("testTexturedRect8"), )) def testCurve(self): @@ -284,14 +281,18 @@ class VectorTestCase(AVGTestCase): canvas = self.makeEmptyCanvas() curve = addCurve() - self.start(( - lambda: self.compareImage("testCurve1", False), + self.assertAlmostEqual(curve.length, 210) + self.assertAlmostEqual(curve.getPtOnCurve(0), (10.5,10)) + self.assertAlmostEqual(curve.getPtOnCurve(1), (80.5,10)) + self.assertAlmostEqual(curve.getPtOnCurve(0.5), (45.5,62.5)) + self.start(False, + (lambda: self.compareImage("testCurve1"), changeCurve, - lambda: self.compareImage("testCurve2", False), + lambda: self.compareImage("testCurve2"), moveCurve, - lambda: self.compareImage("testCurve3", False), + lambda: self.compareImage("testCurve3"), addCurve2, - lambda: self.compareImage("testCurve4", False), + lambda: self.compareImage("testCurve4"), )) def testTexturedCurve(self): @@ -307,10 +308,10 @@ class VectorTestCase(AVGTestCase): canvas = self.makeEmptyCanvas() curve = addCurve() - self.start(( - lambda: self.compareImage("testTexturedCurve1", False), + self.start(False, + (lambda: self.compareImage("testTexturedCurve1"), setTexCoords, - lambda: self.compareImage("testTexturedCurve2", False) + lambda: self.compareImage("testTexturedCurve2") )) def testPolyLine(self): @@ -331,7 +332,7 @@ class VectorTestCase(AVGTestCase): polyline.linejoin = "miter" def addPolyLine2(): - polyline2 = Player.createNode( + polyline2 = player.createNode( """<polyline strokewidth="2" color="FF00FF" pos="((110,10), (100,50), (110,70))" />""") canvas.insertChild(polyline2,0) @@ -353,20 +354,20 @@ class VectorTestCase(AVGTestCase): canvas = self.makeEmptyCanvas() polyline = addPolyLine() - self.start(( - lambda: self.compareImage("testPolyLine1", False), + self.start(False, + (lambda: self.compareImage("testPolyLine1"), changePolyLine, - lambda: self.compareImage("testPolyLine2", False), + lambda: self.compareImage("testPolyLine2"), miterPolyLine, - lambda: self.compareImage("testPolyLine3", False), + lambda: self.compareImage("testPolyLine3"), addPolyLine2, - lambda: self.compareImage("testPolyLine4", False), + lambda: self.compareImage("testPolyLine4"), testEmptyPolyLine, - lambda: self.compareImage("testPolyLine5", False), + lambda: self.compareImage("testPolyLine5"), testAlmostEmptyPolyLine, - lambda: self.compareImage("testPolyLine5", False), + lambda: self.compareImage("testPolyLine5"), testAcutePolyLine, - lambda: self.compareImage("testPolyLine6", False) + lambda: self.compareImage("testPolyLine6") )) def testTexturedPolyLine(self): @@ -389,21 +390,21 @@ class VectorTestCase(AVGTestCase): canvas = self.makeEmptyCanvas() polyline = texturePolyLine() - self.start(( - lambda: self.compareImage("testTexturedPolyLine1", False), + self.start(False, + (lambda: self.compareImage("testTexturedPolyLine1"), miter, - lambda: self.compareImage("testTexturedPolyLine2", False), + lambda: self.compareImage("testTexturedPolyLine2"), setTexCoords, - lambda: self.compareImage("testTexturedPolyLine3", False), + lambda: self.compareImage("testTexturedPolyLine3"), repeatTexCoords, - lambda: self.compareImage("testTexturedPolyLine4", False) + lambda: self.compareImage("testTexturedPolyLine4") )) def testPolygon(self): def addPolygon(): polygon = avg.PolygonNode(strokewidth=2, color="FF00FF", pos=((10,10), (50,10), (90,50), (90, 90))) - polygon.setEventHandler(avg.CURSORDOWN, avg.MOUSE, onMouseDown) + polygon.subscribe(avg.Node.CURSOR_DOWN, onMouseDown) canvas.appendChild(polygon) return polygon @@ -446,39 +447,65 @@ class VectorTestCase(AVGTestCase): def addEmptyPolygon(): avg.PolygonNode(parent=canvas, fillopacity=1) + def createLeftOpenPolygon(): + polygon.pos = ( (15,0), (35,0), (55,10), (65,30), (55,50), (35,60), (15,60), + (5,50), (15,40), (35,40), (35,30), (35,20), (15,20), (5,10) ) + polygon.strokewidth = 2 + + def createUpOpenPolygon(): + polygon.pos = ( (15,0), (25,10), (25,30), (35,30), (45,30), (45,10), (55,0), + (65,10), (65,30), (55,50), (35,60), (15,50), (5,30), (5,10) ) + + def createBottomOpenPolygon(): + polygon.pos = ( (35,0), (55,10), (65,30), (65,50), (55,60), (45,50), (45,30), + (35,30), (25,30), (25,50), (15,60), (5,50), (5,30), (15,10) ) + + def createOneHole(): + polygon.holes = ( [(35,10), (40,15), (35,20), (30,15)], ) + + def createMoreHoles(): + newHoles = ( polygon.holes[0], [(20,35), (20,45), (10,40)], + [(50,35), (50,45), (60,40)], ) + polygon.holes = newHoles + + def clearCanvas(): + for i in xrange(canvas.getNumChildren()-1): + dell = canvas.getChild(i) + canvas.removeChild(dell) + self.__mouseDownCalled = False canvas = self.makeEmptyCanvas() polygon = addPolygon() - helper = Player.getTestHelper() - self.start(( - lambda: self.compareImage("testPolygon1", True), + self.start(False, + (lambda: self.compareImage("testPolygon1"), changePolygon, - lambda: self.compareImage("testPolygon2", True), + lambda: self.compareImage("testPolygon2"), fillPolygon, - lambda: self.compareImage("testPolygon3", True), + lambda: self.compareImage("testPolygon3"), addEmptyPoint, - lambda: self.compareImage("testPolygon4", True), + lambda: self.compareImage("testPolygon4"), addPolygon2, - lambda: self.compareImage("testPolygon5", True), + lambda: self.compareImage("testPolygon5"), miterPolygons, - lambda: self.compareImage("testPolygon6", False), + lambda: self.compareImage("testPolygon6"), lambda: self.fakeClick(50, 50), lambda: self.assertEqual(self.__mouseDownCalled, False), lambda: self.fakeClick(20, 87), lambda: self.assert_(self.__mouseDownCalled), - addEmptyPolygon + addEmptyPolygon, + clearCanvas, + createLeftOpenPolygon, + lambda: self.compareImage("testPolygon7"), + createUpOpenPolygon, + lambda: self.compareImage("testPolygon8"), + createBottomOpenPolygon, + lambda: self.compareImage("testPolygon9"), + createOneHole, + lambda: self.compareImage("testPolygonHole1"), + createMoreHoles, + lambda: self.compareImage("testPolygonHole2") )) - def testSelfIntersectPolygon(self): - def addPolygon(): - polygon = avg.PolygonNode(strokewidth=3, color="FF00FF", - pos=((100.5, 10.5), (100.5, 30.5), (120.5, 10.5), (120.5, 30.5)), - fillcolor="00FFFF", fillopacity=0.5) - canvas.insertChild(polygon, 0) - - canvas = self.makeEmptyCanvas() - self.assertException(lambda: self.start([addPolygon])) - def testTexturedPolygon(self): def texturePolygon(): polygon = avg.PolygonNode(strokewidth=20, color="FF00FF", @@ -507,18 +534,18 @@ class VectorTestCase(AVGTestCase): canvas = self.makeEmptyCanvas() polygon = texturePolygon() - self.start(( - lambda: self.compareImage("testTexturedPolygon1", False), + self.start(False, + (lambda: self.compareImage("testTexturedPolygon1"), miter, - lambda: self.compareImage("testTexturedPolygon2", False), + lambda: self.compareImage("testTexturedPolygon2"), setTexCoords, - lambda: self.compareImage("testTexturedPolygon3", False), + lambda: self.compareImage("testTexturedPolygon3"), repeatTexCoords, - lambda: self.compareImage("testTexturedPolygon4", False), + lambda: self.compareImage("testTexturedPolygon4"), setFillTex, - lambda: self.compareImage("testTexturedPolygon5", False), + lambda: self.compareImage("testTexturedPolygon5"), setFillTexCoords, - lambda: self.compareImage("testTexturedPolygon6", False) + lambda: self.compareImage("testTexturedPolygon6") )) def testPointInPolygon(self): @@ -529,13 +556,13 @@ class VectorTestCase(AVGTestCase): def testCircle(self): def addCircle(): circle = avg.CircleNode(pos=(30, 30), r=20) - circle.setEventHandler(avg.CURSORDOWN, avg.MOUSE, onMouseDown) + circle.subscribe(avg.Node.CURSOR_DOWN, onMouseDown) canvas.appendChild(circle) return circle def changeCircle(): circle.color="FF0000" - circle.fillcolor="FFFFFF" + circle.fillcolor=u"FFFFFF" circle.fillopacity=0.5 circle.strokewidth=3 @@ -562,17 +589,16 @@ class VectorTestCase(AVGTestCase): self.__mouseDownCalled = False canvas = self.makeEmptyCanvas() circle = addCircle() - helper = Player.getTestHelper() - self.start(( - lambda: self.compareImage("testCircle1", False), + self.start(False, + (lambda: self.compareImage("testCircle1"), changeCircle, - lambda: self.compareImage("testCircle2", False), + lambda: self.compareImage("testCircle2"), textureCircle, - lambda: self.compareImage("testCircle3", False), + lambda: self.compareImage("testCircle3"), setFillTex, - lambda: self.compareImage("testCircle4", False), + lambda: self.compareImage("testCircle4"), setFillTexCoords, - lambda: self.compareImage("testCircle5", False), + lambda: self.compareImage("testCircle5"), lambda: self.fakeClick(32, 32), lambda: self.assert_(self.__mouseDownCalled == False), lambda: self.fakeClick(67, 50), @@ -612,6 +638,16 @@ class VectorTestCase(AVGTestCase): def setHref(): mesh.texhref = "rgb24alpha-64x64.png" + + def setBackfaceCullTrue(): + mesh.texhref="rgb24-64x64.png" + mesh.vertexcoords = ((0,0), (64,0), (0,64), (64, 64),(31.5, 32)) + mesh.texcoords = ((0,0),(1,0),(0,1),(1,1),(0.5,0.5)) + mesh.triangles = ((3,1,4),(1,3,4),(1,2,4),(2,0,4)) + mesh.backfacecull = True + + def setBackfaceCullFalse(): + mesh.backfacecull = False def setIllegalVertexes(): mesh.vertexcoords = ((0,0), (64,0), (0,64), (64, 64),(32, 32), (16,16)) @@ -627,18 +663,22 @@ class VectorTestCase(AVGTestCase): self.assertException(setIllegalVertexes) self.assertException(setIllegalTextures) self.assertException(setIllegalIndexes) - self.start(( - lambda: self.compareImage("testMesh1", False), + self.start(False, + (lambda: self.compareImage("testMesh1"), setVertexCoords, - lambda: self.compareImage("testMesh2", False), + lambda: self.compareImage("testMesh2"), setTexCoords, - lambda: self.compareImage("testMesh3", False), + lambda: self.compareImage("testMesh3"), setTriangles, - lambda: self.compareImage("testMesh4", False), + lambda: self.compareImage("testMesh4"), setHref, - lambda: self.compareImage("testMesh5", False), + lambda: self.compareImage("testMesh5"), setTrianglesSameItem, - lambda: self.compareImage("testMesh6", False) + lambda: self.compareImage("testMesh6"), + setBackfaceCullTrue, + lambda: self.compareImage("testMesh7"), + setBackfaceCullFalse, + lambda: self.compareImage("testMesh8") )) def testInactiveVector(self): @@ -649,7 +689,7 @@ class VectorTestCase(AVGTestCase): def addFilledVectorNode(): node = avg.RectNode(pos=(2, 6), size=(50, 30), strokewidth=2) - node.setEventHandler(avg.CURSORDOWN, avg.MOUSE, onDown) + node.subscribe(avg.Node.CURSOR_DOWN, onDown) canvas.appendChild(node) return node @@ -658,16 +698,15 @@ class VectorTestCase(AVGTestCase): fvNode.active = False self.onDownCalled = not self.onDownCalled - Helper = Player.getTestHelper() canvas = self.makeEmptyCanvas() vNode = addVectorNode() fvNode = addFilledVectorNode() self.onDownCalled = False - self.start(( - lambda: self.compareImage("testInactiveVector1", False), + self.start(False, + (lambda: self.compareImage("testInactiveVector1"), lambda: self.fakeClick(20, 20), lambda: self.assert_(self.onDownCalled), - lambda: self.compareImage("testInactiveVector2", False), + lambda: self.compareImage("testInactiveVector2"), lambda: self.fakeClick(20, 20), lambda: self.assert_(self.onDownCalled) )) @@ -686,7 +725,6 @@ def vectorTestSuite(tests): "testPolyLine", "testTexturedPolyLine", "testPolygon", - "testSelfIntersectPolygon", "testTexturedPolygon", "testPointInPolygon", "testCircle", @@ -694,5 +732,3 @@ def vectorTestSuite(tests): "testInactiveVector" ) return createAVGTestSuite(availableTests, VectorTestCase, tests) - -Player = avg.Player.get() diff --git a/src/test/WidgetTest.py b/src/test/WidgetTest.py new file mode 100644 index 0000000..720171e --- /dev/null +++ b/src/test/WidgetTest.py @@ -0,0 +1,900 @@ +# -*- 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, textarea, widget, player + +from testcase import * + +class WidgetTestCase(AVGTestCase): + def __init__(self, testFuncName): + AVGTestCase.__init__(self, testFuncName) + + def testKeyboard(self): + def createKbd(pos, shiftKey=None, feedbackImage=None): + keyDefs = [ + [("a", "A"), ( 5, 5), (30, 30), False], + [("1", ), (35, 5), (30, 30), False], + ["SHIFT", (65, 5), (50, 30), True]] + kbd = widget.Keyboard("keyboard_bg.png", "keyboard_down.png", keyDefs, + shiftKey, feedbackSrc=feedbackImage, pos=pos, parent=root) + + for msg in (widget.Keyboard.DOWN, widget.Keyboard.UP, widget.Keyboard.CHAR): + kbd.subscribe(msg, lambda keyCode, msg=msg: onMessage(msg, keyCode)) + return kbd + + def onMessage(msg, keyCode): + self.__messageTester.setMessageReceived(msg) + self.__keyCode = keyCode + + def assertState(msgs, keyCode, imageSrc): + self.__messageTester.assertState(msgs) + self.assert_(self.__keyCode == keyCode) + self.compareImage(imageSrc) + + root = self.loadEmptyScene() + self.__keyCode = "" + + # Keyboard without shift support, no feedback image. + kbNoShift = createKbd((10, 10)) + self.__messageTester = MessageTester(kbNoShift, [], self) + + self.start(False, + (lambda: self.compareImage("testUIKeyboard"), + # test character key + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 30, 30), + lambda: assertState((widget.Keyboard.DOWN,), "a", "testUIKeyboardA"), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 30, 30), + lambda: assertState((widget.Keyboard.CHAR,widget.Keyboard.UP), + "a", "testUIKeyboard"), + # test command key + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 100, 30), + lambda: assertState((widget.Keyboard.DOWN,), "SHIFT", "testUIKeyboardS"), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 100, 30), + lambda: assertState((widget.Keyboard.UP,), "SHIFT", "testUIKeyboard"), + # test multiple keys + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_DOWN, 100, 30), + lambda: self._sendTouchEvent(2, avg.Event.CURSOR_DOWN, 30, 30), + lambda: assertState((widget.Keyboard.DOWN,), "a", "testUIKeyboardAS"), + lambda: self._sendTouchEvent(3, avg.Event.CURSOR_DOWN, 60, 30), + lambda: assertState((widget.Keyboard.DOWN,), "1", "testUIKeyboardA1S"), + lambda: self._sendTouchEvent(2, avg.Event.CURSOR_UP, 30, 30), + lambda: assertState((widget.Keyboard.CHAR,widget.Keyboard.UP), + "a", "testUIKeyboard1S"), + lambda: self._sendTouchEvent(3, avg.Event.CURSOR_UP, 60, 30), + lambda: assertState((widget.Keyboard.CHAR,widget.Keyboard.UP), + "1", "testUIKeyboardS"), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_UP, 100, 30), + lambda: assertState((widget.Keyboard.UP,), "SHIFT", "testUIKeyboard"), + )) + + root = self.loadEmptyScene() + self.__keyCode = "" + + # Keyboard with shift support, feedback image. + kbd = createKbd((10, 60), "SHIFT", "keyboard_feedback.png") + self.__messageTester = MessageTester(kbd, [], self) + + self.start(False, + # test shift key + (lambda: self.compareImage("testUIKeyboardFB"), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_DOWN, 100, 80), + lambda: self._sendTouchEvent(2, avg.Event.CURSOR_DOWN, 30, 80), + lambda: assertState((widget.Keyboard.DOWN,), "a", "testUIKeyboardFBAS"), + lambda: self._sendTouchEvent(3, avg.Event.CURSOR_DOWN, 60, 80), + lambda: assertState((widget.Keyboard.DOWN,), "1", "testUIKeyboardFBA1S"), + lambda: self._sendTouchEvent(2, avg.Event.CURSOR_UP, 30, 80), + lambda: assertState((widget.Keyboard.CHAR,widget.Keyboard.UP), + "A", "testUIKeyboardNoFB1S"), + lambda: self._sendTouchEvent(3, avg.Event.CURSOR_UP, 60, 80), + lambda: assertState((widget.Keyboard.CHAR,widget.Keyboard.UP), + "1", "testUIKeyboardFBS"), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_UP, 100, 80), + lambda: assertState((widget.Keyboard.UP,), "SHIFT", "testUIKeyboardFB"), + # test drag over keys + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_DOWN, 60, 80), + lambda: assertState((widget.Keyboard.DOWN,), "1", "testUIKeyboardFB1"), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_MOTION, 60, 50), + lambda: assertState((widget.Keyboard.UP,), "1", "testUIKeyboardFB"), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_MOTION, 100, 80), + lambda: assertState((widget.Keyboard.DOWN,), "SHIFT", + "testUIKeyboardFBS"), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_MOTION, 60, 80), + lambda: assertState((widget.Keyboard.DOWN,widget.Keyboard.UP), + "1", "testUIKeyboardFB1"), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_UP, 60, 80), + lambda: assertState((widget.Keyboard.CHAR,widget.Keyboard.UP), + "1", "testUIKeyboardFB"), + )) + + def testTextArea(self): + def setup(): + self.ta1 = textarea.TextArea(pos=(2,2), size=(156, 96), parent=root) + self.ta1.setStyle(font="Bitstream vera sans", variant="Roman", fontsize=16, + multiline=True, color='FFFFFF') + self.ta1.setText('Lorem ipsum') + self.ta1.setFocus(True) # TODO: REMOVE + + self.ta2 = textarea.TextArea(pos=(2,100), size=(156, 18), parent=root) + self.ta2.setStyle(font="Bitstream vera sans", variant="Roman", fontsize=14, + multiline=False, color='4b94ef', cursorColor='FF0000', + flashingCursor=False) + self.ta2.setText('sit dolor') + self.ta2.showCursor(False) + self.ta2.setFocus(True) # TODO: REMOVE + + def setAndCheck(ta, text): + ta.setText(text) + self.assertEqual(ta.getText(), text) + + def clear(ta): + ta.onKeyDown(textarea.KEYCODE_FORMFEED) + self.assertEqual(ta.getText(), '') + + def testUnicode(): + self.ta1.setText(u'some ùnìcöde') + self.ta1.onKeyDown(textarea.KEYCODES_BACKSPACE[0]) + self.assertEqual(self.ta1.getText(), u'some ùnìcöd') + self.ta1.onKeyDown(textarea.KEYCODES_BACKSPACE[1]) + self.ta1.onKeyDown(textarea.KEYCODES_BACKSPACE[0]) + self.assertEqual(self.ta1.getText(), u'some ùnìc') + self.ta1.onKeyDown(ord(u'Ä')) + self.assertEqual(self.ta1.getText(), u'some ùnìcÄ') + + def testSpecialChars(): + clear(self.ta1) + self.ta1.onKeyDown(ord(u'&')) + self.ta1.onKeyDown(textarea.KEYCODES_BACKSPACE[0]) + self.assertEqual(self.ta1.getText(), '') + + def checkSingleLine(): + text = '' + self.ta2.setText('') + while True: + self.assert_(len(text) < 20) + self.ta2.onKeyDown(ord(u'A')) + text = text + 'A' + if text != self.ta2.getText(): + break + + root = self.loadEmptyScene() + + player.setFakeFPS(20) + textarea.init(avg, False) + self.start(True, + (setup, + lambda: self.delay(200), + lambda: self.assertEqual(self.ta1.getText(), 'Lorem ipsum'), + lambda: setAndCheck(self.ta1, ''), + lambda: setAndCheck(self.ta2, 'Lorem Ipsum'), + testUnicode, + lambda: self.compareImage("testTextArea1"), + testSpecialChars, + checkSingleLine, + lambda: self.compareImage("testTextArea2"), + lambda: self.ta2.showCursor(True), + lambda: self.delay(200), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_DOWN, 30, 100), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_UP, 30, 100), + lambda: self.compareImage("testTextArea3"), + lambda: self._sendTouchEvent(2, avg.Event.CURSOR_DOWN, 130, 100), + lambda: self.delay(1100), + lambda: self.compareImage("testTextArea4"), + lambda: self._sendTouchEvent(2, avg.Event.CURSOR_MOTION, 30, 100), + lambda: self.compareImage("testTextArea5"), + lambda: self._sendTouchEvent(2, avg.Event.CURSOR_UP, 30, 100), + lambda: self.compareImage("testTextArea3"), + )) + player.setFakeFPS(-1) + + def testFocusContext(self): + def setup(): + textarea.init(avg) + self.ctx1 = textarea.FocusContext() + self.ctx2 = textarea.FocusContext() + + self.ta1 = textarea.TextArea(self.ctx1, pos=(2,2), size=(156,54), parent=root) + self.ta1.setStyle(fontsize=16, multiline=True, color='FFFFFF') + self.ta1.setText('Lorem ipsum') + + self.ta2 = textarea.TextArea(self.ctx1, pos=(2,58), size=(76,54), parent=root) + self.ta2.setStyle(fontsize=14, multiline=False, color='FFFFFF') + self.ta2.setText('dolor') + + self.bgImage = avg.ImageNode(href="1x1_white.png", size=(76,54)) + self.ta3 = textarea.TextArea(self.ctx2, disableMouseFocus=True, pos=(80,58), + size=(76,54), textBackgroundNode=self.bgImage, parent=root) + self.ta3.setStyle(fontsize=14, multiline=True, color='FFFFFF') + self.ta3.setText('dolor sit amet') + + textarea.setActiveFocusContext(self.ctx1) + + def writeChar(): + helper = player.getTestHelper() + helper.fakeKeyEvent(avg.Event.KEY_DOWN, 65, 65, "A", 65, 0) + helper.fakeKeyEvent(avg.Event.KEY_UP, 65, 65, "A", 65, 0) + helper.fakeKeyEvent(avg.Event.KEY_DOWN, 66, 66, "B", 66, 0) + helper.fakeKeyEvent(avg.Event.KEY_UP, 66, 66, "B", 66, 0) + helper.fakeKeyEvent(avg.Event.KEY_DOWN, 67, 67, "C", 67, 0) + helper.fakeKeyEvent(avg.Event.KEY_UP, 67, 67, "C", 67, 0) + + def switchFocus(): + self.ctx1.cycleFocus() + + def clearFocused(): + self.ctx1.clear() + + def clickForFocus(): + self._sendMouseEvent(avg.Event.CURSOR_DOWN, 20, 70) + self._sendMouseEvent(avg.Event.CURSOR_UP, 20, 70) + + root = self.loadEmptyScene() + self.start(True, + (setup, + lambda: self.compareImage("testFocusContext1"), + writeChar, + lambda: self.compareImage("testFocusContext2"), + switchFocus, + writeChar, + lambda: self.compareImage("testFocusContext3"), + switchFocus, + clearFocused, + lambda: self.compareImage("testFocusContext4"), + clickForFocus, + clearFocused, + lambda: self.compareImage("testFocusContext5"), + )) + + + def testButton(self): + + def enable(enabled): + button.enabled = enabled + + def createScene(**kwargs): + root = self.loadEmptyScene() + button = widget.Button( + parent = root, + upNode = avg.ImageNode(href="button_up.png"), + downNode = avg.ImageNode(href="button_down.png"), + disabledNode = avg.ImageNode(href="button_disabled.png"), + **kwargs + ) + self.messageTester = MessageTester(button, + [widget.Button.CLICKED, widget.Button.PRESSED, + widget.Button.RELEASED], self) + return button + + def runTest(): + self.start(False, + (# Standard down->up + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 0, 0, + [widget.Button.PRESSED]), + lambda: self.compareImage("testUIButtonDown"), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 0, 0, + [widget.Button.CLICKED, widget.Button.RELEASED]), + lambda: self.compareImage("testUIButtonUp"), + + # Disable, down, up -> no click + lambda: self.assert_(button.enabled), + lambda: enable(False), + lambda: self.assert_(not(button.enabled)), + lambda: self.compareImage("testUIButtonDisabled"), + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 0, 0), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 0, 0, []), + lambda: enable(True), + lambda: self.assert_(button.enabled), + + # Down, up further away -> no click + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 0, 0), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 100, 0, + [widget.Button.PRESSED, widget.Button.RELEASED]), + lambda: self.compareImage("testUIButtonUp"), + + # Down, move further away, up -> no click + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 0, 0), + lambda: self._sendMouseEvent(avg.Event.CURSOR_MOTION, 100, 0), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 100, 0, + [widget.Button.PRESSED, widget.Button.RELEASED]), + lambda: self.compareImage("testUIButtonUp"), + + # Test if button still reacts after abort + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 0, 0, + [widget.Button.PRESSED]), + lambda: self.compareImage("testUIButtonDown"), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 0, 0, + [widget.Button.CLICKED, widget.Button.RELEASED]), + lambda: self.compareImage("testUIButtonUp"), + )) + + button = createScene() + runTest() + + button = createScene(activeAreaNode=avg.CircleNode(r=5, opacity=0)) + runTest() + + button = createScene(fatFingerEnlarge=True) + runTest() + + root = self.loadEmptyScene() + button = widget.BmpButton( + parent = root, + upSrc = "button_up.png", + downSrc = "button_down.png", + disabledSrc = "button_disabled.png", + ) + self.messageTester = MessageTester(button, + [widget.Button.CLICKED, widget.Button.PRESSED, widget.Button.RELEASED], + self) + runTest() + + button = createScene(enabled=False) + self.start(False, + (lambda: self.compareImage("testUIButtonDisabled"), + )) + + def testTextButton(self): + root = self.loadEmptyScene() + button = widget.TextButton("text", parent=root, size=(50,42)) + self.messageTester = MessageTester(button, + [widget.Button.CLICKED, widget.Button.PRESSED, widget.Button.RELEASED], + self) + self.start(True, + (# Standard down->up + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 0, 0, + [widget.Button.PRESSED]), + lambda: self.compareImage("testTextButtonDown"), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 0, 0, + [widget.Button.CLICKED, widget.Button.RELEASED]), + lambda: self.compareImage("testTextButtonUp"), + + # Check disabled graphics + lambda: self.assert_(button.enabled), + lambda: button.setEnabled(False), + lambda: self.assert_(not(button.enabled)), + lambda: self.compareImage("testTextButtonDisabled"), + lambda: button.setEnabled(True), + + # Change text + lambda: button.setText("newText"), + lambda: self.compareImage("testTextButtonUpNewText"), + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 0, 0, + [widget.Button.PRESSED]), + lambda: self.compareImage("testTextButtonDownNewText"), + )) + + + def testToggleButton(self): + + def onToggled(isToggled): + self.messageTester.setMessageReceived(widget.ToggleButton.TOGGLED) + self.toggled = isToggled + + def createScene(**kwargs): + root = self.loadEmptyScene() + button = widget.ToggleButton( + uncheckedUpNode = avg.ImageNode(href="toggle_unchecked_Up.png"), + uncheckedDownNode = avg.ImageNode(href="toggle_unchecked_Down.png"), + checkedUpNode = avg.ImageNode(href="toggle_checked_Up.png"), + checkedDownNode = avg.ImageNode(href="toggle_checked_Down.png"), + uncheckedDisabledNode = + avg.ImageNode(href="toggle_unchecked_Disabled.png"), + checkedDisabledNode = + avg.ImageNode(href="toggle_checked_Disabled.png"), + parent=root, + **kwargs + ) + self.messageTester = MessageTester(button, + [widget.ToggleButton.PRESSED, widget.ToggleButton.RELEASED], self) + + button.subscribe(widget.ToggleButton.TOGGLED, onToggled) + return button + + def testToggle(): + self.start(False, + (lambda: self.compareImage("testUIToggleUnchecked_Up"), + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 0, 0, + [widget.ToggleButton.PRESSED]), + lambda: self.assert_(not self.toggled), + lambda: self.compareImage("testUIToggleUnchecked_Down"), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 0, 0, + [widget.ToggleButton.RELEASED, widget.ToggleButton.TOGGLED]), + lambda: self.assert_(self.toggled), + lambda: self.compareImage("testUIToggleChecked_Up"), + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 0, 0), + lambda: self.compareImage("testUIToggleChecked_Down"), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 0, 0), + lambda: self.assert_(not(self.toggled)), + lambda: self.compareImage("testUIToggleUnchecked_Up"), + )) + + def testToggleAbort(): + self.start(False, + (lambda: self.compareImage("testUIToggleUnchecked_Up"), + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 0, 0), + lambda: self.compareImage("testUIToggleUnchecked_Down"), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 100, 0, + [widget.ToggleButton.PRESSED, widget.ToggleButton.RELEASED]), + lambda: self.assert_(not self.toggled), + lambda: self.compareImage("testUIToggleUnchecked_Up"), + lambda: button.setChecked(True), + lambda: self.compareImage("testUIToggleChecked_Up"), + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 0, 0), + lambda: self.compareImage("testUIToggleChecked_Down"), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 100, 0), + lambda: self.assert_(not(self.toggled)), + lambda: self.compareImage("testUIToggleChecked_Up"), + )) + + def testToggleDisable(): + self.start(False, + (lambda: self.compareImage("testUIToggleUnchecked_Disabled"), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_DOWN, 0, 0), + lambda: self._sendTouchEvent(1, avg.Event.CURSOR_UP, 0, 0), + lambda: self.compareImage("testUIToggleUnchecked_Disabled"), + lambda: button.setEnabled(True), + lambda: self.compareImage("testUIToggleUnchecked_Up"), + lambda: self._sendTouchEvent(2, avg.Event.CURSOR_DOWN, 0, 0), + lambda: button.setEnabled(False), + lambda: self._sendTouchEvent(2, avg.Event.CURSOR_UP, 0, 0), + lambda: self.assert_(not(self.toggled)), + lambda: self.compareImage("testUIToggleUnchecked_Disabled"), + + lambda: button.setEnabled(True), + lambda: self.compareImage("testUIToggleUnchecked_Up"), + lambda: button.setChecked(True), + lambda: self.compareImage("testUIToggleChecked_Up"), + lambda: button.setEnabled(False), + lambda: self.compareImage("testUIToggleChecked_Disabled"), + lambda: self._sendTouchEvent(3, avg.Event.CURSOR_DOWN, 0, 0), + lambda: self._sendTouchEvent(3, avg.Event.CURSOR_UP, 0, 0), + lambda: self.compareImage("testUIToggleChecked_Disabled"), + lambda: button.setEnabled(True), + lambda: self.compareImage("testUIToggleChecked_Up"), + lambda: self._sendTouchEvent(4, avg.Event.CURSOR_DOWN, 0, 0), + lambda: button.setEnabled(False), + lambda: self._sendTouchEvent(4, avg.Event.CURSOR_UP, 0, 0), + lambda: self.assert_(not(self.toggled)), + lambda: self.compareImage("testUIToggleChecked_Disabled"), + )) + + def testFromSrc(): + root = self.loadEmptyScene() + button = widget.BmpToggleButton( + uncheckedUpSrc="toggle_unchecked_Up.png", + uncheckedDownSrc="toggle_unchecked_Down.png", + checkedUpSrc="toggle_checked_Up.png", + checkedDownSrc="toggle_checked_Down.png", + uncheckedDisabledSrc="toggle_unchecked_Disabled.png", + checkedDisabledSrc="toggle_checked_Disabled.png", + parent=root) + button.subscribe(widget.ToggleButton.TOGGLED, onToggled) + self.start(False, + (lambda: self.compareImage("testUIToggleUnchecked_Up"), + lambda: button.setChecked(True), + lambda: self.compareImage("testUIToggleChecked_Up"), + lambda: button.setChecked(False), + lambda: button.setEnabled(False), + lambda: self.compareImage("testUIToggleUnchecked_Disabled"), + lambda: button.setChecked(True), + lambda: self.compareImage("testUIToggleChecked_Disabled"), + )) + + self.toggled = False + button = createScene() + testToggle() + + button = createScene() + testToggleAbort() + + button = createScene(enabled = False) + testToggleDisable() + + button = createScene(activeAreaNode = avg.CircleNode(r=5, opacity=0)) + testToggle() + + button = createScene(fatFingerEnlarge = True) + testToggle() + + testFromSrc() + + + def testCheckBox(self): + + root = self.loadEmptyScene() + avg.RectNode(size=(160,120), fillcolor="FFFFFF", fillopacity=1, parent=root) + checkBox = widget.CheckBox(text="checkboxtext", pos=(10,10), parent=root) + + self.start(True, + (lambda: self.compareImage("testUICheckBoxUnchecked_Up"), + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 15, 15), + lambda: self.compareImage("testUICheckBoxUnchecked_Down"), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 15, 15), + lambda: self.compareImage("testUICheckBoxChecked_Up"), + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 15, 15), + lambda: self.compareImage("testUICheckBoxChecked_Down"), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 15, 15), + lambda: self.compareImage("testUICheckBoxUnchecked_Up"), + lambda: checkBox.setEnabled(False), + lambda: self.compareImage("testUICheckBoxUnchecked_Disabled"), + lambda: checkBox.setEnabled(True), + lambda: self.compareImage("testUICheckBoxUnchecked_Up"), + # Test click on text. + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 50, 15), + lambda: self.compareImage("testUICheckBoxUnchecked_Down"), + )) + + + def testScrollPane(self): + def scrollLarge(): + scrollPane.contentpos = (34, 34) + self.assertEqual(scrollPane.contentpos, (32,32)) + + def initSmallContent(): + scrollPane.size = (64, 64) + contentArea.size = (32, 32) + image.size = (32, 32) + scrollPane.contentpos = (0, 0) + self.assertEqual(scrollPane.getMaxContentPos(), (0,0)) + + def scrollSmall(): + scrollPane.contentpos = (32, 32) + + root = self.loadEmptyScene() + contentArea = avg.DivNode(size=(64,64)) + image = avg.ImageNode(href="rgb24-64x64.png", parent=contentArea) + scrollPane = widget.ScrollPane(contentNode=contentArea, size=(32,32), parent=root) + + self.start(False, + (lambda: self.compareImage("testScrollPane1"), + scrollLarge, + lambda: self.compareImage("testScrollPane2"), + initSmallContent, + lambda: self.compareImage("testScrollPane3"), + scrollSmall, + lambda: self.compareImage("testScrollPane3"), + )) + + def testStretchNode(self): + + def changeExtent(): + if orientation == widget.Orientation.HORIZONTAL: + self.node.width = 100 + else: + self.node.height = 100 + + def minExtent(): + if orientation == widget.Orientation.HORIZONTAL: + self.node.width = 3 + self.assert_(self.node.width == 31) + else: + self.node.height = 3 + self.assert_(self.node.height == 31) + + for orientation, orName in ( + (widget.Orientation.HORIZONTAL,"Horiz"), + (widget.Orientation.VERTICAL, "Vert"),): + root = self.loadEmptyScene() + if orientation == widget.Orientation.HORIZONTAL: + self.node = widget.HStretchNode(src="media/rgb24-32x32.png", + endsExtent=15, size=(31,31), parent=root) + else: + self.node = widget.VStretchNode(src="media/rgb24-32x32.png", + endsExtent=15, size=(31,31), parent=root) + self.start(False, + (lambda: self.compareImage("testStretchNode"+orName+"1"), + changeExtent, + lambda: self.compareImage("testStretchNode"+orName+"2"), + minExtent, + lambda: self.compareImage("testStretchNode"+orName+"1"), + )) + + + def testHVStretchNode(self): + + def changeSize(): + self.node.size = (64, 64) + self.assert_(self.node.size == (64,64)) + + root = self.loadEmptyScene() + self.node = widget.HVStretchNode(src="media/rgb24-32x32.png", endsExtent=(5,5), + size=(31,31), parent=root) + self.start(False, + (lambda: self.compareImage("testHVStretchNode1"), + changeSize, + lambda: self.compareImage("testHVStretchNode2"), + )) + + + def testSlider(self): + def onThumbPosChanged(pos): + self.thumbPos = pos + + def setSize(): + if orientation == widget.Orientation.HORIZONTAL: + self.node.width=140 + else: + self.node.height=60 + + sys.stderr.write("\n") + for orientation, orName in ( + (widget.Orientation.HORIZONTAL, "Horiz"), + (widget.Orientation.VERTICAL, "Vert")): + for widgetType in ("Slider", "TimeSlider"): + sys.stderr.write(" "+widgetType+", "+orName+"\n") + root = self.loadEmptyScene() + if widgetType == "Slider": + self.node = widget.Slider(orientation=orientation, pos=(20,20), + width=100, height=100, parent=root) + else: + self.node = widget.TimeSlider(orientation=orientation, pos=(20,20), + width=100, height=100, parent=root) + self.start(False, + (lambda: self.compareImage("test"+widgetType+orName+"1"), + lambda: self.node.setThumbPos(0.25), + lambda: self.compareImage("test"+widgetType+orName+"2"), + lambda: self.node.setThumbPos(1), + lambda: self.compareImage("test"+widgetType+orName+"3"), + lambda: self.node.setRange((1,10)), + lambda: self.compareImage("test"+widgetType+orName+"1"), + lambda: self.node.setRange((10,1)), + lambda: self.compareImage("test"+widgetType+orName+"3"), + setSize, + lambda: self.compareImage("test"+widgetType+orName+"4"), + lambda: self.node.setEnabled(False), + lambda: self.compareImage("test"+widgetType+orName+"5"), + lambda: self.node.setEnabled(True), + lambda: self.compareImage("test"+widgetType+orName+"4"), + )) + + + def testScrollBar(self): + + def onThumbPosChanged(pos): + self.thumbPos = pos + + for orientation, orName in ( + (widget.Orientation.HORIZONTAL, "Horiz"), + (widget.Orientation.VERTICAL, "Vert")): + root = self.loadEmptyScene() + self.node = widget.ScrollBar(orientation=orientation, pos=(20,20), + width=100, height=100, parent=root) + self.start(False, + (lambda: self.compareImage("testScrollBar"+orName+"1"), + lambda: self.node.setThumbExtent(0.5), + lambda: self.compareImage("testScrollBar"+orName+"2"), + lambda: self.node.setThumbPos(0.25), + lambda: self.compareImage("testScrollBar"+orName+"3"), + lambda: self.node.setThumbPos(5), + lambda: self.compareImage("testScrollBar"+orName+"4"), + lambda: self.node.setRange((0,10)), + lambda: self.node.setThumbPos(4.75), + lambda: self.compareImage("testScrollBar"+orName+"5"), + lambda: self.node.setRange((10,20)), + lambda: self.node.setThumbPos(14.75), + lambda: self.compareImage("testScrollBar"+orName+"5"), + lambda: self.node.setThumbExtent(10), + lambda: self.compareImage("testScrollBar"+orName+"6"), + lambda: self.node.setRange((10,0)), + lambda: self.node.setThumbExtent(0.5), + lambda: self.node.setThumbPos(4.75), + lambda: self.compareImage("testScrollBar"+orName+"5"), + )) + + # Horizontal + root = self.loadEmptyScene() + self.node = widget.ScrollBar(orientation=widget.Orientation.HORIZONTAL, + pos=(20,5), width=100, parent=root) + self.messageTester = MessageTester(self.node, + [widget.Slider.PRESSED, widget.Slider.RELEASED], self) + self.start(False, + (lambda: self.node.setThumbExtent(0.5), + # User input + self._genMouseEventFrames(avg.Event.CURSOR_DOWN, 25, 10, + [widget.Slider.PRESSED]), + lambda: self.compareImage("testScrollBarHoriz7"), + lambda: self._sendMouseEvent(avg.Event.CURSOR_MOTION, 50, 10), + lambda: self.compareImage("testScrollBarHoriz8"), + lambda: self.assertAlmostEqual(self.node.getThumbPos(), 0.25), + lambda: self._sendMouseEvent(avg.Event.CURSOR_MOTION, 25, 10), + lambda: self.compareImage("testScrollBarHoriz9"), + lambda: self.assertAlmostEqual(self.node.getThumbPos(), 0), + self._genMouseEventFrames(avg.Event.CURSOR_UP, 0, 10, + [widget.Slider.RELEASED]), + lambda: self.compareImage("testScrollBarHoriz10"), + lambda: self.assertAlmostEqual(self.node.getThumbPos(), 0), + + # Publish/Subscribe interface + lambda: self.node.subscribe(widget.ScrollBar.THUMB_POS_CHANGED, + onThumbPosChanged), + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 25, 10), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 50, 10), + lambda: self.assertAlmostEqual(self.thumbPos, 0.25), + + # Enable/disable + self.messageTester.reset, + lambda: self.node.setEnabled(False), + lambda: self.compareImage("testScrollBarHoriz11"), + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 50, 10), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 25, 10), + lambda: self.messageTester.assertState([]), + lambda: self.assertAlmostEqual(self.thumbPos, 0.25), + lambda: self.node.setEnabled(True), + lambda: self.compareImage("testScrollBarHoriz12"), + + # Disable after down: Drag aborted + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 50, 10), + lambda: self.node.setEnabled(False), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 25, 10), + lambda: self.assertAlmostEqual(self.thumbPos, 0.25), + lambda: self.node.setEnabled(True), + lambda: self.compareImage("testScrollBarHoriz12"), + )) + + # Vertical: Don't need to test everything again, just make sure coords are + # calculated correctly. + root = self.loadEmptyScene() + self.node = widget.ScrollBar(orientation=widget.Orientation.VERTICAL, pos=(5,5), + height=100, parent=root) + self.start(False, + (lambda: self.node.setThumbExtent(0.5), + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 10, 25), + lambda: self.compareImage("testScrollBarVert7"), + lambda: self._sendMouseEvent(avg.Event.CURSOR_MOTION, 10, 50), + lambda: self.compareImage("testScrollBarVert8"), + lambda: self.assertAlmostEqual(self.node.getThumbPos(), 0.25), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 10, 0), + lambda: self.compareImage("testScrollBarVert9"), + lambda: self.assertAlmostEqual(self.node.getThumbPos(), 0), + )) + + def testProgressBar(self): + + def setValue(value): + self.node.value = value + + def setRange(range): + self.node.range = range + + root = self.loadEmptyScene() + self.node = widget.ProgressBar(orientation=widget.Orientation.HORIZONTAL, + pos=(5,5), width=100, parent=root) + self.start(False, + (lambda: self.compareImage("testProgressBar1"), + lambda: setValue(0.5), + lambda: self.compareImage("testProgressBar2"), + lambda: setValue(1), + lambda: self.compareImage("testProgressBar3"), + lambda: setRange((23,42)), + lambda: self.compareImage("testProgressBar1"), + lambda: setValue(32.5), + lambda: self.compareImage("testProgressBar2"), + )) + + def testMediaControl(self): + + def onSeek(time): + self.messageTester.setMessageReceived(widget.MediaControl.SEEK_MOTION) + + root = self.loadEmptyScene() + self.node = widget.MediaControl(size=(160,30), parent=root) + self.messageTester = MessageTester(self.node, + [widget.MediaControl.PLAY_CLICKED, widget.MediaControl.PAUSE_CLICKED, + widget.MediaControl.SEEK_PRESSED, widget.MediaControl.SEEK_RELEASED], + self) + self.node.subscribe(widget.MediaControl.SEEK_MOTION, onSeek) + self.start(True, + (lambda: self.compareImage("testMediaControl1"), + lambda: self.node.setDuration(60*1000), + lambda: self.compareImage("testMediaControl2"), + lambda: self.node.setTime(30*1000), + lambda: self.compareImage("testMediaControl3"), + lambda: self.node.setTime(60*1000), + lambda: self.compareImage("testMediaControl4"), + lambda: self.node.play(), + lambda: self.compareImage("testMediaControl5"), + lambda: self.node.pause(), + lambda: self.compareImage("testMediaControl4"), + self.messageTester.reset, + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 1, 1), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 1, 1), + lambda: self.messageTester.assertState( + [widget.MediaControl.PLAY_CLICKED,]), + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 1, 1), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 1, 1), + lambda: self.messageTester.assertState( + [widget.MediaControl.PAUSE_CLICKED,]), + lambda: self.node.setTime(0), + lambda: self._sendMouseEvent(avg.Event.CURSOR_DOWN, 56, 5), + lambda: self.messageTester.assertState( + [widget.MediaControl.SEEK_PRESSED]), + lambda: self._sendMouseEvent(avg.Event.CURSOR_MOTION, 150, 5), + lambda: self.messageTester.assertState( + [widget.MediaControl.SEEK_MOTION,]), + lambda: self.compareImage("testMediaControl4"), + lambda: self._sendMouseEvent(avg.Event.CURSOR_UP, 150, 5), + lambda: self.messageTester.assertState( + [widget.MediaControl.SEEK_RELEASED,]), + )) + + def testScrollArea(self): + def setSize(size): + self.node.size = size + + root = self.loadEmptyScene() + image = avg.ImageNode(href="rgb24-64x64.png", size=(200,400)) + self.node = widget.ScrollArea(contentNode=image, size=(80,80), parent=root) + self.start(False, + (lambda: self.compareImage("testScrollArea1"), + lambda: setSize((120,80)), + lambda: self.compareImage("testScrollArea2"), + )) + + def testScrollAreaCustomSkin(self): + root = self.loadEmptyScene() + image = avg.ImageNode(href="rgb24-64x64.png", size=(200, 400)) + pwdPath = os.path.dirname(os.path.realpath(__file__)) + mediaPath = os.path.join(pwdPath, "media") + skin = widget.Skin("CustomSkin.xml", mediaPath) + self.node = widget.ScrollArea(contentNode=image, size=(80, 80), skinObj=skin, + parent=root) + self.start(False, + (lambda: self.compareImage("testScrollArea3"),)) + + def testCustomMediaDir(self): + root = self.loadEmptyScene() + + pwdPath = os.path.dirname(os.path.realpath(__file__)) + mediaPath = os.path.join(pwdPath, "media") + skin = widget.Skin("SimpleSkin.xml", mediaPath) + downBmpPath = skin.textButtonCfg[None]['downBmp'].getName() + upBmpPath = skin.textButtonCfg[None]['upBmp'].getName() + self.assert_(downBmpPath == os.path.join(mediaPath, 'button_bg_down.png')) + self.assert_(upBmpPath == os.path.join(mediaPath, 'button_bg_up.png')) + + customSkinMediaPath = os.path.join(mediaPath, 'incompleteSkinMedia') + skin = widget.Skin("IncompleteSkin.xml", customSkinMediaPath) + self.node = widget.ScrollBar(orientation=widget.Orientation.HORIZONTAL, + pos=(20,5), width=100, parent=root, skinObj=skin) + self.start(False, ()) + + +def widgetTestSuite(tests): + availableTests = ( + "testKeyboard", + "testTextArea", + "testFocusContext", + "testButton", + "testTextButton", + "testToggleButton", + "testCheckBox", + "testScrollPane", + "testStretchNode", + "testHVStretchNode", + "testSlider", + "testScrollBar", + "testProgressBar", + "testMediaControl", + "testScrollArea", + "testScrollAreaCustomSkin", + "testCustomMediaDir", + ) + + return createAVGTestSuite(availableTests, WidgetTestCase, tests) diff --git a/src/test/WordsTest.py b/src/test/WordsTest.py index 1fdbfd5..a5e856e 100644 --- a/src/test/WordsTest.py +++ b/src/test/WordsTest.py @@ -1,7 +1,7 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # libavg - Media Playback Engine. -# Copyright (C) 2003-2011 Ulrich von Zadow +# 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 @@ -22,20 +22,20 @@ import platform -from libavg import avg +from libavg import avg, player from testcase import * class WordsTestCase(AVGTestCase): def __init__(self, testFuncName): AVGTestCase.__init__(self, testFuncName) - + def testSimpleWords(self): def checkFont(): self.assertEqual(node.variant, "bold") def checkUnicodeText(): node.text = u"föa" - newNode = avg.WordsNode(text=u"öäü") + avg.WordsNode(text=u"öäü", font="Bitstream Vera Sans") fontList = avg.WordsNode.getFontFamilies() try: @@ -47,12 +47,12 @@ class WordsTestCase(AVGTestCase): root = self.loadEmptyScene() avg.WordsNode (pos=(1,1), fontsize=12, font="Bitstream Vera Sans", text="Bitstream Vera Sans", variant="roman", parent=root) - node = avg.WordsNode (pos=(1,16), fontsize=12, font="Bitstream Vera Sans", + node = avg.WordsNode(pos=(1,16), fontsize=12, font="Bitstream Vera Sans", text="Bold", variant="bold", parent=root) self.assertNotEqual(node.size, (0,0)) - pos = node.getGlyphPos(0) - self.start(( - lambda: self.compareImage("testSimpleWords", True), + node.getGlyphPos(0) + self.start(True, + (lambda: self.compareImage("testSimpleWords"), checkFont, checkUnicodeText, )) @@ -64,11 +64,63 @@ class WordsTestCase(AVGTestCase): node.text = newText self.assertNotEqual(node.size, size) + def changeFont(): + size = node.size + node.fontsize = 18 + self.assertNotEqual(node.size, size) + root = self.loadEmptyScene() node = avg.WordsNode(font="Bitstream Vera Sans", fontsize=12, text="foo", parent=root) changeText("foobar") - self.start((lambda: changeText("bar"),)) + self.start(True, + (lambda: changeText("bar"), + changeFont, + )) + + def testFontStyle(self): + + def setStyle(node, style): + node.fontstyle = style + self.assert_(node.fontsize == 15) + + fontStyle = avg.FontStyle(font="Bitstream Vera Sans", variant="Roman", + fontsize=12) + self.assert_(fontStyle.font == "Bitstream Vera Sans") + root = self.loadEmptyScene() + words = avg.WordsNode(pos=(1,1), fontstyle=fontStyle, text="Bitstream Vera Sans", + parent=root) + avg.WordsNode (pos=(1,16), fontstyle=fontStyle, variant="bold", text="Bold", + parent=root) + otherFontStyle = fontStyle + otherFontStyle.fontsize = 15 + self.start(True, + (lambda: self.compareImage("testFontStyle1"), + lambda: setStyle(words, otherFontStyle), + lambda: self.compareImage("testFontStyle2"), + )) + + def testBaseStyle(self): + attrs = {"font": "Bitstream Vera Sans", + "variant": "Bold", + "color": "FF0000", + "aagamma": 0.5, + "fontsize": 20, + "indent": 1, + "linespacing": 2, + "alignment": "right", + "wrapmode": "char", + "justify": True, + "letterspacing": 3, + "hint": False} + defaultStyle = avg.FontStyle() + fontStyle1 = avg.FontStyle(basestyle=defaultStyle, **attrs) + for attrName in attrs.iterkeys(): + self.assert_(getattr(fontStyle1, attrName) != getattr(defaultStyle, attrName)) + self.assert_(getattr(fontStyle1, attrName) == attrs[attrName]) + fontStyle2 = avg.FontStyle(basestyle=fontStyle1) + for attrName in attrs.iterkeys(): + self.assert_(getattr(fontStyle2, attrName) == getattr(fontStyle1, attrName)) def testGlyphPos(self): def posAlmostEqual(pos1, pos2): @@ -107,14 +159,14 @@ class WordsTestCase(AVGTestCase): font="Bitstream Vera Sans", linespacing=-4, text="Paragraph with custom line spacing.", parent=root) - self.start([lambda: self.compareImage("testParaWords", True)]) + self.start(True, [lambda: self.compareImage("testParaWords")]) def testJustify(self): root = self.loadEmptyScene() avg.WordsNode(pos=(1,1), fontsize=12, font="Bitstream Vera Sans", variant="roman", justify=True, width=100, text="Justified paragraph more than one line long.", parent=root) - self.start([lambda: self.compareImage("testJustify", True)]) + self.start(True, [lambda: self.compareImage("testJustify")]) def testWrapMode(self): def setCharMode(): @@ -132,15 +184,15 @@ class WordsTestCase(AVGTestCase): text="""Wrapped paragraph more than one line long. Withaverylongpackedlinewithnobreaks""", parent=root) - self.start([ - lambda: self.compareImage("testWrapMode1", True), - setCharMode, - lambda: self.compareImage("testWrapMode2", True), - setWordMode, - lambda: self.compareImage("testWrapMode3", True), - setWordCharMode, - lambda: self.compareImage("testWrapMode4", True), - ]) + self.start(True, + (lambda: self.compareImage("testWrapMode1"), + setCharMode, + lambda: self.compareImage("testWrapMode2"), + setWordMode, + lambda: self.compareImage("testWrapMode3"), + setWordCharMode, + lambda: self.compareImage("testWrapMode4"), + )) def testWordsMask(self): def setMask(): @@ -148,7 +200,7 @@ class WordsTestCase(AVGTestCase): node.maskhref = "mask1.png" except RuntimeError: self.skip("no shader support") - Player.stop() + player.stop() def setColor(): node.color = "FFFF00" @@ -169,6 +221,12 @@ class WordsTestCase(AVGTestCase): def setDefaultSize(): node.masksize = (0,0) + def setCentered(): + node.alignment = "center" + node.masksize = (160, 120) + node.pos = (80,20) + node.maskpos = (0, -20) + root = self.loadEmptyScene() node = avg.WordsNode(fontsize=8, linespacing=-4, font="Bitstream Vera Sans", variant="roman", width=160, @@ -182,19 +240,21 @@ class WordsTestCase(AVGTestCase): Ulysses von James Joyce werden. Aber jetzt lohnt es sich noch nicht, \ mich weiterzulesen. Denn vorerst bin ich nur ein kleiner Blindtext.", parent=root) - self.start(( - setMask, - lambda: self.compareImage("testWordsMask1", False), + self.start(True, + (setMask, + lambda: self.compareImage("testWordsMask1"), setColor, - lambda: self.compareImage("testWordsMask2", False), + lambda: self.compareImage("testWordsMask2"), setOpacity, - lambda: self.compareImage("testWordsMask3", False), + lambda: self.compareImage("testWordsMask3"), setSize, - lambda: self.compareImage("testWordsMask4", False), + lambda: self.compareImage("testWordsMask4"), setPos, - lambda: self.compareImage("testWordsMask5", False), + lambda: self.compareImage("testWordsMask5"), setDefaultSize, - lambda: self.compareImage("testWordsMask6", False), + lambda: self.compareImage("testWordsMask6"), + setCentered, + lambda: self.compareImage("testWordsMask7"), )) def testHinting(self): @@ -222,20 +282,20 @@ class WordsTestCase(AVGTestCase): avg.WordsNode(pos=(1,15), fontsize=12, font="Bitstream Vera Sans", variant="roman", hint=True, text="Lorem ipsum dolor (hinting)", parent=root) - self.start([checkPositions]) + self.start(True, [checkPositions]) def testSpanWords(self): def setTextAttrib(): - self.baselineBmp = Player.screenshot() - Player.getElementByID("words").text = self.text + self.baselineBmp = player.screenshot() + player.getElementByID("words").text = self.text def checkSameImage(): - bmp = Player.screenshot() + bmp = player.screenshot() self.assert_(self.areSimilarBmps(bmp, self.baselineBmp, 0, 0)) def createUsingDict(): - Player.getElementByID("words").unlink() + player.getElementByID("words").unlink() node = avg.WordsNode(id="words", pos=(1,1), fontsize=12, width=120, font="Bitstream Vera Sans", variant="roman", text=self.text) root.appendChild(node) @@ -246,7 +306,7 @@ class WordsTestCase(AVGTestCase): <i>italics</i>, <b>bold</b> """ root = self.loadEmptyScene() - node = Player.createNode(""" + node = player.createNode(""" <words id="words" x="1" y="1" fontsize="12" width="120" font="Bitstream Vera Sans" variant="roman"> """ @@ -255,13 +315,13 @@ class WordsTestCase(AVGTestCase): </words> """) root.appendChild(node) - self.start( - [lambda: self.compareImage("testSpanWords", True), + self.start(True, + [lambda: self.compareImage("testSpanWords"), setTextAttrib, - lambda: self.compareImage("testSpanWords", True), + lambda: self.compareImage("testSpanWords"), checkSameImage, createUsingDict, - lambda: self.compareImage("testSpanWords", True), + lambda: self.compareImage("testSpanWords"), checkSameImage, ]) @@ -300,17 +360,17 @@ class WordsTestCase(AVGTestCase): root = self.loadEmptyScene() words = avg.WordsNode(pos=(1,1), fontsize=12, font="Bitstream Vera Sans", text="foo", parent=root) - self.start(( - lambda: self.compareImage("testDynamicWords1", True), + self.start(True, + (lambda: self.compareImage("testDynamicWords1"), changeText, changeHeight, changeFont, - lambda: self.compareImage("testDynamicWords2", True), + lambda: self.compareImage("testDynamicWords2"), deactivateText, - lambda: self.compareImage("testDynamicWords3", True), + lambda: self.compareImage("testDynamicWords3"), activateText, changeFont2, - lambda: self.compareImage("testDynamicWords4", True), + lambda: self.compareImage("testDynamicWords4"), changeTextWithInvalidTag )) @@ -329,7 +389,7 @@ class WordsTestCase(AVGTestCase): words = avg.WordsNode(pos=(1,24), fontsize=12, font="Bitstream Vera Sans", text="foo", parent=root) root.appendChild( - Player.createNode(""" + player.createNode(""" <words x="1" y="48" fontsize="12" font="Bitstream Vera Sans"> & </words> @@ -337,12 +397,12 @@ class WordsTestCase(AVGTestCase): avg.WordsNode(pos=(12,48), fontsize=12, font="Bitstream Vera Sans", text="&", rawtextmode=True, parent=root) - self.start(( - lambda: self.compareImage("testI18NWords1", True), + self.start(True, + (lambda: self.compareImage("testI18NWords1"), changeUnicodeText, - lambda: self.compareImage("testI18NWords2", True), + lambda: self.compareImage("testI18NWords2"), setNBSP, - lambda: self.compareImage("testI18NWords3", True), + lambda: self.compareImage("testI18NWords3"), )) def testRawText(self): @@ -352,7 +412,7 @@ class WordsTestCase(AVGTestCase): variant='roman', fontsize=12) root.appendChild(self.dictdnode) - self.xmldnode = Player.createNode(""" + self.xmldnode = player.createNode(""" <words text="<test dynattr&" fontsize="12" font="Bitstream Vera Sans" variant="roman" rawtextmode="true" x="1" y="85"/>""") @@ -380,36 +440,37 @@ class WordsTestCase(AVGTestCase): root = self.loadEmptyScene() attribNode = avg.WordsNode(text="ùnicòdé <b>bold</b>", fontsize=12, pos=(1,5), font="Bitstream Vera Sans", parent=root) - valNode = Player.createNode(""" + valNode = player.createNode(""" <words id="nodeval" fontsize="10" x="1" y="25" font="Bitstream Vera Sans"><b>bold</b> ùnicòdé <</words>""") root.appendChild(valNode) root.appendChild( - Player.createNode(""" + player.createNode(""" <words x="1" y="45" fontsize="15" font="Bitstream Vera Sans"> & </words>""")) - self.start(( - lambda: self.compareImage("testRawText1", True), + self.start(True, + (lambda: self.compareImage("testRawText1"), createDynNodes, - lambda: self.compareImage("testRawText2", True), + lambda: self.compareImage("testRawText2"), switchRawMode, - lambda: self.compareImage("testRawText3", True), + lambda: self.compareImage("testRawText3"), bombIt, assignNewTexts, - lambda: self.compareImage("testRawText4", True), + lambda: self.compareImage("testRawText4"), )) def testWordsBR(self): root = self.loadEmptyScene() avg.WordsNode(pos=(1,1), fontsize=12, font="Bitstream Vera Sans", variant="roman", text="paragraph 1<br/>paragraph 2", parent=root) - self.start([lambda: self.compareImage("testWordsBR", True)]) + self.start(True, + [lambda: self.compareImage("testWordsBR")]) def testLetterSpacing(self): def setSpacing(): - Player.getElementByID("words1").letterspacing=-2 - Player.getElementByID("words2").letterspacing=-2 + player.getElementByID("words1").letterspacing=-2 + player.getElementByID("words2").letterspacing=-2 root = self.loadEmptyScene() avg.WordsNode(id="words1", pos=(1,1), fontsize=12, font="Bitstream Vera Sans", @@ -420,10 +481,10 @@ class WordsTestCase(AVGTestCase): parent=root) avg.WordsNode(id="words2", pos=(1,20), fontsize=12, font="Bitstream Vera Sans", variant="roman", letterspacing=2, text="spaced", parent=root) - self.start(( - lambda: self.compareImage("testLetterSpacing1", True), + self.start(True, + (lambda: self.compareImage("testLetterSpacing1"), setSpacing, - lambda: self.compareImage("testLetterSpacing2", True) + lambda: self.compareImage("testLetterSpacing2") )) def testPositioning(self): @@ -458,16 +519,14 @@ class WordsTestCase(AVGTestCase): font="Bitstream Vera Sans", variant="roman", text="Centered", parent=root) for id in ["left", "center", "right"]: - Player.getElementByID(id).setEventHandler(avg.CURSORDOWN, avg.MOUSE, - onMouse) + player.getElementByID(id).subscribe(avg.Node.CURSOR_DOWN, onMouse) self.clicked = False - helper = Player.getTestHelper() - leftWidth = Player.getElementByID("left").getMediaSize()[0] - centerWidth = Player.getElementByID("center").getMediaSize()[0] - rightWidth = Player.getElementByID("right").getMediaSize()[0] + leftWidth = player.getElementByID("left").getMediaSize()[0] + centerWidth = player.getElementByID("center").getMediaSize()[0] + rightWidth = player.getElementByID("right").getMediaSize()[0] - self.start(( - lambda: self.compareImage("testPositioning", True), + self.start(True, + (lambda: self.compareImage("testPositioning"), lambda: click((4,20)), lambda: self.assert_(testInside(True)), lambda: click((3,20)), @@ -512,9 +571,9 @@ class WordsTestCase(AVGTestCase): def assignInvalidColor3(): testColor('xxxxxx') - root = self.loadEmptyScene() - self.start(( - self.assertException(assignInvalidColor1), + self.loadEmptyScene() + self.start(True, + (self.assertException(assignInvalidColor1), self.assertException(assignInvalidColor2), self.assertException(assignInvalidColor3), )) @@ -523,18 +582,20 @@ class WordsTestCase(AVGTestCase): avg.WordsNode.addFontDir('extrafonts') root = self.loadEmptyScene() avg.WordsNode(font="testaddfontdir", fontsize=50, text="ABAAA", parent=root) - self.start((lambda: self.compareImage("testFontDir", True),)) + self.start(True, + (lambda: self.compareImage("testFontDir"),)) def testGetNumLines(self): textNode = avg.WordsNode(text="paragraph 1<br/>paragraph 2<br/>paragraph 3") self.assertEqual(textNode.getNumLines(), 3) + textNode.text = "" + self.assertEqual(textNode.getNumLines(), 0) def testGetLineExtents(self): textNode = avg.WordsNode(fontsize = 100, font = "Bitstream Vera Sans", text = "bla <br/> blabli <br/> blabliblabla") self.assertEqual(textNode.getLineExtents(0), (184,117)) - textNode.parent = Player.getRootNode() self.assertEqual(textNode.getLineExtents(1), (303,117)) def testGetCharIndexFromPos(self): @@ -568,32 +629,52 @@ class WordsTestCase(AVGTestCase): def testSize(p1, p2): self.assert_(abs(p1.x - p2.x) < 5) - self.assert_(abs(p1.y - p2.y) < 5) + self.assert_(abs(p1.y - p2.y) < 50) testSize(textNode.size, avg.Point2D(630,13)) testSize(textNode.getMediaSize(), avg.Point2D(630,13)) mediaSize = textNode.getMediaSize() def changeSize(): - textNode.width = 50 + textNode.width = 50 testSize(textNode.size, avg.Point2D(50,182)) testSize(textNode.getMediaSize(), avg.Point2D(45,182)) self.assertNotEqual(mediaSize, textNode.getMediaSize()) - self.start([lambda: changeSize()]) + self.start(True, + [lambda: changeSize()]) def testTooWide(self): root = self.loadEmptyScene() text = "42 " * 42 * 20 - node = avg.WordsNode(parent=root, text=text) + avg.WordsNode(parent=root, text=text) self.assertException( lambda: self.start((None, None)) ) + def testWordsGamma(self): + + def setGamma(): + node.aagamma = 4 + + root = self.loadEmptyScene() + for i, gamma in enumerate((2, 1.5, 1)): + node = avg.WordsNode(pos=(1,i*20), fontsize=12, font="Bitstream Vera Sans", + variant="roman", aagamma=gamma, text="lorem ipsum dolor", + parent=root) + self.start(True, + (lambda: self.compareImage("testWordsGamma1"), + setGamma, + lambda: self.compareImage("testWordsGamma2"), + )) + + def wordsTestSuite(tests): availableTests = ( "testSimpleWords", "testRedrawOnDemand", + "testFontStyle", + "testBaseStyle", "testGlyphPos", "testParaWords", "testJustify", @@ -615,7 +696,6 @@ def wordsTestSuite(tests): "testGetTextAsDisplayed", "testSetWidth", "testTooWide", + "testWordsGamma", ) return createAVGTestSuite(availableTests, WordsTestCase, tests) - -Player = avg.Player.get() diff --git a/src/test/baseline/testBitmap2.png b/src/test/baseline/testBitmap2.png Binary files differnew file mode 100644 index 0000000..f94b54e --- /dev/null +++ b/src/test/baseline/testBitmap2.png diff --git a/src/test/baseline/testBitmap3.png b/src/test/baseline/testBitmap3.png Binary files differnew file mode 100644 index 0000000..7d0898d --- /dev/null +++ b/src/test/baseline/testBitmap3.png diff --git a/src/test/baseline/testBitmap4.png b/src/test/baseline/testBitmap4.png Binary files differnew file mode 100644 index 0000000..5569133 --- /dev/null +++ b/src/test/baseline/testBitmap4.png diff --git a/src/test/baseline/testCanvasNullFX3.png b/src/test/baseline/testCanvasNullFX3.png Binary files differnew file mode 100644 index 0000000..56571a2 --- /dev/null +++ b/src/test/baseline/testCanvasNullFX3.png diff --git a/src/test/baseline/testChromaKeyFX1.png b/src/test/baseline/testChromaKeyFX1.png Binary files differnew file mode 100644 index 0000000..9f63ce5 --- /dev/null +++ b/src/test/baseline/testChromaKeyFX1.png diff --git a/src/test/baseline/testChromaKeyFX2.png b/src/test/baseline/testChromaKeyFX2.png Binary files differnew file mode 100644 index 0000000..65df5ea --- /dev/null +++ b/src/test/baseline/testChromaKeyFX2.png diff --git a/src/test/baseline/testChromaKeyFX3.png b/src/test/baseline/testChromaKeyFX3.png Binary files differnew file mode 100644 index 0000000..1ab1b59 --- /dev/null +++ b/src/test/baseline/testChromaKeyFX3.png diff --git a/src/test/baseline/testChromaKeyFX4.png b/src/test/baseline/testChromaKeyFX4.png Binary files differnew file mode 100644 index 0000000..86efc70 --- /dev/null +++ b/src/test/baseline/testChromaKeyFX4.png diff --git a/src/test/baseline/testFontStyle1.png b/src/test/baseline/testFontStyle1.png Binary files differnew file mode 100644 index 0000000..3d773d6 --- /dev/null +++ b/src/test/baseline/testFontStyle1.png diff --git a/src/test/baseline/testFontStyle2.png b/src/test/baseline/testFontStyle2.png Binary files differnew file mode 100644 index 0000000..e67cfa4 --- /dev/null +++ b/src/test/baseline/testFontStyle2.png diff --git a/src/test/baseline/testHVStretchNode1.png b/src/test/baseline/testHVStretchNode1.png Binary files differnew file mode 100644 index 0000000..304c23e --- /dev/null +++ b/src/test/baseline/testHVStretchNode1.png diff --git a/src/test/baseline/testHVStretchNode2.png b/src/test/baseline/testHVStretchNode2.png Binary files differnew file mode 100644 index 0000000..ca1f0f2 --- /dev/null +++ b/src/test/baseline/testHVStretchNode2.png diff --git a/src/test/baseline/testImgWarp2.png b/src/test/baseline/testImgWarp2.png Binary files differnew file mode 100644 index 0000000..514e6f4 --- /dev/null +++ b/src/test/baseline/testImgWarp2.png diff --git a/src/test/baseline/testMediaControl1.png b/src/test/baseline/testMediaControl1.png Binary files differnew file mode 100644 index 0000000..fd36c50 --- /dev/null +++ b/src/test/baseline/testMediaControl1.png diff --git a/src/test/baseline/testMediaControl2.png b/src/test/baseline/testMediaControl2.png Binary files differnew file mode 100644 index 0000000..fd01c50 --- /dev/null +++ b/src/test/baseline/testMediaControl2.png diff --git a/src/test/baseline/testMediaControl3.png b/src/test/baseline/testMediaControl3.png Binary files differnew file mode 100644 index 0000000..9f9c0ee --- /dev/null +++ b/src/test/baseline/testMediaControl3.png diff --git a/src/test/baseline/testMediaControl4.png b/src/test/baseline/testMediaControl4.png Binary files differnew file mode 100644 index 0000000..53adc06 --- /dev/null +++ b/src/test/baseline/testMediaControl4.png diff --git a/src/test/baseline/testMediaControl5.png b/src/test/baseline/testMediaControl5.png Binary files differnew file mode 100644 index 0000000..37d7bf4 --- /dev/null +++ b/src/test/baseline/testMediaControl5.png diff --git a/src/test/baseline/testMesh7.png b/src/test/baseline/testMesh7.png Binary files differnew file mode 100644 index 0000000..a7e2493 --- /dev/null +++ b/src/test/baseline/testMesh7.png diff --git a/src/test/baseline/testMesh8.png b/src/test/baseline/testMesh8.png Binary files differnew file mode 100644 index 0000000..20e4fb1 --- /dev/null +++ b/src/test/baseline/testMesh8.png diff --git a/src/test/baseline/testMipmap.png b/src/test/baseline/testMipmap.png Binary files differindex 7068a7a..eb6185e 100644 --- a/src/test/baseline/testMipmap.png +++ b/src/test/baseline/testMipmap.png diff --git a/src/test/baseline/testOpacity.png b/src/test/baseline/testOpacity.png Binary files differnew file mode 100644 index 0000000..aab7cdb --- /dev/null +++ b/src/test/baseline/testOpacity.png diff --git a/src/test/baseline/testOutlines.png b/src/test/baseline/testOutlines.png Binary files differindex 0ef64ad..36a7c14 100644 --- a/src/test/baseline/testOutlines.png +++ b/src/test/baseline/testOutlines.png diff --git a/src/test/baseline/testPolygon7.png b/src/test/baseline/testPolygon7.png Binary files differnew file mode 100644 index 0000000..5cb45e6 --- /dev/null +++ b/src/test/baseline/testPolygon7.png diff --git a/src/test/baseline/testPolygon8.png b/src/test/baseline/testPolygon8.png Binary files differnew file mode 100644 index 0000000..f926687 --- /dev/null +++ b/src/test/baseline/testPolygon8.png diff --git a/src/test/baseline/testPolygon9.png b/src/test/baseline/testPolygon9.png Binary files differnew file mode 100644 index 0000000..3e00de4 --- /dev/null +++ b/src/test/baseline/testPolygon9.png diff --git a/src/test/baseline/testPolygonHole1.png b/src/test/baseline/testPolygonHole1.png Binary files differnew file mode 100644 index 0000000..9c18ad1 --- /dev/null +++ b/src/test/baseline/testPolygonHole1.png diff --git a/src/test/baseline/testPolygonHole2.png b/src/test/baseline/testPolygonHole2.png Binary files differnew file mode 100644 index 0000000..d8199da --- /dev/null +++ b/src/test/baseline/testPolygonHole2.png diff --git a/src/test/baseline/testProgressBar1.png b/src/test/baseline/testProgressBar1.png Binary files differnew file mode 100644 index 0000000..2b2c752 --- /dev/null +++ b/src/test/baseline/testProgressBar1.png diff --git a/src/test/baseline/testProgressBar2.png b/src/test/baseline/testProgressBar2.png Binary files differnew file mode 100644 index 0000000..6c1f56b --- /dev/null +++ b/src/test/baseline/testProgressBar2.png diff --git a/src/test/baseline/testProgressBar3.png b/src/test/baseline/testProgressBar3.png Binary files differnew file mode 100644 index 0000000..d788f76 --- /dev/null +++ b/src/test/baseline/testProgressBar3.png diff --git a/src/test/baseline/testScrollArea1.png b/src/test/baseline/testScrollArea1.png Binary files differnew file mode 100644 index 0000000..4cb67e2 --- /dev/null +++ b/src/test/baseline/testScrollArea1.png diff --git a/src/test/baseline/testScrollArea2.png b/src/test/baseline/testScrollArea2.png Binary files differnew file mode 100644 index 0000000..7939cae --- /dev/null +++ b/src/test/baseline/testScrollArea2.png diff --git a/src/test/baseline/testScrollArea3.png b/src/test/baseline/testScrollArea3.png Binary files differnew file mode 100644 index 0000000..1fc62df --- /dev/null +++ b/src/test/baseline/testScrollArea3.png diff --git a/src/test/baseline/testScrollBarHoriz1.png b/src/test/baseline/testScrollBarHoriz1.png Binary files differnew file mode 100644 index 0000000..aedcb12 --- /dev/null +++ b/src/test/baseline/testScrollBarHoriz1.png diff --git a/src/test/baseline/testScrollBarHoriz10.png b/src/test/baseline/testScrollBarHoriz10.png Binary files differnew file mode 100644 index 0000000..0c8a5af --- /dev/null +++ b/src/test/baseline/testScrollBarHoriz10.png diff --git a/src/test/baseline/testScrollBarHoriz11.png b/src/test/baseline/testScrollBarHoriz11.png Binary files differnew file mode 100644 index 0000000..da84ebc --- /dev/null +++ b/src/test/baseline/testScrollBarHoriz11.png diff --git a/src/test/baseline/testScrollBarHoriz12.png b/src/test/baseline/testScrollBarHoriz12.png Binary files differnew file mode 100644 index 0000000..5e2f013 --- /dev/null +++ b/src/test/baseline/testScrollBarHoriz12.png diff --git a/src/test/baseline/testScrollBarHoriz2.png b/src/test/baseline/testScrollBarHoriz2.png Binary files differnew file mode 100644 index 0000000..b8a2dcd --- /dev/null +++ b/src/test/baseline/testScrollBarHoriz2.png diff --git a/src/test/baseline/testScrollBarHoriz3.png b/src/test/baseline/testScrollBarHoriz3.png Binary files differnew file mode 100644 index 0000000..885b429 --- /dev/null +++ b/src/test/baseline/testScrollBarHoriz3.png diff --git a/src/test/baseline/testScrollBarHoriz4.png b/src/test/baseline/testScrollBarHoriz4.png Binary files differnew file mode 100644 index 0000000..8ceea4f --- /dev/null +++ b/src/test/baseline/testScrollBarHoriz4.png diff --git a/src/test/baseline/testScrollBarHoriz5.png b/src/test/baseline/testScrollBarHoriz5.png Binary files differnew file mode 100644 index 0000000..4278825 --- /dev/null +++ b/src/test/baseline/testScrollBarHoriz5.png diff --git a/src/test/baseline/testScrollBarHoriz6.png b/src/test/baseline/testScrollBarHoriz6.png Binary files differnew file mode 100644 index 0000000..ee270d3 --- /dev/null +++ b/src/test/baseline/testScrollBarHoriz6.png diff --git a/src/test/baseline/testScrollBarHoriz7.png b/src/test/baseline/testScrollBarHoriz7.png Binary files differnew file mode 100644 index 0000000..0fefd7b --- /dev/null +++ b/src/test/baseline/testScrollBarHoriz7.png diff --git a/src/test/baseline/testScrollBarHoriz8.png b/src/test/baseline/testScrollBarHoriz8.png Binary files differnew file mode 100644 index 0000000..138ec3a --- /dev/null +++ b/src/test/baseline/testScrollBarHoriz8.png diff --git a/src/test/baseline/testScrollBarHoriz9.png b/src/test/baseline/testScrollBarHoriz9.png Binary files differnew file mode 100644 index 0000000..0fefd7b --- /dev/null +++ b/src/test/baseline/testScrollBarHoriz9.png diff --git a/src/test/baseline/testScrollBarVert1.png b/src/test/baseline/testScrollBarVert1.png Binary files differnew file mode 100644 index 0000000..25c3098 --- /dev/null +++ b/src/test/baseline/testScrollBarVert1.png diff --git a/src/test/baseline/testScrollBarVert2.png b/src/test/baseline/testScrollBarVert2.png Binary files differnew file mode 100644 index 0000000..572fac9 --- /dev/null +++ b/src/test/baseline/testScrollBarVert2.png diff --git a/src/test/baseline/testScrollBarVert3.png b/src/test/baseline/testScrollBarVert3.png Binary files differnew file mode 100644 index 0000000..d1a893c --- /dev/null +++ b/src/test/baseline/testScrollBarVert3.png diff --git a/src/test/baseline/testScrollBarVert4.png b/src/test/baseline/testScrollBarVert4.png Binary files differnew file mode 100644 index 0000000..a29849f --- /dev/null +++ b/src/test/baseline/testScrollBarVert4.png diff --git a/src/test/baseline/testScrollBarVert5.png b/src/test/baseline/testScrollBarVert5.png Binary files differnew file mode 100644 index 0000000..ff40ef7 --- /dev/null +++ b/src/test/baseline/testScrollBarVert5.png diff --git a/src/test/baseline/testScrollBarVert6.png b/src/test/baseline/testScrollBarVert6.png Binary files differnew file mode 100644 index 0000000..edb3196 --- /dev/null +++ b/src/test/baseline/testScrollBarVert6.png diff --git a/src/test/baseline/testScrollBarVert7.png b/src/test/baseline/testScrollBarVert7.png Binary files differnew file mode 100644 index 0000000..115d8ca --- /dev/null +++ b/src/test/baseline/testScrollBarVert7.png diff --git a/src/test/baseline/testScrollBarVert8.png b/src/test/baseline/testScrollBarVert8.png Binary files differnew file mode 100644 index 0000000..5e1e08b --- /dev/null +++ b/src/test/baseline/testScrollBarVert8.png diff --git a/src/test/baseline/testScrollBarVert9.png b/src/test/baseline/testScrollBarVert9.png Binary files differnew file mode 100644 index 0000000..3a7ff70 --- /dev/null +++ b/src/test/baseline/testScrollBarVert9.png diff --git a/src/test/baseline/testScrollPane4.png b/src/test/baseline/testScrollPane4.png Binary files differdeleted file mode 100644 index 9daf9a5..0000000 --- a/src/test/baseline/testScrollPane4.png +++ /dev/null diff --git a/src/test/baseline/testSeekAfterEOF.png b/src/test/baseline/testSeekAfterEOF.png Binary files differnew file mode 100644 index 0000000..76e79c1 --- /dev/null +++ b/src/test/baseline/testSeekAfterEOF.png diff --git a/src/test/baseline/testSliderHoriz1.png b/src/test/baseline/testSliderHoriz1.png Binary files differnew file mode 100644 index 0000000..c30040d --- /dev/null +++ b/src/test/baseline/testSliderHoriz1.png diff --git a/src/test/baseline/testSliderHoriz2.png b/src/test/baseline/testSliderHoriz2.png Binary files differnew file mode 100644 index 0000000..e22a32f --- /dev/null +++ b/src/test/baseline/testSliderHoriz2.png diff --git a/src/test/baseline/testSliderHoriz3.png b/src/test/baseline/testSliderHoriz3.png Binary files differnew file mode 100644 index 0000000..bcf1690 --- /dev/null +++ b/src/test/baseline/testSliderHoriz3.png diff --git a/src/test/baseline/testSliderHoriz4.png b/src/test/baseline/testSliderHoriz4.png Binary files differnew file mode 100644 index 0000000..7c48e5a --- /dev/null +++ b/src/test/baseline/testSliderHoriz4.png diff --git a/src/test/baseline/testSliderHoriz5.png b/src/test/baseline/testSliderHoriz5.png Binary files differnew file mode 100644 index 0000000..2b6534a --- /dev/null +++ b/src/test/baseline/testSliderHoriz5.png diff --git a/src/test/baseline/testSliderVert1.png b/src/test/baseline/testSliderVert1.png Binary files differnew file mode 100644 index 0000000..d82d467 --- /dev/null +++ b/src/test/baseline/testSliderVert1.png diff --git a/src/test/baseline/testSliderVert2.png b/src/test/baseline/testSliderVert2.png Binary files differnew file mode 100644 index 0000000..294dae9 --- /dev/null +++ b/src/test/baseline/testSliderVert2.png diff --git a/src/test/baseline/testSliderVert3.png b/src/test/baseline/testSliderVert3.png Binary files differnew file mode 100644 index 0000000..4a00a8f --- /dev/null +++ b/src/test/baseline/testSliderVert3.png diff --git a/src/test/baseline/testSliderVert4.png b/src/test/baseline/testSliderVert4.png Binary files differnew file mode 100644 index 0000000..f13d278 --- /dev/null +++ b/src/test/baseline/testSliderVert4.png diff --git a/src/test/baseline/testSliderVert5.png b/src/test/baseline/testSliderVert5.png Binary files differnew file mode 100644 index 0000000..a939fe0 --- /dev/null +++ b/src/test/baseline/testSliderVert5.png diff --git a/src/test/baseline/testStretchNodeHoriz1.png b/src/test/baseline/testStretchNodeHoriz1.png Binary files differnew file mode 100644 index 0000000..652ada8 --- /dev/null +++ b/src/test/baseline/testStretchNodeHoriz1.png diff --git a/src/test/baseline/testStretchNodeHoriz2.png b/src/test/baseline/testStretchNodeHoriz2.png Binary files differnew file mode 100644 index 0000000..fe123b0 --- /dev/null +++ b/src/test/baseline/testStretchNodeHoriz2.png diff --git a/src/test/baseline/testStretchNodeVert1.png b/src/test/baseline/testStretchNodeVert1.png Binary files differnew file mode 100644 index 0000000..a0e6fe3 --- /dev/null +++ b/src/test/baseline/testStretchNodeVert1.png diff --git a/src/test/baseline/testStretchNodeVert2.png b/src/test/baseline/testStretchNodeVert2.png Binary files differnew file mode 100644 index 0000000..ac7d496 --- /dev/null +++ b/src/test/baseline/testStretchNodeVert2.png diff --git a/src/test/baseline/testTextArea1.png b/src/test/baseline/testTextArea1.png Binary files differindex 53f03a1..7cf8ac1 100644 --- a/src/test/baseline/testTextArea1.png +++ b/src/test/baseline/testTextArea1.png diff --git a/src/test/baseline/testTextArea2.png b/src/test/baseline/testTextArea2.png Binary files differindex 07349af..6fe4c64 100644 --- a/src/test/baseline/testTextArea2.png +++ b/src/test/baseline/testTextArea2.png diff --git a/src/test/baseline/testTextArea3.png b/src/test/baseline/testTextArea3.png Binary files differnew file mode 100644 index 0000000..6577cf2 --- /dev/null +++ b/src/test/baseline/testTextArea3.png diff --git a/src/test/baseline/testTextArea4.png b/src/test/baseline/testTextArea4.png Binary files differnew file mode 100644 index 0000000..2fc48fe --- /dev/null +++ b/src/test/baseline/testTextArea4.png diff --git a/src/test/baseline/testTextArea5.png b/src/test/baseline/testTextArea5.png Binary files differnew file mode 100644 index 0000000..a7c53e2 --- /dev/null +++ b/src/test/baseline/testTextArea5.png diff --git a/src/test/baseline/testTextButtonDisabled.png b/src/test/baseline/testTextButtonDisabled.png Binary files differnew file mode 100644 index 0000000..c859bfa --- /dev/null +++ b/src/test/baseline/testTextButtonDisabled.png diff --git a/src/test/baseline/testTextButtonDown.png b/src/test/baseline/testTextButtonDown.png Binary files differnew file mode 100644 index 0000000..9122c33 --- /dev/null +++ b/src/test/baseline/testTextButtonDown.png diff --git a/src/test/baseline/testTextButtonDownNewText.png b/src/test/baseline/testTextButtonDownNewText.png Binary files differnew file mode 100644 index 0000000..9592a86 --- /dev/null +++ b/src/test/baseline/testTextButtonDownNewText.png diff --git a/src/test/baseline/testTextButtonUp.png b/src/test/baseline/testTextButtonUp.png Binary files differnew file mode 100644 index 0000000..c859bfa --- /dev/null +++ b/src/test/baseline/testTextButtonUp.png diff --git a/src/test/baseline/testTextButtonUpNewText.png b/src/test/baseline/testTextButtonUpNewText.png Binary files differnew file mode 100644 index 0000000..ebb66bc --- /dev/null +++ b/src/test/baseline/testTextButtonUpNewText.png diff --git a/src/test/baseline/testTexturedPolyLine4.png b/src/test/baseline/testTexturedPolyLine4.png Binary files differindex 83c0b4a..f063a2f 100644 --- a/src/test/baseline/testTexturedPolyLine4.png +++ b/src/test/baseline/testTexturedPolyLine4.png diff --git a/src/test/baseline/testTimeSliderHoriz1.png b/src/test/baseline/testTimeSliderHoriz1.png Binary files differnew file mode 100644 index 0000000..42c0eca --- /dev/null +++ b/src/test/baseline/testTimeSliderHoriz1.png diff --git a/src/test/baseline/testTimeSliderHoriz2.png b/src/test/baseline/testTimeSliderHoriz2.png Binary files differnew file mode 100644 index 0000000..a42b8ca --- /dev/null +++ b/src/test/baseline/testTimeSliderHoriz2.png diff --git a/src/test/baseline/testTimeSliderHoriz3.png b/src/test/baseline/testTimeSliderHoriz3.png Binary files differnew file mode 100644 index 0000000..4908be5 --- /dev/null +++ b/src/test/baseline/testTimeSliderHoriz3.png diff --git a/src/test/baseline/testTimeSliderHoriz4.png b/src/test/baseline/testTimeSliderHoriz4.png Binary files differnew file mode 100644 index 0000000..1371480 --- /dev/null +++ b/src/test/baseline/testTimeSliderHoriz4.png diff --git a/src/test/baseline/testTimeSliderHoriz5.png b/src/test/baseline/testTimeSliderHoriz5.png Binary files differnew file mode 100644 index 0000000..1371480 --- /dev/null +++ b/src/test/baseline/testTimeSliderHoriz5.png diff --git a/src/test/baseline/testTimeSliderVert1.png b/src/test/baseline/testTimeSliderVert1.png Binary files differnew file mode 100644 index 0000000..8b31bac --- /dev/null +++ b/src/test/baseline/testTimeSliderVert1.png diff --git a/src/test/baseline/testTimeSliderVert2.png b/src/test/baseline/testTimeSliderVert2.png Binary files differnew file mode 100644 index 0000000..79be7d1 --- /dev/null +++ b/src/test/baseline/testTimeSliderVert2.png diff --git a/src/test/baseline/testTimeSliderVert3.png b/src/test/baseline/testTimeSliderVert3.png Binary files differnew file mode 100644 index 0000000..a3a8718 --- /dev/null +++ b/src/test/baseline/testTimeSliderVert3.png diff --git a/src/test/baseline/testTimeSliderVert4.png b/src/test/baseline/testTimeSliderVert4.png Binary files differnew file mode 100644 index 0000000..f64996b --- /dev/null +++ b/src/test/baseline/testTimeSliderVert4.png diff --git a/src/test/baseline/testTimeSliderVert5.png b/src/test/baseline/testTimeSliderVert5.png Binary files differnew file mode 100644 index 0000000..f64996b --- /dev/null +++ b/src/test/baseline/testTimeSliderVert5.png diff --git a/src/test/baseline/testUICheckBoxChecked_Down.png b/src/test/baseline/testUICheckBoxChecked_Down.png Binary files differnew file mode 100644 index 0000000..73818b9 --- /dev/null +++ b/src/test/baseline/testUICheckBoxChecked_Down.png diff --git a/src/test/baseline/testUICheckBoxChecked_Up.png b/src/test/baseline/testUICheckBoxChecked_Up.png Binary files differnew file mode 100644 index 0000000..a4af8c9 --- /dev/null +++ b/src/test/baseline/testUICheckBoxChecked_Up.png diff --git a/src/test/baseline/testUICheckBoxUnchecked_Disabled.png b/src/test/baseline/testUICheckBoxUnchecked_Disabled.png Binary files differnew file mode 100644 index 0000000..ebcb3ef --- /dev/null +++ b/src/test/baseline/testUICheckBoxUnchecked_Disabled.png diff --git a/src/test/baseline/testUICheckBoxUnchecked_Down.png b/src/test/baseline/testUICheckBoxUnchecked_Down.png Binary files differnew file mode 100644 index 0000000..4967f44 --- /dev/null +++ b/src/test/baseline/testUICheckBoxUnchecked_Down.png diff --git a/src/test/baseline/testUICheckBoxUnchecked_Up.png b/src/test/baseline/testUICheckBoxUnchecked_Up.png Binary files differnew file mode 100644 index 0000000..1c102e7 --- /dev/null +++ b/src/test/baseline/testUICheckBoxUnchecked_Up.png diff --git a/src/test/baseline/testUIKeyboard.png b/src/test/baseline/testUIKeyboard.png Binary files differindex 9e1a4cd..87d23a2 100644 --- a/src/test/baseline/testUIKeyboard.png +++ b/src/test/baseline/testUIKeyboard.png diff --git a/src/test/baseline/testUIKeyboard1S.png b/src/test/baseline/testUIKeyboard1S.png Binary files differnew file mode 100644 index 0000000..d7f0606 --- /dev/null +++ b/src/test/baseline/testUIKeyboard1S.png diff --git a/src/test/baseline/testUIKeyboardA.png b/src/test/baseline/testUIKeyboardA.png Binary files differnew file mode 100644 index 0000000..0012b33 --- /dev/null +++ b/src/test/baseline/testUIKeyboardA.png diff --git a/src/test/baseline/testUIKeyboardA1S.png b/src/test/baseline/testUIKeyboardA1S.png Binary files differnew file mode 100644 index 0000000..f2ccd3a --- /dev/null +++ b/src/test/baseline/testUIKeyboardA1S.png diff --git a/src/test/baseline/testUIKeyboardAS.png b/src/test/baseline/testUIKeyboardAS.png Binary files differnew file mode 100644 index 0000000..cd76aad --- /dev/null +++ b/src/test/baseline/testUIKeyboardAS.png diff --git a/src/test/baseline/testUIKeyboardDown11.png b/src/test/baseline/testUIKeyboardDown11.png Binary files differnew file mode 100644 index 0000000..bfc8a50 --- /dev/null +++ b/src/test/baseline/testUIKeyboardDown11.png diff --git a/src/test/baseline/testUIKeyboardDownA1.png b/src/test/baseline/testUIKeyboardDownA1.png Binary files differdeleted file mode 100644 index 51c001e..0000000 --- a/src/test/baseline/testUIKeyboardDownA1.png +++ /dev/null diff --git a/src/test/baseline/testUIKeyboardDownA111S1.png b/src/test/baseline/testUIKeyboardDownA111S1.png Binary files differdeleted file mode 100644 index d05d7a6..0000000 --- a/src/test/baseline/testUIKeyboardDownA111S1.png +++ /dev/null diff --git a/src/test/baseline/testUIKeyboardDownA212S2.png b/src/test/baseline/testUIKeyboardDownA212S2.png Binary files differindex b7b5492..cd79feb 100644 --- a/src/test/baseline/testUIKeyboardDownA212S2.png +++ b/src/test/baseline/testUIKeyboardDownA212S2.png diff --git a/src/test/baseline/testUIKeyboardDownA2S1.png b/src/test/baseline/testUIKeyboardDownA2S1.png Binary files differnew file mode 100644 index 0000000..6c07214 --- /dev/null +++ b/src/test/baseline/testUIKeyboardDownA2S1.png diff --git a/src/test/baseline/testUIKeyboardDownS1.png b/src/test/baseline/testUIKeyboardDownS1.png Binary files differdeleted file mode 100644 index deef9fc..0000000 --- a/src/test/baseline/testUIKeyboardDownS1.png +++ /dev/null diff --git a/src/test/baseline/testUIKeyboardFB.png b/src/test/baseline/testUIKeyboardFB.png Binary files differnew file mode 100644 index 0000000..f4836a1 --- /dev/null +++ b/src/test/baseline/testUIKeyboardFB.png diff --git a/src/test/baseline/testUIKeyboardFB1.png b/src/test/baseline/testUIKeyboardFB1.png Binary files differnew file mode 100644 index 0000000..13a56aa --- /dev/null +++ b/src/test/baseline/testUIKeyboardFB1.png diff --git a/src/test/baseline/testUIKeyboardFBA1S.png b/src/test/baseline/testUIKeyboardFBA1S.png Binary files differnew file mode 100644 index 0000000..e9e5534 --- /dev/null +++ b/src/test/baseline/testUIKeyboardFBA1S.png diff --git a/src/test/baseline/testUIKeyboardFBAS.png b/src/test/baseline/testUIKeyboardFBAS.png Binary files differnew file mode 100644 index 0000000..0e10aaf --- /dev/null +++ b/src/test/baseline/testUIKeyboardFBAS.png diff --git a/src/test/baseline/testUIKeyboardFBS.png b/src/test/baseline/testUIKeyboardFBS.png Binary files differnew file mode 100644 index 0000000..9e0964a --- /dev/null +++ b/src/test/baseline/testUIKeyboardFBS.png diff --git a/src/test/baseline/testUIKeyboardNoFB1S.png b/src/test/baseline/testUIKeyboardNoFB1S.png Binary files differnew file mode 100644 index 0000000..4c91d91 --- /dev/null +++ b/src/test/baseline/testUIKeyboardNoFB1S.png diff --git a/src/test/baseline/testUIKeyboardS.png b/src/test/baseline/testUIKeyboardS.png Binary files differnew file mode 100644 index 0000000..12a6c9f --- /dev/null +++ b/src/test/baseline/testUIKeyboardS.png diff --git a/src/test/baseline/testUIToggleChecked_Disabled.png b/src/test/baseline/testUIToggleChecked_Disabled.png Binary files differnew file mode 100644 index 0000000..6a23dda --- /dev/null +++ b/src/test/baseline/testUIToggleChecked_Disabled.png diff --git a/src/test/baseline/testUIToggleChecked_Down.png b/src/test/baseline/testUIToggleChecked_Down.png Binary files differnew file mode 100644 index 0000000..a17041f --- /dev/null +++ b/src/test/baseline/testUIToggleChecked_Down.png diff --git a/src/test/baseline/testUIToggleChecked_Up.png b/src/test/baseline/testUIToggleChecked_Up.png Binary files differnew file mode 100644 index 0000000..03f2f41 --- /dev/null +++ b/src/test/baseline/testUIToggleChecked_Up.png diff --git a/src/test/baseline/testUIToggleUnchecked_Disabled.png b/src/test/baseline/testUIToggleUnchecked_Disabled.png Binary files differnew file mode 100644 index 0000000..8fccaa6 --- /dev/null +++ b/src/test/baseline/testUIToggleUnchecked_Disabled.png diff --git a/src/test/baseline/testUIToggleUnchecked_Down.png b/src/test/baseline/testUIToggleUnchecked_Down.png Binary files differnew file mode 100644 index 0000000..bbad224 --- /dev/null +++ b/src/test/baseline/testUIToggleUnchecked_Down.png diff --git a/src/test/baseline/testUIToggleUnchecked_Up.png b/src/test/baseline/testUIToggleUnchecked_Up.png Binary files differnew file mode 100644 index 0000000..a6f08f0 --- /dev/null +++ b/src/test/baseline/testUIToggleUnchecked_Up.png diff --git a/src/test/baseline/testVideo-mpeg1-48x48.mpg1.png b/src/test/baseline/testVideo-mpeg1-48x48.mov1.png Binary files differindex ad9dcf8..ad9dcf8 100644 --- a/src/test/baseline/testVideo-mpeg1-48x48.mpg1.png +++ b/src/test/baseline/testVideo-mpeg1-48x48.mov1.png diff --git a/src/test/baseline/testVideo-mpeg4-48x48.avi1.png b/src/test/baseline/testVideo-mpeg4-48x48.avi1.png Binary files differnew file mode 100644 index 0000000..5b6a337 --- /dev/null +++ b/src/test/baseline/testVideo-mpeg4-48x48.avi1.png diff --git a/src/test/baseline/testWordsGamma1.png b/src/test/baseline/testWordsGamma1.png Binary files differnew file mode 100644 index 0000000..9586c80 --- /dev/null +++ b/src/test/baseline/testWordsGamma1.png diff --git a/src/test/baseline/testWordsGamma2.png b/src/test/baseline/testWordsGamma2.png Binary files differnew file mode 100644 index 0000000..f5c2367 --- /dev/null +++ b/src/test/baseline/testWordsGamma2.png diff --git a/src/test/baseline/testWordsIntensity.png b/src/test/baseline/testWordsIntensity.png Binary files differnew file mode 100644 index 0000000..c49904e --- /dev/null +++ b/src/test/baseline/testWordsIntensity.png diff --git a/src/test/baseline/testWordsMask7.png b/src/test/baseline/testWordsMask7.png Binary files differnew file mode 100644 index 0000000..6be97bc --- /dev/null +++ b/src/test/baseline/testWordsMask7.png diff --git a/src/test/baseline/testWordsOutlines.png b/src/test/baseline/testWordsOutlines.png Binary files differnew file mode 100644 index 0000000..6187147 --- /dev/null +++ b/src/test/baseline/testWordsOutlines.png diff --git a/src/test/baseline/testplugin1.png b/src/test/baseline/testplugin1.png Binary files differindex e06639d..fd07f6c 100644 --- a/src/test/baseline/testplugin1.png +++ b/src/test/baseline/testplugin1.png diff --git a/src/test/baseline/testplugin2.png b/src/test/baseline/testplugin2.png Binary files differindex fc47a3c..2ec2e11 100644 --- a/src/test/baseline/testplugin2.png +++ b/src/test/baseline/testplugin2.png diff --git a/src/test/camcfgs.py b/src/test/camcfgs.py index ef0d5d6..5c65229 100644 --- a/src/test/camcfgs.py +++ b/src/test/camcfgs.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- # libavg - Media Playback Engine. -# Copyright (C) 2003-2011 Ulrich von Zadow +# 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 diff --git a/src/test/checkcamera.py b/src/test/checkcamera.py index 936993d..1146679 100755 --- a/src/test/checkcamera.py +++ b/src/test/checkcamera.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- # libavg - Media Playback Engine. -# Copyright (C) 2003-2011 Ulrich von Zadow +# 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 @@ -28,8 +28,6 @@ import optparse from testcase import * -g_Player = avg.Player.get() - def parseCmdLine(): global g_TestParams @@ -78,8 +76,8 @@ class CameraTestCase(AVGTestCase): self.loadEmptyScene() self.__openCamera() self.actions = [None, None] - g_Player.setOnFrameHandler(self.__onFrame) - g_Player.play() + avg.player.setOnFrameHandler(self.__onFrame) + avg.player.play() self.assertEqual(self.cam.framenum, 2) self.cam = None @@ -135,8 +133,8 @@ class CameraTestCase(AVGTestCase): def checkCamImageChange(testCfg): def saveCamImages(): - print - print "Average image brightnesses: ",minAverages, medAverages, maxAverages +# print +# print "Average image brightnesses: ",minAverages, medAverages, maxAverages dir = AVGTestCase.getImageResultDir() for (i, category) in enumerate(("min", "med", "max")): self.camBmps[i].save(dir+"/cam"+testCfg.name+category+".png") @@ -165,10 +163,10 @@ class CameraTestCase(AVGTestCase): self.loadEmptyScene() self.__openCamera() self.actions = buildParamActionList(testCfg) - g_Player.setOnFrameHandler(self.__onFrame) + avg.player.setOnFrameHandler(self.__onFrame) self.averages = [] self.camBmps = [] - g_Player.play() + avg.player.play() self.cam = None def __openCamera(self): @@ -177,7 +175,7 @@ class CameraTestCase(AVGTestCase): fw800=self.cameraCfg.fw800, framerate=self.fmt.framerate, capturewidth=self.fmt.size[0], captureheight=self.fmt.size[1], pixelformat=self.fmt.pixelformat, - parent=g_Player.getRootNode()) + parent=avg.player.getRootNode()) self.cam.play() self.lastCameraFrame = -1 self.assert_(self.cam.isAvailable()) @@ -188,7 +186,7 @@ class CameraTestCase(AVGTestCase): if self.cam.framenum != self.lastCameraFrame: self.lastCameraFrame += 1 if len(self.actions) == self.lastCameraFrame: - g_Player.stop() + avg.player.stop() else: action = self.actions[self.lastCameraFrame] if action != None: diff --git a/src/test/checkspeed.py b/src/test/checkspeed.py deleted file mode 100755 index 0f72202..0000000 --- a/src/test/checkspeed.py +++ /dev/null @@ -1,105 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# libavg - Media Playback Engine. -# Copyright (C) 2003-2011 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 -# -# Original author of this file is Robert Parcus <betoparcus@gmail.com> -# - -from libavg import * -import optparse -import random - -g_Player = avg.Player.get() - -def parseCmdLine(): - parser = optparse.OptionParser(usage= -"""%prog [option]. -Checks libavg performance by creating lots of nodes. Displays a frame time graph, executes for 20 secs and dumps profile statistics at the end of program execution.""") - parser.add_option('--use-fx', '-f', dest='useFX', action='store_true', default=False, - help='Display everything using a NullFX to test FX overhead.') - parser.add_option('--video', '-v', dest='video', action='store_true', default=False, - help='Show videos instead of images.') - parser.add_option('--create-nodes', '-c', dest='createNodes', action='store_true', - default=False, - help='Destroy and recreate all nodes every 400 ms.') - parser.add_option('--move', '-m', dest='move', action='store_true', - default=False, - help='Move nodes every frame.') - parser.add_option('--vsync', '-s', dest='vsync', action='store_true', - default=False, - help='Sync output to vertical refresh.') - parser.add_option('--num-objs', '-n', dest='numObjs', type='int', default=-1, - help='Number of objects to create. Default is 200 images or 40 videos.') - - (options, args) = parser.parse_args() - - return options - - -class SpeedApp(AVGApp): - def init(self): - self.__createNodes() - self._starter.showFrameRate() - if options.createNodes: - g_Player.setInterval(400, self.__createNodes) - g_Player.setTimeout(20000, g_Player.stop) - if options.move: - g_Player.setOnFrameHandler(self.__moveNodes) - - def __createNodes(self): - self.__nodes = [] - for i in xrange(options.numObjs): - pos = (random.randrange(800-64), random.randrange(600-64)) - if options.video: - node = avg.VideoNode(pos=pos, href="../video/testfiles/mpeg1-48x48.mpg", - loop=True, parent=self._parentNode) - node.play() - else: - node = avg.ImageNode(pos=pos, href="rgb24alpha-64x64.png", - parent=self._parentNode) - if options.useFX: - node.setEffect(avg.NullFXNode()) - self.__nodes.append(node) - if options.createNodes: - g_Player.setTimeout(300, self.__deleteNodes) - - def __deleteNodes(self): - for node in self.__nodes: - node.unlink(True) - self.__nodes = [] - - def __moveNodes(self): - for node in self.__nodes: - node.pos = (random.randrange(800-64), random.randrange(600-64)) - - -options = parseCmdLine() -if not(options.vsync): - g_Player.setFramerate(1000) -if options.numObjs == -1: - if options.video: - options.numObjs = 40 - else: - options.numObjs = 200 - -log = avg.Logger.get() -log.setCategories(log.PROFILE | log.CONFIG | log.WARNING | log.ERROR) -SpeedApp.start(resolution=(800,600)) - diff --git a/src/test/extrafonts/.svn/entries b/src/test/extrafonts/.svn/entries deleted file mode 100644 index db28fcb..0000000 --- a/src/test/extrafonts/.svn/entries +++ /dev/null @@ -1,62 +0,0 @@ -10 - -dir -7007 -https://www.libavg.de/svn/branches/release1.7.x/src/test/extrafonts -https://www.libavg.de/svn - - - -2009-05-18T18:25:22.096076Z -3872 -coder - - - - - - - - - - - - - - -44470bb9-56e9-0310-a0f8-c586564d3dc6 - -testaddfontdir.ttf -file - - - - -2011-12-07T12:58:46.191560Z -f2b76dafe01a3f6316e5aa9d16854d57 -2009-05-18T18:25:22.096076Z -3872 -coder -has-props - - - - - - - - - - - - - - - - - - - - -1736 - diff --git a/src/test/extrafonts/.svn/prop-base/testaddfontdir.ttf.svn-base b/src/test/extrafonts/.svn/prop-base/testaddfontdir.ttf.svn-base deleted file mode 100644 index 5e9587e..0000000 --- a/src/test/extrafonts/.svn/prop-base/testaddfontdir.ttf.svn-base +++ /dev/null @@ -1,5 +0,0 @@ -K 13 -svn:mime-type -V 24 -application/octet-stream -END diff --git a/src/test/extrafonts/.svn/text-base/testaddfontdir.ttf.svn-base b/src/test/extrafonts/.svn/text-base/testaddfontdir.ttf.svn-base Binary files differdeleted file mode 100644 index d57eda6..0000000 --- a/src/test/extrafonts/.svn/text-base/testaddfontdir.ttf.svn-base +++ /dev/null diff --git a/src/test/fonts/.svn/entries b/src/test/fonts/.svn/entries deleted file mode 100644 index 01974a4..0000000 --- a/src/test/fonts/.svn/entries +++ /dev/null @@ -1,164 +0,0 @@ -10 - -dir -7007 -https://www.libavg.de/svn/branches/release1.7.x/src/test/fonts -https://www.libavg.de/svn - - - -2008-06-21T14:08:49.239477Z -2933 -coder - - - - - - - - - - - - - - -44470bb9-56e9-0310-a0f8-c586564d3dc6 - -VeraBd.ttf -file - - - - -2011-12-07T12:58:17.713947Z -4ebf664c986099acf6d151c62bdb24eb -2008-06-21T14:08:49.239477Z -2933 -coder -has-props - - - - - - - - - - - - - - - - - - - - -58716 - -VeraBI.ttf -file - - - - -2011-12-07T12:58:17.713947Z -a99f3482bfc2d9c37b509e68d20d016a -2008-06-21T14:08:49.239477Z -2933 -coder -has-props - - - - - - - - - - - - - - - - - - - - -63208 - -VeraIt.ttf -file - - - - -2011-12-07T12:58:17.713947Z -06ee45608b225ef0f22e94995bc981b2 -2008-06-21T14:08:49.239477Z -2933 -coder -has-props - - - - - - - - - - - - - - - - - - - - -63684 - -Vera.ttf -file - - - - -2011-12-07T12:58:17.713947Z -785d2fd45984c6548763ae6702d83e20 -2008-06-21T14:08:49.239477Z -2933 -coder -has-props - - - - - - - - - - - - - - - - - - - - -65932 - diff --git a/src/test/fonts/.svn/prop-base/Vera.ttf.svn-base b/src/test/fonts/.svn/prop-base/Vera.ttf.svn-base deleted file mode 100644 index 5e9587e..0000000 --- a/src/test/fonts/.svn/prop-base/Vera.ttf.svn-base +++ /dev/null @@ -1,5 +0,0 @@ -K 13 -svn:mime-type -V 24 -application/octet-stream -END diff --git a/src/test/fonts/.svn/prop-base/VeraBI.ttf.svn-base b/src/test/fonts/.svn/prop-base/VeraBI.ttf.svn-base deleted file mode 100644 index 5e9587e..0000000 --- a/src/test/fonts/.svn/prop-base/VeraBI.ttf.svn-base +++ /dev/null @@ -1,5 +0,0 @@ -K 13 -svn:mime-type -V 24 -application/octet-stream -END diff --git a/src/test/fonts/.svn/prop-base/VeraBd.ttf.svn-base b/src/test/fonts/.svn/prop-base/VeraBd.ttf.svn-base deleted file mode 100644 index 5e9587e..0000000 --- a/src/test/fonts/.svn/prop-base/VeraBd.ttf.svn-base +++ /dev/null @@ -1,5 +0,0 @@ -K 13 -svn:mime-type -V 24 -application/octet-stream -END diff --git a/src/test/fonts/.svn/prop-base/VeraIt.ttf.svn-base b/src/test/fonts/.svn/prop-base/VeraIt.ttf.svn-base deleted file mode 100644 index 5e9587e..0000000 --- a/src/test/fonts/.svn/prop-base/VeraIt.ttf.svn-base +++ /dev/null @@ -1,5 +0,0 @@ -K 13 -svn:mime-type -V 24 -application/octet-stream -END diff --git a/src/test/fonts/.svn/text-base/Vera.ttf.svn-base b/src/test/fonts/.svn/text-base/Vera.ttf.svn-base Binary files differdeleted file mode 100644 index 58cd6b5..0000000 --- a/src/test/fonts/.svn/text-base/Vera.ttf.svn-base +++ /dev/null diff --git a/src/test/fonts/.svn/text-base/VeraBI.ttf.svn-base b/src/test/fonts/.svn/text-base/VeraBI.ttf.svn-base Binary files differdeleted file mode 100644 index b55eee3..0000000 --- a/src/test/fonts/.svn/text-base/VeraBI.ttf.svn-base +++ /dev/null diff --git a/src/test/fonts/.svn/text-base/VeraBd.ttf.svn-base b/src/test/fonts/.svn/text-base/VeraBd.ttf.svn-base Binary files differdeleted file mode 100644 index 51d6111..0000000 --- a/src/test/fonts/.svn/text-base/VeraBd.ttf.svn-base +++ /dev/null diff --git a/src/test/fonts/.svn/text-base/VeraIt.ttf.svn-base b/src/test/fonts/.svn/text-base/VeraIt.ttf.svn-base Binary files differdeleted file mode 100644 index cc23c9e..0000000 --- a/src/test/fonts/.svn/text-base/VeraIt.ttf.svn-base +++ /dev/null diff --git a/src/test/image.avg b/src/test/image.avg index f2dbace..7fc4c13 100644 --- a/src/test/image.avg +++ b/src/test/image.avg @@ -1,4 +1,4 @@ -<avg id="imageavg" width="160" height="120"> +<avg id="imageavg" width="160" height="120" mediadir="media"> <image id="testtiles" pos="(0, 30)" size=" ( 65 , 65 ) " opacity="1" href="rgb24-65x65.png" maxtilewidth="16" maxtileheight="32"/> <image id="test" x="64" y="30" diff --git a/src/test/1x1_white.png b/src/test/media/1x1_white.png Binary files differindex 5800230..5800230 100644 --- a/src/test/1x1_white.png +++ b/src/test/media/1x1_white.png diff --git a/src/test/media/22.050Hz_16bit_mono.wav b/src/test/media/22.050Hz_16bit_mono.wav Binary files differnew file mode 100755 index 0000000..1f86e64 --- /dev/null +++ b/src/test/media/22.050Hz_16bit_mono.wav diff --git a/src/test/media/44.1kHz_16bit_6Chan.ogg b/src/test/media/44.1kHz_16bit_6Chan.ogg Binary files differnew file mode 100644 index 0000000..7d190d1 --- /dev/null +++ b/src/test/media/44.1kHz_16bit_6Chan.ogg diff --git a/src/test/media/44.1kHz_16bit_mono.wav b/src/test/media/44.1kHz_16bit_mono.wav Binary files differnew file mode 100755 index 0000000..8676a75 --- /dev/null +++ b/src/test/media/44.1kHz_16bit_mono.wav diff --git a/src/test/media/44.1kHz_16bit_stereo.aif b/src/test/media/44.1kHz_16bit_stereo.aif Binary files differnew file mode 100755 index 0000000..0c9b5c7 --- /dev/null +++ b/src/test/media/44.1kHz_16bit_stereo.aif diff --git a/src/test/media/44.1kHz_16bit_stereo.wav b/src/test/media/44.1kHz_16bit_stereo.wav Binary files differnew file mode 100755 index 0000000..af5c2ee --- /dev/null +++ b/src/test/media/44.1kHz_16bit_stereo.wav diff --git a/src/test/media/44.1kHz_24bit_mono.wav b/src/test/media/44.1kHz_24bit_mono.wav Binary files differnew file mode 100755 index 0000000..fd2deed --- /dev/null +++ b/src/test/media/44.1kHz_24bit_mono.wav diff --git a/src/test/media/44.1kHz_24bit_stereo.aif b/src/test/media/44.1kHz_24bit_stereo.aif Binary files differnew file mode 100755 index 0000000..f569ded --- /dev/null +++ b/src/test/media/44.1kHz_24bit_stereo.aif diff --git a/src/test/media/44.1kHz_24bit_stereo.wav b/src/test/media/44.1kHz_24bit_stereo.wav Binary files differnew file mode 100755 index 0000000..36c6aa7 --- /dev/null +++ b/src/test/media/44.1kHz_24bit_stereo.wav diff --git a/src/test/media/44.1kHz_mono.ogg b/src/test/media/44.1kHz_mono.ogg Binary files differnew file mode 100755 index 0000000..7bcb866 --- /dev/null +++ b/src/test/media/44.1kHz_mono.ogg diff --git a/src/test/media/44.1kHz_stereo.mp3 b/src/test/media/44.1kHz_stereo.mp3 Binary files differnew file mode 100644 index 0000000..cbefc63 --- /dev/null +++ b/src/test/media/44.1kHz_stereo.mp3 diff --git a/src/test/media/44.1kHz_stereo.ogg b/src/test/media/44.1kHz_stereo.ogg Binary files differnew file mode 100644 index 0000000..f5ed4d0 --- /dev/null +++ b/src/test/media/44.1kHz_stereo.ogg diff --git a/src/test/media/48kHz_16bit_mono.wav b/src/test/media/48kHz_16bit_mono.wav Binary files differnew file mode 100755 index 0000000..0f817c9 --- /dev/null +++ b/src/test/media/48kHz_16bit_mono.wav diff --git a/src/test/media/48kHz_16bit_stereo.aif b/src/test/media/48kHz_16bit_stereo.aif Binary files differnew file mode 100755 index 0000000..db3a381 --- /dev/null +++ b/src/test/media/48kHz_16bit_stereo.aif diff --git a/src/test/media/48kHz_16bit_stereo.wav b/src/test/media/48kHz_16bit_stereo.wav Binary files differnew file mode 100755 index 0000000..9fc52f1 --- /dev/null +++ b/src/test/media/48kHz_16bit_stereo.wav diff --git a/src/test/media/48kHz_24bit_mono.wav b/src/test/media/48kHz_24bit_mono.wav Binary files differnew file mode 100755 index 0000000..296ca11 --- /dev/null +++ b/src/test/media/48kHz_24bit_mono.wav diff --git a/src/test/media/48kHz_24bit_stereo.aif b/src/test/media/48kHz_24bit_stereo.aif Binary files differnew file mode 100755 index 0000000..3ab7cf1 --- /dev/null +++ b/src/test/media/48kHz_24bit_stereo.aif diff --git a/src/test/media/48kHz_24bit_stereo.wav b/src/test/media/48kHz_24bit_stereo.wav Binary files differnew file mode 100755 index 0000000..af2c977 --- /dev/null +++ b/src/test/media/48kHz_24bit_stereo.wav diff --git a/src/test/media/48kHz_stereo.mp3 b/src/test/media/48kHz_stereo.mp3 Binary files differnew file mode 100644 index 0000000..0eaa0f5 --- /dev/null +++ b/src/test/media/48kHz_stereo.mp3 diff --git a/src/test/media/48kHz_stereo.ogg b/src/test/media/48kHz_stereo.ogg Binary files differnew file mode 100644 index 0000000..92d7b7b --- /dev/null +++ b/src/test/media/48kHz_stereo.ogg diff --git a/src/test/media/CustomSkin.xml b/src/test/media/CustomSkin.xml new file mode 100644 index 0000000..3f21274 --- /dev/null +++ b/src/test/media/CustomSkin.xml @@ -0,0 +1,83 @@ +<skin> + <fontdef id="stdFont" font="Bitstream Vera Sans" variant="Roman" fontsize="12" + color="000000" letterspacing="0" linespacing="-1"/> + <fontdef id="downFont" baseid="stdFont" color="CCCCCC"/> + <fontdef id="disabledFont" baseid="stdFont" color="444444"/> + <textbutton + upSrc="button_bg_up.png" + downSrc="button_bg_down.png" + font="stdFont" + downFont="downFont" + disabledFont="disabledFont" + endsExtent="(7,7)"/> + <slider> + <horizontal + trackSrc="slider_horiz_track.png" + trackDisabledSrc="slider_horiz_track_disabled.png" + trackEndsExtent="6" + thumbUpSrc="slider_thumb_up.png" + thumbDownSrc="slider_thumb_down.png"/> + <vertical + trackSrc="slider_vert_track.png" + trackDisabledSrc="slider_vert_track_disabled.png" + trackEndsExtent="6" + thumbUpSrc="slider_thumb_up.png" + thumbDownSrc="slider_thumb_down.png"/> + </slider> + <scrollbar> + <horizontal + trackSrc="scrollbar_horiz_track.png" + trackDisabledSrc="scrollbar_horiz_track_disabled.png" + trackEndsExtent="2" + thumbUpSrc="scrollbar_horiz_thumb_up.png" + thumbDownSrc="scrollbar_horiz_thumb_down.png" + thumbEndsExtent="4"/> + <vertical + trackSrc="scrollbar_vert_track.png" + trackDisabledSrc="scrollbar_vert_track_disabled.png" + trackEndsExtent="2" + thumbUpSrc="scrollbar_vert_thumb_up.png" + thumbDownSrc="scrollbar_vert_thumb_down.png" + thumbEndsExtent="4"/> + </scrollbar> + <progressbar> + <horizontal + trackSrc="scrollbar_horiz_track.png" + trackEndsExtent="2" + thumbUpSrc="scrollbar_horiz_thumb_up.png" + thumbDisabledSrc="scrollbar_vert_thumb_down.png" + thumbEndsExtent="4"/> + <vertical + trackSrc="scrollbar_vert_track.png" + trackEndsExtent="2" + thumbUpSrc="scrollbar_vert_thumb_up.png" + thumbDisabledSrc="scrollbar_vert_thumb_down.png" + thumbEndsExtent="4"/> + </progressbar> + <scrollarea + borderSrc="scrollarea_border.png" + borderEndsExtent="(8,8)" + margins="(1,1,8,8)" + friction="-1" + sensitiveScrollBars="True"/> + <checkbox + uncheckedUpSrc="checkbox_unchecked_up.png" + uncheckedDownSrc="checkbox_unchecked_down.png" + uncheckedDisabledSrc="checkbox_unchecked_disabled.png" + checkedUpSrc="checkbox_checked_up.png" + checkedDownSrc="checkbox_checked_down.png" + checkedDisabledSrc="checkbox_checked_disabled.png" + font="stdFont" + downFont="stdFont" + disabledFont="disabledFont"/> + <mediacontrol + playUpSrc="play_button_up.png" + playDownSrc="play_button_down.png" + pauseUpSrc="pause_button_up.png" + pauseDownSrc="pause_button_down.png" + font="stdFont" + timePos="(15,0)" + timeLeftPos="(-42,0)" + barPos="(55,2)" + barRight="-45"/> +</skin> diff --git a/src/test/media/SimpleSkin.xml b/src/test/media/SimpleSkin.xml new file mode 100644 index 0000000..3f21274 --- /dev/null +++ b/src/test/media/SimpleSkin.xml @@ -0,0 +1,83 @@ +<skin> + <fontdef id="stdFont" font="Bitstream Vera Sans" variant="Roman" fontsize="12" + color="000000" letterspacing="0" linespacing="-1"/> + <fontdef id="downFont" baseid="stdFont" color="CCCCCC"/> + <fontdef id="disabledFont" baseid="stdFont" color="444444"/> + <textbutton + upSrc="button_bg_up.png" + downSrc="button_bg_down.png" + font="stdFont" + downFont="downFont" + disabledFont="disabledFont" + endsExtent="(7,7)"/> + <slider> + <horizontal + trackSrc="slider_horiz_track.png" + trackDisabledSrc="slider_horiz_track_disabled.png" + trackEndsExtent="6" + thumbUpSrc="slider_thumb_up.png" + thumbDownSrc="slider_thumb_down.png"/> + <vertical + trackSrc="slider_vert_track.png" + trackDisabledSrc="slider_vert_track_disabled.png" + trackEndsExtent="6" + thumbUpSrc="slider_thumb_up.png" + thumbDownSrc="slider_thumb_down.png"/> + </slider> + <scrollbar> + <horizontal + trackSrc="scrollbar_horiz_track.png" + trackDisabledSrc="scrollbar_horiz_track_disabled.png" + trackEndsExtent="2" + thumbUpSrc="scrollbar_horiz_thumb_up.png" + thumbDownSrc="scrollbar_horiz_thumb_down.png" + thumbEndsExtent="4"/> + <vertical + trackSrc="scrollbar_vert_track.png" + trackDisabledSrc="scrollbar_vert_track_disabled.png" + trackEndsExtent="2" + thumbUpSrc="scrollbar_vert_thumb_up.png" + thumbDownSrc="scrollbar_vert_thumb_down.png" + thumbEndsExtent="4"/> + </scrollbar> + <progressbar> + <horizontal + trackSrc="scrollbar_horiz_track.png" + trackEndsExtent="2" + thumbUpSrc="scrollbar_horiz_thumb_up.png" + thumbDisabledSrc="scrollbar_vert_thumb_down.png" + thumbEndsExtent="4"/> + <vertical + trackSrc="scrollbar_vert_track.png" + trackEndsExtent="2" + thumbUpSrc="scrollbar_vert_thumb_up.png" + thumbDisabledSrc="scrollbar_vert_thumb_down.png" + thumbEndsExtent="4"/> + </progressbar> + <scrollarea + borderSrc="scrollarea_border.png" + borderEndsExtent="(8,8)" + margins="(1,1,8,8)" + friction="-1" + sensitiveScrollBars="True"/> + <checkbox + uncheckedUpSrc="checkbox_unchecked_up.png" + uncheckedDownSrc="checkbox_unchecked_down.png" + uncheckedDisabledSrc="checkbox_unchecked_disabled.png" + checkedUpSrc="checkbox_checked_up.png" + checkedDownSrc="checkbox_checked_down.png" + checkedDisabledSrc="checkbox_checked_disabled.png" + font="stdFont" + downFont="stdFont" + disabledFont="disabledFont"/> + <mediacontrol + playUpSrc="play_button_up.png" + playDownSrc="play_button_down.png" + pauseUpSrc="pause_button_up.png" + pauseDownSrc="pause_button_down.png" + font="stdFont" + timePos="(15,0)" + timeLeftPos="(-42,0)" + barPos="(55,2)" + barRight="-45"/> +</skin> diff --git a/src/test/media/button_bg_down.png b/src/test/media/button_bg_down.png Binary files differnew file mode 100644 index 0000000..81cbb0f --- /dev/null +++ b/src/test/media/button_bg_down.png diff --git a/src/test/media/button_bg_up.png b/src/test/media/button_bg_up.png Binary files differnew file mode 100644 index 0000000..91cfe04 --- /dev/null +++ b/src/test/media/button_bg_up.png diff --git a/src/test/button_check.png b/src/test/media/button_check.png Binary files differindex b0aa4a9..b0aa4a9 100644 --- a/src/test/button_check.png +++ b/src/test/media/button_check.png diff --git a/src/test/button_disabled.png b/src/test/media/button_disabled.png Binary files differindex dbf1309..dbf1309 100644 --- a/src/test/button_disabled.png +++ b/src/test/media/button_disabled.png diff --git a/src/test/button_down.png b/src/test/media/button_down.png Binary files differindex 88ee5f5..88ee5f5 100644 --- a/src/test/button_down.png +++ b/src/test/media/button_down.png diff --git a/src/test/button_over.png b/src/test/media/button_over.png Binary files differindex 0837e8e..0837e8e 100644 --- a/src/test/button_over.png +++ b/src/test/media/button_over.png diff --git a/src/test/button_up.png b/src/test/media/button_up.png Binary files differindex aa7d33a..aa7d33a 100644 --- a/src/test/button_up.png +++ b/src/test/media/button_up.png diff --git a/src/test/media/checkbox_checked_disabled.png b/src/test/media/checkbox_checked_disabled.png Binary files differnew file mode 100644 index 0000000..da58829 --- /dev/null +++ b/src/test/media/checkbox_checked_disabled.png diff --git a/src/test/media/checkbox_checked_down.png b/src/test/media/checkbox_checked_down.png Binary files differnew file mode 100644 index 0000000..4fbbd83 --- /dev/null +++ b/src/test/media/checkbox_checked_down.png diff --git a/src/test/media/checkbox_checked_up.png b/src/test/media/checkbox_checked_up.png Binary files differnew file mode 100644 index 0000000..ca901f4 --- /dev/null +++ b/src/test/media/checkbox_checked_up.png diff --git a/src/test/media/checkbox_unchecked_disabled.png b/src/test/media/checkbox_unchecked_disabled.png Binary files differnew file mode 100644 index 0000000..e8c2116 --- /dev/null +++ b/src/test/media/checkbox_unchecked_disabled.png diff --git a/src/test/media/checkbox_unchecked_down.png b/src/test/media/checkbox_unchecked_down.png Binary files differnew file mode 100644 index 0000000..69f8282 --- /dev/null +++ b/src/test/media/checkbox_unchecked_down.png diff --git a/src/test/media/checkbox_unchecked_up.png b/src/test/media/checkbox_unchecked_up.png Binary files differnew file mode 100644 index 0000000..e354492 --- /dev/null +++ b/src/test/media/checkbox_unchecked_up.png diff --git a/src/test/checker.png b/src/test/media/checker.png Binary files differindex 4f100c5..4f100c5 100644 --- a/src/test/checker.png +++ b/src/test/media/checker.png diff --git a/src/test/media/chromakey-median.png b/src/test/media/chromakey-median.png Binary files differnew file mode 100644 index 0000000..5858c4b --- /dev/null +++ b/src/test/media/chromakey-median.png diff --git a/src/test/media/chromakey.png b/src/test/media/chromakey.png Binary files differnew file mode 100644 index 0000000..b2cfc2e --- /dev/null +++ b/src/test/media/chromakey.png diff --git a/src/test/colorramp.png b/src/test/media/colorramp.png Binary files differindex da12725..da12725 100644 --- a/src/test/colorramp.png +++ b/src/test/media/colorramp.png diff --git a/src/test/media/core b/src/test/media/core Binary files differnew file mode 100644 index 0000000..a3b4f7b --- /dev/null +++ b/src/test/media/core diff --git a/src/test/crop_bkgd.png b/src/test/media/crop_bkgd.png Binary files differindex 89f9e95..89f9e95 100644 --- a/src/test/crop_bkgd.png +++ b/src/test/media/crop_bkgd.png diff --git a/src/test/media/dilation.png b/src/test/media/dilation.png Binary files differnew file mode 100644 index 0000000..7981594 --- /dev/null +++ b/src/test/media/dilation.png diff --git a/src/test/media/erosion.png b/src/test/media/erosion.png Binary files differnew file mode 100644 index 0000000..899e2c4 --- /dev/null +++ b/src/test/media/erosion.png diff --git a/src/test/media/filterwipeborder.png b/src/test/media/filterwipeborder.png Binary files differnew file mode 100644 index 0000000..58ac84d --- /dev/null +++ b/src/test/media/filterwipeborder.png diff --git a/src/test/media/flat.png b/src/test/media/flat.png Binary files differnew file mode 100644 index 0000000..51d2c55 --- /dev/null +++ b/src/test/media/flat.png diff --git a/src/test/media/floodfill.png b/src/test/media/floodfill.png Binary files differnew file mode 100644 index 0000000..6a9e5b5 --- /dev/null +++ b/src/test/media/floodfill.png diff --git a/src/test/freidrehen.jpg b/src/test/media/freidrehen.jpg Binary files differindex 7f93bf0..7f93bf0 100644 --- a/src/test/freidrehen.jpg +++ b/src/test/media/freidrehen.jpg diff --git a/src/test/greyscale.png b/src/test/media/greyscale.png Binary files differindex f86a18b..f86a18b 100644 --- a/src/test/greyscale.png +++ b/src/test/media/greyscale.png diff --git a/src/test/media/h264-48x48.h264 b/src/test/media/h264-48x48.h264 Binary files differnew file mode 100644 index 0000000..d650960 --- /dev/null +++ b/src/test/media/h264-48x48.h264 diff --git a/src/test/media/hsl.png b/src/test/media/hsl.png Binary files differnew file mode 100644 index 0000000..9621451 --- /dev/null +++ b/src/test/media/hsl.png diff --git a/src/test/media/i8-64x64.png b/src/test/media/i8-64x64.png Binary files differnew file mode 100644 index 0000000..ec88c8c --- /dev/null +++ b/src/test/media/i8-64x64.png diff --git a/src/test/media/incompleteSkinMedia/IncompleteSkin.xml b/src/test/media/incompleteSkinMedia/IncompleteSkin.xml new file mode 100644 index 0000000..019d702 --- /dev/null +++ b/src/test/media/incompleteSkinMedia/IncompleteSkin.xml @@ -0,0 +1,11 @@ +<skin> +<scrollbar> + <horizontal + trackSrc="scrollbar_horiz_track.png" + trackDisabledSrc="scrollbar_horiz_track_disabled.png" + trackEndsExtent="2" + thumbUpSrc="scrollbar_horiz_thumb_up.png" + thumbDownSrc="scrollbar_horiz_thumb_down.png" + thumbEndsExtent="4"/> +</scrollbar> +</skin> diff --git a/src/test/media/incompleteSkinMedia/scrollbar_horiz_thumb_down.png b/src/test/media/incompleteSkinMedia/scrollbar_horiz_thumb_down.png Binary files differnew file mode 100644 index 0000000..6dc6fd1 --- /dev/null +++ b/src/test/media/incompleteSkinMedia/scrollbar_horiz_thumb_down.png diff --git a/src/test/media/incompleteSkinMedia/scrollbar_horiz_thumb_up.png b/src/test/media/incompleteSkinMedia/scrollbar_horiz_thumb_up.png Binary files differnew file mode 100644 index 0000000..eb6b005 --- /dev/null +++ b/src/test/media/incompleteSkinMedia/scrollbar_horiz_thumb_up.png diff --git a/src/test/media/incompleteSkinMedia/scrollbar_horiz_track.png b/src/test/media/incompleteSkinMedia/scrollbar_horiz_track.png Binary files differnew file mode 100644 index 0000000..d2f393b --- /dev/null +++ b/src/test/media/incompleteSkinMedia/scrollbar_horiz_track.png diff --git a/src/test/media/incompleteSkinMedia/scrollbar_horiz_track_disabled.png b/src/test/media/incompleteSkinMedia/scrollbar_horiz_track_disabled.png Binary files differnew file mode 100644 index 0000000..7ac86fe --- /dev/null +++ b/src/test/media/incompleteSkinMedia/scrollbar_horiz_track_disabled.png diff --git a/src/test/keyboard_bg.png b/src/test/media/keyboard_bg.png Binary files differindex a767d06..a767d06 100644 --- a/src/test/keyboard_bg.png +++ b/src/test/media/keyboard_bg.png diff --git a/src/test/keyboard_ovl.png b/src/test/media/keyboard_down.png Binary files differindex f3ead71..f3ead71 100644 --- a/src/test/keyboard_ovl.png +++ b/src/test/media/keyboard_down.png diff --git a/src/test/media/keyboard_feedback.png b/src/test/media/keyboard_feedback.png Binary files differnew file mode 100644 index 0000000..e519594 --- /dev/null +++ b/src/test/media/keyboard_feedback.png diff --git a/src/test/mask.png b/src/test/media/mask.png Binary files differindex 031b39a..031b39a 100644 --- a/src/test/mask.png +++ b/src/test/media/mask.png diff --git a/src/test/mask1.png b/src/test/media/mask1.png Binary files differindex ffe5618..ffe5618 100644 --- a/src/test/mask1.png +++ b/src/test/media/mask1.png diff --git a/src/test/mask2.png b/src/test/media/mask2.png Binary files differindex 92975df..92975df 100644 --- a/src/test/mask2.png +++ b/src/test/media/mask2.png diff --git a/src/test/media/mjpeg-48x48.avi b/src/test/media/mjpeg-48x48.avi Binary files differnew file mode 100644 index 0000000..337df16 --- /dev/null +++ b/src/test/media/mjpeg-48x48.avi diff --git a/src/test/media/mpeg1-48x48-sound.avi b/src/test/media/mpeg1-48x48-sound.avi Binary files differnew file mode 100644 index 0000000..be415db --- /dev/null +++ b/src/test/media/mpeg1-48x48-sound.avi diff --git a/src/test/media/mpeg1-48x48.mov b/src/test/media/mpeg1-48x48.mov Binary files differnew file mode 100644 index 0000000..16ab499 --- /dev/null +++ b/src/test/media/mpeg1-48x48.mov diff --git a/src/test/media/mpeg4-48x48.avi b/src/test/media/mpeg4-48x48.avi Binary files differnew file mode 100644 index 0000000..a906b17 --- /dev/null +++ b/src/test/media/mpeg4-48x48.avi diff --git a/src/test/oe.png b/src/test/media/oe.png Binary files differindex 3527967..3527967 100644 --- a/src/test/oe.png +++ b/src/test/media/oe.png diff --git a/src/test/media/pause_button_down.png b/src/test/media/pause_button_down.png Binary files differnew file mode 100644 index 0000000..c06b34a --- /dev/null +++ b/src/test/media/pause_button_down.png diff --git a/src/test/media/pause_button_up.png b/src/test/media/pause_button_up.png Binary files differnew file mode 100644 index 0000000..1a923b9 --- /dev/null +++ b/src/test/media/pause_button_up.png diff --git a/src/test/media/play_button_down.png b/src/test/media/play_button_down.png Binary files differnew file mode 100644 index 0000000..07b167b --- /dev/null +++ b/src/test/media/play_button_down.png diff --git a/src/test/media/play_button_up.png b/src/test/media/play_button_up.png Binary files differnew file mode 100644 index 0000000..e16ec9e --- /dev/null +++ b/src/test/media/play_button_up.png diff --git a/src/test/rect.svg b/src/test/media/rect.svg index 136b061..136b061 100644 --- a/src/test/rect.svg +++ b/src/test/media/rect.svg diff --git a/src/test/rectborder.png b/src/test/media/rectborder.png Binary files differindex 1675688..1675688 100644 --- a/src/test/rectborder.png +++ b/src/test/media/rectborder.png diff --git a/src/test/rgb24-32x32.png b/src/test/media/rgb24-32x32.png Binary files differindex c5d6711..c5d6711 100644 --- a/src/test/rgb24-32x32.png +++ b/src/test/media/rgb24-32x32.png diff --git a/src/test/rgb24-64x64.png b/src/test/media/rgb24-64x64.png Binary files differindex cca71fe..cca71fe 100644 --- a/src/test/rgb24-64x64.png +++ b/src/test/media/rgb24-64x64.png diff --git a/src/test/rgb24-65x65.png b/src/test/media/rgb24-65x65.png Binary files differindex ada2689..ada2689 100644 --- a/src/test/rgb24-65x65.png +++ b/src/test/media/rgb24-65x65.png diff --git a/src/test/rgb24alpha-32x32.png b/src/test/media/rgb24alpha-32x32.png Binary files differindex 2e9e6af..2e9e6af 100644 --- a/src/test/rgb24alpha-32x32.png +++ b/src/test/media/rgb24alpha-32x32.png diff --git a/src/test/rgb24alpha-64x64.png b/src/test/media/rgb24alpha-64x64.png Binary files differindex 41b69c3..41b69c3 100644 --- a/src/test/rgb24alpha-64x64.png +++ b/src/test/media/rgb24alpha-64x64.png diff --git a/src/test/media/rgba-48x48.mov b/src/test/media/rgba-48x48.mov Binary files differnew file mode 100644 index 0000000..7e311cc --- /dev/null +++ b/src/test/media/rgba-48x48.mov diff --git a/src/test/media/scrollarea_border.png b/src/test/media/scrollarea_border.png Binary files differnew file mode 100644 index 0000000..2e95f57 --- /dev/null +++ b/src/test/media/scrollarea_border.png diff --git a/src/test/media/scrollbar_horiz_thumb_disabled.png b/src/test/media/scrollbar_horiz_thumb_disabled.png Binary files differnew file mode 100644 index 0000000..4645372 --- /dev/null +++ b/src/test/media/scrollbar_horiz_thumb_disabled.png diff --git a/src/test/media/scrollbar_horiz_thumb_down.png b/src/test/media/scrollbar_horiz_thumb_down.png Binary files differnew file mode 100644 index 0000000..6dc6fd1 --- /dev/null +++ b/src/test/media/scrollbar_horiz_thumb_down.png diff --git a/src/test/media/scrollbar_horiz_thumb_up.png b/src/test/media/scrollbar_horiz_thumb_up.png Binary files differnew file mode 100644 index 0000000..eb6b005 --- /dev/null +++ b/src/test/media/scrollbar_horiz_thumb_up.png diff --git a/src/test/media/scrollbar_horiz_track.png b/src/test/media/scrollbar_horiz_track.png Binary files differnew file mode 100644 index 0000000..d2f393b --- /dev/null +++ b/src/test/media/scrollbar_horiz_track.png diff --git a/src/test/media/scrollbar_horiz_track_disabled.png b/src/test/media/scrollbar_horiz_track_disabled.png Binary files differnew file mode 100644 index 0000000..7ac86fe --- /dev/null +++ b/src/test/media/scrollbar_horiz_track_disabled.png diff --git a/src/test/media/scrollbar_vert_thumb_disabled.png b/src/test/media/scrollbar_vert_thumb_disabled.png Binary files differnew file mode 100644 index 0000000..f375a2b --- /dev/null +++ b/src/test/media/scrollbar_vert_thumb_disabled.png diff --git a/src/test/media/scrollbar_vert_thumb_down.png b/src/test/media/scrollbar_vert_thumb_down.png Binary files differnew file mode 100644 index 0000000..c7b09d1 --- /dev/null +++ b/src/test/media/scrollbar_vert_thumb_down.png diff --git a/src/test/media/scrollbar_vert_thumb_up.png b/src/test/media/scrollbar_vert_thumb_up.png Binary files differnew file mode 100644 index 0000000..f6c2f88 --- /dev/null +++ b/src/test/media/scrollbar_vert_thumb_up.png diff --git a/src/test/media/scrollbar_vert_track.png b/src/test/media/scrollbar_vert_track.png Binary files differnew file mode 100644 index 0000000..58af284 --- /dev/null +++ b/src/test/media/scrollbar_vert_track.png diff --git a/src/test/media/scrollbar_vert_track_disabled.png b/src/test/media/scrollbar_vert_track_disabled.png Binary files differnew file mode 100644 index 0000000..695b112 --- /dev/null +++ b/src/test/media/scrollbar_vert_track_disabled.png diff --git a/src/test/shadow.png b/src/test/media/shadow.png Binary files differindex 0a4563f..0a4563f 100644 --- a/src/test/shadow.png +++ b/src/test/media/shadow.png diff --git a/src/test/media/slider_horiz_track.png b/src/test/media/slider_horiz_track.png Binary files differnew file mode 100644 index 0000000..6e233a5 --- /dev/null +++ b/src/test/media/slider_horiz_track.png diff --git a/src/test/media/slider_horiz_track_disabled.png b/src/test/media/slider_horiz_track_disabled.png Binary files differnew file mode 100644 index 0000000..01c880d --- /dev/null +++ b/src/test/media/slider_horiz_track_disabled.png diff --git a/src/test/media/slider_thumb_down.png b/src/test/media/slider_thumb_down.png Binary files differnew file mode 100644 index 0000000..1f2acc2 --- /dev/null +++ b/src/test/media/slider_thumb_down.png diff --git a/src/test/media/slider_thumb_up.png b/src/test/media/slider_thumb_up.png Binary files differnew file mode 100644 index 0000000..885506d --- /dev/null +++ b/src/test/media/slider_thumb_up.png diff --git a/src/test/media/slider_vert_track.png b/src/test/media/slider_vert_track.png Binary files differnew file mode 100644 index 0000000..51bac37 --- /dev/null +++ b/src/test/media/slider_vert_track.png diff --git a/src/test/media/slider_vert_track_disabled.png b/src/test/media/slider_vert_track_disabled.png Binary files differnew file mode 100644 index 0000000..bc8d7b6 --- /dev/null +++ b/src/test/media/slider_vert_track_disabled.png diff --git a/src/test/media/spike.png b/src/test/media/spike.png Binary files differnew file mode 100644 index 0000000..958e95d --- /dev/null +++ b/src/test/media/spike.png diff --git a/src/test/media/toggle_checked_Disabled.png b/src/test/media/toggle_checked_Disabled.png Binary files differnew file mode 100644 index 0000000..31372c0 --- /dev/null +++ b/src/test/media/toggle_checked_Disabled.png diff --git a/src/test/media/toggle_checked_Down.png b/src/test/media/toggle_checked_Down.png Binary files differnew file mode 100644 index 0000000..8c4afd2 --- /dev/null +++ b/src/test/media/toggle_checked_Down.png diff --git a/src/test/media/toggle_checked_Up.png b/src/test/media/toggle_checked_Up.png Binary files differnew file mode 100644 index 0000000..8214fcf --- /dev/null +++ b/src/test/media/toggle_checked_Up.png diff --git a/src/test/media/toggle_unchecked_Disabled.png b/src/test/media/toggle_unchecked_Disabled.png Binary files differnew file mode 100644 index 0000000..6b90e0b --- /dev/null +++ b/src/test/media/toggle_unchecked_Disabled.png diff --git a/src/test/media/toggle_unchecked_Down.png b/src/test/media/toggle_unchecked_Down.png Binary files differnew file mode 100644 index 0000000..f2e4272 --- /dev/null +++ b/src/test/media/toggle_unchecked_Down.png diff --git a/src/test/media/toggle_unchecked_Up.png b/src/test/media/toggle_unchecked_Up.png Binary files differnew file mode 100644 index 0000000..3a006ea --- /dev/null +++ b/src/test/media/toggle_unchecked_Up.png diff --git a/src/test/media/vp6a-yuva-48x48.flv b/src/test/media/vp6a-yuva-48x48.flv Binary files differnew file mode 100644 index 0000000..21866fe --- /dev/null +++ b/src/test/media/vp6a-yuva-48x48.flv diff --git a/src/test/widebmp.jpg b/src/test/media/widebmp.jpg Binary files differindex 8304e3d..8304e3d 100644 --- a/src/test/widebmp.jpg +++ b/src/test/media/widebmp.jpg diff --git a/src/test/panoimage.png b/src/test/panoimage.png Binary files differdeleted file mode 100644 index 118b573..0000000 --- a/src/test/panoimage.png +++ /dev/null diff --git a/src/test/plugin/ColorNode.cpp b/src/test/plugin/ColorNode.cpp index 7231c48..b98c98b 100644 --- a/src/test/plugin/ColorNode.cpp +++ b/src/test/plugin/ColorNode.cpp @@ -1,6 +1,6 @@ // // libavg - Media Playback Engine. -// Copyright (C) 2003-2011 Ulrich von Zadow +// 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 @@ -26,7 +26,7 @@ #include "../../player/Player.h" #include "../../player/AreaNode.h" -#include "../../player/NodeDefinition.h" +#include "../../player/TypeDefinition.h" #include "../../base/Logger.h" #include "../../graphics/OGLHelper.h" @@ -46,7 +46,7 @@ namespace avg { class ColorNode : public AreaNode { public: - static NodeDefinition createNodeDefinition(); + static void registerType(); ColorNode(const ArgList& Args); @@ -56,33 +56,34 @@ public: float getFloat() const; void setFloat(float f); - virtual void maybeRender(const DRect& Rect); - virtual void render (const DRect& Rect); + virtual void maybeRender(const glm::mat4& parentTransform); + virtual void render(); -protected: - void parseColor(const std::string& sColorSreing); - +private: std::string m_sFillColorName; - float m_r, m_g, m_b; + Pixel32 m_Color; float m_FloatParam; }; -ColorNode::ColorNode(const ArgList& Args) : - m_sFillColorName("FFFFFF") +ColorNode::ColorNode(const ArgList& Args) + : m_sFillColorName("FFFFFF") { - AVG_TRACE(Logger::PLUGIN, "ColorNode c'tor gets Argument fillcolor= " << Args.getArgVal<string>("fillcolor")); + AVG_TRACE(Logger::category::PLUGIN, Logger::severity::INFO, + "ColorNode c'tor gets Argument fillcolor= " << + Args.getArgVal<string>("fillcolor")); Args.setMembers(this); - AVG_TRACE(Logger::PLUGIN, "ColorNode constructed with " << m_sFillColorName); - - parseColor(m_sFillColorName); + AVG_TRACE(Logger::category::PLUGIN, Logger::severity::INFO, + "ColorNode constructed with " << m_sFillColorName); + m_Color = colorStringToColor(m_sFillColorName); } void ColorNode::setFillColor(const string& sFillColor) { - AVG_TRACE(Logger::PLUGIN, "setFillColor called with " << sFillColor); + AVG_TRACE(Logger::category::PLUGIN, Logger::severity::INFO, + "setFillColor called with " << sFillColor); m_sFillColorName = sFillColor; - parseColor(m_sFillColorName); + m_Color = colorStringToColor(m_sFillColorName); } const std::string& ColorNode::getFillColor() const @@ -101,37 +102,29 @@ void ColorNode::setFloat(float f) } -void ColorNode::parseColor(const std::string& sColorSreing) +void ColorNode::maybeRender(const glm::mat4& parentTransform) { - istringstream(sColorSreing.substr(0,2)) >> hex >> m_r; - istringstream(sColorSreing.substr(2,2)) >> hex >> m_g; - istringstream(sColorSreing.substr(4,2)) >> hex >> m_b; + render(); } - -void ColorNode::maybeRender(const DRect& rect) +void ColorNode::render() { - render(rect); -} - -void ColorNode::render(const DRect& rect) -{ - //AVG_TRACE(Logger::PLUGIN, "ColorNode::render"); - - glClearColor(m_r, m_g, m_b, 1.0); + glClearColor(m_Color.getR()/255., m_Color.getG()/255., m_Color.getB()/255., 1.0); glClear(GL_COLOR_BUFFER_BIT); } char colorNodeName[] = "colornode"; -NodeDefinition ColorNode::createNodeDefinition() +void ColorNode::registerType() { - return NodeDefinition("colornode", Node::buildNode<ColorNode>) - .extendDefinition(AreaNode::createDefinition()) + avg::TypeDefinition def = avg::TypeDefinition("colornode", "areanode", + ExportedObject::buildObject<ColorNode>) .addArg(Arg<float>("floatparam", 0.0f, false, offsetof(ColorNode, m_FloatParam))) .addArg(Arg<string>("fillcolor", "0F0F0F", false, offsetof(ColorNode, m_sFillColorName))); + const char* allowedParentNodeNames[] = {"avg", 0}; + avg::TypeRegistry::get()->registerType(def, allowedParentNodeNames); } } @@ -154,10 +147,7 @@ AVG_PLUGIN_API void registerPlugin() object colorModule(handle<>(PyImport_ImportModule("colorplugin"))); mainModule.attr("colorplugin") = colorModule; - avg::NodeDefinition myNodeDefinition = avg::ColorNode::createNodeDefinition(); - const char* allowedParentNodeNames[] = {"avg", 0}; + avg::ColorNode::registerType(); - // Register this node type - avg::Player::get()->registerNodeType(myNodeDefinition, allowedParentNodeNames); } diff --git a/src/test/plugin/Makefile.am b/src/test/plugin/Makefile.am index 7d2cd34..9aa10b1 100644 --- a/src/test/plugin/Makefile.am +++ b/src/test/plugin/Makefile.am @@ -1,19 +1,19 @@ - -INCLUDES = -I. -I../player \ - @XML2_CFLAGS@ @PTHREAD_CFLAGS@ @PANGOFT2_CFLAGS@ @PYTHON_INCLUDES@ @DC1394_2_CFLAGS@ +AM_CPPFLAGS = -I. -I../player \ + @XML2_CFLAGS@ @PTHREAD_CFLAGS@ @PANGOFT2_CFLAGS@ \ + @PYTHON_CPPFLAGS@ @DC1394_2_CFLAGS@ ALL_H = if APPLE XGL_LIBS = - EXTRA_LDFLAGS=-read_only_relocs suppress + EXTRA_LDFLAGS = -read_only_relocs suppress else XGL_LIBS = -lXxf86vm - EXTRA_LDFLAGS=-XCClinker ../../wrapper/.libs/avg.so + EXTRA_LDFLAGS = -XCClinker ../../wrapper/.libs/avg.so endif ALL_GL_LIBS = @GL_LIBS@ @SDL_LIBS@ $(XGL_LIBS) pkgpyexec_LTLIBRARIES = colorplugin.la -colorplugin_la_SOURCES = ColorNode.cpp -colorplugin_la_LDFLAGS = $(EXTRA_LDFLAGS) -module +colorplugin_la_SOURCES = ColorNode.cpp +colorplugin_la_LDFLAGS = $(EXTRA_LDFLAGS) -module diff --git a/src/test/plugin/Makefile.in b/src/test/plugin/Makefile.in index adac1e9..5376384 100644 --- a/src/test/plugin/Makefile.in +++ b/src/test/plugin/Makefile.in @@ -1,9 +1,9 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -41,11 +41,12 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ac_cxx_namespaces.m4 \ $(top_srcdir)/m4/ac_path_generic.m4 \ $(top_srcdir)/m4/ax_boost_thread.m4 \ - $(top_srcdir)/m4/ax_check_gl.m4 $(top_srcdir)/m4/libtool.m4 \ - $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ - $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ - $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/m4/python_dev.m4 \ - $(top_srcdir)/configure.in + $(top_srcdir)/m4/ax_check_gl.m4 \ + $(top_srcdir)/m4/ax_python_devel.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ + $(top_srcdir)/m4/avg_version.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs @@ -73,13 +74,19 @@ am__nobase_list = $(am__nobase_strip_setup); \ am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } am__installdirs = "$(DESTDIR)$(pkgpyexecdir)" LTLIBRARIES = $(pkgpyexec_LTLIBRARIES) colorplugin_la_LIBADD = am_colorplugin_la_OBJECTS = ColorNode.lo colorplugin_la_OBJECTS = $(am_colorplugin_la_OBJECTS) -AM_V_lt = $(am__v_lt_$(V)) -am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent colorplugin_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ @@ -95,21 +102,21 @@ LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) -AM_V_CXX = $(am__v_CXX_$(V)) -am__v_CXX_ = $(am__v_CXX_$(AM_DEFAULT_VERBOSITY)) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; -AM_V_at = $(am__v_at_$(V)) -am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -AM_V_CXXLD = $(am__v_CXXLD_$(V)) -am__v_CXXLD_ = $(am__v_CXXLD_$(AM_DEFAULT_VERBOSITY)) +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; -AM_V_GEN = $(am__v_GEN_$(V)) -am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(colorplugin_la_SOURCES) DIST_SOURCES = $(colorplugin_la_SOURCES) @@ -125,7 +132,7 @@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_PYTHON_LIBS = @BOOST_PYTHON_LIBS@ -BOOST_THREAD_LIB = @BOOST_THREAD_LIB@ +BOOST_THREAD_LIBS = @BOOST_THREAD_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ @@ -140,6 +147,7 @@ DC1394_2_CFLAGS = @DC1394_2_CFLAGS@ DC1394_2_LIBS = @DC1394_2_LIBS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ @@ -180,6 +188,7 @@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MTDEV_CFLAGS = @MTDEV_CFLAGS@ MTDEV_LIBS = @MTDEV_LIBS@ @@ -209,11 +218,13 @@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ PYTHON = @PYTHON@ +PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ -PYTHON_INCLUDES = @PYTHON_INCLUDES@ -PYTHON_LIBS = @PYTHON_LIBS@ +PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ +PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ @@ -236,6 +247,7 @@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ @@ -270,7 +282,6 @@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ @@ -294,8 +305,9 @@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -INCLUDES = -I. -I../player \ - @XML2_CFLAGS@ @PTHREAD_CFLAGS@ @PANGOFT2_CFLAGS@ @PYTHON_INCLUDES@ @DC1394_2_CFLAGS@ +AM_CPPFLAGS = -I. -I../player \ + @XML2_CFLAGS@ @PTHREAD_CFLAGS@ @PANGOFT2_CFLAGS@ \ + @PYTHON_CPPFLAGS@ @DC1394_2_CFLAGS@ ALL_H = @APPLE_FALSE@XGL_LIBS = -lXxf86vm @@ -304,8 +316,8 @@ ALL_H = @APPLE_TRUE@EXTRA_LDFLAGS = -read_only_relocs suppress ALL_GL_LIBS = @GL_LIBS@ @SDL_LIBS@ $(XGL_LIBS) pkgpyexec_LTLIBRARIES = colorplugin.la -colorplugin_la_SOURCES = ColorNode.cpp -colorplugin_la_LDFLAGS = $(EXTRA_LDFLAGS) -module +colorplugin_la_SOURCES = ColorNode.cpp +colorplugin_la_LDFLAGS = $(EXTRA_LDFLAGS) -module all: all-am .SUFFIXES: @@ -371,7 +383,7 @@ clean-pkgpyexecLTLIBRARIES: echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done -colorplugin.la: $(colorplugin_la_OBJECTS) $(colorplugin_la_DEPENDENCIES) +colorplugin.la: $(colorplugin_la_OBJECTS) $(colorplugin_la_DEPENDENCIES) $(EXTRA_colorplugin_la_DEPENDENCIES) $(AM_V_CXXLD)$(colorplugin_la_LINK) -rpath $(pkgpyexecdir) $(colorplugin_la_OBJECTS) $(colorplugin_la_LIBADD) $(LIBS) mostlyclean-compile: @@ -385,26 +397,23 @@ distclean-compile: .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo @@ -511,10 +520,15 @@ install-am: all-am installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi mostlyclean-generic: clean-generic: diff --git a/src/test/rgb24alpha.tif b/src/test/rgb24alpha.tif Binary files differdeleted file mode 100644 index b37829d..0000000 --- a/src/test/rgb24alpha.tif +++ /dev/null diff --git a/src/test/testapp.py b/src/test/testapp.py index e5bc46d..251ab47 100644 --- a/src/test/testapp.py +++ b/src/test/testapp.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- # libavg - Media Playback Engine. -# Copyright (C) 2003-2011 Ulrich von Zadow +# 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 @@ -24,12 +24,13 @@ import unittest import optparse import os +import sys -import libavg +from libavg import avg, player import testcase -class TestApp: +class TestApp(object): EXIT_OK = 0 EXIT_FAILURE = 1 @@ -45,7 +46,7 @@ class TestApp: self.__testSuite = unittest.TestSuite() self.__optionParser = None self.__commandlineOptions = None - self.__player = libavg.avg.Player.get() + player.keepWindowOpen() def getSuiteFactory(self, name): return self.__registerdSuiteFactoriesDict[name] @@ -80,7 +81,7 @@ class TestApp: yield self.__RegisterdSuitesDict[name] def __runVideoTest(self): - self.__player.loadFile("image.avg") + player.loadFile("image.avg") def __run(self): testRunner = unittest.TextTestRunner(verbosity = 2) @@ -92,7 +93,12 @@ class TestApp: for test in suite: if test.skipped(): numSkipped += 1 - print "Skipped", numSkipped, "tests." + if numSkipped > 0: + sys.stderr.write("Skipped "+str(numSkipped)+" tests:\n") + for suite in self.__testSuite: + for test in suite: + if test.skipped(): + print " " + str(test) + ": " + test.skipReason() if testResult.wasSuccessful(): self.__exitOk = TestApp.EXIT_OK @@ -105,43 +111,57 @@ class TestApp: self.__populateTestSuite() def __setupGlobalPlayerOptions(self): - self.__player.setOGLOptions(self.__commandlineOptions.usepow2textures, - self.__commandlineOptions.useshaders, - self.__commandlineOptions.usepixelbuffers, - 1) - + if self.__commandlineOptions.shaderusage == "FULL": + shaderUsage = avg.SHADERUSAGE_FULL + elif self.__commandlineOptions.shaderusage == "MINIMAL": + shaderUsage = avg.SHADERUSAGE_MINIMAL + elif self.__commandlineOptions.shaderusage == "FRAGMENT_ONLY": + shaderUsage = avg.SHADERUSAGE_FRAGMENT_ONLY + elif self.__commandlineOptions.shaderusage == "AUTO": + shaderUsage = avg.SHADERUSAGE_AUTO + else: + sys.stderr.write("\nUnknown value for --shaderusage command-line parameter.\n") + self.__optionParser.print_help() + sys.exit(-1) + + player.setOGLOptions(self.__commandlineOptions.usepow2textures, + self.__commandlineOptions.usepixelbuffers, 1, shaderUsage, True) + def __setupCommandlineParser(self): self.__optionParser = optparse.OptionParser( usage = '%prog [options] [<suite> [testcase] [testcase] [...]]') - + self.__optionParser.add_option("--usepow2textures", - dest = "usepow2textures", - action = 'store_true', - default = False, - help = "Use power of 2 textures") + dest = "usepow2textures", + action = 'store_true', + default = False, + help = "Use power of 2 textures") - self.__optionParser.add_option("--noshaders", - dest = "useshaders", - action = 'store_false', - default = True, - help = "Use shaders") - self.__optionParser.add_option("--nopixelbuffers", - dest = "usepixelbuffers", - action = 'store_false', - default = True, - help = "Use pixel buffers") + dest = "usepixelbuffers", + action = 'store_false', + default = True, + help = "Use pixel buffers") + + self.__optionParser.add_option("--shaderusage", + dest = "shaderusage", + default = "AUTO", + help = "Configure usage of shaders. Valid values are FULL, MINIMAL, FRAGMENT_ONLY and AUTO.") def __parseCommandline(self): self.__commandlineOptions, args = self.__optionParser.parse_args() - + + # MFX 2013-11-10: cleanup argv consuming testapp args to avoid clashes + # with libavg.app.App ArgvExtender + sys.argv = [sys.argv[0]] + if len(args): # suite suiteFactory = args.pop(0) if not(self.isSuiteFactoryRegistered(suiteFactory)): - print "Unknown test suite, registered suites:" + sys.stderr.write("Unknown test suite, registered suites:\n") for factory in self.getSuiteFactoryNames(): - print factory - print '' + sys.stderr.write(factory+"\n") + sys.stderr.write("\n") self.__optionParser.print_usage() self.__suitesToRun.append(self.getSuiteFactory(suiteFactory)) @@ -155,14 +175,17 @@ class TestApp: self.__testSuite.addTest(suite(self.__suitesTestSubsets)) def __dumpConfig(self): - log = libavg.avg.Logger.get() - log.pushCategories() - log.setCategories(log.APP | log.WARNING | log.CONFIG | 0) - self.__player.loadString(""" + player.enableGLErrorChecks(True) + cats = avg.logger.getCategories() + for cat in [avg.logger.Category.APP, avg.logger.Category.CONFIG, + avg.logger.Category.DEPREC]: + avg.logger.configureCategory(cat, avg.logger.Severity.INFO) + player.loadString(""" <avg id="avg" width="160" height="120"> </avg> """) - self.__player.setTimeout(0, self.__player.stop) - self.__player.setFramerate(10000) - self.__player.play() - log.popCategories() + player.setTimeout(0, player.stop) + player.setFramerate(10000) + player.play() + for cat, severity in cats.iteritems(): + avg.logger.configureCategory(cat, severity) diff --git a/src/test/testcase.py b/src/test/testcase.py index f9044a3..7e07279 100644 --- a/src/test/testcase.py +++ b/src/test/testcase.py @@ -1,7 +1,7 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # libavg - Media Playback Engine. -# Copyright (C) 2003-2011 Ulrich von Zadow +# 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 @@ -26,9 +26,7 @@ import sys import os import math -from libavg import avg - -g_HasShaderSupport = None +from libavg import avg, player def almostEqual(a, b, epsilon): try: @@ -56,6 +54,22 @@ def flatten(l): return ltype(l) +class MouseEmulator(object): + def __init__(self): + self.btnStates = [False, False, False] + + def sendMouseEvent(self, type_, x, y, btn=1): + helper = player.getTestHelper() + index = btn-1 + if type_ == avg.Event.CURSOR_UP: + self.btnStates[index] = False + if type_ == avg.Event.CURSOR_DOWN: + self.btnStates[index] = True + + helper.fakeMouseEvent(type_, self.btnStates[0], self.btnStates[1], + self.btnStates[2], x, y, btn) + + class AVGTestCase(unittest.TestCase): imageResultDirectory = "resultimages" baselineImageResultDirectory = "baseline" @@ -63,14 +77,16 @@ class AVGTestCase(unittest.TestCase): def __init__(self, testFuncName): unittest.TestCase.__init__(self, testFuncName) - self.__player = avg.Player.get() + player.enableGLErrorChecks(True) self.__testFuncName = testFuncName - self.__logger = avg.Logger.get() + self.__logger = avg.logger self.__skipped = False + self.__warnOnImageDiff = False + self.__mouseEmulator = None def __setupPlayer(self): - self.__player.setMultiSampleSamples(1) - self.__player.setResolution(0, 0, 0, 0) + player.setMultiSampleSamples(1) + player.setResolution(0, 0, 0, 0) @staticmethod def setImageResultDirectory(name): @@ -93,64 +109,57 @@ class AVGTestCase(unittest.TestCase): except OSError: pass - @staticmethod - def setBaselineImageDirectory(name): - AVGTestCase.baselineImageResultDirectory = name - - @staticmethod - def getBaselineImageDir(): - return AVGTestCase.baselineImageResultDirectory - - def start(self, actions): + def start(self, warnOnImageDiff, actions): self.__setupPlayer() self.__dumpTestFrames = (os.getenv("AVG_DUMP_TEST_FRAMES") != None) self.__delaying = False + self.__warnOnImageDiff = warnOnImageDiff - self.assert_(self.__player.isPlaying() == 0) + self.assert_(player.isPlaying() == 0) self.actions = flatten(actions) self.curFrame = 0 - self.__player.setOnFrameHandler(self.__nextAction) - self.__player.setFramerate(10000) - self.__player.play() - self.assert_(self.__player.isPlaying() == 0) + player.subscribe(player.ON_FRAME, self.__nextAction) + player.setFramerate(10000) + player.assumePixelsPerMM(1) + player.play() + self.assert_(player.isPlaying() == 0) def delay(self, time): def timeout(): self.__delaying = False self.__delaying = True - self.__player.setTimeout(time, timeout) + player.setTimeout(time, timeout) - def compareImage(self, fileName, warn): - bmp = self.__player.screenshot() - self.compareBitmapToFile(bmp, fileName, warn) + def compareImage(self, fileName): + bmp = player.screenshot() + self.compareBitmapToFile(bmp, fileName) - def compareBitmapToFile(self, bmp, fileName, warn): + def compareBitmapToFile(self, bmp, fileName): try: - baselineBmp = avg.Bitmap(AVGTestCase.getBaselineImageDir() + "/" + fileName - + ".png") - diffBmp = bmp.subtract(baselineBmp) - average = diffBmp.getAvg() - stdDev = diffBmp.getStdDev() - if (average > 0.1 or stdDev > 0.5): - if self._isCurrentDirWriteable(): - bmp.save(AVGTestCase.getImageResultDir() + "/" + fileName + ".png") - baselineBmp.save(AVGTestCase.getImageResultDir() + "/" + fileName - + "_baseline.png") - diffBmp.save(AVGTestCase.getImageResultDir() + "/" + fileName - + "_diff.png") - if (average > 2 or stdDev > 6): - msg = (" "+fileName+ - ": Difference image has avg=%(avg).2f, std dev=%(stddev).2f"% - {'avg':average, 'stddev':stdDev}) - if warn: - print msg - else: - self.fail(msg) + baselineBmp = avg.Bitmap(AVGTestCase.baselineImageResultDirectory + "/" + + fileName + ".png") except RuntimeError: bmp.save(AVGTestCase.getImageResultDir()+"/"+fileName+".png") - self.__logger.trace(self.__logger.WARNING, - "Could not load image "+fileName+".png") + self.__logger.warning("Could not load image "+fileName+".png") raise + diffBmp = bmp.subtract(baselineBmp) + average = diffBmp.getAvg() + stdDev = diffBmp.getStdDev() + if (average > 0.1 or stdDev > 0.5): + if self._isCurrentDirWriteable(): + bmp.save(AVGTestCase.getImageResultDir() + "/" + fileName + ".png") + baselineBmp.save(AVGTestCase.getImageResultDir() + "/" + fileName + + "_baseline.png") + diffBmp.save(AVGTestCase.getImageResultDir() + "/" + fileName + + "_diff.png") + if (average > 2 or stdDev > 6): + msg = (" "+fileName+ + ": Difference image has avg=%(avg).2f, std dev=%(stddev).2f"% + {'avg':average, 'stddev':stdDev}) + if self.__warnOnImageDiff: + sys.stderr.write("\n"+msg+"\n") + else: + self.fail(msg) def areSimilarBmps(self, bmp1, bmp2, maxAvg, maxStdDev): diffBmp = bmp1.subtract(bmp2) @@ -164,16 +173,19 @@ class AVGTestCase(unittest.TestCase): code() except: exceptionRaised = True + self.assert_(exceptionRaised) - def assertAlmostEqual(self, a, b, epsilon=0.000001): + def assertAlmostEqual(self, a, b, epsilon=0.00001): if not(almostEqual(a, b, epsilon)): msg = "almostEqual: " + str(a) + " != " + str(b) self.fail(msg) def loadEmptyScene(self, resolution=(160,120)): - self.__player.createMainCanvas(size=resolution) - return self.__player.getRootNode() + player.createMainCanvas(size=resolution) + root = player.getRootNode() + root.mediadir = "media" + return root def initDefaultImageScene(self): root = self.loadEmptyScene() @@ -184,58 +196,62 @@ class AVGTestCase(unittest.TestCase): avg.ImageNode(id="test1", pos=(129,30), href="rgb24-65x65.png", parent=root) def fakeClick(self, x, y): - helper = self.__player.getTestHelper() - helper.fakeMouseEvent(avg.CURSORDOWN, True, False, False, x, y, 1) - helper.fakeMouseEvent(avg.CURSORUP, False, False, False, x, y, 1) + helper = player.getTestHelper() + helper.fakeMouseEvent(avg.Event.CURSOR_DOWN, True, False, False, x, y, 1) + helper.fakeMouseEvent(avg.Event.CURSOR_UP, False, False, False, x, y, 1) def skip(self, message): + self.__skipReason = str(message) sys.stderr.write("skipping: " + str(message) + " ... ") self.__skipped = True def skipped(self): return self.__skipped - def _sendMouseEvent(self, type, x, y): - helper = self.__player.getTestHelper() - if type == avg.CURSORUP: - button = False - else: - button = True - helper.fakeMouseEvent(type, button, False, False, x, y, 1) + def skipReason(self): + return self.__skipReason + + def skipIfMinimalShader(self): + if not(player.areFullShadersSupported()): + self.skip("Not supported if ShaderUsage == MINIMAL") + player.stop() + return + + def _sendMouseEvent(self, type, x, y, btn=1): + if not self.__mouseEmulator: + self.__mouseEmulator = MouseEmulator() + self.__mouseEmulator.sendMouseEvent(type, x, y, btn) def _sendTouchEvent(self, id, type, x, y): - helper = self.__player.getTestHelper() - helper.fakeTouchEvent(id, type, avg.TOUCH, avg.Point2D(x, y)) + helper = player.getTestHelper() + helper.fakeTouchEvent(id, type, avg.Event.TOUCH, avg.Point2D(x, y)) def _sendTouchEvents(self, eventData): - helper = self.__player.getTestHelper() + helper = player.getTestHelper() for (id, type, x, y) in eventData: - helper.fakeTouchEvent(id, type, avg.TOUCH, avg.Point2D(x, y)) + helper.fakeTouchEvent(id, type, avg.Event.TOUCH, avg.Point2D(x, y)) + + def _genMouseEventFrames(self, type, x, y, expectedEvents): + return [ + lambda: self._sendMouseEvent(type, x, y), + lambda: self.messageTester.assertState(expectedEvents), + ] + def _genTouchEventFrames(self, eventData, expectedEvents): + return [ + lambda: self._sendTouchEvents(eventData), + lambda: self.messageTester.assertState(expectedEvents), + ] def _isCurrentDirWriteable(self): return bool(os.access('.', os.W_OK)) - def _hasShaderSupport(self): - # XXX Duplicated code with FXTest.areFXSupported() - def checkShaderSupport(): - global g_HasShaderSupport - g_HasShaderSupport = self.__player.isUsingShaders() - - global g_HasShaderSupport - if g_HasShaderSupport == None: - self.loadEmptyScene() - self.start([checkShaderSupport,]) - if not(g_HasShaderSupport): - self.skip("no shader support") - return g_HasShaderSupport - def __nextAction(self): if not(self.__delaying): if self.__dumpTestFrames: - self.__logger.trace(self.__logger.APP, "Frame "+str(self.curFrame)) + self.__logger.log("Frame "+str(self.curFrame)) if len(self.actions) == self.curFrame: - self.__player.stop() + player.stop() else: action = self.actions[self.curFrame] if action != None: @@ -250,7 +266,7 @@ def createAVGTestSuite(availableTests, AVGTestCaseClass, testSubset): if testName in availableTests: testNames.append(testName) else: - print "no test named %s" % testName + sys.stderr.write(("No test named %s"%testName) + "\n") sys.exit(1) else: testNames = availableTests @@ -262,66 +278,74 @@ def createAVGTestSuite(availableTests, AVGTestCaseClass, testSubset): return suite -class NodeHandlerTester: +class NodeHandlerTester(object): def __init__(self, testCase, node): - self.__testCase=testCase + self.__testCase = testCase self.reset() self.__node = node + self.__subscriberIDs = set() self.setHandlers() + self.__messagesReceived = set() - def assertState(self, down, up, over, out, move): - self.__testCase.assert_(down == self.__downCalled) - self.__testCase.assert_(up == self.__upCalled) - self.__testCase.assert_(over == self.__overCalled) - self.__testCase.assert_(out == self.__outCalled) - self.__testCase.assert_(move == self.__moveCalled) - self.__testCase.assert_(not(self.__touchDownCalled)) + def assertState(self, expectedMessages): + self.__testCase.assert_(self.isState(expectedMessages)) self.reset() + def isState(self, expectedMessages): + expectedMessages = set(expectedMessages) + if expectedMessages != self.__messagesReceived: + sys.stderr.write("\nState expected: "+str(expectedMessages)+"\n") + sys.stderr.write("Actual state: "+str(self.__messagesReceived)+"\n") + return False + else: + return True + def reset(self): - self.__upCalled=False - self.__downCalled=False - self.__overCalled=False - self.__outCalled=False - self.__moveCalled=False - self.__touchDownCalled=False + self.__messagesReceived = set() def setHandlers(self): - self.__node.setEventHandler(avg.CURSORDOWN, avg.MOUSE, self.__onDown) - self.__node.setEventHandler(avg.CURSORUP, avg.MOUSE, self.__onUp) - self.__node.setEventHandler(avg.CURSOROVER, avg.MOUSE, self.__onOver) - self.__node.setEventHandler(avg.CURSOROUT, avg.MOUSE, self.__onOut) - self.__node.setEventHandler(avg.CURSORMOTION, avg.MOUSE, self.__onMove) - self.__node.setEventHandler(avg.CURSORDOWN, avg.TOUCH, self.__onTouchDown) + messageIDs = [avg.Node.CURSOR_DOWN, avg.Node.CURSOR_UP, avg.Node.CURSOR_OVER, + avg.Node.CURSOR_OUT, avg.Node.CURSOR_MOTION] + for messageID in messageIDs: + subscriberID = self.__node.subscribe(messageID, + lambda event, messageID=messageID: + self.setMessageReceived(messageID, event)) + self.__subscriberIDs.add(subscriberID) def clearHandlers(self): - self.__node.setEventHandler(avg.CURSORDOWN, avg.MOUSE, None) - self.__node.setEventHandler(avg.CURSORUP, avg.MOUSE, None) - self.__node.setEventHandler(avg.CURSOROVER, avg.MOUSE, None) - self.__node.setEventHandler(avg.CURSOROUT, avg.MOUSE, None) - self.__node.setEventHandler(avg.CURSORMOTION, avg.MOUSE, None) - self.__node.setEventHandler(avg.CURSORDOWN, avg.TOUCH, None) - - def __onDown(self, Event): - self.__testCase.assert_(Event.type == avg.CURSORDOWN) - self.__downCalled = True - - def __onUp(self, Event): - self.__testCase.assert_(Event.type == avg.CURSORUP) - self.__upCalled = True + for subscriber in self.__subscriberIDs: + self.__node.unsubscribe(subscriber) + self.__subscriberIDs = set() - def __onOver(self, Event): - self.__testCase.assert_(Event.type == avg.CURSOROVER) - self.__overCalled = True + def setMessageReceived(self, messageID, event): + self.__messagesReceived.add(messageID) - def __onOut(self, Event): - self.__testCase.assert_(Event.type == avg.CURSOROUT) - self.__outCalled = True - - def __onMove(self, Event): - self.__testCase.assert_(Event.type == avg.CURSORMOTION) - self.__moveCalled = True - - def __onTouchDown(self, Event): - self.__touchDownCalled = True + +class MessageTester(object): + + def __init__(self, publisher, messageIDs, testCase=None): + for messageID in messageIDs: + publisher.subscribe(messageID, + lambda messageID=messageID: self.setMessageReceived(messageID)) + self.__messagesReceived = set() + self.__testCase = testCase + + def assertState(self, expectedMessages): + self.__testCase.assert_(self.isState(expectedMessages)) + self.reset() + + def isState(self, expectedMessages): + expectedMessages = set(expectedMessages) + if expectedMessages != self.__messagesReceived: + sys.stderr.write("\nState expected: "+str(expectedMessages)+"\n") + sys.stderr.write("Actual state: "+str(self.__messagesReceived)+"\n") + return False + else: + return True + + def setMessageReceived(self, messageID): + self.__messagesReceived.add(messageID) + + def reset(self): + self.__messagesReceived = set() |