Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions Changes.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,18 @@ Fixes
- Fixed handling of connections between floats and color/vector components [^2].
- Fixed bug preventing attributes from being deleted from lights during an interactive render [^2].

API
---

- GafferUITest.TestCase :
- Added `uiThreadCallHandler` member. This should be used by any tests which need to handle calls to the UI thread.
- Added `waitForPlugValueWidgetUpdate()` method.

Breaking Changes
----------------

- PlugValueWidgetTest : Removed `waitForUpdate()` method. Use `GafferUITest.TestCase.waitForPlugValueWidgetUpdate()` instead.

Build
-----

Expand Down
270 changes: 128 additions & 142 deletions python/GafferUITest/AnnotationsGadgetTest.py

Large diffs are not rendered by default.

14 changes: 7 additions & 7 deletions python/GafferUITest/BoolPlugValueWidgetTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,19 +55,19 @@ def test( self ) :
self.assertEqual( w.boolWidget().getState(), False )

n["user"]["p1"].setValue( True )
GafferUITest.PlugValueWidgetTest.waitForUpdate( w )
self.waitForPlugValueWidgetUpdate( w )
self.assertEqual( w.boolWidget().getState(), True )

w.setPlugs( n["user"].children() )
GafferUITest.PlugValueWidgetTest.waitForUpdate( w )
self.waitForPlugValueWidgetUpdate( w )
self.assertEqual( w.boolWidget().getState(), w.boolWidget().State.Indeterminate )

n["user"]["p2"].setValue( True )
GafferUITest.PlugValueWidgetTest.waitForUpdate( w )
self.waitForPlugValueWidgetUpdate( w )
self.assertEqual( w.boolWidget().getState(), True )

w.setPlugs( [] )
GafferUITest.PlugValueWidgetTest.waitForUpdate( w )
self.waitForPlugValueWidgetUpdate( w )
self.assertEqual( w.boolWidget().getState(), w.boolWidget().State.Indeterminate )

def testInitialValue( self ) :
Expand All @@ -78,7 +78,7 @@ def testInitialValue( self ) :
for v in ( True, False ) :
n["user"]["p"].setValue( v )
w = GafferUI.BoolPlugValueWidget( n["user"]["p"] )
GafferUITest.PlugValueWidgetTest.waitForUpdate( w )
self.waitForPlugValueWidgetUpdate( w )
self.assertEqual( w.boolWidget().getState(), v )

def testErrorHandling( self ) :
Expand All @@ -93,9 +93,9 @@ def testErrorHandling( self ) :

script["b"] = GafferTest.BadNode()
script["n"]["user"]["p"].setInput( script["b"]["out3"] )
GafferUITest.PlugValueWidgetTest.waitForUpdate( w )
self.waitForPlugValueWidgetUpdate( w )
self.assertTrue( w.boolWidget().getErrored() )

script["n"]["user"]["p"].setInput( None )
GafferUITest.PlugValueWidgetTest.waitForUpdate( w )
self.waitForPlugValueWidgetUpdate( w )
self.assertFalse( w.boolWidget().getErrored() )
8 changes: 4 additions & 4 deletions python/GafferUITest/ColorChooserTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -251,8 +251,8 @@ def testSaveDefaultOptions( self ) :
rgbaWidget = GafferUI.ColorPlugValueWidget( script["node"]["rgbaPlug"] )
rgbaWidget.setColorChooserVisible( True )

GafferUITest.PlugValueWidgetTest.waitForUpdate( rgbWidget._ColorPlugValueWidget__colorChooser )
GafferUITest.PlugValueWidgetTest.waitForUpdate( rgbaWidget._ColorPlugValueWidget__colorChooser )
self.waitForPlugValueWidgetUpdate( rgbWidget._ColorPlugValueWidget__colorChooser )
self.waitForPlugValueWidgetUpdate( rgbaWidget._ColorPlugValueWidget__colorChooser )

# Default state
for c in "rgbhsvtmi" :
Expand Down Expand Up @@ -286,8 +286,8 @@ def testSaveDefaultOptions( self ) :
rgbaWidget = GafferUI.ColorPlugValueWidget( script["node"]["rgbaPlug"] )
rgbaWidget.setColorChooserVisible( True )

