int UtcDaliStageTouchedSignalN(void) { TestApplication application; Stage stage = Stage::GetCurrent(); TouchedSignalData data; TouchedFunctor functor( data ); stage.TouchedSignal().Connect( &application, functor ); // 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 ); // 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 ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); 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 ); 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 ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0u ); DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor ); 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. { Integration::TouchEvent touchEvent; touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Interrupted, 10.0f, 10.0f ) ); application.ProcessEvent( touchEvent ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); 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 ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); 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 ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); 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(), 1u, TEST_LOCATION ); // Check that getting info about a non-existent point causes an assert. bool asserted = false; try { data.receivedTouchEvent.GetPoint( 1 ); } catch( Dali::DaliException& e ) { DALI_TEST_PRINT_ASSERT( e ); DALI_TEST_ASSERT( e, "point < points.size() && \"No point at index\"", TEST_LOCATION ); asserted = true; } DALI_TEST_CHECK( asserted ); data.Reset(); } END_TEST; }
int UtcDaliStageTouchedSignalP(void) { TestApplication application; Stage stage = Stage::GetCurrent(); TouchedSignalData data; TouchedFunctor functor( data ); stage.TouchedSignal().Connect( &application, functor ); // Render and notify. application.SendNotification(); application.Render(); // 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 ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); 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 ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0u ); DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor ); 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. { Integration::TouchEvent touchEvent; touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Down, 10.0f, 10.0f ) ); application.ProcessEvent( touchEvent ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); 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 ); DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION ); data.Reset(); touchEvent.points[0].state = TouchPoint::Up; application.ProcessEvent( touchEvent ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0u ); DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor ); data.Reset(); } // Multiple touch. Should only receive a touch on first down and last up. { Integration::TouchEvent touchEvent; // 1st point touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Down, 10.0f, 10.0f ) ); application.ProcessEvent( touchEvent ); DALI_TEST_EQUALS( true, data.functorCalled, 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 ) ); application.ProcessEvent( touchEvent ); DALI_TEST_EQUALS( false, data.functorCalled, 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; application.ProcessEvent( touchEvent ); DALI_TEST_EQUALS( false, data.functorCalled, 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; application.ProcessEvent( touchEvent ); DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( data.receivedTouchEvent.GetPointCount(), 0u, TEST_LOCATION ); data.Reset(); // Final point Up touchEvent.points[0].state = TouchPoint::Up; application.ProcessEvent( touchEvent ); DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION ); DALI_TEST_EQUALS( data.receivedTouchEvent.GetPointCount(), 1u, TEST_LOCATION ); data.Reset(); } END_TEST; }