|
|
@@ -1,10 +1,211 @@
|
|
|
-from direct.gui.DirectGuiBase import DirectGuiWidget
|
|
|
+from direct.gui.DirectGuiBase import DirectGuiBase, DirectGuiWidget, toggleGuiGridSnap, setGuiGridSpacing
|
|
|
+from direct.gui.OnscreenText import OnscreenText
|
|
|
+from direct.gui import DirectGuiGlobals as DGG
|
|
|
from direct.showbase.ShowBase import ShowBase
|
|
|
from direct.showbase import ShowBaseGlobal
|
|
|
+from direct.showbase.MessengerGlobal import messenger
|
|
|
from panda3d import core
|
|
|
import pytest
|
|
|
|
|
|
|
|
|
+def test_create_DirectGuiBase():
|
|
|
+ baseitem = DirectGuiBase()
|
|
|
+
|
|
|
+def test_defineoptions():
|
|
|
+ baseitem = DirectGuiBase()
|
|
|
+ testoptiondefs = (('test',0,None),)
|
|
|
+ baseitem.defineoptions({}, testoptiondefs)
|
|
|
+ assert baseitem['test'] == 0
|
|
|
+
|
|
|
+def test_addoptions():
|
|
|
+ baseitem = DirectGuiBase()
|
|
|
+ testoptiondefs = (('test',0,None),)
|
|
|
+
|
|
|
+ # Those two will usually be set in the defineoptions function
|
|
|
+ baseitem._optionInfo = {}
|
|
|
+ baseitem._constructorKeywords = {}
|
|
|
+
|
|
|
+ baseitem.addoptions(testoptiondefs, {})
|
|
|
+ assert baseitem['test'] == 0
|
|
|
+
|
|
|
+def test_initialiseoptions():
|
|
|
+ baseitem = DirectGuiBase()
|
|
|
+
|
|
|
+ class testWidget(DirectGuiBase):
|
|
|
+ def __init__(self):
|
|
|
+ pass
|
|
|
+
|
|
|
+ tw = testWidget()
|
|
|
+ baseitem.initialiseoptions(tw)
|
|
|
+
|
|
|
+ testoptiondefs = (('test',0,None),)
|
|
|
+ tw.defineoptions({}, testoptiondefs)
|
|
|
+ baseitem.initialiseoptions(tw)
|
|
|
+
|
|
|
+ assert tw['test'] == 0
|
|
|
+
|
|
|
+def test_postInitialiseFunc():
|
|
|
+ baseitem = DirectGuiBase()
|
|
|
+
|
|
|
+ def func_a():
|
|
|
+ global test_value_a
|
|
|
+ test_value_a = 1
|
|
|
+ def func_b():
|
|
|
+ global test_value_b
|
|
|
+ test_value_b = 1
|
|
|
+
|
|
|
+ baseitem.postInitialiseFuncList.append(func_a)
|
|
|
+ baseitem.postInitialiseFuncList.append(func_b)
|
|
|
+
|
|
|
+ baseitem.postInitialiseFunc()
|
|
|
+
|
|
|
+ global test_value_a
|
|
|
+ assert test_value_a == 1
|
|
|
+
|
|
|
+ global test_value_b
|
|
|
+ assert test_value_b == 1
|
|
|
+
|
|
|
+def test_isinitoption():
|
|
|
+ baseitem = DirectGuiBase()
|
|
|
+ testoptiondefs = (('test-true',0,DGG.INITOPT),('test-false',0,None))
|
|
|
+ baseitem.defineoptions({}, testoptiondefs)
|
|
|
+ assert baseitem.isinitoption('test-true') == True
|
|
|
+ assert baseitem.isinitoption('test-false') == False
|
|
|
+
|
|
|
+def test_options():
|
|
|
+ baseitem = DirectGuiBase()
|
|
|
+ testoptiondefs = (('test-1',0,DGG.INITOPT),('test-2',0,None),)
|
|
|
+ baseitem.defineoptions({}, testoptiondefs)
|
|
|
+ assert len(baseitem.options()) == 2
|
|
|
+
|
|
|
+def test_get_options():
|
|
|
+ baseitem = DirectGuiBase()
|
|
|
+ testoptiondefs = (('test-1',0,None),)
|
|
|
+ baseitem.defineoptions({}, testoptiondefs)
|
|
|
+
|
|
|
+ # Using the configure function
|
|
|
+ # check if configuration have been set correctly
|
|
|
+ assert baseitem.configure() == {'test-1': ('test-1', 0, 0),}
|
|
|
+ # check for specific configurations
|
|
|
+ assert baseitem.configure('test-1') == ('test-1', 0, 0)
|
|
|
+
|
|
|
+ # using index style references __getItem__ and cget
|
|
|
+ assert baseitem['test-1'] == 0
|
|
|
+ assert baseitem.cget('test-1') == 0
|
|
|
+
|
|
|
+def test_set_options():
|
|
|
+ baseitem = DirectGuiBase()
|
|
|
+
|
|
|
+ testoptiondefs = (('test-1',0,DGG.INITOPT),('test-2',0,None))
|
|
|
+ baseitem.defineoptions({}, testoptiondefs)
|
|
|
+
|
|
|
+ # try to set a value of an initopt option (shouldn't be possible)
|
|
|
+ baseitem.configure('test-1', **{'test-1': 1})
|
|
|
+ # check it's value. It shouldn't have changed
|
|
|
+ assert baseitem['test-1'] == 0
|
|
|
+
|
|
|
+ baseitem['test-1'] = 1
|
|
|
+ # check it's value. It shouldn't have changed
|
|
|
+ assert baseitem['test-1'] == 0
|
|
|
+
|
|
|
+ # try changing using the configure function. As test-2 isn't an
|
|
|
+ # initopt option, this should work fine
|
|
|
+ baseitem.configure('test-2', **{'test-2': 2})
|
|
|
+ # check it's value. It should be 2 now
|
|
|
+ assert baseitem['test-2'] == 2
|
|
|
+
|
|
|
+ # try changing using index style referencing
|
|
|
+ baseitem['test-2'] = 1
|
|
|
+ assert baseitem['test-2'] == 1
|
|
|
+
|
|
|
+def test_component_handling():
|
|
|
+ baseitem = DirectGuiBase()
|
|
|
+ testoptiondefs = (('test-1',0,None),)
|
|
|
+ baseitem.defineoptions({}, testoptiondefs)
|
|
|
+
|
|
|
+ assert len(baseitem.components()) == 0
|
|
|
+
|
|
|
+ baseitem.createcomponent(
|
|
|
+ 'componentName', # componentName
|
|
|
+ (), # componentAliases
|
|
|
+ 'componentGroup', # componentGroup
|
|
|
+ OnscreenText, # widgetClass
|
|
|
+ (), # *widgetArgs
|
|
|
+ text = 'Test', # **kw
|
|
|
+ parent = core.NodePath()
|
|
|
+ )
|
|
|
+
|
|
|
+ # check if we have exactly one component now
|
|
|
+ assert len(baseitem.components()) == 1
|
|
|
+ # check if we have a component named like the one we just created
|
|
|
+ assert baseitem.hascomponent('componentName')
|
|
|
+
|
|
|
+ # get our new component
|
|
|
+ component = baseitem.component('componentName')
|
|
|
+ # check some of its values
|
|
|
+ assert component.text == 'Test'
|
|
|
+
|
|
|
+ # destroy our recently created component
|
|
|
+ baseitem.destroycomponent('componentName')
|
|
|
+ # check if it really is gone
|
|
|
+ assert baseitem.hascomponent('componentName') == False
|
|
|
+
|
|
|
+def test_destroy():
|
|
|
+ baseitem = DirectGuiBase()
|
|
|
+ testoptiondefs = (('test-1',0,None),)
|
|
|
+ baseitem.defineoptions({}, testoptiondefs)
|
|
|
+ baseitem.destroy()
|
|
|
+ # check if things got correctly removed
|
|
|
+ assert not hasattr(baseitem, '_optionInfo')
|
|
|
+ assert not hasattr(baseitem, '__componentInfo')
|
|
|
+ assert not hasattr(baseitem, 'postInitialiseFuncList')
|
|
|
+
|
|
|
+def test_bindings():
|
|
|
+ baseitem = DirectGuiBase()
|
|
|
+
|
|
|
+ # Our test function and variable to check
|
|
|
+ global commandCalled
|
|
|
+ commandCalled = False
|
|
|
+ def command(**kw):
|
|
|
+ global commandCalled
|
|
|
+ commandCalled = True
|
|
|
+ assert True
|
|
|
+
|
|
|
+ # Bind an event to our item
|
|
|
+ baseitem.bind(DGG.B1CLICK, command)
|
|
|
+
|
|
|
+ # The function should be called now. Note that the guiId will be
|
|
|
+ # automatically appended by the bind command!
|
|
|
+ messenger.send(DGG.B1CLICK + baseitem.guiId)
|
|
|
+ assert commandCalled
|
|
|
+
|
|
|
+ # Try to unbind the event again
|
|
|
+ baseitem.unbind(DGG.B1CLICK)
|
|
|
+
|
|
|
+ # Now it shouldn't be called anymore
|
|
|
+ commandCalled = False
|
|
|
+ messenger.send(DGG.B1CLICK + baseitem.guiId)
|
|
|
+ assert not commandCalled
|
|
|
+
|
|
|
+def test_toggle_snap():
|
|
|
+ try:
|
|
|
+ DirectGuiWidget.snapToGrid = 0
|
|
|
+ item = DirectGuiWidget()
|
|
|
+ assert item.snapToGrid == 0
|
|
|
+ toggleGuiGridSnap()
|
|
|
+ assert item.snapToGrid == 1
|
|
|
+ finally:
|
|
|
+ DirectGuiWidget.snapToGrid = 0
|
|
|
+
|
|
|
+def test_toggle_spacing():
|
|
|
+ try:
|
|
|
+ DirectGuiWidget.gridSpacing = 0
|
|
|
+ item = DirectGuiWidget()
|
|
|
+ setGuiGridSpacing(5)
|
|
|
+ assert item.gridSpacing == 5
|
|
|
+ finally:
|
|
|
+ DirectGuiWidget.gridSpacing = 0.05
|
|
|
+
|
|
|
@pytest.mark.skipif(not ShowBaseGlobal.__dev__, reason="requires want-dev")
|
|
|
def test_track_gui_items():
|
|
|
page = core.load_prc_file_data("", "track-gui-items true")
|