X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=automated-tests%2Fsrc%2Fdali%2Futc-Dali-Stage.cpp;h=9401ecf09b2c085f02964076f552ea6134b0ecbd;hb=refs%2Ftags%2Fsubmit%2Ftizen%2F20170417.100748;hp=0b3f88f077ad826e5bbef1e0d80afacb19490172;hpb=a86ae47738c5baf9707e366912e1f52dbba39129;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/automated-tests/src/dali/utc-Dali-Stage.cpp b/automated-tests/src/dali/utc-Dali-Stage.cpp index 0b3f88f..9401ecf 100644 --- a/automated-tests/src/dali/utc-Dali-Stage.cpp +++ b/automated-tests/src/dali/utc-Dali-Stage.cpp @@ -20,8 +20,10 @@ #include #include +#include #include #include +#include #include #include @@ -42,6 +44,9 @@ void stage_test_cleanup(void) namespace { +const std::string DEFAULT_DEVICE_NAME("hwKeyboard"); +const DevelKeyEvent::DeviceClass::Type DEFAULT_DEVICE_CLASS( DevelKeyEvent::DeviceClass::TOUCH ); + // Functor for EventProcessingFinished signal struct EventProcessingFinishedFunctor { @@ -60,6 +65,50 @@ struct EventProcessingFinishedFunctor bool& mEventProcessingFinished; }; +// Stores data that is populated in the KeyEventGeneratedSignal callback and will be read by the TET cases +struct KeyEventGeneratedSignalData +{ + KeyEventGeneratedSignalData() + : functorCalled(false) + {} + + void Reset() + { + functorCalled = false; + + receivedKeyEvent.keyModifier = 0; + receivedKeyEvent.keyPressedName.clear(); + receivedKeyEvent.keyPressed.clear(); + } + + bool functorCalled; + KeyEvent receivedKeyEvent; +}; + +// Functor that sets the data when called +struct KeyEventGeneratedReceivedFunctor +{ + KeyEventGeneratedReceivedFunctor( KeyEventGeneratedSignalData& data ) + : signalData( data ) + {} + + bool operator()( const KeyEvent& keyEvent ) + { + signalData.functorCalled = true; + signalData.receivedKeyEvent = keyEvent; + + return true; + } + + bool operator()() + { + signalData.functorCalled = true; + return true; + } + + KeyEventGeneratedSignalData& signalData; +}; + // Stores data that is populated in the key-event callback and will be read by the TET cases struct KeyEventSignalData { @@ -109,10 +158,13 @@ struct TouchedSignalData receivedTouchEvent.points.clear(); receivedTouchEvent.time = 0; + + receivedTouchData.Reset(); } bool functorCalled; TouchEvent receivedTouchEvent; + TouchData receivedTouchData; }; // Functor that sets the data when touched signal is received @@ -129,6 +181,26 @@ struct TouchedFunctor TouchedSignalData& signalData; }; + +// Functor that sets the data when touched signal is received +struct TouchFunctor +{ + TouchFunctor( TouchedSignalData& data ) : signalData( data ) { } + + void operator()( const TouchData& touch ) + { + signalData.functorCalled = true; + signalData.receivedTouchData = touch; + } + + void operator()() + { + signalData.functorCalled = true; + } + + TouchedSignalData& signalData; +}; + // Stores data that is populated in the wheel-event callback and will be read by the TET cases struct WheelEventSignalData { @@ -224,6 +296,16 @@ struct ActorCreatedFunctor bool& mSignalVerified; }; +void GenerateTouch( TestApplication& application, PointState::Type state, const Vector2& screenPosition ) +{ + Integration::TouchEvent touchEvent; + Integration::Point point; + point.SetState( state ); + point.SetScreenPosition( screenPosition ); + touchEvent.points.push_back( point ); + application.ProcessEvent( touchEvent ); +} + } // unnamed namespace @@ -789,6 +871,63 @@ int UtcDaliStageEventProcessingFinishedN(void) END_TEST; } +int UtcDaliStageKeyEventGeneratedSignalP(void) +{ + TestApplication application; + Stage stage = Stage::GetCurrent(); + + KeyEventGeneratedSignalData data; + KeyEventGeneratedReceivedFunctor functor( data ); + DevelStage::KeyEventGeneratedSignal( stage ).Connect( &application, functor ); + + KeyEventGeneratedSignalData data2; + KeyEventGeneratedReceivedFunctor functor2( data2 ); + GetImplementation( stage ).ConnectSignal( &application, "keyEventGenerated", functor2 ); + + Integration::KeyEvent event( "a", "a", 0, 0, 0, Integration::KeyEvent::Up, DEFAULT_DEVICE_NAME, DEFAULT_DEVICE_CLASS ); + application.ProcessEvent( event ); + + DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); + DALI_TEST_CHECK( event.keyModifier == data.receivedKeyEvent.keyModifier ); + DALI_TEST_CHECK( event.keyName == data.receivedKeyEvent.keyPressedName ); + DALI_TEST_CHECK( event.keyString == data.receivedKeyEvent.keyPressed ); + DALI_TEST_CHECK( event.state == static_cast( data.receivedKeyEvent.state ) ); + + data.Reset(); + + Integration::KeyEvent event2( "i", "i", 0, 0, 0, Integration::KeyEvent::Up, DEFAULT_DEVICE_NAME, DEFAULT_DEVICE_CLASS ); + application.ProcessEvent( event2 ); + + DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); + DALI_TEST_CHECK( event2.keyModifier == data.receivedKeyEvent.keyModifier ); + DALI_TEST_CHECK( event2.keyName == data.receivedKeyEvent.keyPressedName ); + DALI_TEST_CHECK( event2.keyString == data.receivedKeyEvent.keyPressed ); + DALI_TEST_CHECK( event2.state == static_cast( data.receivedKeyEvent.state ) ); + + data.Reset(); + + Integration::KeyEvent event3( "a", "a", 0, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DEFAULT_DEVICE_CLASS ); + application.ProcessEvent( event3 ); + + DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); + DALI_TEST_CHECK( event3.keyModifier == data.receivedKeyEvent.keyModifier ); + DALI_TEST_CHECK( event3.keyName == data.receivedKeyEvent.keyPressedName ); + DALI_TEST_CHECK( event3.keyString == data.receivedKeyEvent.keyPressed ); + DALI_TEST_CHECK( event3.state == static_cast( data.receivedKeyEvent.state ) ); + + data.Reset(); + + Integration::KeyEvent event4( "a", "a", 0, 0, 0, Integration::KeyEvent::Up, DEFAULT_DEVICE_NAME, DEFAULT_DEVICE_CLASS ); + application.ProcessEvent( event4 ); + + DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); + DALI_TEST_CHECK( event4.keyModifier == data.receivedKeyEvent.keyModifier ); + DALI_TEST_CHECK( event4.keyName == data.receivedKeyEvent.keyPressedName ); + DALI_TEST_CHECK( event4.keyString == data.receivedKeyEvent.keyPressed ); + DALI_TEST_CHECK( event4.state == static_cast( data.receivedKeyEvent.state ) ); + END_TEST; +} + int UtcDaliStageSignalKeyEventP(void) { TestApplication application; @@ -798,7 +937,7 @@ int UtcDaliStageSignalKeyEventP(void) KeyEventReceivedFunctor functor( data ); stage.KeyEventSignal().Connect( &application, functor ); - Integration::KeyEvent event( "i", "i", 0, 0, 0, Integration::KeyEvent::Down ); + Integration::KeyEvent event( "i", "i", 0, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DEFAULT_DEVICE_CLASS ); application.ProcessEvent( event ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); @@ -809,7 +948,7 @@ int UtcDaliStageSignalKeyEventP(void) data.Reset(); - Integration::KeyEvent event2( "i", "i", 0, 0, 0, Integration::KeyEvent::Up ); + Integration::KeyEvent event2( "i", "i", 0, 0, 0, Integration::KeyEvent::Up, DEFAULT_DEVICE_NAME, DEFAULT_DEVICE_CLASS ); application.ProcessEvent( event2 ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); @@ -820,7 +959,7 @@ int UtcDaliStageSignalKeyEventP(void) data.Reset(); - Integration::KeyEvent event3( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ); + Integration::KeyEvent event3( "a", "a", 0, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DEFAULT_DEVICE_CLASS ); application.ProcessEvent( event3 ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); @@ -831,7 +970,7 @@ int UtcDaliStageSignalKeyEventP(void) data.Reset(); - Integration::KeyEvent event4( "a", "a", 0, 0, 0, Integration::KeyEvent::Up ); + Integration::KeyEvent event4( "a", "a", 0, 0, 0, Integration::KeyEvent::Up, DEFAULT_DEVICE_NAME, DEFAULT_DEVICE_CLASS ); application.ProcessEvent( event4 ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); @@ -872,20 +1011,17 @@ int UtcDaliStageTouchedSignalP(void) // Basic test: No actors, single touch (down then up). { - Integration::TouchEvent touchEvent; - touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Down, 10.0f, 10.0f ) ); - application.ProcessEvent( touchEvent ); + GenerateTouch( application, PointState::DOWN, Vector2( 10.0f, 10.0f ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); - DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 ); + DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0u ); DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor ); data.Reset(); - touchEvent.points[0].state = TouchPoint::Up; - application.ProcessEvent( touchEvent ); + GenerateTouch( application, PointState::UP, Vector2( 10.0f, 10.0f ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); - DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 ); + DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0u ); DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor ); data.Reset(); } @@ -904,27 +1040,22 @@ int UtcDaliStageTouchedSignalP(void) // Actor on scene, single touch, down in actor, motion, then up outside actor. { - Integration::TouchEvent touchEvent; - touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Down, 10.0f, 10.0f ) ); - application.ProcessEvent( touchEvent ); + GenerateTouch( application, PointState::DOWN, Vector2( 10.0f, 10.0f ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); - DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 ); + DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0u ); DALI_TEST_CHECK( data.receivedTouchEvent.points[0].hitActor == actor ); data.Reset(); - touchEvent.points[0].state = TouchPoint::Motion; - touchEvent.points[0].screen.x = 150.0f; // Some motion - application.ProcessEvent( touchEvent ); + GenerateTouch( application, PointState::MOTION, Vector2( 150.0f, 10.0f ) ); // Some motion DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION ); data.Reset(); - touchEvent.points[0].state = TouchPoint::Up; - application.ProcessEvent( touchEvent ); + GenerateTouch( application, PointState::UP, Vector2( 150.0f, 10.0f ) ); // Some motion DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); - DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 ); + DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0u ); DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor ); data.Reset(); } @@ -932,44 +1063,49 @@ int UtcDaliStageTouchedSignalP(void) // Multiple touch. Should only receive a touch on first down and last up. { Integration::TouchEvent touchEvent; + Integration::Point point; // 1st point - touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Down, 10.0f, 10.0f ) ); + point.SetState( PointState::DOWN ); + point.SetScreenPosition( Vector2( 10.0f, 10.0f ) ); + touchEvent.points.push_back( point ); application.ProcessEvent( touchEvent ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); - DALI_TEST_EQUALS( data.receivedTouchEvent.GetPointCount(), 1, TEST_LOCATION ); + DALI_TEST_EQUALS( data.receivedTouchEvent.GetPointCount(), 1u, TEST_LOCATION ); data.Reset(); // 2nd point - touchEvent.points[0].state = TouchPoint::Stationary; - touchEvent.points.push_back( TouchPoint( 1, TouchPoint::Down, 50.0f, 50.0f ) ); + touchEvent.points[0].SetState( PointState::STATIONARY ); + point.SetDeviceId( 1 ); + point.SetScreenPosition( Vector2( 50.0f, 50.0f ) ); + touchEvent.points.push_back( point ); application.ProcessEvent( touchEvent ); DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION ); - DALI_TEST_EQUALS( data.receivedTouchEvent.GetPointCount(), 0, TEST_LOCATION ); + DALI_TEST_EQUALS( data.receivedTouchEvent.GetPointCount(), 0u, TEST_LOCATION ); data.Reset(); // Primary point is up - touchEvent.points[0].state = TouchPoint::Up; - touchEvent.points[1].state = TouchPoint::Stationary; + touchEvent.points[0].SetState( PointState::UP ); + touchEvent.points[1].SetState( PointState::STATIONARY ); application.ProcessEvent( touchEvent ); DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION ); - DALI_TEST_EQUALS( data.receivedTouchEvent.GetPointCount(), 0, TEST_LOCATION ); + DALI_TEST_EQUALS( data.receivedTouchEvent.GetPointCount(), 0u, TEST_LOCATION ); data.Reset(); // Remove 1st point now, 2nd point is now in motion touchEvent.points.erase( touchEvent.points.begin() ); - touchEvent.points[0].state = TouchPoint::Motion; - touchEvent.points[0].screen.x = 150.0f; + touchEvent.points[0].SetState( PointState::MOTION ); + touchEvent.points[0].SetScreenPosition( Vector2( 150.0f, 50.0f ) ); application.ProcessEvent( touchEvent ); DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION ); - DALI_TEST_EQUALS( data.receivedTouchEvent.GetPointCount(), 0, TEST_LOCATION ); + DALI_TEST_EQUALS( data.receivedTouchEvent.GetPointCount(), 0u, TEST_LOCATION ); data.Reset(); // Final point Up - touchEvent.points[0].state = TouchPoint::Up; + touchEvent.points[0].SetState( PointState::UP ); application.ProcessEvent( touchEvent ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); - DALI_TEST_EQUALS( data.receivedTouchEvent.GetPointCount(), 1, TEST_LOCATION ); + DALI_TEST_EQUALS( data.receivedTouchEvent.GetPointCount(), 1u, TEST_LOCATION ); data.Reset(); } END_TEST; @@ -993,29 +1129,24 @@ int UtcDaliStageTouchedSignalN(void) // No actors, single touch, down, motion then up. { - Integration::TouchEvent touchEvent; - touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Down, 10.0f, 10.0f ) ); - application.ProcessEvent( touchEvent ); + GenerateTouch( application, PointState::DOWN, Vector2( 10.0f, 10.0f ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); - DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 ); + DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0u ); DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor ); data.Reset(); // Confirm there is no signal when the touchpoint is only moved. - touchEvent.points[0].state = TouchPoint::Motion; - touchEvent.points[0].screen.x = 1200.0f; // Some motion - application.ProcessEvent( touchEvent ); + GenerateTouch( application, PointState::MOTION, Vector2( 1200.0f, 10.0f ) ); // Some motion DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION ); data.Reset(); // Confirm a following up event generates a signal. - touchEvent.points[0].state = TouchPoint::Up; - application.ProcessEvent( touchEvent ); + GenerateTouch( application, PointState::UP, Vector2( 1200.0f, 10.0f ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); - DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 ); + DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0u ); DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor ); data.Reset(); } @@ -1034,34 +1165,30 @@ int UtcDaliStageTouchedSignalN(void) // Actor on scene. Interrupted before down and interrupted after down. { - Integration::TouchEvent touchEvent; - touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Interrupted, 10.0f, 10.0f ) ); - application.ProcessEvent( touchEvent ); + GenerateTouch( application, PointState::INTERRUPTED, Vector2( 10.0f, 10.0f ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); - DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 ); + DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0u ); DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor ); DALI_TEST_CHECK( data.receivedTouchEvent.points[0].state == TouchPoint::Interrupted ); data.Reset(); - touchEvent.points[0].state = TouchPoint::Down; - application.ProcessEvent( touchEvent ); + GenerateTouch( application, PointState::DOWN, Vector2( 10.0f, 10.0f ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); - DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 ); + DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0u ); DALI_TEST_CHECK( data.receivedTouchEvent.points[0].hitActor == actor ); DALI_TEST_CHECK( data.receivedTouchEvent.points[0].state == TouchPoint::Down ); data.Reset(); - touchEvent.points[0].state = TouchPoint::Interrupted; - application.ProcessEvent( touchEvent ); + GenerateTouch( application, PointState::INTERRUPTED, Vector2( 10.0f, 10.0f ) ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); - DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 ); + DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0u ); DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor ); DALI_TEST_CHECK( data.receivedTouchEvent.points[0].state == TouchPoint::Interrupted ); - DALI_TEST_EQUALS( data.receivedTouchEvent.GetPointCount(), 1, TEST_LOCATION ); + DALI_TEST_EQUALS( data.receivedTouchEvent.GetPointCount(), 1u, TEST_LOCATION ); // Check that getting info about a non-existent point causes an assert. bool asserted = false; @@ -1083,6 +1210,217 @@ int UtcDaliStageTouchedSignalN(void) END_TEST; } + +int UtcDaliStageTouchSignalP(void) +{ + TestApplication application; + Stage stage = Stage::GetCurrent(); + + TouchedSignalData data; + TouchFunctor functor( data ); + stage.TouchSignal().Connect( &application, functor ); + + // Render and notify. + application.SendNotification(); + application.Render(); + + // Basic test: No actors, single touch (down then up). + { + GenerateTouch( application, PointState::DOWN, Vector2( 10.0f, 10.0f ) ); + + DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); + DALI_TEST_CHECK( data.receivedTouchData.GetPointCount() != 0u ); + DALI_TEST_CHECK( !data.receivedTouchData.GetHitActor(0) ); + data.Reset(); + + GenerateTouch( application, PointState::UP, Vector2( 10.0f, 10.0f ) ); + + DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); + DALI_TEST_CHECK( data.receivedTouchData.GetPointCount() != 0u ); + DALI_TEST_CHECK( !data.receivedTouchData.GetHitActor(0) ); + data.Reset(); + } + + // Add an actor to the scene. + Actor actor = Actor::New(); + actor.SetSize( 100.0f, 100.0f ); + actor.SetAnchorPoint( AnchorPoint::TOP_LEFT ); + actor.SetParentOrigin( ParentOrigin::TOP_LEFT ); + actor.TouchedSignal().Connect( &DummyTouchCallback ); + stage.Add( actor ); + + // Render and notify. + application.SendNotification(); + application.Render(); + + // Actor on scene, single touch, down in actor, motion, then up outside actor. + { + GenerateTouch( application, PointState::DOWN, Vector2( 10.0f, 10.0f ) ); + + DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); + DALI_TEST_CHECK( data.receivedTouchData.GetPointCount() != 0u ); + DALI_TEST_CHECK( data.receivedTouchData.GetHitActor(0) == actor ); + data.Reset(); + + GenerateTouch( application, PointState::MOTION, Vector2( 150.0f, 10.0f ) ); // Some motion + + DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION ); + data.Reset(); + + GenerateTouch( application, PointState::UP, Vector2( 150.0f, 10.0f ) ); // Some motion + + DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); + DALI_TEST_CHECK( data.receivedTouchData.GetPointCount() != 0u ); + DALI_TEST_CHECK( !data.receivedTouchData.GetHitActor(0) ); + data.Reset(); + } + + // Multiple touch. Should only receive a touch on first down and last up. + { + Integration::TouchEvent touchEvent; + Integration::Point point; + + // 1st point + point.SetState( PointState::DOWN ); + point.SetScreenPosition( Vector2( 10.0f, 10.0f ) ); + touchEvent.points.push_back( point ); + application.ProcessEvent( touchEvent ); + DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); + DALI_TEST_EQUALS( data.receivedTouchData.GetPointCount(), 1u, TEST_LOCATION ); + data.Reset(); + + // 2nd point + touchEvent.points[0].SetState( PointState::STATIONARY ); + point.SetDeviceId( 1 ); + point.SetScreenPosition( Vector2( 50.0f, 50.0f ) ); + touchEvent.points.push_back( point ); + application.ProcessEvent( touchEvent ); + DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION ); + data.Reset(); + + // Primary point is up + touchEvent.points[0].SetState( PointState::UP ); + touchEvent.points[1].SetState( PointState::STATIONARY ); + application.ProcessEvent( touchEvent ); + DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION ); + data.Reset(); + + // Remove 1st point now, 2nd point is now in motion + touchEvent.points.erase( touchEvent.points.begin() ); + touchEvent.points[0].SetState( PointState::MOTION ); + touchEvent.points[0].SetScreenPosition( Vector2( 150.0f, 50.0f ) ); + application.ProcessEvent( touchEvent ); + DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION ); + data.Reset(); + + // Final point Up + touchEvent.points[0].SetState( PointState::UP ); + application.ProcessEvent( touchEvent ); + DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); + DALI_TEST_EQUALS( data.receivedTouchData.GetPointCount(), 1u, TEST_LOCATION ); + data.Reset(); + } + END_TEST; +} + +int UtcDaliStageTouchSignalN(void) +{ + TestApplication application; + Stage stage = Stage::GetCurrent(); + + TouchedSignalData data; + TouchFunctor functor( data ); + stage.TouchSignal().Connect( &application, functor ); + + TouchedSignalData data2; + TouchFunctor functor2( data2 ); + GetImplementation( stage ).ConnectSignal( &application, "touch", functor2 ); + + // Render and notify. + application.SendNotification(); + application.Render(); + + // Confirm functor not called before there has been any touch event. + DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION ); + DALI_TEST_EQUALS( false, data2.functorCalled, TEST_LOCATION ); + + // No actors, single touch, down, motion then up. + { + GenerateTouch( application, PointState::DOWN, Vector2( 10.0f, 10.0f ) ); + + DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); + DALI_TEST_CHECK( data.receivedTouchData.GetPointCount() != 0u ); + DALI_TEST_CHECK( !data.receivedTouchData.GetHitActor(0)); + + DALI_TEST_EQUALS( true, data2.functorCalled, TEST_LOCATION ); + + data.Reset(); + data2.Reset(); + + // Confirm there is no signal when the touchpoint is only moved. + GenerateTouch( application, PointState::MOTION, Vector2( 1200.0f, 10.0f ) ); // Some motion + + DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION ); + data.Reset(); + + // Confirm a following up event generates a signal. + GenerateTouch( application, PointState::UP, Vector2( 1200.0f, 10.0f ) ); + + DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); + DALI_TEST_CHECK( data.receivedTouchData.GetPointCount() != 0u ); + DALI_TEST_CHECK( !data.receivedTouchData.GetHitActor(0)); + data.Reset(); + } + + // Add an actor to the scene. + Actor actor = Actor::New(); + actor.SetSize( 100.0f, 100.0f ); + actor.SetAnchorPoint( AnchorPoint::TOP_LEFT ); + actor.SetParentOrigin( ParentOrigin::TOP_LEFT ); + actor.TouchedSignal().Connect( &DummyTouchCallback ); + stage.Add( actor ); + + // Render and notify. + application.SendNotification(); + application.Render(); + + // Actor on scene. Interrupted before down and interrupted after down. + { + GenerateTouch( application, PointState::INTERRUPTED, Vector2( 10.0f, 10.0f ) ); + + DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); + DALI_TEST_CHECK( data.receivedTouchData.GetPointCount() != 0u ); + DALI_TEST_CHECK( !data.receivedTouchData.GetHitActor(0) ); + DALI_TEST_CHECK( data.receivedTouchData.GetState(0) == PointState::INTERRUPTED ); + data.Reset(); + + GenerateTouch( application, PointState::DOWN, Vector2( 10.0f, 10.0f ) ); + + DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); + DALI_TEST_CHECK( data.receivedTouchData.GetPointCount() != 0u ); + DALI_TEST_CHECK( data.receivedTouchData.GetHitActor(0) == actor ); + DALI_TEST_CHECK( data.receivedTouchData.GetState(0) == PointState::DOWN ); + data.Reset(); + + GenerateTouch( application, PointState::INTERRUPTED, Vector2( 10.0f, 10.0f ) ); + + DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); + DALI_TEST_CHECK( data.receivedTouchData.GetPointCount() != 0u ); + DALI_TEST_CHECK( !data.receivedTouchData.GetHitActor(0) ); + DALI_TEST_CHECK( data.receivedTouchData.GetState(0) == PointState::INTERRUPTED ); + + DALI_TEST_EQUALS( data.receivedTouchData.GetPointCount(), 1u, TEST_LOCATION ); + + // Check that getting info about a non-existent point returns an empty handle + Actor actor = data.receivedTouchData.GetHitActor( 1 ); + DALI_TEST_CHECK( !actor ); + + data.Reset(); + } + + END_TEST; +} + int UtcDaliStageSignalWheelEventP(void) { TestApplication application; @@ -1248,7 +1586,7 @@ int UtcDaliStageGetRenderTaskListP(void) const RenderTaskList& tasks = stage.GetRenderTaskList(); // There should be 1 task by default. - DALI_TEST_EQUALS( tasks.GetTaskCount(), 1, TEST_LOCATION ); + DALI_TEST_EQUALS( tasks.GetTaskCount(), 1u, TEST_LOCATION ); // RenderTaskList has it's own UTC tests. // But we can confirm that GetRenderTaskList in Stage retrieves the same RenderTaskList each time. @@ -1321,3 +1659,15 @@ int UtcDaliStageGetObjectRegistryN(void) END_TEST; } + +int UtcDaliStageOperatorAssign(void) +{ + TestApplication app; + Stage stage; + DALI_TEST_CHECK( !stage ); + + stage = Stage::GetCurrent(); + DALI_TEST_CHECK( stage ); + + END_TEST; +}