summaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
authorDimitri John Ledkov <dimitri.ledkov@canonical.com>2014-02-20 16:10:52 +0000
committerDimitri John Ledkov <dimitri.ledkov@canonical.com>2014-02-20 19:15:57 +0000
commitd20f4a64eba38690337ac914a04a113de7caf125 (patch)
tree6828990e93ca5d8847b8cde2f2febb6566b0d53f /src/test
parent28161e9209f21be1a600f637565ecede94855a36 (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')
-rw-r--r--src/test/AVGAppTest.py45
-rw-r--r--src/test/AVTest.py403
-rw-r--r--src/test/AnimTest.py188
-rw-r--r--src/test/AppTest.py314
-rw-r--r--src/test/DynamicsTest.py205
-rw-r--r--src/test/EventTest.py803
-rw-r--r--src/test/FXTest.py331
-rw-r--r--src/test/GestureTest.py1048
-rw-r--r--src/test/ImageTest.py271
-rw-r--r--src/test/InputDeviceTest.py107
-rw-r--r--src/test/LoggerTest.py96
-rw-r--r--src/test/Makefile.am6
-rw-r--r--src/test/Makefile.in93
-rw-r--r--src/test/OffscreenTest.py216
-rw-r--r--src/test/PlayerTest.py514
-rw-r--r--src/test/PluginTest.py37
-rw-r--r--src/test/PythonTest.py370
-rwxr-xr-xsrc/test/Test.py34
-rw-r--r--src/test/UITest.py1370
-rw-r--r--src/test/VectorTest.py276
-rw-r--r--src/test/WidgetTest.py900
-rw-r--r--src/test/WordsTest.py244
-rw-r--r--src/test/baseline/testBitmap2.pngbin0 -> 2816 bytes
-rw-r--r--src/test/baseline/testBitmap3.pngbin0 -> 2918 bytes
-rw-r--r--src/test/baseline/testBitmap4.pngbin0 -> 3666 bytes
-rw-r--r--src/test/baseline/testCanvasNullFX3.pngbin0 -> 1042 bytes
-rw-r--r--src/test/baseline/testChromaKeyFX1.pngbin0 -> 2428 bytes
-rw-r--r--src/test/baseline/testChromaKeyFX2.pngbin0 -> 2230 bytes
-rw-r--r--src/test/baseline/testChromaKeyFX3.pngbin0 -> 2309 bytes
-rw-r--r--src/test/baseline/testChromaKeyFX4.pngbin0 -> 2186 bytes
-rw-r--r--src/test/baseline/testFontStyle1.pngbin0 -> 1971 bytes
-rw-r--r--src/test/baseline/testFontStyle2.pngbin0 -> 2566 bytes
-rw-r--r--src/test/baseline/testHVStretchNode1.pngbin0 -> 339 bytes
-rw-r--r--src/test/baseline/testHVStretchNode2.pngbin0 -> 409 bytes
-rw-r--r--src/test/baseline/testImgWarp2.pngbin0 -> 2522 bytes
-rw-r--r--src/test/baseline/testMediaControl1.pngbin0 -> 1041 bytes
-rw-r--r--src/test/baseline/testMediaControl2.pngbin0 -> 1032 bytes
-rw-r--r--src/test/baseline/testMediaControl3.pngbin0 -> 1202 bytes
-rw-r--r--src/test/baseline/testMediaControl4.pngbin0 -> 1108 bytes
-rw-r--r--src/test/baseline/testMediaControl5.pngbin0 -> 930 bytes
-rw-r--r--src/test/baseline/testMesh7.pngbin0 -> 1481 bytes
-rw-r--r--src/test/baseline/testMesh8.pngbin0 -> 1870 bytes
-rw-r--r--src/test/baseline/testMipmap.pngbin506 -> 371 bytes
-rw-r--r--src/test/baseline/testOpacity.pngbin0 -> 2457 bytes
-rw-r--r--src/test/baseline/testOutlines.pngbin3149 -> 3282 bytes
-rw-r--r--src/test/baseline/testPolygon7.pngbin0 -> 567 bytes
-rw-r--r--src/test/baseline/testPolygon8.pngbin0 -> 547 bytes
-rw-r--r--src/test/baseline/testPolygon9.pngbin0 -> 579 bytes
-rw-r--r--src/test/baseline/testPolygonHole1.pngbin0 -> 637 bytes
-rw-r--r--src/test/baseline/testPolygonHole2.pngbin0 -> 727 bytes
-rw-r--r--src/test/baseline/testProgressBar1.pngbin0 -> 318 bytes
-rw-r--r--src/test/baseline/testProgressBar2.pngbin0 -> 321 bytes
-rw-r--r--src/test/baseline/testProgressBar3.pngbin0 -> 303 bytes
-rw-r--r--src/test/baseline/testScrollArea1.pngbin0 -> 741 bytes
-rw-r--r--src/test/baseline/testScrollArea2.pngbin0 -> 857 bytes
-rw-r--r--src/test/baseline/testScrollArea3.pngbin0 -> 745 bytes
-rw-r--r--src/test/baseline/testScrollBarHoriz1.pngbin0 -> 313 bytes
-rw-r--r--src/test/baseline/testScrollBarHoriz10.pngbin0 -> 319 bytes
-rw-r--r--src/test/baseline/testScrollBarHoriz11.pngbin0 -> 322 bytes
-rw-r--r--src/test/baseline/testScrollBarHoriz12.pngbin0 -> 314 bytes
-rw-r--r--src/test/baseline/testScrollBarHoriz2.pngbin0 -> 318 bytes
-rw-r--r--src/test/baseline/testScrollBarHoriz3.pngbin0 -> 315 bytes
-rw-r--r--src/test/baseline/testScrollBarHoriz4.pngbin0 -> 301 bytes
-rw-r--r--src/test/baseline/testScrollBarHoriz5.pngbin0 -> 327 bytes
-rw-r--r--src/test/baseline/testScrollBarHoriz6.pngbin0 -> 297 bytes
-rw-r--r--src/test/baseline/testScrollBarHoriz7.pngbin0 -> 331 bytes
-rw-r--r--src/test/baseline/testScrollBarHoriz8.pngbin0 -> 326 bytes
-rw-r--r--src/test/baseline/testScrollBarHoriz9.pngbin0 -> 331 bytes
-rw-r--r--src/test/baseline/testScrollBarVert1.pngbin0 -> 521 bytes
-rw-r--r--src/test/baseline/testScrollBarVert2.pngbin0 -> 523 bytes
-rw-r--r--src/test/baseline/testScrollBarVert3.pngbin0 -> 537 bytes
-rw-r--r--src/test/baseline/testScrollBarVert4.pngbin0 -> 520 bytes
-rw-r--r--src/test/baseline/testScrollBarVert5.pngbin0 -> 555 bytes
-rw-r--r--src/test/baseline/testScrollBarVert6.pngbin0 -> 500 bytes
-rw-r--r--src/test/baseline/testScrollBarVert7.pngbin0 -> 517 bytes
-rw-r--r--src/test/baseline/testScrollBarVert8.pngbin0 -> 539 bytes
-rw-r--r--src/test/baseline/testScrollBarVert9.pngbin0 -> 525 bytes
-rw-r--r--src/test/baseline/testScrollPane4.pngbin1012 -> 0 bytes
-rw-r--r--src/test/baseline/testSeekAfterEOF.pngbin0 -> 4114 bytes
-rw-r--r--src/test/baseline/testSliderHoriz1.pngbin0 -> 412 bytes
-rw-r--r--src/test/baseline/testSliderHoriz2.pngbin0 -> 424 bytes
-rw-r--r--src/test/baseline/testSliderHoriz3.pngbin0 -> 431 bytes
-rw-r--r--src/test/baseline/testSliderHoriz4.pngbin0 -> 390 bytes
-rw-r--r--src/test/baseline/testSliderHoriz5.pngbin0 -> 381 bytes
-rw-r--r--src/test/baseline/testSliderVert1.pngbin0 -> 578 bytes
-rw-r--r--src/test/baseline/testSliderVert2.pngbin0 -> 581 bytes
-rw-r--r--src/test/baseline/testSliderVert3.pngbin0 -> 578 bytes
-rw-r--r--src/test/baseline/testSliderVert4.pngbin0 -> 504 bytes
-rw-r--r--src/test/baseline/testSliderVert5.pngbin0 -> 502 bytes
-rw-r--r--src/test/baseline/testStretchNodeHoriz1.pngbin0 -> 1098 bytes
-rw-r--r--src/test/baseline/testStretchNodeHoriz2.pngbin0 -> 1118 bytes
-rw-r--r--src/test/baseline/testStretchNodeVert1.pngbin0 -> 1091 bytes
-rw-r--r--src/test/baseline/testStretchNodeVert2.pngbin0 -> 1224 bytes
-rw-r--r--src/test/baseline/testTextArea1.pngbin2681 -> 2792 bytes
-rw-r--r--src/test/baseline/testTextArea2.pngbin354 -> 460 bytes
-rw-r--r--src/test/baseline/testTextArea3.pngbin0 -> 511 bytes
-rw-r--r--src/test/baseline/testTextArea4.pngbin0 -> 1056 bytes
-rw-r--r--src/test/baseline/testTextArea5.pngbin0 -> 1100 bytes
-rw-r--r--src/test/baseline/testTextButtonDisabled.pngbin0 -> 1099 bytes
-rw-r--r--src/test/baseline/testTextButtonDown.pngbin0 -> 975 bytes
-rw-r--r--src/test/baseline/testTextButtonDownNewText.pngbin0 -> 1438 bytes
-rw-r--r--src/test/baseline/testTextButtonUp.pngbin0 -> 1099 bytes
-rw-r--r--src/test/baseline/testTextButtonUpNewText.pngbin0 -> 1559 bytes
-rw-r--r--src/test/baseline/testTexturedPolyLine4.pngbin2482 -> 2329 bytes
-rw-r--r--src/test/baseline/testTimeSliderHoriz1.pngbin0 -> 416 bytes
-rw-r--r--src/test/baseline/testTimeSliderHoriz2.pngbin0 -> 501 bytes
-rw-r--r--src/test/baseline/testTimeSliderHoriz3.pngbin0 -> 499 bytes
-rw-r--r--src/test/baseline/testTimeSliderHoriz4.pngbin0 -> 461 bytes
-rw-r--r--src/test/baseline/testTimeSliderHoriz5.pngbin0 -> 461 bytes
-rw-r--r--src/test/baseline/testTimeSliderVert1.pngbin0 -> 570 bytes
-rw-r--r--src/test/baseline/testTimeSliderVert2.pngbin0 -> 674 bytes
-rw-r--r--src/test/baseline/testTimeSliderVert3.pngbin0 -> 665 bytes
-rw-r--r--src/test/baseline/testTimeSliderVert4.pngbin0 -> 591 bytes
-rw-r--r--src/test/baseline/testTimeSliderVert5.pngbin0 -> 591 bytes
-rw-r--r--src/test/baseline/testUICheckBoxChecked_Down.pngbin0 -> 1506 bytes
-rw-r--r--src/test/baseline/testUICheckBoxChecked_Up.pngbin0 -> 1499 bytes
-rw-r--r--src/test/baseline/testUICheckBoxUnchecked_Disabled.pngbin0 -> 1440 bytes
-rw-r--r--src/test/baseline/testUICheckBoxUnchecked_Down.pngbin0 -> 1430 bytes
-rw-r--r--src/test/baseline/testUICheckBoxUnchecked_Up.pngbin0 -> 1471 bytes
-rw-r--r--src/test/baseline/testUIKeyboard.pngbin971 -> 859 bytes
-rw-r--r--src/test/baseline/testUIKeyboard1S.pngbin0 -> 911 bytes
-rw-r--r--src/test/baseline/testUIKeyboardA.pngbin0 -> 878 bytes
-rw-r--r--src/test/baseline/testUIKeyboardA1S.pngbin0 -> 885 bytes
-rw-r--r--src/test/baseline/testUIKeyboardAS.pngbin0 -> 883 bytes
-rw-r--r--src/test/baseline/testUIKeyboardDown11.pngbin0 -> 1979 bytes
-rw-r--r--src/test/baseline/testUIKeyboardDownA1.pngbin1285 -> 0 bytes
-rw-r--r--src/test/baseline/testUIKeyboardDownA111S1.pngbin1530 -> 0 bytes
-rw-r--r--src/test/baseline/testUIKeyboardDownA212S2.pngbin1531 -> 2191 bytes
-rw-r--r--src/test/baseline/testUIKeyboardDownA2S1.pngbin0 -> 1205 bytes
-rw-r--r--src/test/baseline/testUIKeyboardDownS1.pngbin1200 -> 0 bytes
-rw-r--r--src/test/baseline/testUIKeyboardFB.pngbin0 -> 859 bytes
-rw-r--r--src/test/baseline/testUIKeyboardFB1.pngbin0 -> 1616 bytes
-rw-r--r--src/test/baseline/testUIKeyboardFBA1S.pngbin0 -> 1587 bytes
-rw-r--r--src/test/baseline/testUIKeyboardFBAS.pngbin0 -> 2065 bytes
-rw-r--r--src/test/baseline/testUIKeyboardFBS.pngbin0 -> 854 bytes
-rw-r--r--src/test/baseline/testUIKeyboardNoFB1S.pngbin0 -> 910 bytes
-rw-r--r--src/test/baseline/testUIKeyboardS.pngbin0 -> 855 bytes
-rw-r--r--src/test/baseline/testUIToggleChecked_Disabled.pngbin0 -> 1276 bytes
-rw-r--r--src/test/baseline/testUIToggleChecked_Down.pngbin0 -> 1458 bytes
-rw-r--r--src/test/baseline/testUIToggleChecked_Up.pngbin0 -> 1450 bytes
-rw-r--r--src/test/baseline/testUIToggleUnchecked_Disabled.pngbin0 -> 959 bytes
-rw-r--r--src/test/baseline/testUIToggleUnchecked_Down.pngbin0 -> 1113 bytes
-rw-r--r--src/test/baseline/testUIToggleUnchecked_Up.pngbin0 -> 1115 bytes
-rw-r--r--src/test/baseline/testVideo-mpeg1-48x48.mov1.png (renamed from src/test/baseline/testVideo-mpeg1-48x48.mpg1.png)bin10904 -> 10904 bytes
-rw-r--r--src/test/baseline/testVideo-mpeg4-48x48.avi1.pngbin0 -> 10964 bytes
-rw-r--r--src/test/baseline/testWordsGamma1.pngbin0 -> 3194 bytes
-rw-r--r--src/test/baseline/testWordsGamma2.pngbin0 -> 3174 bytes
-rw-r--r--src/test/baseline/testWordsIntensity.pngbin0 -> 2239 bytes
-rw-r--r--src/test/baseline/testWordsMask7.pngbin0 -> 3853 bytes
-rw-r--r--src/test/baseline/testWordsOutlines.pngbin0 -> 1024 bytes
-rw-r--r--src/test/baseline/testplugin1.pngbin356 -> 371 bytes
-rw-r--r--src/test/baseline/testplugin2.pngbin357 -> 375 bytes
-rw-r--r--src/test/camcfgs.py2
-rwxr-xr-xsrc/test/checkcamera.py20
-rwxr-xr-xsrc/test/checkspeed.py105
-rw-r--r--src/test/extrafonts/.svn/entries62
-rw-r--r--src/test/extrafonts/.svn/prop-base/testaddfontdir.ttf.svn-base5
-rw-r--r--src/test/extrafonts/.svn/text-base/testaddfontdir.ttf.svn-basebin1736 -> 0 bytes
-rw-r--r--src/test/fonts/.svn/entries164
-rw-r--r--src/test/fonts/.svn/prop-base/Vera.ttf.svn-base5
-rw-r--r--src/test/fonts/.svn/prop-base/VeraBI.ttf.svn-base5
-rw-r--r--src/test/fonts/.svn/prop-base/VeraBd.ttf.svn-base5
-rw-r--r--src/test/fonts/.svn/prop-base/VeraIt.ttf.svn-base5
-rw-r--r--src/test/fonts/.svn/text-base/Vera.ttf.svn-basebin65932 -> 0 bytes
-rw-r--r--src/test/fonts/.svn/text-base/VeraBI.ttf.svn-basebin63208 -> 0 bytes
-rw-r--r--src/test/fonts/.svn/text-base/VeraBd.ttf.svn-basebin58716 -> 0 bytes
-rw-r--r--src/test/fonts/.svn/text-base/VeraIt.ttf.svn-basebin63684 -> 0 bytes
-rw-r--r--src/test/image.avg2
-rw-r--r--src/test/media/1x1_white.png (renamed from src/test/1x1_white.png)bin2791 -> 2791 bytes
-rwxr-xr-xsrc/test/media/22.050Hz_16bit_mono.wavbin0 -> 4454 bytes
-rw-r--r--src/test/media/44.1kHz_16bit_6Chan.oggbin0 -> 159170 bytes
-rwxr-xr-xsrc/test/media/44.1kHz_16bit_mono.wavbin0 -> 8864 bytes
-rwxr-xr-xsrc/test/media/44.1kHz_16bit_stereo.aifbin0 -> 352854 bytes
-rwxr-xr-xsrc/test/media/44.1kHz_16bit_stereo.wavbin0 -> 352844 bytes
-rwxr-xr-xsrc/test/media/44.1kHz_24bit_mono.wavbin0 -> 8864 bytes
-rwxr-xr-xsrc/test/media/44.1kHz_24bit_stereo.aifbin0 -> 529254 bytes
-rwxr-xr-xsrc/test/media/44.1kHz_24bit_stereo.wavbin0 -> 352844 bytes
-rwxr-xr-xsrc/test/media/44.1kHz_mono.oggbin0 -> 4177 bytes
-rw-r--r--src/test/media/44.1kHz_stereo.mp3bin0 -> 47647 bytes
-rw-r--r--src/test/media/44.1kHz_stereo.oggbin0 -> 10211 bytes
-rwxr-xr-xsrc/test/media/48kHz_16bit_mono.wavbin0 -> 9644 bytes
-rwxr-xr-xsrc/test/media/48kHz_16bit_stereo.aifbin0 -> 384054 bytes
-rwxr-xr-xsrc/test/media/48kHz_16bit_stereo.wavbin0 -> 384044 bytes
-rwxr-xr-xsrc/test/media/48kHz_24bit_mono.wavbin0 -> 9644 bytes
-rwxr-xr-xsrc/test/media/48kHz_24bit_stereo.aifbin0 -> 576054 bytes
-rwxr-xr-xsrc/test/media/48kHz_24bit_stereo.wavbin0 -> 384044 bytes
-rw-r--r--src/test/media/48kHz_stereo.mp3bin0 -> 47808 bytes
-rw-r--r--src/test/media/48kHz_stereo.oggbin0 -> 104701 bytes
-rw-r--r--src/test/media/CustomSkin.xml83
-rw-r--r--src/test/media/SimpleSkin.xml83
-rw-r--r--src/test/media/button_bg_down.pngbin0 -> 3212 bytes
-rw-r--r--src/test/media/button_bg_up.pngbin0 -> 3085 bytes
-rw-r--r--src/test/media/button_check.png (renamed from src/test/button_check.png)bin3040 -> 3040 bytes
-rw-r--r--src/test/media/button_disabled.png (renamed from src/test/button_disabled.png)bin4308 -> 4308 bytes
-rw-r--r--src/test/media/button_down.png (renamed from src/test/button_down.png)bin4221 -> 4221 bytes
-rw-r--r--src/test/media/button_over.png (renamed from src/test/button_over.png)bin4131 -> 4131 bytes
-rw-r--r--src/test/media/button_up.png (renamed from src/test/button_up.png)bin3923 -> 3923 bytes
-rw-r--r--src/test/media/checkbox_checked_disabled.pngbin0 -> 2908 bytes
-rw-r--r--src/test/media/checkbox_checked_down.pngbin0 -> 2902 bytes
-rw-r--r--src/test/media/checkbox_checked_up.pngbin0 -> 2902 bytes
-rw-r--r--src/test/media/checkbox_unchecked_disabled.pngbin0 -> 2856 bytes
-rw-r--r--src/test/media/checkbox_unchecked_down.pngbin0 -> 2849 bytes
-rw-r--r--src/test/media/checkbox_unchecked_up.pngbin0 -> 2849 bytes
-rw-r--r--src/test/media/checker.png (renamed from src/test/checker.png)bin3526 -> 3526 bytes
-rw-r--r--src/test/media/chromakey-median.pngbin0 -> 3331 bytes
-rw-r--r--src/test/media/chromakey.pngbin0 -> 2995 bytes
-rw-r--r--src/test/media/colorramp.png (renamed from src/test/colorramp.png)bin4471 -> 4471 bytes
-rw-r--r--src/test/media/corebin0 -> 71188480 bytes
-rw-r--r--src/test/media/crop_bkgd.png (renamed from src/test/crop_bkgd.png)bin369 -> 369 bytes
-rw-r--r--src/test/media/dilation.pngbin0 -> 80 bytes
-rw-r--r--src/test/media/erosion.pngbin0 -> 960 bytes
-rw-r--r--src/test/media/filterwipeborder.pngbin0 -> 1166 bytes
-rw-r--r--src/test/media/flat.pngbin0 -> 2861 bytes
-rw-r--r--src/test/media/floodfill.pngbin0 -> 119 bytes
-rw-r--r--src/test/media/freidrehen.jpg (renamed from src/test/freidrehen.jpg)bin3856 -> 3856 bytes
-rw-r--r--src/test/media/greyscale.png (renamed from src/test/greyscale.png)bin2245 -> 2245 bytes
-rw-r--r--src/test/media/h264-48x48.h264bin0 -> 131081 bytes
-rw-r--r--src/test/media/hsl.pngbin0 -> 3131 bytes
-rw-r--r--src/test/media/i8-64x64.pngbin0 -> 2256 bytes
-rw-r--r--src/test/media/incompleteSkinMedia/IncompleteSkin.xml11
-rw-r--r--src/test/media/incompleteSkinMedia/scrollbar_horiz_thumb_down.pngbin0 -> 2990 bytes
-rw-r--r--src/test/media/incompleteSkinMedia/scrollbar_horiz_thumb_up.pngbin0 -> 2948 bytes
-rw-r--r--src/test/media/incompleteSkinMedia/scrollbar_horiz_track.pngbin0 -> 2843 bytes
-rw-r--r--src/test/media/incompleteSkinMedia/scrollbar_horiz_track_disabled.pngbin0 -> 2873 bytes
-rw-r--r--src/test/media/keyboard_bg.png (renamed from src/test/keyboard_bg.png)bin781 -> 781 bytes
-rw-r--r--src/test/media/keyboard_down.png (renamed from src/test/keyboard_ovl.png)bin775 -> 775 bytes
-rw-r--r--src/test/media/keyboard_feedback.pngbin0 -> 2711 bytes
-rw-r--r--src/test/media/mask.png (renamed from src/test/mask.png)bin1270 -> 1270 bytes
-rw-r--r--src/test/media/mask1.png (renamed from src/test/mask1.png)bin227 -> 227 bytes
-rw-r--r--src/test/media/mask2.png (renamed from src/test/mask2.png)bin1598 -> 1598 bytes
-rw-r--r--src/test/media/mjpeg-48x48.avibin0 -> 329852 bytes
-rw-r--r--src/test/media/mpeg1-48x48-sound.avibin0 -> 28534 bytes
-rw-r--r--src/test/media/mpeg1-48x48.movbin0 -> 9863 bytes
-rw-r--r--src/test/media/mpeg4-48x48.avibin0 -> 15126 bytes
-rw-r--r--src/test/media/oe.png (renamed from src/test/oe.png)bin3178 -> 3178 bytes
-rw-r--r--src/test/media/pause_button_down.pngbin0 -> 2826 bytes
-rw-r--r--src/test/media/pause_button_up.pngbin0 -> 2825 bytes
-rw-r--r--src/test/media/play_button_down.pngbin0 -> 2927 bytes
-rw-r--r--src/test/media/play_button_up.pngbin0 -> 2928 bytes
-rw-r--r--src/test/media/rect.svg (renamed from src/test/rect.svg)0
-rw-r--r--src/test/media/rectborder.png (renamed from src/test/rectborder.png)bin2810 -> 2810 bytes
-rw-r--r--src/test/media/rgb24-32x32.png (renamed from src/test/rgb24-32x32.png)bin3584 -> 3584 bytes
-rw-r--r--src/test/media/rgb24-64x64.png (renamed from src/test/rgb24-64x64.png)bin2092 -> 2092 bytes
-rw-r--r--src/test/media/rgb24-65x65.png (renamed from src/test/rgb24-65x65.png)bin2210 -> 2210 bytes
-rw-r--r--src/test/media/rgb24alpha-32x32.png (renamed from src/test/rgb24alpha-32x32.png)bin4088 -> 4088 bytes
-rw-r--r--src/test/media/rgb24alpha-64x64.png (renamed from src/test/rgb24alpha-64x64.png)bin3392 -> 3392 bytes
-rw-r--r--src/test/media/rgba-48x48.movbin0 -> 127378 bytes
-rw-r--r--src/test/media/scrollarea_border.pngbin0 -> 3262 bytes
-rw-r--r--src/test/media/scrollbar_horiz_thumb_disabled.pngbin0 -> 2924 bytes
-rw-r--r--src/test/media/scrollbar_horiz_thumb_down.pngbin0 -> 2990 bytes
-rw-r--r--src/test/media/scrollbar_horiz_thumb_up.pngbin0 -> 2948 bytes
-rw-r--r--src/test/media/scrollbar_horiz_track.pngbin0 -> 2843 bytes
-rw-r--r--src/test/media/scrollbar_horiz_track_disabled.pngbin0 -> 2873 bytes
-rw-r--r--src/test/media/scrollbar_vert_thumb_disabled.pngbin0 -> 2911 bytes
-rw-r--r--src/test/media/scrollbar_vert_thumb_down.pngbin0 -> 3008 bytes
-rw-r--r--src/test/media/scrollbar_vert_thumb_up.pngbin0 -> 2998 bytes
-rw-r--r--src/test/media/scrollbar_vert_track.pngbin0 -> 2903 bytes
-rw-r--r--src/test/media/scrollbar_vert_track_disabled.pngbin0 -> 2902 bytes
-rw-r--r--src/test/media/shadow.png (renamed from src/test/shadow.png)bin3168 -> 3168 bytes
-rw-r--r--src/test/media/slider_horiz_track.pngbin0 -> 2858 bytes
-rw-r--r--src/test/media/slider_horiz_track_disabled.pngbin0 -> 2859 bytes
-rw-r--r--src/test/media/slider_thumb_down.pngbin0 -> 3200 bytes
-rw-r--r--src/test/media/slider_thumb_up.pngbin0 -> 3225 bytes
-rw-r--r--src/test/media/slider_vert_track.pngbin0 -> 2867 bytes
-rw-r--r--src/test/media/slider_vert_track_disabled.pngbin0 -> 2866 bytes
-rw-r--r--src/test/media/spike.pngbin0 -> 2820 bytes
-rw-r--r--src/test/media/toggle_checked_Disabled.pngbin0 -> 3886 bytes
-rw-r--r--src/test/media/toggle_checked_Down.pngbin0 -> 3873 bytes
-rw-r--r--src/test/media/toggle_checked_Up.pngbin0 -> 3867 bytes
-rw-r--r--src/test/media/toggle_unchecked_Disabled.pngbin0 -> 3555 bytes
-rw-r--r--src/test/media/toggle_unchecked_Down.pngbin0 -> 3506 bytes
-rw-r--r--src/test/media/toggle_unchecked_Up.pngbin0 -> 3517 bytes
-rw-r--r--src/test/media/vp6a-yuva-48x48.flvbin0 -> 13669 bytes
-rw-r--r--src/test/media/widebmp.jpg (renamed from src/test/widebmp.jpg)bin33903 -> 33903 bytes
-rw-r--r--src/test/panoimage.pngbin58076 -> 0 bytes
-rw-r--r--src/test/plugin/ColorNode.cpp66
-rw-r--r--src/test/plugin/Makefile.am14
-rw-r--r--src/test/plugin/Makefile.in94
-rw-r--r--src/test/rgb24alpha.tifbin29970 -> 0 bytes
-rw-r--r--src/test/testapp.py99
-rw-r--r--src/test/testcase.py286
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">
&amp;
</words>
@@ -337,12 +397,12 @@ class WordsTestCase(AVGTestCase):
avg.WordsNode(pos=(12,48), fontsize=12, font="Bitstream Vera Sans", text="&amp;",
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="&lt;test dynattr&amp;" 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é &lt;</words>""")
root.appendChild(valNode)
root.appendChild(
- Player.createNode("""
+ player.createNode("""
<words x="1" y="45" fontsize="15" font="Bitstream Vera Sans">
&amp;
</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
new file mode 100644
index 0000000..f94b54e
--- /dev/null
+++ b/src/test/baseline/testBitmap2.png
Binary files differ
diff --git a/src/test/baseline/testBitmap3.png b/src/test/baseline/testBitmap3.png
new file mode 100644
index 0000000..7d0898d
--- /dev/null
+++ b/src/test/baseline/testBitmap3.png
Binary files differ
diff --git a/src/test/baseline/testBitmap4.png b/src/test/baseline/testBitmap4.png
new file mode 100644
index 0000000..5569133
--- /dev/null
+++ b/src/test/baseline/testBitmap4.png
Binary files differ
diff --git a/src/test/baseline/testCanvasNullFX3.png b/src/test/baseline/testCanvasNullFX3.png
new file mode 100644
index 0000000..56571a2
--- /dev/null
+++ b/src/test/baseline/testCanvasNullFX3.png
Binary files differ
diff --git a/src/test/baseline/testChromaKeyFX1.png b/src/test/baseline/testChromaKeyFX1.png
new file mode 100644
index 0000000..9f63ce5
--- /dev/null
+++ b/src/test/baseline/testChromaKeyFX1.png
Binary files differ
diff --git a/src/test/baseline/testChromaKeyFX2.png b/src/test/baseline/testChromaKeyFX2.png
new file mode 100644
index 0000000..65df5ea
--- /dev/null
+++ b/src/test/baseline/testChromaKeyFX2.png
Binary files differ
diff --git a/src/test/baseline/testChromaKeyFX3.png b/src/test/baseline/testChromaKeyFX3.png
new file mode 100644
index 0000000..1ab1b59
--- /dev/null
+++ b/src/test/baseline/testChromaKeyFX3.png
Binary files differ
diff --git a/src/test/baseline/testChromaKeyFX4.png b/src/test/baseline/testChromaKeyFX4.png
new file mode 100644
index 0000000..86efc70
--- /dev/null
+++ b/src/test/baseline/testChromaKeyFX4.png
Binary files differ
diff --git a/src/test/baseline/testFontStyle1.png b/src/test/baseline/testFontStyle1.png
new file mode 100644
index 0000000..3d773d6
--- /dev/null
+++ b/src/test/baseline/testFontStyle1.png
Binary files differ
diff --git a/src/test/baseline/testFontStyle2.png b/src/test/baseline/testFontStyle2.png
new file mode 100644
index 0000000..e67cfa4
--- /dev/null
+++ b/src/test/baseline/testFontStyle2.png
Binary files differ
diff --git a/src/test/baseline/testHVStretchNode1.png b/src/test/baseline/testHVStretchNode1.png
new file mode 100644
index 0000000..304c23e
--- /dev/null
+++ b/src/test/baseline/testHVStretchNode1.png
Binary files differ
diff --git a/src/test/baseline/testHVStretchNode2.png b/src/test/baseline/testHVStretchNode2.png
new file mode 100644
index 0000000..ca1f0f2
--- /dev/null
+++ b/src/test/baseline/testHVStretchNode2.png
Binary files differ
diff --git a/src/test/baseline/testImgWarp2.png b/src/test/baseline/testImgWarp2.png
new file mode 100644
index 0000000..514e6f4
--- /dev/null
+++ b/src/test/baseline/testImgWarp2.png
Binary files differ
diff --git a/src/test/baseline/testMediaControl1.png b/src/test/baseline/testMediaControl1.png
new file mode 100644
index 0000000..fd36c50
--- /dev/null
+++ b/src/test/baseline/testMediaControl1.png
Binary files differ
diff --git a/src/test/baseline/testMediaControl2.png b/src/test/baseline/testMediaControl2.png
new file mode 100644
index 0000000..fd01c50
--- /dev/null
+++ b/src/test/baseline/testMediaControl2.png
Binary files differ
diff --git a/src/test/baseline/testMediaControl3.png b/src/test/baseline/testMediaControl3.png
new file mode 100644
index 0000000..9f9c0ee
--- /dev/null
+++ b/src/test/baseline/testMediaControl3.png
Binary files differ
diff --git a/src/test/baseline/testMediaControl4.png b/src/test/baseline/testMediaControl4.png
new file mode 100644
index 0000000..53adc06
--- /dev/null
+++ b/src/test/baseline/testMediaControl4.png
Binary files differ
diff --git a/src/test/baseline/testMediaControl5.png b/src/test/baseline/testMediaControl5.png
new file mode 100644
index 0000000..37d7bf4
--- /dev/null
+++ b/src/test/baseline/testMediaControl5.png
Binary files differ
diff --git a/src/test/baseline/testMesh7.png b/src/test/baseline/testMesh7.png
new file mode 100644
index 0000000..a7e2493
--- /dev/null
+++ b/src/test/baseline/testMesh7.png
Binary files differ
diff --git a/src/test/baseline/testMesh8.png b/src/test/baseline/testMesh8.png
new file mode 100644
index 0000000..20e4fb1
--- /dev/null
+++ b/src/test/baseline/testMesh8.png
Binary files differ
diff --git a/src/test/baseline/testMipmap.png b/src/test/baseline/testMipmap.png
index 7068a7a..eb6185e 100644
--- a/src/test/baseline/testMipmap.png
+++ b/src/test/baseline/testMipmap.png
Binary files differ
diff --git a/src/test/baseline/testOpacity.png b/src/test/baseline/testOpacity.png
new file mode 100644
index 0000000..aab7cdb
--- /dev/null
+++ b/src/test/baseline/testOpacity.png
Binary files differ
diff --git a/src/test/baseline/testOutlines.png b/src/test/baseline/testOutlines.png
index 0ef64ad..36a7c14 100644
--- a/src/test/baseline/testOutlines.png
+++ b/src/test/baseline/testOutlines.png
Binary files differ
diff --git a/src/test/baseline/testPolygon7.png b/src/test/baseline/testPolygon7.png
new file mode 100644
index 0000000..5cb45e6
--- /dev/null
+++ b/src/test/baseline/testPolygon7.png
Binary files differ
diff --git a/src/test/baseline/testPolygon8.png b/src/test/baseline/testPolygon8.png
new file mode 100644
index 0000000..f926687
--- /dev/null
+++ b/src/test/baseline/testPolygon8.png
Binary files differ
diff --git a/src/test/baseline/testPolygon9.png b/src/test/baseline/testPolygon9.png
new file mode 100644
index 0000000..3e00de4
--- /dev/null
+++ b/src/test/baseline/testPolygon9.png
Binary files differ
diff --git a/src/test/baseline/testPolygonHole1.png b/src/test/baseline/testPolygonHole1.png
new file mode 100644
index 0000000..9c18ad1
--- /dev/null
+++ b/src/test/baseline/testPolygonHole1.png
Binary files differ
diff --git a/src/test/baseline/testPolygonHole2.png b/src/test/baseline/testPolygonHole2.png
new file mode 100644
index 0000000..d8199da
--- /dev/null
+++ b/src/test/baseline/testPolygonHole2.png
Binary files differ
diff --git a/src/test/baseline/testProgressBar1.png b/src/test/baseline/testProgressBar1.png
new file mode 100644
index 0000000..2b2c752
--- /dev/null
+++ b/src/test/baseline/testProgressBar1.png
Binary files differ
diff --git a/src/test/baseline/testProgressBar2.png b/src/test/baseline/testProgressBar2.png
new file mode 100644
index 0000000..6c1f56b
--- /dev/null
+++ b/src/test/baseline/testProgressBar2.png
Binary files differ
diff --git a/src/test/baseline/testProgressBar3.png b/src/test/baseline/testProgressBar3.png
new file mode 100644
index 0000000..d788f76
--- /dev/null
+++ b/src/test/baseline/testProgressBar3.png
Binary files differ
diff --git a/src/test/baseline/testScrollArea1.png b/src/test/baseline/testScrollArea1.png
new file mode 100644
index 0000000..4cb67e2
--- /dev/null
+++ b/src/test/baseline/testScrollArea1.png
Binary files differ
diff --git a/src/test/baseline/testScrollArea2.png b/src/test/baseline/testScrollArea2.png
new file mode 100644
index 0000000..7939cae
--- /dev/null
+++ b/src/test/baseline/testScrollArea2.png
Binary files differ
diff --git a/src/test/baseline/testScrollArea3.png b/src/test/baseline/testScrollArea3.png
new file mode 100644
index 0000000..1fc62df
--- /dev/null
+++ b/src/test/baseline/testScrollArea3.png
Binary files differ
diff --git a/src/test/baseline/testScrollBarHoriz1.png b/src/test/baseline/testScrollBarHoriz1.png
new file mode 100644
index 0000000..aedcb12
--- /dev/null
+++ b/src/test/baseline/testScrollBarHoriz1.png
Binary files differ
diff --git a/src/test/baseline/testScrollBarHoriz10.png b/src/test/baseline/testScrollBarHoriz10.png
new file mode 100644
index 0000000..0c8a5af
--- /dev/null
+++ b/src/test/baseline/testScrollBarHoriz10.png
Binary files differ
diff --git a/src/test/baseline/testScrollBarHoriz11.png b/src/test/baseline/testScrollBarHoriz11.png
new file mode 100644
index 0000000..da84ebc
--- /dev/null
+++ b/src/test/baseline/testScrollBarHoriz11.png
Binary files differ
diff --git a/src/test/baseline/testScrollBarHoriz12.png b/src/test/baseline/testScrollBarHoriz12.png
new file mode 100644
index 0000000..5e2f013
--- /dev/null
+++ b/src/test/baseline/testScrollBarHoriz12.png
Binary files differ
diff --git a/src/test/baseline/testScrollBarHoriz2.png b/src/test/baseline/testScrollBarHoriz2.png
new file mode 100644
index 0000000..b8a2dcd
--- /dev/null
+++ b/src/test/baseline/testScrollBarHoriz2.png
Binary files differ
diff --git a/src/test/baseline/testScrollBarHoriz3.png b/src/test/baseline/testScrollBarHoriz3.png
new file mode 100644
index 0000000..885b429
--- /dev/null
+++ b/src/test/baseline/testScrollBarHoriz3.png
Binary files differ
diff --git a/src/test/baseline/testScrollBarHoriz4.png b/src/test/baseline/testScrollBarHoriz4.png
new file mode 100644
index 0000000..8ceea4f
--- /dev/null
+++ b/src/test/baseline/testScrollBarHoriz4.png
Binary files differ
diff --git a/src/test/baseline/testScrollBarHoriz5.png b/src/test/baseline/testScrollBarHoriz5.png
new file mode 100644
index 0000000..4278825
--- /dev/null
+++ b/src/test/baseline/testScrollBarHoriz5.png
Binary files differ
diff --git a/src/test/baseline/testScrollBarHoriz6.png b/src/test/baseline/testScrollBarHoriz6.png
new file mode 100644
index 0000000..ee270d3
--- /dev/null
+++ b/src/test/baseline/testScrollBarHoriz6.png
Binary files differ
diff --git a/src/test/baseline/testScrollBarHoriz7.png b/src/test/baseline/testScrollBarHoriz7.png
new file mode 100644
index 0000000..0fefd7b
--- /dev/null
+++ b/src/test/baseline/testScrollBarHoriz7.png
Binary files differ
diff --git a/src/test/baseline/testScrollBarHoriz8.png b/src/test/baseline/testScrollBarHoriz8.png
new file mode 100644
index 0000000..138ec3a
--- /dev/null
+++ b/src/test/baseline/testScrollBarHoriz8.png
Binary files differ
diff --git a/src/test/baseline/testScrollBarHoriz9.png b/src/test/baseline/testScrollBarHoriz9.png
new file mode 100644
index 0000000..0fefd7b
--- /dev/null
+++ b/src/test/baseline/testScrollBarHoriz9.png
Binary files differ
diff --git a/src/test/baseline/testScrollBarVert1.png b/src/test/baseline/testScrollBarVert1.png
new file mode 100644
index 0000000..25c3098
--- /dev/null
+++ b/src/test/baseline/testScrollBarVert1.png
Binary files differ
diff --git a/src/test/baseline/testScrollBarVert2.png b/src/test/baseline/testScrollBarVert2.png
new file mode 100644
index 0000000..572fac9
--- /dev/null
+++ b/src/test/baseline/testScrollBarVert2.png
Binary files differ
diff --git a/src/test/baseline/testScrollBarVert3.png b/src/test/baseline/testScrollBarVert3.png
new file mode 100644
index 0000000..d1a893c
--- /dev/null
+++ b/src/test/baseline/testScrollBarVert3.png
Binary files differ
diff --git a/src/test/baseline/testScrollBarVert4.png b/src/test/baseline/testScrollBarVert4.png
new file mode 100644
index 0000000..a29849f
--- /dev/null
+++ b/src/test/baseline/testScrollBarVert4.png
Binary files differ
diff --git a/src/test/baseline/testScrollBarVert5.png b/src/test/baseline/testScrollBarVert5.png
new file mode 100644
index 0000000..ff40ef7
--- /dev/null
+++ b/src/test/baseline/testScrollBarVert5.png
Binary files differ
diff --git a/src/test/baseline/testScrollBarVert6.png b/src/test/baseline/testScrollBarVert6.png
new file mode 100644
index 0000000..edb3196
--- /dev/null
+++ b/src/test/baseline/testScrollBarVert6.png
Binary files differ
diff --git a/src/test/baseline/testScrollBarVert7.png b/src/test/baseline/testScrollBarVert7.png
new file mode 100644
index 0000000..115d8ca
--- /dev/null
+++ b/src/test/baseline/testScrollBarVert7.png
Binary files differ
diff --git a/src/test/baseline/testScrollBarVert8.png b/src/test/baseline/testScrollBarVert8.png
new file mode 100644
index 0000000..5e1e08b
--- /dev/null
+++ b/src/test/baseline/testScrollBarVert8.png
Binary files differ
diff --git a/src/test/baseline/testScrollBarVert9.png b/src/test/baseline/testScrollBarVert9.png
new file mode 100644
index 0000000..3a7ff70
--- /dev/null
+++ b/src/test/baseline/testScrollBarVert9.png
Binary files differ
diff --git a/src/test/baseline/testScrollPane4.png b/src/test/baseline/testScrollPane4.png
deleted file mode 100644
index 9daf9a5..0000000
--- a/src/test/baseline/testScrollPane4.png
+++ /dev/null
Binary files differ
diff --git a/src/test/baseline/testSeekAfterEOF.png b/src/test/baseline/testSeekAfterEOF.png
new file mode 100644
index 0000000..76e79c1
--- /dev/null
+++ b/src/test/baseline/testSeekAfterEOF.png
Binary files differ
diff --git a/src/test/baseline/testSliderHoriz1.png b/src/test/baseline/testSliderHoriz1.png
new file mode 100644
index 0000000..c30040d
--- /dev/null
+++ b/src/test/baseline/testSliderHoriz1.png
Binary files differ
diff --git a/src/test/baseline/testSliderHoriz2.png b/src/test/baseline/testSliderHoriz2.png
new file mode 100644
index 0000000..e22a32f
--- /dev/null
+++ b/src/test/baseline/testSliderHoriz2.png
Binary files differ
diff --git a/src/test/baseline/testSliderHoriz3.png b/src/test/baseline/testSliderHoriz3.png
new file mode 100644
index 0000000..bcf1690
--- /dev/null
+++ b/src/test/baseline/testSliderHoriz3.png
Binary files differ
diff --git a/src/test/baseline/testSliderHoriz4.png b/src/test/baseline/testSliderHoriz4.png
new file mode 100644
index 0000000..7c48e5a
--- /dev/null
+++ b/src/test/baseline/testSliderHoriz4.png
Binary files differ
diff --git a/src/test/baseline/testSliderHoriz5.png b/src/test/baseline/testSliderHoriz5.png
new file mode 100644
index 0000000..2b6534a
--- /dev/null
+++ b/src/test/baseline/testSliderHoriz5.png
Binary files differ
diff --git a/src/test/baseline/testSliderVert1.png b/src/test/baseline/testSliderVert1.png
new file mode 100644
index 0000000..d82d467
--- /dev/null
+++ b/src/test/baseline/testSliderVert1.png
Binary files differ
diff --git a/src/test/baseline/testSliderVert2.png b/src/test/baseline/testSliderVert2.png
new file mode 100644
index 0000000..294dae9
--- /dev/null
+++ b/src/test/baseline/testSliderVert2.png
Binary files differ
diff --git a/src/test/baseline/testSliderVert3.png b/src/test/baseline/testSliderVert3.png
new file mode 100644
index 0000000..4a00a8f
--- /dev/null
+++ b/src/test/baseline/testSliderVert3.png
Binary files differ
diff --git a/src/test/baseline/testSliderVert4.png b/src/test/baseline/testSliderVert4.png
new file mode 100644
index 0000000..f13d278
--- /dev/null
+++ b/src/test/baseline/testSliderVert4.png
Binary files differ
diff --git a/src/test/baseline/testSliderVert5.png b/src/test/baseline/testSliderVert5.png
new file mode 100644
index 0000000..a939fe0
--- /dev/null
+++ b/src/test/baseline/testSliderVert5.png
Binary files differ
diff --git a/src/test/baseline/testStretchNodeHoriz1.png b/src/test/baseline/testStretchNodeHoriz1.png
new file mode 100644
index 0000000..652ada8
--- /dev/null
+++ b/src/test/baseline/testStretchNodeHoriz1.png
Binary files differ
diff --git a/src/test/baseline/testStretchNodeHoriz2.png b/src/test/baseline/testStretchNodeHoriz2.png
new file mode 100644
index 0000000..fe123b0
--- /dev/null
+++ b/src/test/baseline/testStretchNodeHoriz2.png
Binary files differ
diff --git a/src/test/baseline/testStretchNodeVert1.png b/src/test/baseline/testStretchNodeVert1.png
new file mode 100644
index 0000000..a0e6fe3
--- /dev/null
+++ b/src/test/baseline/testStretchNodeVert1.png
Binary files differ
diff --git a/src/test/baseline/testStretchNodeVert2.png b/src/test/baseline/testStretchNodeVert2.png
new file mode 100644
index 0000000..ac7d496
--- /dev/null
+++ b/src/test/baseline/testStretchNodeVert2.png
Binary files differ
diff --git a/src/test/baseline/testTextArea1.png b/src/test/baseline/testTextArea1.png
index 53f03a1..7cf8ac1 100644
--- a/src/test/baseline/testTextArea1.png
+++ b/src/test/baseline/testTextArea1.png
Binary files differ
diff --git a/src/test/baseline/testTextArea2.png b/src/test/baseline/testTextArea2.png
index 07349af..6fe4c64 100644
--- a/src/test/baseline/testTextArea2.png
+++ b/src/test/baseline/testTextArea2.png
Binary files differ
diff --git a/src/test/baseline/testTextArea3.png b/src/test/baseline/testTextArea3.png
new file mode 100644
index 0000000..6577cf2
--- /dev/null
+++ b/src/test/baseline/testTextArea3.png
Binary files differ
diff --git a/src/test/baseline/testTextArea4.png b/src/test/baseline/testTextArea4.png
new file mode 100644
index 0000000..2fc48fe
--- /dev/null
+++ b/src/test/baseline/testTextArea4.png
Binary files differ
diff --git a/src/test/baseline/testTextArea5.png b/src/test/baseline/testTextArea5.png
new file mode 100644
index 0000000..a7c53e2
--- /dev/null
+++ b/src/test/baseline/testTextArea5.png
Binary files differ
diff --git a/src/test/baseline/testTextButtonDisabled.png b/src/test/baseline/testTextButtonDisabled.png
new file mode 100644
index 0000000..c859bfa
--- /dev/null
+++ b/src/test/baseline/testTextButtonDisabled.png
Binary files differ
diff --git a/src/test/baseline/testTextButtonDown.png b/src/test/baseline/testTextButtonDown.png
new file mode 100644
index 0000000..9122c33
--- /dev/null
+++ b/src/test/baseline/testTextButtonDown.png
Binary files differ
diff --git a/src/test/baseline/testTextButtonDownNewText.png b/src/test/baseline/testTextButtonDownNewText.png
new file mode 100644
index 0000000..9592a86
--- /dev/null
+++ b/src/test/baseline/testTextButtonDownNewText.png
Binary files differ
diff --git a/src/test/baseline/testTextButtonUp.png b/src/test/baseline/testTextButtonUp.png
new file mode 100644
index 0000000..c859bfa
--- /dev/null
+++ b/src/test/baseline/testTextButtonUp.png
Binary files differ
diff --git a/src/test/baseline/testTextButtonUpNewText.png b/src/test/baseline/testTextButtonUpNewText.png
new file mode 100644
index 0000000..ebb66bc
--- /dev/null
+++ b/src/test/baseline/testTextButtonUpNewText.png
Binary files differ
diff --git a/src/test/baseline/testTexturedPolyLine4.png b/src/test/baseline/testTexturedPolyLine4.png
index 83c0b4a..f063a2f 100644
--- a/src/test/baseline/testTexturedPolyLine4.png
+++ b/src/test/baseline/testTexturedPolyLine4.png
Binary files differ
diff --git a/src/test/baseline/testTimeSliderHoriz1.png b/src/test/baseline/testTimeSliderHoriz1.png
new file mode 100644
index 0000000..42c0eca
--- /dev/null
+++ b/src/test/baseline/testTimeSliderHoriz1.png
Binary files differ
diff --git a/src/test/baseline/testTimeSliderHoriz2.png b/src/test/baseline/testTimeSliderHoriz2.png
new file mode 100644
index 0000000..a42b8ca
--- /dev/null
+++ b/src/test/baseline/testTimeSliderHoriz2.png
Binary files differ
diff --git a/src/test/baseline/testTimeSliderHoriz3.png b/src/test/baseline/testTimeSliderHoriz3.png
new file mode 100644
index 0000000..4908be5
--- /dev/null
+++ b/src/test/baseline/testTimeSliderHoriz3.png
Binary files differ
diff --git a/src/test/baseline/testTimeSliderHoriz4.png b/src/test/baseline/testTimeSliderHoriz4.png
new file mode 100644
index 0000000..1371480
--- /dev/null
+++ b/src/test/baseline/testTimeSliderHoriz4.png
Binary files differ
diff --git a/src/test/baseline/testTimeSliderHoriz5.png b/src/test/baseline/testTimeSliderHoriz5.png
new file mode 100644
index 0000000..1371480
--- /dev/null
+++ b/src/test/baseline/testTimeSliderHoriz5.png
Binary files differ
diff --git a/src/test/baseline/testTimeSliderVert1.png b/src/test/baseline/testTimeSliderVert1.png
new file mode 100644
index 0000000..8b31bac
--- /dev/null
+++ b/src/test/baseline/testTimeSliderVert1.png
Binary files differ
diff --git a/src/test/baseline/testTimeSliderVert2.png b/src/test/baseline/testTimeSliderVert2.png
new file mode 100644
index 0000000..79be7d1
--- /dev/null
+++ b/src/test/baseline/testTimeSliderVert2.png
Binary files differ
diff --git a/src/test/baseline/testTimeSliderVert3.png b/src/test/baseline/testTimeSliderVert3.png
new file mode 100644
index 0000000..a3a8718
--- /dev/null
+++ b/src/test/baseline/testTimeSliderVert3.png
Binary files differ
diff --git a/src/test/baseline/testTimeSliderVert4.png b/src/test/baseline/testTimeSliderVert4.png
new file mode 100644
index 0000000..f64996b
--- /dev/null
+++ b/src/test/baseline/testTimeSliderVert4.png
Binary files differ
diff --git a/src/test/baseline/testTimeSliderVert5.png b/src/test/baseline/testTimeSliderVert5.png
new file mode 100644
index 0000000..f64996b
--- /dev/null
+++ b/src/test/baseline/testTimeSliderVert5.png
Binary files differ
diff --git a/src/test/baseline/testUICheckBoxChecked_Down.png b/src/test/baseline/testUICheckBoxChecked_Down.png
new file mode 100644
index 0000000..73818b9
--- /dev/null
+++ b/src/test/baseline/testUICheckBoxChecked_Down.png
Binary files differ
diff --git a/src/test/baseline/testUICheckBoxChecked_Up.png b/src/test/baseline/testUICheckBoxChecked_Up.png
new file mode 100644
index 0000000..a4af8c9
--- /dev/null
+++ b/src/test/baseline/testUICheckBoxChecked_Up.png
Binary files differ
diff --git a/src/test/baseline/testUICheckBoxUnchecked_Disabled.png b/src/test/baseline/testUICheckBoxUnchecked_Disabled.png
new file mode 100644
index 0000000..ebcb3ef
--- /dev/null
+++ b/src/test/baseline/testUICheckBoxUnchecked_Disabled.png
Binary files differ
diff --git a/src/test/baseline/testUICheckBoxUnchecked_Down.png b/src/test/baseline/testUICheckBoxUnchecked_Down.png
new file mode 100644
index 0000000..4967f44
--- /dev/null
+++ b/src/test/baseline/testUICheckBoxUnchecked_Down.png
Binary files differ
diff --git a/src/test/baseline/testUICheckBoxUnchecked_Up.png b/src/test/baseline/testUICheckBoxUnchecked_Up.png
new file mode 100644
index 0000000..1c102e7
--- /dev/null
+++ b/src/test/baseline/testUICheckBoxUnchecked_Up.png
Binary files differ
diff --git a/src/test/baseline/testUIKeyboard.png b/src/test/baseline/testUIKeyboard.png
index 9e1a4cd..87d23a2 100644
--- a/src/test/baseline/testUIKeyboard.png
+++ b/src/test/baseline/testUIKeyboard.png
Binary files differ
diff --git a/src/test/baseline/testUIKeyboard1S.png b/src/test/baseline/testUIKeyboard1S.png
new file mode 100644
index 0000000..d7f0606
--- /dev/null
+++ b/src/test/baseline/testUIKeyboard1S.png
Binary files differ
diff --git a/src/test/baseline/testUIKeyboardA.png b/src/test/baseline/testUIKeyboardA.png
new file mode 100644
index 0000000..0012b33
--- /dev/null
+++ b/src/test/baseline/testUIKeyboardA.png
Binary files differ
diff --git a/src/test/baseline/testUIKeyboardA1S.png b/src/test/baseline/testUIKeyboardA1S.png
new file mode 100644
index 0000000..f2ccd3a
--- /dev/null
+++ b/src/test/baseline/testUIKeyboardA1S.png
Binary files differ
diff --git a/src/test/baseline/testUIKeyboardAS.png b/src/test/baseline/testUIKeyboardAS.png
new file mode 100644
index 0000000..cd76aad
--- /dev/null
+++ b/src/test/baseline/testUIKeyboardAS.png
Binary files differ
diff --git a/src/test/baseline/testUIKeyboardDown11.png b/src/test/baseline/testUIKeyboardDown11.png
new file mode 100644
index 0000000..bfc8a50
--- /dev/null
+++ b/src/test/baseline/testUIKeyboardDown11.png
Binary files differ
diff --git a/src/test/baseline/testUIKeyboardDownA1.png b/src/test/baseline/testUIKeyboardDownA1.png
deleted file mode 100644
index 51c001e..0000000
--- a/src/test/baseline/testUIKeyboardDownA1.png
+++ /dev/null
Binary files differ
diff --git a/src/test/baseline/testUIKeyboardDownA111S1.png b/src/test/baseline/testUIKeyboardDownA111S1.png
deleted file mode 100644
index d05d7a6..0000000
--- a/src/test/baseline/testUIKeyboardDownA111S1.png
+++ /dev/null
Binary files differ
diff --git a/src/test/baseline/testUIKeyboardDownA212S2.png b/src/test/baseline/testUIKeyboardDownA212S2.png
index b7b5492..cd79feb 100644
--- a/src/test/baseline/testUIKeyboardDownA212S2.png
+++ b/src/test/baseline/testUIKeyboardDownA212S2.png
Binary files differ
diff --git a/src/test/baseline/testUIKeyboardDownA2S1.png b/src/test/baseline/testUIKeyboardDownA2S1.png
new file mode 100644
index 0000000..6c07214
--- /dev/null
+++ b/src/test/baseline/testUIKeyboardDownA2S1.png
Binary files differ
diff --git a/src/test/baseline/testUIKeyboardDownS1.png b/src/test/baseline/testUIKeyboardDownS1.png
deleted file mode 100644
index deef9fc..0000000
--- a/src/test/baseline/testUIKeyboardDownS1.png
+++ /dev/null
Binary files differ
diff --git a/src/test/baseline/testUIKeyboardFB.png b/src/test/baseline/testUIKeyboardFB.png
new file mode 100644
index 0000000..f4836a1
--- /dev/null
+++ b/src/test/baseline/testUIKeyboardFB.png
Binary files differ
diff --git a/src/test/baseline/testUIKeyboardFB1.png b/src/test/baseline/testUIKeyboardFB1.png
new file mode 100644
index 0000000..13a56aa
--- /dev/null
+++ b/src/test/baseline/testUIKeyboardFB1.png
Binary files differ
diff --git a/src/test/baseline/testUIKeyboardFBA1S.png b/src/test/baseline/testUIKeyboardFBA1S.png
new file mode 100644
index 0000000..e9e5534
--- /dev/null
+++ b/src/test/baseline/testUIKeyboardFBA1S.png
Binary files differ
diff --git a/src/test/baseline/testUIKeyboardFBAS.png b/src/test/baseline/testUIKeyboardFBAS.png
new file mode 100644
index 0000000..0e10aaf
--- /dev/null
+++ b/src/test/baseline/testUIKeyboardFBAS.png
Binary files differ
diff --git a/src/test/baseline/testUIKeyboardFBS.png b/src/test/baseline/testUIKeyboardFBS.png
new file mode 100644
index 0000000..9e0964a
--- /dev/null
+++ b/src/test/baseline/testUIKeyboardFBS.png
Binary files differ
diff --git a/src/test/baseline/testUIKeyboardNoFB1S.png b/src/test/baseline/testUIKeyboardNoFB1S.png
new file mode 100644
index 0000000..4c91d91
--- /dev/null
+++ b/src/test/baseline/testUIKeyboardNoFB1S.png
Binary files differ
diff --git a/src/test/baseline/testUIKeyboardS.png b/src/test/baseline/testUIKeyboardS.png
new file mode 100644
index 0000000..12a6c9f
--- /dev/null
+++ b/src/test/baseline/testUIKeyboardS.png
Binary files differ
diff --git a/src/test/baseline/testUIToggleChecked_Disabled.png b/src/test/baseline/testUIToggleChecked_Disabled.png
new file mode 100644
index 0000000..6a23dda
--- /dev/null
+++ b/src/test/baseline/testUIToggleChecked_Disabled.png
Binary files differ
diff --git a/src/test/baseline/testUIToggleChecked_Down.png b/src/test/baseline/testUIToggleChecked_Down.png
new file mode 100644
index 0000000..a17041f
--- /dev/null
+++ b/src/test/baseline/testUIToggleChecked_Down.png
Binary files differ
diff --git a/src/test/baseline/testUIToggleChecked_Up.png b/src/test/baseline/testUIToggleChecked_Up.png
new file mode 100644
index 0000000..03f2f41
--- /dev/null
+++ b/src/test/baseline/testUIToggleChecked_Up.png
Binary files differ
diff --git a/src/test/baseline/testUIToggleUnchecked_Disabled.png b/src/test/baseline/testUIToggleUnchecked_Disabled.png
new file mode 100644
index 0000000..8fccaa6
--- /dev/null
+++ b/src/test/baseline/testUIToggleUnchecked_Disabled.png
Binary files differ
diff --git a/src/test/baseline/testUIToggleUnchecked_Down.png b/src/test/baseline/testUIToggleUnchecked_Down.png
new file mode 100644
index 0000000..bbad224
--- /dev/null
+++ b/src/test/baseline/testUIToggleUnchecked_Down.png
Binary files differ
diff --git a/src/test/baseline/testUIToggleUnchecked_Up.png b/src/test/baseline/testUIToggleUnchecked_Up.png
new file mode 100644
index 0000000..a6f08f0
--- /dev/null
+++ b/src/test/baseline/testUIToggleUnchecked_Up.png
Binary files differ
diff --git a/src/test/baseline/testVideo-mpeg1-48x48.mpg1.png b/src/test/baseline/testVideo-mpeg1-48x48.mov1.png
index ad9dcf8..ad9dcf8 100644
--- a/src/test/baseline/testVideo-mpeg1-48x48.mpg1.png
+++ b/src/test/baseline/testVideo-mpeg1-48x48.mov1.png
Binary files differ
diff --git a/src/test/baseline/testVideo-mpeg4-48x48.avi1.png b/src/test/baseline/testVideo-mpeg4-48x48.avi1.png
new file mode 100644
index 0000000..5b6a337
--- /dev/null
+++ b/src/test/baseline/testVideo-mpeg4-48x48.avi1.png
Binary files differ
diff --git a/src/test/baseline/testWordsGamma1.png b/src/test/baseline/testWordsGamma1.png
new file mode 100644
index 0000000..9586c80
--- /dev/null
+++ b/src/test/baseline/testWordsGamma1.png
Binary files differ
diff --git a/src/test/baseline/testWordsGamma2.png b/src/test/baseline/testWordsGamma2.png
new file mode 100644
index 0000000..f5c2367
--- /dev/null
+++ b/src/test/baseline/testWordsGamma2.png
Binary files differ
diff --git a/src/test/baseline/testWordsIntensity.png b/src/test/baseline/testWordsIntensity.png
new file mode 100644
index 0000000..c49904e
--- /dev/null
+++ b/src/test/baseline/testWordsIntensity.png
Binary files differ
diff --git a/src/test/baseline/testWordsMask7.png b/src/test/baseline/testWordsMask7.png
new file mode 100644
index 0000000..6be97bc
--- /dev/null
+++ b/src/test/baseline/testWordsMask7.png
Binary files differ
diff --git a/src/test/baseline/testWordsOutlines.png b/src/test/baseline/testWordsOutlines.png
new file mode 100644
index 0000000..6187147
--- /dev/null
+++ b/src/test/baseline/testWordsOutlines.png
Binary files differ
diff --git a/src/test/baseline/testplugin1.png b/src/test/baseline/testplugin1.png
index e06639d..fd07f6c 100644
--- a/src/test/baseline/testplugin1.png
+++ b/src/test/baseline/testplugin1.png
Binary files differ
diff --git a/src/test/baseline/testplugin2.png b/src/test/baseline/testplugin2.png
index fc47a3c..2ec2e11 100644
--- a/src/test/baseline/testplugin2.png
+++ b/src/test/baseline/testplugin2.png
Binary files differ
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
deleted file mode 100644
index d57eda6..0000000
--- a/src/test/extrafonts/.svn/text-base/testaddfontdir.ttf.svn-base
+++ /dev/null
Binary files differ
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
deleted file mode 100644
index 58cd6b5..0000000
--- a/src/test/fonts/.svn/text-base/Vera.ttf.svn-base
+++ /dev/null
Binary files differ
diff --git a/src/test/fonts/.svn/text-base/VeraBI.ttf.svn-base b/src/test/fonts/.svn/text-base/VeraBI.ttf.svn-base
deleted file mode 100644
index b55eee3..0000000
--- a/src/test/fonts/.svn/text-base/VeraBI.ttf.svn-base
+++ /dev/null
Binary files differ
diff --git a/src/test/fonts/.svn/text-base/VeraBd.ttf.svn-base b/src/test/fonts/.svn/text-base/VeraBd.ttf.svn-base
deleted file mode 100644
index 51d6111..0000000
--- a/src/test/fonts/.svn/text-base/VeraBd.ttf.svn-base
+++ /dev/null
Binary files differ
diff --git a/src/test/fonts/.svn/text-base/VeraIt.ttf.svn-base b/src/test/fonts/.svn/text-base/VeraIt.ttf.svn-base
deleted file mode 100644
index cc23c9e..0000000
--- a/src/test/fonts/.svn/text-base/VeraIt.ttf.svn-base
+++ /dev/null
Binary files differ
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
index 5800230..5800230 100644
--- a/src/test/1x1_white.png
+++ b/src/test/media/1x1_white.png
Binary files differ
diff --git a/src/test/media/22.050Hz_16bit_mono.wav b/src/test/media/22.050Hz_16bit_mono.wav
new file mode 100755
index 0000000..1f86e64
--- /dev/null
+++ b/src/test/media/22.050Hz_16bit_mono.wav
Binary files differ
diff --git a/src/test/media/44.1kHz_16bit_6Chan.ogg b/src/test/media/44.1kHz_16bit_6Chan.ogg
new file mode 100644
index 0000000..7d190d1
--- /dev/null
+++ b/src/test/media/44.1kHz_16bit_6Chan.ogg
Binary files differ
diff --git a/src/test/media/44.1kHz_16bit_mono.wav b/src/test/media/44.1kHz_16bit_mono.wav
new file mode 100755
index 0000000..8676a75
--- /dev/null
+++ b/src/test/media/44.1kHz_16bit_mono.wav
Binary files differ
diff --git a/src/test/media/44.1kHz_16bit_stereo.aif b/src/test/media/44.1kHz_16bit_stereo.aif
new file mode 100755
index 0000000..0c9b5c7
--- /dev/null
+++ b/src/test/media/44.1kHz_16bit_stereo.aif
Binary files differ
diff --git a/src/test/media/44.1kHz_16bit_stereo.wav b/src/test/media/44.1kHz_16bit_stereo.wav
new file mode 100755
index 0000000..af5c2ee
--- /dev/null
+++ b/src/test/media/44.1kHz_16bit_stereo.wav
Binary files differ
diff --git a/src/test/media/44.1kHz_24bit_mono.wav b/src/test/media/44.1kHz_24bit_mono.wav
new file mode 100755
index 0000000..fd2deed
--- /dev/null
+++ b/src/test/media/44.1kHz_24bit_mono.wav
Binary files differ
diff --git a/src/test/media/44.1kHz_24bit_stereo.aif b/src/test/media/44.1kHz_24bit_stereo.aif
new file mode 100755
index 0000000..f569ded
--- /dev/null
+++ b/src/test/media/44.1kHz_24bit_stereo.aif
Binary files differ
diff --git a/src/test/media/44.1kHz_24bit_stereo.wav b/src/test/media/44.1kHz_24bit_stereo.wav
new file mode 100755
index 0000000..36c6aa7
--- /dev/null
+++ b/src/test/media/44.1kHz_24bit_stereo.wav
Binary files differ
diff --git a/src/test/media/44.1kHz_mono.ogg b/src/test/media/44.1kHz_mono.ogg
new file mode 100755
index 0000000..7bcb866
--- /dev/null
+++ b/src/test/media/44.1kHz_mono.ogg
Binary files differ
diff --git a/src/test/media/44.1kHz_stereo.mp3 b/src/test/media/44.1kHz_stereo.mp3
new file mode 100644
index 0000000..cbefc63
--- /dev/null
+++ b/src/test/media/44.1kHz_stereo.mp3
Binary files differ
diff --git a/src/test/media/44.1kHz_stereo.ogg b/src/test/media/44.1kHz_stereo.ogg
new file mode 100644
index 0000000..f5ed4d0
--- /dev/null
+++ b/src/test/media/44.1kHz_stereo.ogg
Binary files differ
diff --git a/src/test/media/48kHz_16bit_mono.wav b/src/test/media/48kHz_16bit_mono.wav
new file mode 100755
index 0000000..0f817c9
--- /dev/null
+++ b/src/test/media/48kHz_16bit_mono.wav
Binary files differ
diff --git a/src/test/media/48kHz_16bit_stereo.aif b/src/test/media/48kHz_16bit_stereo.aif
new file mode 100755
index 0000000..db3a381
--- /dev/null
+++ b/src/test/media/48kHz_16bit_stereo.aif
Binary files differ
diff --git a/src/test/media/48kHz_16bit_stereo.wav b/src/test/media/48kHz_16bit_stereo.wav
new file mode 100755
index 0000000..9fc52f1
--- /dev/null
+++ b/src/test/media/48kHz_16bit_stereo.wav
Binary files differ
diff --git a/src/test/media/48kHz_24bit_mono.wav b/src/test/media/48kHz_24bit_mono.wav
new file mode 100755
index 0000000..296ca11
--- /dev/null
+++ b/src/test/media/48kHz_24bit_mono.wav
Binary files differ
diff --git a/src/test/media/48kHz_24bit_stereo.aif b/src/test/media/48kHz_24bit_stereo.aif
new file mode 100755
index 0000000..3ab7cf1
--- /dev/null
+++ b/src/test/media/48kHz_24bit_stereo.aif
Binary files differ
diff --git a/src/test/media/48kHz_24bit_stereo.wav b/src/test/media/48kHz_24bit_stereo.wav
new file mode 100755
index 0000000..af2c977
--- /dev/null
+++ b/src/test/media/48kHz_24bit_stereo.wav
Binary files differ
diff --git a/src/test/media/48kHz_stereo.mp3 b/src/test/media/48kHz_stereo.mp3
new file mode 100644
index 0000000..0eaa0f5
--- /dev/null
+++ b/src/test/media/48kHz_stereo.mp3
Binary files differ
diff --git a/src/test/media/48kHz_stereo.ogg b/src/test/media/48kHz_stereo.ogg
new file mode 100644
index 0000000..92d7b7b
--- /dev/null
+++ b/src/test/media/48kHz_stereo.ogg
Binary files differ
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
new file mode 100644
index 0000000..81cbb0f
--- /dev/null
+++ b/src/test/media/button_bg_down.png
Binary files differ
diff --git a/src/test/media/button_bg_up.png b/src/test/media/button_bg_up.png
new file mode 100644
index 0000000..91cfe04
--- /dev/null
+++ b/src/test/media/button_bg_up.png
Binary files differ
diff --git a/src/test/button_check.png b/src/test/media/button_check.png
index b0aa4a9..b0aa4a9 100644
--- a/src/test/button_check.png
+++ b/src/test/media/button_check.png
Binary files differ
diff --git a/src/test/button_disabled.png b/src/test/media/button_disabled.png
index dbf1309..dbf1309 100644
--- a/src/test/button_disabled.png
+++ b/src/test/media/button_disabled.png
Binary files differ
diff --git a/src/test/button_down.png b/src/test/media/button_down.png
index 88ee5f5..88ee5f5 100644
--- a/src/test/button_down.png
+++ b/src/test/media/button_down.png
Binary files differ
diff --git a/src/test/button_over.png b/src/test/media/button_over.png
index 0837e8e..0837e8e 100644
--- a/src/test/button_over.png
+++ b/src/test/media/button_over.png
Binary files differ
diff --git a/src/test/button_up.png b/src/test/media/button_up.png
index aa7d33a..aa7d33a 100644
--- a/src/test/button_up.png
+++ b/src/test/media/button_up.png
Binary files differ
diff --git a/src/test/media/checkbox_checked_disabled.png b/src/test/media/checkbox_checked_disabled.png
new file mode 100644
index 0000000..da58829
--- /dev/null
+++ b/src/test/media/checkbox_checked_disabled.png
Binary files differ
diff --git a/src/test/media/checkbox_checked_down.png b/src/test/media/checkbox_checked_down.png
new file mode 100644
index 0000000..4fbbd83
--- /dev/null
+++ b/src/test/media/checkbox_checked_down.png
Binary files differ
diff --git a/src/test/media/checkbox_checked_up.png b/src/test/media/checkbox_checked_up.png
new file mode 100644
index 0000000..ca901f4
--- /dev/null
+++ b/src/test/media/checkbox_checked_up.png
Binary files differ
diff --git a/src/test/media/checkbox_unchecked_disabled.png b/src/test/media/checkbox_unchecked_disabled.png
new file mode 100644
index 0000000..e8c2116
--- /dev/null
+++ b/src/test/media/checkbox_unchecked_disabled.png
Binary files differ
diff --git a/src/test/media/checkbox_unchecked_down.png b/src/test/media/checkbox_unchecked_down.png
new file mode 100644
index 0000000..69f8282
--- /dev/null
+++ b/src/test/media/checkbox_unchecked_down.png
Binary files differ
diff --git a/src/test/media/checkbox_unchecked_up.png b/src/test/media/checkbox_unchecked_up.png
new file mode 100644
index 0000000..e354492
--- /dev/null
+++ b/src/test/media/checkbox_unchecked_up.png
Binary files differ
diff --git a/src/test/checker.png b/src/test/media/checker.png
index 4f100c5..4f100c5 100644
--- a/src/test/checker.png
+++ b/src/test/media/checker.png
Binary files differ
diff --git a/src/test/media/chromakey-median.png b/src/test/media/chromakey-median.png
new file mode 100644
index 0000000..5858c4b
--- /dev/null
+++ b/src/test/media/chromakey-median.png
Binary files differ
diff --git a/src/test/media/chromakey.png b/src/test/media/chromakey.png
new file mode 100644
index 0000000..b2cfc2e
--- /dev/null
+++ b/src/test/media/chromakey.png
Binary files differ
diff --git a/src/test/colorramp.png b/src/test/media/colorramp.png
index da12725..da12725 100644
--- a/src/test/colorramp.png
+++ b/src/test/media/colorramp.png
Binary files differ
diff --git a/src/test/media/core b/src/test/media/core
new file mode 100644
index 0000000..a3b4f7b
--- /dev/null
+++ b/src/test/media/core
Binary files differ
diff --git a/src/test/crop_bkgd.png b/src/test/media/crop_bkgd.png
index 89f9e95..89f9e95 100644
--- a/src/test/crop_bkgd.png
+++ b/src/test/media/crop_bkgd.png
Binary files differ
diff --git a/src/test/media/dilation.png b/src/test/media/dilation.png
new file mode 100644
index 0000000..7981594
--- /dev/null
+++ b/src/test/media/dilation.png
Binary files differ
diff --git a/src/test/media/erosion.png b/src/test/media/erosion.png
new file mode 100644
index 0000000..899e2c4
--- /dev/null
+++ b/src/test/media/erosion.png
Binary files differ
diff --git a/src/test/media/filterwipeborder.png b/src/test/media/filterwipeborder.png
new file mode 100644
index 0000000..58ac84d
--- /dev/null
+++ b/src/test/media/filterwipeborder.png
Binary files differ
diff --git a/src/test/media/flat.png b/src/test/media/flat.png
new file mode 100644
index 0000000..51d2c55
--- /dev/null
+++ b/src/test/media/flat.png
Binary files differ
diff --git a/src/test/media/floodfill.png b/src/test/media/floodfill.png
new file mode 100644
index 0000000..6a9e5b5
--- /dev/null
+++ b/src/test/media/floodfill.png
Binary files differ
diff --git a/src/test/freidrehen.jpg b/src/test/media/freidrehen.jpg
index 7f93bf0..7f93bf0 100644
--- a/src/test/freidrehen.jpg
+++ b/src/test/media/freidrehen.jpg
Binary files differ
diff --git a/src/test/greyscale.png b/src/test/media/greyscale.png
index f86a18b..f86a18b 100644
--- a/src/test/greyscale.png
+++ b/src/test/media/greyscale.png
Binary files differ
diff --git a/src/test/media/h264-48x48.h264 b/src/test/media/h264-48x48.h264
new file mode 100644
index 0000000..d650960
--- /dev/null
+++ b/src/test/media/h264-48x48.h264
Binary files differ
diff --git a/src/test/media/hsl.png b/src/test/media/hsl.png
new file mode 100644
index 0000000..9621451
--- /dev/null
+++ b/src/test/media/hsl.png
Binary files differ
diff --git a/src/test/media/i8-64x64.png b/src/test/media/i8-64x64.png
new file mode 100644
index 0000000..ec88c8c
--- /dev/null
+++ b/src/test/media/i8-64x64.png
Binary files differ
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
new file mode 100644
index 0000000..6dc6fd1
--- /dev/null
+++ b/src/test/media/incompleteSkinMedia/scrollbar_horiz_thumb_down.png
Binary files differ
diff --git a/src/test/media/incompleteSkinMedia/scrollbar_horiz_thumb_up.png b/src/test/media/incompleteSkinMedia/scrollbar_horiz_thumb_up.png
new file mode 100644
index 0000000..eb6b005
--- /dev/null
+++ b/src/test/media/incompleteSkinMedia/scrollbar_horiz_thumb_up.png
Binary files differ
diff --git a/src/test/media/incompleteSkinMedia/scrollbar_horiz_track.png b/src/test/media/incompleteSkinMedia/scrollbar_horiz_track.png
new file mode 100644
index 0000000..d2f393b
--- /dev/null
+++ b/src/test/media/incompleteSkinMedia/scrollbar_horiz_track.png
Binary files differ
diff --git a/src/test/media/incompleteSkinMedia/scrollbar_horiz_track_disabled.png b/src/test/media/incompleteSkinMedia/scrollbar_horiz_track_disabled.png
new file mode 100644
index 0000000..7ac86fe
--- /dev/null
+++ b/src/test/media/incompleteSkinMedia/scrollbar_horiz_track_disabled.png
Binary files differ
diff --git a/src/test/keyboard_bg.png b/src/test/media/keyboard_bg.png
index a767d06..a767d06 100644
--- a/src/test/keyboard_bg.png
+++ b/src/test/media/keyboard_bg.png
Binary files differ
diff --git a/src/test/keyboard_ovl.png b/src/test/media/keyboard_down.png
index f3ead71..f3ead71 100644
--- a/src/test/keyboard_ovl.png
+++ b/src/test/media/keyboard_down.png
Binary files differ
diff --git a/src/test/media/keyboard_feedback.png b/src/test/media/keyboard_feedback.png
new file mode 100644
index 0000000..e519594
--- /dev/null
+++ b/src/test/media/keyboard_feedback.png
Binary files differ
diff --git a/src/test/mask.png b/src/test/media/mask.png
index 031b39a..031b39a 100644
--- a/src/test/mask.png
+++ b/src/test/media/mask.png
Binary files differ
diff --git a/src/test/mask1.png b/src/test/media/mask1.png
index ffe5618..ffe5618 100644
--- a/src/test/mask1.png
+++ b/src/test/media/mask1.png
Binary files differ
diff --git a/src/test/mask2.png b/src/test/media/mask2.png
index 92975df..92975df 100644
--- a/src/test/mask2.png
+++ b/src/test/media/mask2.png
Binary files differ
diff --git a/src/test/media/mjpeg-48x48.avi b/src/test/media/mjpeg-48x48.avi
new file mode 100644
index 0000000..337df16
--- /dev/null
+++ b/src/test/media/mjpeg-48x48.avi
Binary files differ
diff --git a/src/test/media/mpeg1-48x48-sound.avi b/src/test/media/mpeg1-48x48-sound.avi
new file mode 100644
index 0000000..be415db
--- /dev/null
+++ b/src/test/media/mpeg1-48x48-sound.avi
Binary files differ
diff --git a/src/test/media/mpeg1-48x48.mov b/src/test/media/mpeg1-48x48.mov
new file mode 100644
index 0000000..16ab499
--- /dev/null
+++ b/src/test/media/mpeg1-48x48.mov
Binary files differ
diff --git a/src/test/media/mpeg4-48x48.avi b/src/test/media/mpeg4-48x48.avi
new file mode 100644
index 0000000..a906b17
--- /dev/null
+++ b/src/test/media/mpeg4-48x48.avi
Binary files differ
diff --git a/src/test/oe.png b/src/test/media/oe.png
index 3527967..3527967 100644
--- a/src/test/oe.png
+++ b/src/test/media/oe.png
Binary files differ
diff --git a/src/test/media/pause_button_down.png b/src/test/media/pause_button_down.png
new file mode 100644
index 0000000..c06b34a
--- /dev/null
+++ b/src/test/media/pause_button_down.png
Binary files differ
diff --git a/src/test/media/pause_button_up.png b/src/test/media/pause_button_up.png
new file mode 100644
index 0000000..1a923b9
--- /dev/null
+++ b/src/test/media/pause_button_up.png
Binary files differ
diff --git a/src/test/media/play_button_down.png b/src/test/media/play_button_down.png
new file mode 100644
index 0000000..07b167b
--- /dev/null
+++ b/src/test/media/play_button_down.png
Binary files differ
diff --git a/src/test/media/play_button_up.png b/src/test/media/play_button_up.png
new file mode 100644
index 0000000..e16ec9e
--- /dev/null
+++ b/src/test/media/play_button_up.png
Binary files differ
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
index 1675688..1675688 100644
--- a/src/test/rectborder.png
+++ b/src/test/media/rectborder.png
Binary files differ
diff --git a/src/test/rgb24-32x32.png b/src/test/media/rgb24-32x32.png
index c5d6711..c5d6711 100644
--- a/src/test/rgb24-32x32.png
+++ b/src/test/media/rgb24-32x32.png
Binary files differ
diff --git a/src/test/rgb24-64x64.png b/src/test/media/rgb24-64x64.png
index cca71fe..cca71fe 100644
--- a/src/test/rgb24-64x64.png
+++ b/src/test/media/rgb24-64x64.png
Binary files differ
diff --git a/src/test/rgb24-65x65.png b/src/test/media/rgb24-65x65.png
index ada2689..ada2689 100644
--- a/src/test/rgb24-65x65.png
+++ b/src/test/media/rgb24-65x65.png
Binary files differ
diff --git a/src/test/rgb24alpha-32x32.png b/src/test/media/rgb24alpha-32x32.png
index 2e9e6af..2e9e6af 100644
--- a/src/test/rgb24alpha-32x32.png
+++ b/src/test/media/rgb24alpha-32x32.png
Binary files differ
diff --git a/src/test/rgb24alpha-64x64.png b/src/test/media/rgb24alpha-64x64.png
index 41b69c3..41b69c3 100644
--- a/src/test/rgb24alpha-64x64.png
+++ b/src/test/media/rgb24alpha-64x64.png
Binary files differ
diff --git a/src/test/media/rgba-48x48.mov b/src/test/media/rgba-48x48.mov
new file mode 100644
index 0000000..7e311cc
--- /dev/null
+++ b/src/test/media/rgba-48x48.mov
Binary files differ
diff --git a/src/test/media/scrollarea_border.png b/src/test/media/scrollarea_border.png
new file mode 100644
index 0000000..2e95f57
--- /dev/null
+++ b/src/test/media/scrollarea_border.png
Binary files differ
diff --git a/src/test/media/scrollbar_horiz_thumb_disabled.png b/src/test/media/scrollbar_horiz_thumb_disabled.png
new file mode 100644
index 0000000..4645372
--- /dev/null
+++ b/src/test/media/scrollbar_horiz_thumb_disabled.png
Binary files differ
diff --git a/src/test/media/scrollbar_horiz_thumb_down.png b/src/test/media/scrollbar_horiz_thumb_down.png
new file mode 100644
index 0000000..6dc6fd1
--- /dev/null
+++ b/src/test/media/scrollbar_horiz_thumb_down.png
Binary files differ
diff --git a/src/test/media/scrollbar_horiz_thumb_up.png b/src/test/media/scrollbar_horiz_thumb_up.png
new file mode 100644
index 0000000..eb6b005
--- /dev/null
+++ b/src/test/media/scrollbar_horiz_thumb_up.png
Binary files differ
diff --git a/src/test/media/scrollbar_horiz_track.png b/src/test/media/scrollbar_horiz_track.png
new file mode 100644
index 0000000..d2f393b
--- /dev/null
+++ b/src/test/media/scrollbar_horiz_track.png
Binary files differ
diff --git a/src/test/media/scrollbar_horiz_track_disabled.png b/src/test/media/scrollbar_horiz_track_disabled.png
new file mode 100644
index 0000000..7ac86fe
--- /dev/null
+++ b/src/test/media/scrollbar_horiz_track_disabled.png
Binary files differ
diff --git a/src/test/media/scrollbar_vert_thumb_disabled.png b/src/test/media/scrollbar_vert_thumb_disabled.png
new file mode 100644
index 0000000..f375a2b
--- /dev/null
+++ b/src/test/media/scrollbar_vert_thumb_disabled.png
Binary files differ
diff --git a/src/test/media/scrollbar_vert_thumb_down.png b/src/test/media/scrollbar_vert_thumb_down.png
new file mode 100644
index 0000000..c7b09d1
--- /dev/null
+++ b/src/test/media/scrollbar_vert_thumb_down.png
Binary files differ
diff --git a/src/test/media/scrollbar_vert_thumb_up.png b/src/test/media/scrollbar_vert_thumb_up.png
new file mode 100644
index 0000000..f6c2f88
--- /dev/null
+++ b/src/test/media/scrollbar_vert_thumb_up.png
Binary files differ
diff --git a/src/test/media/scrollbar_vert_track.png b/src/test/media/scrollbar_vert_track.png
new file mode 100644
index 0000000..58af284
--- /dev/null
+++ b/src/test/media/scrollbar_vert_track.png
Binary files differ
diff --git a/src/test/media/scrollbar_vert_track_disabled.png b/src/test/media/scrollbar_vert_track_disabled.png
new file mode 100644
index 0000000..695b112
--- /dev/null
+++ b/src/test/media/scrollbar_vert_track_disabled.png
Binary files differ
diff --git a/src/test/shadow.png b/src/test/media/shadow.png
index 0a4563f..0a4563f 100644
--- a/src/test/shadow.png
+++ b/src/test/media/shadow.png
Binary files differ
diff --git a/src/test/media/slider_horiz_track.png b/src/test/media/slider_horiz_track.png
new file mode 100644
index 0000000..6e233a5
--- /dev/null
+++ b/src/test/media/slider_horiz_track.png
Binary files differ
diff --git a/src/test/media/slider_horiz_track_disabled.png b/src/test/media/slider_horiz_track_disabled.png
new file mode 100644
index 0000000..01c880d
--- /dev/null
+++ b/src/test/media/slider_horiz_track_disabled.png
Binary files differ
diff --git a/src/test/media/slider_thumb_down.png b/src/test/media/slider_thumb_down.png
new file mode 100644
index 0000000..1f2acc2
--- /dev/null
+++ b/src/test/media/slider_thumb_down.png
Binary files differ
diff --git a/src/test/media/slider_thumb_up.png b/src/test/media/slider_thumb_up.png
new file mode 100644
index 0000000..885506d
--- /dev/null
+++ b/src/test/media/slider_thumb_up.png
Binary files differ
diff --git a/src/test/media/slider_vert_track.png b/src/test/media/slider_vert_track.png
new file mode 100644
index 0000000..51bac37
--- /dev/null
+++ b/src/test/media/slider_vert_track.png
Binary files differ
diff --git a/src/test/media/slider_vert_track_disabled.png b/src/test/media/slider_vert_track_disabled.png
new file mode 100644
index 0000000..bc8d7b6
--- /dev/null
+++ b/src/test/media/slider_vert_track_disabled.png
Binary files differ
diff --git a/src/test/media/spike.png b/src/test/media/spike.png
new file mode 100644
index 0000000..958e95d
--- /dev/null
+++ b/src/test/media/spike.png
Binary files differ
diff --git a/src/test/media/toggle_checked_Disabled.png b/src/test/media/toggle_checked_Disabled.png
new file mode 100644
index 0000000..31372c0
--- /dev/null
+++ b/src/test/media/toggle_checked_Disabled.png
Binary files differ
diff --git a/src/test/media/toggle_checked_Down.png b/src/test/media/toggle_checked_Down.png
new file mode 100644
index 0000000..8c4afd2
--- /dev/null
+++ b/src/test/media/toggle_checked_Down.png
Binary files differ
diff --git a/src/test/media/toggle_checked_Up.png b/src/test/media/toggle_checked_Up.png
new file mode 100644
index 0000000..8214fcf
--- /dev/null
+++ b/src/test/media/toggle_checked_Up.png
Binary files differ
diff --git a/src/test/media/toggle_unchecked_Disabled.png b/src/test/media/toggle_unchecked_Disabled.png
new file mode 100644
index 0000000..6b90e0b
--- /dev/null
+++ b/src/test/media/toggle_unchecked_Disabled.png
Binary files differ
diff --git a/src/test/media/toggle_unchecked_Down.png b/src/test/media/toggle_unchecked_Down.png
new file mode 100644
index 0000000..f2e4272
--- /dev/null
+++ b/src/test/media/toggle_unchecked_Down.png
Binary files differ
diff --git a/src/test/media/toggle_unchecked_Up.png b/src/test/media/toggle_unchecked_Up.png
new file mode 100644
index 0000000..3a006ea
--- /dev/null
+++ b/src/test/media/toggle_unchecked_Up.png
Binary files differ
diff --git a/src/test/media/vp6a-yuva-48x48.flv b/src/test/media/vp6a-yuva-48x48.flv
new file mode 100644
index 0000000..21866fe
--- /dev/null
+++ b/src/test/media/vp6a-yuva-48x48.flv
Binary files differ
diff --git a/src/test/widebmp.jpg b/src/test/media/widebmp.jpg
index 8304e3d..8304e3d 100644
--- a/src/test/widebmp.jpg
+++ b/src/test/media/widebmp.jpg
Binary files differ
diff --git a/src/test/panoimage.png b/src/test/panoimage.png
deleted file mode 100644
index 118b573..0000000
--- a/src/test/panoimage.png
+++ /dev/null
Binary files differ
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
deleted file mode 100644
index b37829d..0000000
--- a/src/test/rgb24alpha.tif
+++ /dev/null
Binary files differ
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()