GafferUITest.PlugValueWidgetTest.waitForUpdate( rgbWidget._ColorPlugValueWidget__colorChooser )
GafferUITest.PlugValueWidgetTest.waitForUpdate( rgbaWidget._ColorPlugValueWidget__colorChooser )
self.waitForPlugValueWidgetUpdate( rgbWidget._ColorPlugValueWidget__colorChooser )
self.waitForPlugValueWidgetUpdate( rgbaWidget._ColorPlugValueWidget__colorChooser )

for c in "rgbhsv" :
self.assertTrue( self.__sliderFromWidget( rgbWidget, c ).getVisible() )
Expand Down
9 changes: 4 additions & 5 deletions python/GafferUITest/ContextTrackerTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -818,11 +818,10 @@ def testCancellation( self ) :
# the background task.

with ContextTrackerTest.expressionStartedCondition :
with GafferTest.ParallelAlgoTest.UIThreadCallHandler() as handler :
script["node"]["op1"].setValue( 1 )
handler.assertCalled() # Handle UI thread call made when background task detects cancellation.
self.waitForIdle() # Handle idle event used to restart update.
ContextTrackerTest.expressionStartedCondition.wait()
script["node"]["op1"].setValue( 1 )
self.uiThreadCallHandler.assertCalled() # Handle UI thread call made when background task detects cancellation.
self.waitForIdle() # Handle idle event used to restart update.
ContextTrackerTest.expressionStartedCondition.wait()

# Again, the update won't have completed because the expression is stuck.
self.assertFalse( tracker.isTracked( script["node"] ) )
Expand Down
5 changes: 2 additions & 3 deletions python/GafferUITest/GraphGadgetTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -1414,9 +1414,8 @@ def assertHighlighting( self, graphGadget, expectedState ) :
# to wait for it to finish.
contextTracker = GafferUI.ContextTracker.acquireForFocus( graphGadget.getRoot().scriptNode() )
if contextTracker.updatePending() :
with GafferTest.ParallelAlgoTest.UIThreadCallHandler() as uiCallHandler :
self.waitForIdle()
uiCallHandler.assertCalled()
self.waitForIdle()
self.uiThreadCallHandler.assertCalled()

