diff options
Diffstat (limited to 'src/test/GestureTest.py')
-rw-r--r-- | src/test/GestureTest.py | 1048 |
1 files changed, 1048 insertions, 0 deletions
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) |