actualState = {
k : not graphGadget.nodeGadget( graphGadget.getRoot()[k] ).getContents().getDimmed()
Expand Down
18 changes: 9 additions & 9 deletions python/GafferUITest/NumericPlugValueWidgetTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,12 +51,12 @@ def test( self ) :

w = GafferUI.NumericPlugValueWidget( n["i"] )
self.assertTrue( w.getPlug().isSame( n["i"] ) )
GafferUITest.PlugValueWidgetTest.waitForUpdate( w )
self.waitForPlugValueWidgetUpdate( w )
self.assertTrue( isinstance( w.numericWidget().getValue(), int ) )

w.setPlug( n["f"] )
self.assertTrue( w.getPlug().isSame( n["f"] ) )
GafferUITest.PlugValueWidgetTest.waitForUpdate( w )
self.waitForPlugValueWidgetUpdate( w )
self.assertTrue( isinstance( w.numericWidget().getValue(), float ) )

w = GafferUI.NumericPlugValueWidget( plugs = [] )
Expand All @@ -65,7 +65,7 @@ def test( self ) :

w.setPlug( n["f"] )
self.assertTrue( w.getPlug().isSame( n["f"] ) )
GafferUITest.PlugValueWidgetTest.waitForUpdate( w )
self.waitForPlugValueWidgetUpdate( w )
self.assertTrue( isinstance( w.numericWidget().getValue(), float ) )
self.assertEqual( w.numericWidget().getEditable(), True )

Expand All @@ -80,11 +80,11 @@ def testEditMultiplePlugs( self ) :

n["user"]["i1"].setValue( 2 )
n["user"]["i2"].setValue( 2 )
GafferUITest.PlugValueWidgetTest.waitForUpdate( w )
self.waitForPlugValueWidgetUpdate( w )
self.assertEqual( w.numericWidget().getText(), "2" )

n["user"]["i1"].setValue( 1 )
GafferUITest.PlugValueWidgetTest.waitForUpdate( w )
self.waitForPlugValueWidgetUpdate( w )
self.assertEqual( w.numericWidget().getText(), "" )
self.assertEqual( w.numericWidget()._qtWidget().placeholderText(), "---" )

Expand All @@ -104,7 +104,7 @@ def testChangeToMixedPlugsDoesntOverwriteExistingPlugValues( self ) :
n["user"]["i2"].setValue( 2 )

w = GafferUI.NumericPlugValueWidget( n["user"]["i1"] )
GafferUITest.PlugValueWidgetTest.waitForUpdate( w )
self.waitForPlugValueWidgetUpdate( w )
self.assertEqual( w.numericWidget().getText(), "1" )
self.assertEqual( w.numericWidget()._qtWidget().placeholderText(), "" )

Expand All @@ -113,7 +113,7 @@ def testChangeToMixedPlugsDoesntOverwriteExistingPlugValues( self ) :

self.assertEqual( n["user"]["i1"].getValue(), 1 )
self.assertEqual( n["user"]["i2"].getValue(), 2 )
GafferUITest.PlugValueWidgetTest.waitForUpdate( w )
self.waitForPlugValueWidgetUpdate( w )
self.assertEqual( w.numericWidget().getText(), "" )
self.assertEqual( w.numericWidget()._qtWidget().placeholderText(), "---" )

Expand All @@ -126,7 +126,7 @@ def testMixedOrInvalidValuesPreservesExisting( self ) :
n["user"]["i2"].setValue( 2 )

w = GafferUI.NumericPlugValueWidget( n["user"]["i1"] )
GafferUITest.PlugValueWidgetTest.waitForUpdate( w )
self.waitForPlugValueWidgetUpdate( w )
self.assertEqual( w.numericWidget().getValue(), 1 )

w.numericWidget().setText( "" )
Expand All @@ -135,7 +135,7 @@ def testMixedOrInvalidValuesPreservesExisting( self ) :
self.assertEqual( n["user"]["i1"].getValue(), 1 )

w = GafferUI.NumericPlugValueWidget( n["user"].children() )
GafferUITest.PlugValueWidgetTest.waitForUpdate( w )
self.waitForPlugValueWidgetUpdate( w )
self.assertEqual( w.numericWidget().getText(), "" )

w.numericWidget()._qtWidget().editingFinished.emit()
Expand Down
37 changes: 12 additions & 25 deletions python/GafferUITest/PlugValueWidgetTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,19 +48,6 @@

class PlugValueWidgetTest( GafferUITest.TestCase ) :

@staticmethod
def waitForUpdate( widget ) :

with GafferTest.ParallelAlgoTest.UIThreadCallHandler() as handler :

# Updates are done lazily, so we need to flush any pending updates.
widget._PlugValueWidget__callUpdateFromValues.flush( widget )

# And updates for computed values are done in the background, so we
# need to wait until they're done.
if any( isinstance( p, Gaffer.ValuePlug ) and Gaffer.PlugAlgo.dependsOnCompute( p ) for p in widget.getPlugs() ) :
handler.assertCalled()

def testContext( self ) :

s = Gaffer.ScriptNode()
Expand All @@ -72,7 +59,7 @@ def testContext( self ) :
self.assertEqual( w.context(), s.context() )

s.context().setFrame( 10 )
self.waitForUpdate( w )
self.waitForPlugValueWidgetUpdate( w )
self.assertEqual( w.numericWidget().getValue(), 10 )
self.assertEqual( w.context(), s.context() )

Expand Down Expand Up @@ -279,35 +266,35 @@ def testUpdates( self ) :
# Changing the context shouldn't trigger an update, because the
# plug value isn't computed.
script.context().setFrame( 2 )
self.waitForUpdate( widget )
self.waitForPlugValueWidgetUpdate( widget )
self.assertEqual( widget.updateCount, 1 )

# Changing the plug should trigger an update.
widget.setPlug( script["add"]["op2"] )
self.waitForUpdate( widget )
self.waitForPlugValueWidgetUpdate( widget )
self.assertEqual( widget.updateCount, 2 )
self.assertEqual( widget.updateContexts[1], script.context() )

# Changing the context still shouldn't trigger an update, because the
# plug value isn't computed.
script.context().setFrame( 3 )
self.waitForUpdate( widget )
self.waitForPlugValueWidgetUpdate( widget )
self.assertEqual( widget.updateCount, 2 )

# Changing the plug again should trigger an update again. This time we
# see two updates - one to denote the start of the background task, and
# one when it completes. This is because the plug's value is computed
# and we don't want to block the UI thread with computes.
widget.setPlug( script["add"]["sum"] )
self.waitForUpdate( widget )
self.waitForPlugValueWidgetUpdate( widget )
self.assertEqual( widget.updateCount, 4 )
self.assertEqual( widget.updateContexts[2], script.context() )
self.assertEqual( widget.updateContexts[3], script.context() )

# And now changing the context should trigger an update, since computed
# values may be context-sensitive.
script.context().setFrame( 4 )
self.waitForUpdate( widget )
self.waitForPlugValueWidgetUpdate( widget )
self.assertEqual( widget.updateCount, 6 )
self.assertEqual( widget.updateContexts[4], script.context() )
self.assertEqual( widget.updateContexts[5], script.context() )
Expand Down Expand Up @@ -399,15 +386,15 @@ def testContextForEditorSettings( self ) :
# Editor not viewing anything yet, so we just use the default
# script context.

self.waitForUpdate( widget )
self.waitForPlugValueWidgetUpdate( widget )
self.assertEqual( widget.updateCount, 2 ) # One at the start of the background update, and one on completion
self.assertEqual( widget.updateContexts[1], script.context() )

# Editor viewing `node`, so we should use the context that has been
# tracked for it.

editor.settings()["in"].setInput( script["node"]["sum"] )
self.waitForUpdate( widget )
self.waitForPlugValueWidgetUpdate( widget )
self.assertEqual( widget.updateCount, 4 )
self.assertEqual( widget.updateContexts[3], contextTracker.context( script["node"] ) )
self.assertIn( "testVariable", widget.updateContexts[3] )
Expand All @@ -416,7 +403,7 @@ def testContextForEditorSettings( self ) :
# has been tracked for that.

editor.settings()["in"].setInput( script["contextVariables"]["out"] )
self.waitForUpdate( widget )
self.waitForPlugValueWidgetUpdate( widget )
self.assertEqual( widget.updateCount, 6 )
self.assertEqual( widget.updateContexts[5], contextTracker.context( script["contextVariables"] ) )
self.assertNotIn( "testVariable", widget.updateContexts[5] )
Expand Down Expand Up @@ -450,7 +437,7 @@ def testContextTrackerUpdates( self ) :
# to indicate the start of the background update and one when
# it finishes.
window.setVisible( True )
self.waitForUpdate( widget )
self.waitForPlugValueWidgetUpdate( widget )
self.assertEqual( widget.updateCount, 2 )
self.assertEqual( widget.updateContexts[-1], script.context() )

Expand All @@ -460,7 +447,7 @@ def testContextTrackerUpdates( self ) :
contextTracker = GafferUI.ContextTracker.acquireForFocus( script )
with GafferUITest.ContextTrackerTest.UpdateHandler() as h :
script.setFocus( script["contextVariables0"] )
self.waitForUpdate( widget )
self.waitForPlugValueWidgetUpdate( widget )

self.assertEqual( widget.updateCount, 4 )
self.assertEqual( widget.updateContexts[-1], contextTracker.context( script["add"]["sum"] ) )
Expand All @@ -478,7 +465,7 @@ def testContextTrackerUpdates( self ) :

with GafferUITest.ContextTrackerTest.UpdateHandler() as h :
script.setFocus( script["contextVariables2"] )
self.waitForUpdate( widget )
self.waitForPlugValueWidgetUpdate( widget )

self.assertEqual( widget.updateCount, 6 )
self.assertEqual( widget.updateContexts[-1], contextTracker.context( script["add"]["sum"] ) )
Expand Down
2 changes: 1 addition & 1 deletion python/GafferUITest/StandardNodeToolbarTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,6 @@ def testNoUnnecessaryUpdates( self ) :

toolbar = GafferUI.StandardNodeToolbar( node )
widget = toolbar._StandardNodeToolbar__layout.plugValueWidget( plug )
GafferUITest.PlugValueWidgetTest.waitForUpdate( widget )
self.waitForPlugValueWidgetUpdate( widget )
self.assertEqual( widget.updateCount, 1 )
self.assertEqual( widget.updateContexts[0], script.context() )
20 changes: 10 additions & 10 deletions python/GafferUITest/StringPlugValueWidgetTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,47 +56,47 @@ def test( self ) :
w = GafferUI.StringPlugValueWidget( n["user"]["p1"] )
self.assertEqual( w.getPlug(), n["user"]["p1"] )
self.assertEqual( w.getPlugs(), { n["user"]["p1"] } )
GafferUITest.PlugValueWidgetTest.waitForUpdate( w )
self.waitForPlugValueWidgetUpdate( w )
self.assertEqual( w.textWidget().getText(), "p1" )
self.assertEqual( w.textWidget()._qtWidget().placeholderText(), "" )

n["user"]["p1"].setValue( "x" )
GafferUITest.PlugValueWidgetTest.waitForUpdate( w )
self.waitForPlugValueWidgetUpdate( w )
self.assertEqual( w.textWidget().getText(), "x" )
self.assertEqual( w.textWidget()._qtWidget().placeholderText(), "" )

w.setPlugs( n["user"].children() )

self.assertEqual( n["user"]["p1"].getValue(), "x" )
self.assertEqual( n["user"]["p2"].getValue(), "p2" )
GafferUITest.PlugValueWidgetTest.waitForUpdate( w )
self.waitForPlugValueWidgetUpdate( w )
self.assertEqual( w.textWidget().getText(), "" )
self.assertEqual( w.textWidget()._qtWidget().placeholderText(), "---" )

w = GafferUI.StringPlugValueWidget( n["user"].children() )
self.assertEqual( w.getPlugs(), { n["user"]["p1"], n["user"]["p2"] } )
GafferUITest.PlugValueWidgetTest.waitForUpdate( w )
self.waitForPlugValueWidgetUpdate( w )
self.assertEqual( w.textWidget().getText(), "" )
self.assertEqual( w.textWidget()._qtWidget().placeholderText(), "---" )

n["user"]["p2"].setValue( "x" )
GafferUITest.PlugValueWidgetTest.waitForUpdate( w )
self.waitForPlugValueWidgetUpdate( w )
self.assertEqual( w.textWidget().getText(), "x" )
self.assertEqual( w.textWidget()._qtWidget().placeholderText(), "" )

n["user"]["p1"].setValue( "" )
n["user"]["p2"].setValue( "" )
GafferUITest.PlugValueWidgetTest.waitForUpdate( w )
self.waitForPlugValueWidgetUpdate( w )
self.assertEqual( w.textWidget().getText(), "" )
self.assertEqual( w.textWidget()._qtWidget().placeholderText(), "" )

Gaffer.Metadata.registerValue( n["user"]["p1"], "stringPlugValueWidget:placeholderText", "test" )
GafferUITest.PlugValueWidgetTest.waitForUpdate( w )
self.waitForPlugValueWidgetUpdate( w )
self.assertEqual( w.textWidget().getText(), "" )
self.assertEqual( w.textWidget()._qtWidget().placeholderText(), "" )

Gaffer.Metadata.registerValue( n["user"]["p2"], "stringPlugValueWidget:placeholderText", "test" )
GafferUITest.PlugValueWidgetTest.waitForUpdate( w )
self.waitForPlugValueWidgetUpdate( w )
self.assertEqual( w.textWidget().getText(), "" )
self.assertEqual( w.textWidget()._qtWidget().placeholderText(), "test" )

Expand All @@ -113,7 +113,7 @@ def testMixedValuesPreserved( self ) :
Gaffer.Metadata.registerValue( n["user"]["p2"], "stringPlugValueWidget:placeholderText", "test" )

w = GafferUI.StringPlugValueWidget( { n["user"]["p1"], n["user"]["p2"] } )
GafferUITest.PlugValueWidgetTest.waitForUpdate( w )
self.waitForPlugValueWidgetUpdate( w )
self.assertEqual( w.textWidget().getText(), "" )
self.assertEqual( w.textWidget()._qtWidget().placeholderText(), "---" )

Expand Down Expand Up @@ -152,7 +152,7 @@ def testExceptionHandling( self ) :
# We want that to be reflected in the UI.

w = GafferUI.StringPlugValueWidget( script["n"]["p"] )
GafferUITest.PlugValueWidgetTest.waitForUpdate( w )
self.waitForPlugValueWidgetUpdate( w )
self.assertEqual( w.textWidget().getText(), "" )
self.assertTrue( w.textWidget().getErrored() )

Expand Down
Loading
Loading