X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=automated-tests%2Fsrc%2Fdali%2Futc-Dali-Constraint.cpp;h=f8f8ac5f5e15919f256b7e7281743ea3d55beb42;hb=refs%2Fchanges%2F68%2F192368%2F3;hp=56d773ec750de746b3b039fd04fda7df539d0f5f;hpb=dfdc24ae708e68e50eaaa0fbe407435ee2112e5d;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/automated-tests/src/dali/utc-Dali-Constraint.cpp b/automated-tests/src/dali/utc-Dali-Constraint.cpp index 56d773e..f8f8ac5 100644 --- a/automated-tests/src/dali/utc-Dali-Constraint.cpp +++ b/automated-tests/src/dali/utc-Dali-Constraint.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * Copyright (c) 2018 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,6 +23,7 @@ using namespace Dali; +/////////////////////////////////////////////////////////////////////////////// void utc_dali_constraint_startup(void) { test_return_value = TET_UNDEF; @@ -32,4206 +33,1328 @@ void utc_dali_constraint_cleanup(void) { test_return_value = TET_PASS; } +/////////////////////////////////////////////////////////////////////////////// - +/////////////////////////////////////////////////////////////////////////////// namespace -{ - -struct EqualToQuaternion -{ - EqualToQuaternion() - { - } - - Quaternion operator()( const Quaternion& current, const PropertyInput& property ) - { - return property.GetQuaternion(); - } -}; - -struct EqualToVector4 -{ - EqualToVector4() - { - } - - Vector4 operator()( const Vector4& current, const PropertyInput& property ) - { - return property.GetVector4(); - } -}; - -class PropertyInputAbstraction : public Dali::PropertyInput -{ -public: - PropertyInputAbstraction(const bool& val) : mType(Dali::Property::BOOLEAN), mBoolData( val ) {} - PropertyInputAbstraction(const float& val) : mType(Dali::Property::FLOAT), mFloatData( val ) {} - PropertyInputAbstraction(const int& val) : mType(Dali::Property::INTEGER), mIntData( val ) {} - PropertyInputAbstraction(const Vector2& val) : mType(Dali::Property::VECTOR2), mVector2Data( val ) {} - PropertyInputAbstraction(const Vector3& val) : mType(Dali::Property::VECTOR3), mVector3Data( val ) {} - PropertyInputAbstraction(const Vector4& val) : mType(Dali::Property::VECTOR4), mVector4Data( val ) {} - PropertyInputAbstraction(const Matrix3& val) : mType(Dali::Property::MATRIX3), mMatrix3Data( val ) {} - PropertyInputAbstraction(const Matrix& val) : mType(Dali::Property::MATRIX), mMatrixData( val ) {} - PropertyInputAbstraction(const Quaternion& val) : mType(Dali::Property::ROTATION), mQuaternionData( val ) {} - - ~PropertyInputAbstraction() {} - - Dali::Property::Type GetType() const { return mType; } - - const bool& GetBoolean() const { return mBoolData; } - - const float& GetFloat() const { return mFloatData; } - - const int& GetInteger() const { return mIntData; } - - const Vector2& GetVector2() const { return mVector2Data; } - const Vector3& GetVector3() const { return mVector3Data; } - const Vector4& GetVector4() const { return mVector4Data; } - - const Matrix3& GetMatrix3() const { return mMatrix3Data; } - const Matrix& GetMatrix() const { return mMatrixData; } - - const Quaternion& GetQuaternion() const { return mQuaternionData; } - -private: - Dali::Property::Type mType; - bool mBoolData; - float mFloatData; - int mIntData; - Vector2 mVector2Data; - Vector3 mVector3Data; - Vector4 mVector4Data; - Matrix3 mMatrix3Data; - Matrix mMatrixData; - Quaternion mQuaternionData; -}; - -static const float POSITION_EPSILON = 0.0001f; -static const float ROTATION_EPSILON = 0.0001f; - -struct TestConstraint -{ - Vector4 operator()(const Vector4& color) - { - return Vector4(color.x, color.y, color.z, 0.1f); - } -}; - -struct TestConstraintToVector3 -{ - TestConstraintToVector3(Vector3 target) - : mTarget(target) - { - } - - Vector3 operator()(const Vector3& current) - { - return mTarget; - } - - Vector3 mTarget; -}; - -struct TestColorConstraint -{ - TestColorConstraint(Vector4 target) - : mTarget(target) - { - } - - Vector4 operator()(const Vector4& color) - { - return mTarget; - } - - Vector4 mTarget; -}; - -struct TestPositionConstraint -{ - TestPositionConstraint(Vector3 target) - : mTarget(target) - { - } - - Vector3 operator()(const Vector3& position) - { - return mTarget; - } - - Vector3 mTarget; -}; - - -struct TestAlwaysTrueConstraint -{ - bool operator()( const bool& current ) - { - return true; - } -}; - -struct TestAlwaysEqualOrGreaterThanConstraintFloat -{ - TestAlwaysEqualOrGreaterThanConstraintFloat( float value ) - : mValue( value ) - { - } - - float operator()( const float& current ) - { - return ( current < mValue ) ? mValue : current; - } - - float mValue; -}; - -struct TestAlwaysEqualOrGreaterThanConstraintInteger -{ - TestAlwaysEqualOrGreaterThanConstraintInteger( int value ) - : mValue( value ) - { - } - - int operator()( const int& current ) - { - return ( current < mValue ) ? mValue : current; - } - - int mValue; -}; - -struct TestAlwaysEqualOrGreaterThanConstraintVector2 -{ - TestAlwaysEqualOrGreaterThanConstraintVector2( Vector2 value ) - : mValue( value ) - { - } - - Vector2 operator()( const Vector2& current ) - { - return Vector2( ( current.x < mValue.x ) ? mValue.x : current.x, - ( current.y < mValue.y ) ? mValue.y : current.y - ); - } - - Vector2 mValue; -}; - -struct TestAlwaysEqualOrGreaterThanConstraintVector3 -{ - TestAlwaysEqualOrGreaterThanConstraintVector3( Vector3 value ) - : mValue( value ) - { - } - - Vector3 operator()( const Vector3& current ) - { - return Vector3( ( current.x < mValue.x ) ? mValue.x : current.x, - ( current.y < mValue.y ) ? mValue.y : current.y, - ( current.z < mValue.z ) ? mValue.z : current.z - ); - } - - Vector3 mValue; -}; - -struct TestAlwaysEqualOrGreaterThanConstraintVector4 -{ - TestAlwaysEqualOrGreaterThanConstraintVector4( Vector4 value ) - : mValue( value ) - { - } - - Vector4 operator()( const Vector4& current ) - { - return Vector4( ( current.x < mValue.x ) ? mValue.x : current.x, - ( current.y < mValue.y ) ? mValue.y : current.y, - ( current.z < mValue.z ) ? mValue.z : current.z, - ( current.w < mValue.w ) ? mValue.w : current.w - ); - } - - Vector4 mValue; -}; - -struct TestConstraintFloat -{ - TestConstraintFloat( float value ) - : mValue( value ) - { - } - - float operator()( const float& current ) - { - return mValue; - } - - float mValue; -}; - -struct TestConstraintInteger -{ - TestConstraintInteger( int value ) - : mValue( value ) - { - } - - int operator()( const int& current ) - { - return mValue; - } - - int mValue; -}; - -struct TestConstraintVector2 -{ - TestConstraintVector2( Vector2 value ) - : mValue( value ) - { - } - - Vector2 operator()( const Vector2& current ) - { - return mValue; - } - - Vector2 mValue; -}; - -struct TestConstraintVector3 -{ - TestConstraintVector3( Vector3 value ) - : mValue( value ) - { - } - - Vector3 operator()( const Vector3& current ) - { - return mValue; - } - - Vector3 mValue; -}; - -struct TestConstraintVector4 -{ - TestConstraintVector4( Vector4 value ) - : mValue( value ) - { - } - - Vector4 operator()( const Vector4& current ) - { - return mValue; - } - - Vector4 mValue; -}; - -struct TestConstraintRotation -{ - TestConstraintRotation( Quaternion rotation ) - : mRotation( rotation ) - { - } - - Quaternion operator()( const Quaternion& current ) - { - return mRotation; - } - - Quaternion mRotation; -}; - -struct TestConstraintMatrix3 -{ - TestConstraintMatrix3(Matrix3 matrix3) - : mMatrix3( matrix3 ) - { - } - - Matrix3 operator()( const Matrix3& current ) - { - return mMatrix3; - } - - Matrix3 mMatrix3; -}; - -struct TestConstraintMatrix -{ - TestConstraintMatrix(Matrix matrix) - : mMatrix( matrix ) - { - } - - Matrix operator()( const Matrix& current ) - { - return mMatrix; - } - - Matrix mMatrix; -}; - -struct MoveAwayWithFadeConstraint -{ - MoveAwayWithFadeConstraint( float distance ) - : mDistance( distance ) - { - } - - Vector3 operator()( const Vector3& current, - const PropertyInput& color ) - { - return Vector3( current.x, - current.y, - -mDistance * (1.0f - color.GetVector4().a) ); - } - - float mDistance; -}; - -struct TestBottomRightAlignConstraint -{ - Vector3 operator()( const Vector3& current, - const PropertyInput& parentSize ) - { - return Vector3( parentSize.GetVector3().x, parentSize.GetVector3().y, 0.0f ); - } -}; - -struct MeanPositionConstraint1 -{ - Vector3 operator()( const Vector3& current, - const PropertyInput& position1 ) - { - return Vector3( position1.GetVector3() ); - } -}; - -struct MeanPositionConstraint2 -{ - Vector3 operator()( const Vector3& current, - const PropertyInput& position1, - const PropertyInput& position2 ) - { - Vector3 meanValue = position1.GetVector3() + - position2.GetVector3(); - - return meanValue * 0.5f; // div 2 - } -}; - -struct MeanPositionConstraint3 -{ - Vector3 operator()( const Vector3& current, - const PropertyInput& position1, - const PropertyInput& position2, - const PropertyInput& position3 ) - { - Vector3 meanValue = position1.GetVector3() + - position2.GetVector3() + - position3.GetVector3(); - - return meanValue * (1.0f / 3.0f); // div 3 - } -}; - -struct MeanPositionConstraint4 -{ - Vector3 operator()( const Vector3& current, - const PropertyInput& position1, - const PropertyInput& position2, - const PropertyInput& position3, - const PropertyInput& position4 ) - { - Vector3 meanValue = position1.GetVector3() + - position2.GetVector3() + - position3.GetVector3() + - position4.GetVector3(); - - return meanValue * 0.25f; // div 4 - } -}; - -struct MeanPositionConstraint5 -{ - Vector3 operator()( const Vector3& current, - const PropertyInput& position1, - const PropertyInput& position2, - const PropertyInput& position3, - const PropertyInput& position4, - const PropertyInput& position5 ) - { - Vector3 meanValue = position1.GetVector3() + - position2.GetVector3() + - position3.GetVector3() + - position4.GetVector3() + - position5.GetVector3(); - - return meanValue * 0.2f; // div 5 - } -}; - -struct MeanPositionConstraint6 -{ - Vector3 operator()( const Vector3& current, - const PropertyInput& position1, - const PropertyInput& position2, - const PropertyInput& position3, - const PropertyInput& position4, - const PropertyInput& position5, - const PropertyInput& position6 ) - { - Vector3 meanValue = position1.GetVector3() + - position2.GetVector3() + - position3.GetVector3() + - position4.GetVector3() + - position5.GetVector3() + - position6.GetVector3(); - - return meanValue * (1.0f / 6.0f); // div 6 - } -}; - -struct TestRelativeConstraintFloat -{ - TestRelativeConstraintFloat(float scale) - : mScale(scale) - { - } - - float operator()( const float& current, const PropertyInput& relative ) - { - return relative.GetFloat() * mScale; - } - - float mScale; -}; - -struct TestRelativeConstraintVector3 -{ - TestRelativeConstraintVector3(float scale) - : mScale(scale) - { - } - - Vector3 operator()( const Vector3& current, const PropertyInput& relative ) - { - return relative.GetVector3() * mScale; - } - - float mScale; -}; - -} // anonymous namespace - - - - - - -int UtcDaliConstraintNewBoolean(void) -{ - TestApplication application; - - Actor actor = Actor::New(); - - // Register a boolean property - bool startValue(false); - Property::Index index = actor.RegisterProperty( "test-property", startValue ); - Stage::GetCurrent().Add(actor); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - - /** - * Test that the Constraint is correctly applied on a clean Node - */ - application.SendNotification(); - application.Render(0); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - application.Render(0); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - application.Render(0); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - - // Apply constraint - - Constraint constraint = Constraint::New( index, TestAlwaysTrueConstraint() ); - - actor.ApplyConstraint( constraint ); - DALI_TEST_EQUALS( actor.GetProperty(index), false, TEST_LOCATION ); - - application.SendNotification(); - application.Render(0); - - // Constraint should be fully applied - DALI_TEST_EQUALS( actor.GetProperty(index), true, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), true, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), true, TEST_LOCATION ); - - // Try to fight with the constraint - this shouldn't work! - actor.SetProperty( index, false ); - - application.SendNotification(); - application.Render(0); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), true, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), true, TEST_LOCATION ); - - // Remove the constraint, then set new value - actor.RemoveConstraints(); - actor.SetProperty( index, false ); - - // Constraint should have been removed - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), false, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), false, TEST_LOCATION ); - END_TEST; -} - -int UtcDaliConstraintNewFloat(void) -{ - TestApplication application; - - Actor actor = Actor::New(); - - // Register a float property - float startValue(1.0f); - Property::Index index = actor.RegisterProperty( "test-property", startValue ); - Stage::GetCurrent().Add(actor); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - - /** - * Test that the Constraint is correctly applied on a clean Node - */ - application.SendNotification(); - application.Render(0); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - application.Render(0); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - application.Render(0); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - - // Apply constraint - - float minValue( 2.0f ); - Constraint constraint = Constraint::New( index, TestAlwaysEqualOrGreaterThanConstraintFloat( minValue ) ); - - actor.ApplyConstraint( constraint ); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - - application.SendNotification(); - application.Render(0); - - // Constraint should be fully applied - DALI_TEST_EQUALS( actor.GetProperty(index), minValue, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), minValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), minValue, TEST_LOCATION ); - - // Set to greater than 2.0f, the constraint will allow this - actor.SetProperty( index, 3.0f ); - - application.SendNotification(); - application.Render(0); - - DALI_TEST_EQUALS( actor.GetProperty(index), 3.0f, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), 3.0f, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), 3.0f, TEST_LOCATION ); - - // Set to less than 2.0f, the constraint will NOT allow this - actor.SetProperty( index, 1.0f ); - - application.SendNotification(); - application.Render(0); - - DALI_TEST_EQUALS( actor.GetProperty(index), minValue/*not 1.0f*/, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), minValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), minValue, TEST_LOCATION ); - - // Remove the constraint, then set new value - actor.RemoveConstraints(); - actor.SetProperty( index, 1.0f ); - - // Constraint should have been removed - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), 1.0f, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), 1.0f, TEST_LOCATION ); - END_TEST; -} - -int UtcDaliConstraintNewInteger(void) -{ - TestApplication application; - - Actor actor = Actor::New(); - - // Register an integer property - int startValue( 1 ); - Property::Index index = actor.RegisterProperty( "test-property", startValue ); - Stage::GetCurrent().Add(actor); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - - /** - * Test that the Constraint is correctly applied on a clean Node - */ - application.SendNotification(); - application.Render(0); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - application.Render(0); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - application.Render(0); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - - // Apply constraint - - int minValue( 2 ); - Constraint constraint = Constraint::New( index, TestAlwaysEqualOrGreaterThanConstraintInteger( minValue ) ); - - actor.ApplyConstraint( constraint ); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - - application.SendNotification(); - application.Render(0); - - // Constraint should be fully applied - DALI_TEST_EQUALS( actor.GetProperty(index), minValue, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), minValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), minValue, TEST_LOCATION ); - - // Set to greater than 2f, the constraint will allow this - actor.SetProperty( index, 3 ); - - application.SendNotification(); - application.Render(0); - - DALI_TEST_EQUALS( actor.GetProperty(index), 3, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), 3, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), 3, TEST_LOCATION ); - - // Set to less than 2, the constraint will NOT allow this - actor.SetProperty( index, 1 ); - - application.SendNotification(); - application.Render(0); - - DALI_TEST_EQUALS( actor.GetProperty(index), minValue/*not 1*/, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), minValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), minValue, TEST_LOCATION ); - - // Remove the constraint, then set new value - actor.RemoveConstraints(); - actor.SetProperty( index, 1 ); - - // Constraint should have been removed - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), 1, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), 1, TEST_LOCATION ); - END_TEST; - -} - -int UtcDaliConstraintNewVector2(void) -{ - TestApplication application; - - Actor actor = Actor::New(); - - // Register a Vector2 property - Vector2 startValue( 1.0f, 1.0f ); - Property::Index index = actor.RegisterProperty( "test-property", startValue ); - Stage::GetCurrent().Add(actor); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - - /** - * Test that the Constraint is correctly applied on a clean Node - */ - application.SendNotification(); - application.Render(0); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - application.Render(0); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - application.Render(0); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - - // Apply constraint - - Vector2 minValue( 2.0f, 2.0f ); - Constraint constraint = Constraint::New( index, TestAlwaysEqualOrGreaterThanConstraintVector2( minValue ) ); - - actor.ApplyConstraint( constraint ); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - - application.SendNotification(); - application.Render(0); - - // Constraint should be fully applied - DALI_TEST_EQUALS( actor.GetProperty(index), minValue, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), minValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), minValue, TEST_LOCATION ); - - // Set to greater than 2.0f, the constraint will allow this - Vector2 greaterValue( 3.0f, 3.0f ); - actor.SetProperty( index, greaterValue ); - - application.SendNotification(); - application.Render(0); - - DALI_TEST_EQUALS( actor.GetProperty(index), greaterValue, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), greaterValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), greaterValue, TEST_LOCATION ); - - // Set to less than 2.0f, the constraint will NOT allow this - Vector2 lesserValue( 1.0f, 1.0f ); - actor.SetProperty( index, lesserValue ); - - application.SendNotification(); - application.Render(0); - - DALI_TEST_EQUALS( actor.GetProperty(index), minValue/*not lesserValue*/, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), minValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), minValue, TEST_LOCATION ); - - // Remove the constraint, then set new value - actor.RemoveConstraints(); - actor.SetProperty( index, lesserValue ); - - // Constraint should have been removed - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), lesserValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), lesserValue, TEST_LOCATION ); - END_TEST; -} - -int UtcDaliConstraintNewVector3(void) -{ - TestApplication application; - - Actor actor = Actor::New(); - - // Register a Vector3 property - Vector3 startValue(1.0f, 1.0f, 1.0f); - Property::Index index = actor.RegisterProperty( "test-property", startValue ); - Stage::GetCurrent().Add(actor); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - - /** - * Test that the Constraint is correctly applied on a clean Node - */ - application.SendNotification(); - application.Render(0); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - application.Render(0); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - application.Render(0); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - - // Apply constraint - - Vector3 minValue( 2.0f, 2.0f, 2.0f ); - Constraint constraint = Constraint::New( index, TestAlwaysEqualOrGreaterThanConstraintVector3( minValue ) ); - - actor.ApplyConstraint( constraint ); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - - application.SendNotification(); - application.Render(0); - - // Constraint should be fully applied - DALI_TEST_EQUALS( actor.GetProperty(index), minValue, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), minValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), minValue, TEST_LOCATION ); - - // Set to greater than 2.0f, the constraint will allow this - Vector3 greaterValue( 3.0f, 3.0f, 3.0f ); - actor.SetProperty( index, greaterValue ); - - application.SendNotification(); - application.Render(0); - - DALI_TEST_EQUALS( actor.GetProperty(index), greaterValue, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), greaterValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), greaterValue, TEST_LOCATION ); - - // Set to less than 2.0f, the constraint will NOT allow this - Vector3 lesserValue( 1.0f, 1.0f, 1.0f ); - actor.SetProperty( index, lesserValue ); - - application.SendNotification(); - application.Render(0); - - DALI_TEST_EQUALS( actor.GetProperty(index), minValue/*not lesserValue*/, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), minValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), minValue, TEST_LOCATION ); - - // Remove the constraint, then set new value - actor.RemoveConstraints(); - actor.SetProperty( index, lesserValue ); - - // Constraint should have been removed - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), lesserValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), lesserValue, TEST_LOCATION ); - END_TEST; -} - -int UtcDaliConstraintNewVector4(void) -{ - TestApplication application; - - Actor actor = Actor::New(); - - // Register a Vector4 property - Vector4 startValue( 1.0f, 1.0f, 1.0f, 1.0f ); - Property::Index index = actor.RegisterProperty( "test-property", startValue ); - Stage::GetCurrent().Add(actor); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - - /** - * Test that the Constraint is correctly applied on a clean Node - */ - application.SendNotification(); - application.Render(0); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - application.Render(0); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - application.Render(0); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - - // Apply constraint - - Vector4 minValue( 2.0f, 2.0f, 2.0f, 2.0f ); - Constraint constraint = Constraint::New( index, TestAlwaysEqualOrGreaterThanConstraintVector4( minValue ) ); - - actor.ApplyConstraint( constraint ); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - - application.SendNotification(); - application.Render(0); - - // Constraint should be fully applied - DALI_TEST_EQUALS( actor.GetProperty(index), minValue, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), minValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), minValue, TEST_LOCATION ); - - // Set to greater than 2.0f, the constraint will allow this - Vector4 greaterValue( 3.0f, 3.0f, 3.0f, 3.0f ); - actor.SetProperty( index, greaterValue ); - - application.SendNotification(); - application.Render(0); - - DALI_TEST_EQUALS( actor.GetProperty(index), greaterValue, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), greaterValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), greaterValue, TEST_LOCATION ); - - // Set to less than 2.0f, the constraint will NOT allow this - Vector4 lesserValue( 1.0f, 1.0f, 1.0f, 1.0f ); - actor.SetProperty( index, lesserValue ); - - application.SendNotification(); - application.Render(0); - - DALI_TEST_EQUALS( actor.GetProperty(index), minValue/*not lesserValue*/, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), minValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), minValue, TEST_LOCATION ); - - // Remove the constraint, then set new value - actor.RemoveConstraints(); - actor.SetProperty( index, lesserValue ); - - // Constraint should have been removed - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), lesserValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), lesserValue, TEST_LOCATION ); - END_TEST; -} - -int UtcDaliConstraintNewMatrix(void) -{ - try - { - TestApplication application; - - Actor actor = Actor::New(); - - // Register a Matrix property - Matrix startValue = Matrix::IDENTITY; - Property::Index index = actor.RegisterProperty( "test-property", startValue ); - DALI_TEST_CHECK( index != Property::INVALID_INDEX ); - if (index != Property::INVALID_INDEX) - { - Stage::GetCurrent().Add(actor); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - - // Apply constraint - Matrix constraintLimit; - constraintLimit.SetTransformComponents(Vector3::ONE, Quaternion(Radian(Degree(30.0f)), Vector3::YAXIS), Vector3::ZAXIS ); - Constraint constraint = Constraint::New( index, TestConstraintMatrix(constraintLimit)); - actor.ApplyConstraint( constraint ); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - - application.SendNotification(); - application.Render(0); - - DALI_TEST_EQUALS( actor.GetProperty(index), constraintLimit, TEST_LOCATION ); - } - } - catch (Dali::DaliException& e) - { - tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str()); - DALI_TEST_CHECK(0); - } - END_TEST; -} - -int UtcDaliConstraintNewMatrix3(void) -{ - try - { - TestApplication application; - - Actor actor = Actor::New(); - - // Register a Matrix3 property - Matrix3 startValue(1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f); - Property::Index index = actor.RegisterProperty( "test-property", startValue ); - DALI_TEST_CHECK( index != Property::INVALID_INDEX ); - if (index != Property::INVALID_INDEX) - { - Stage::GetCurrent().Add(actor); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - - // Apply constraint - Matrix3 constraintLimit(42.0f, 0.0f, 0.0f, 0.0f, 42.0f, 0.0f, 0.0f, 0.0f, 1.0f); - Constraint constraint = Constraint::New( index, TestConstraintMatrix3(constraintLimit)); - actor.ApplyConstraint( constraint ); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, 0.001f, TEST_LOCATION ); - - application.SendNotification(); - application.Render(0); - - DALI_TEST_EQUALS( actor.GetProperty(index), constraintLimit, 0.001f, TEST_LOCATION ); - } - } - catch (Dali::DaliException& e) - { - tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str() ); - DALI_TEST_CHECK(0); - } - END_TEST; -} - -int UtcDaliConstraintNewQuaternion(void) -{ - TestApplication application; - - Actor actor = Actor::New(); - - // Register a Quaternion property - Quaternion startValue( 0.0f, Vector3::YAXIS ); - Property::Index index = actor.RegisterProperty( "test-property", startValue ); - Stage::GetCurrent().Add(actor); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, ROTATION_EPSILON, TEST_LOCATION ); - - /** - * Test that the Constraint is correctly applied on a clean Node - */ - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, ROTATION_EPSILON, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, ROTATION_EPSILON, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, ROTATION_EPSILON, TEST_LOCATION ); - - // Apply constraint - - Quaternion constrainedRotation( M_PI*0.25f, Vector3::YAXIS ); - Constraint constraint = Constraint::New( index, TestConstraintRotation( constrainedRotation ) ); - - actor.ApplyConstraint( constraint ); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, ROTATION_EPSILON, TEST_LOCATION ); - - application.SendNotification(); - application.Render(0); - - // Constraint should be fully applied - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedRotation, ROTATION_EPSILON, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedRotation, ROTATION_EPSILON, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedRotation, ROTATION_EPSILON, TEST_LOCATION ); - - // Set to a different rotation, the constraint will NOT allow this - Quaternion differentRotation( M_PI*0.5f, Vector3::YAXIS ); - actor.SetProperty( index, differentRotation ); - - application.SendNotification(); - application.Render(0); - - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedRotation/*not differentRotation*/, ROTATION_EPSILON, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedRotation, ROTATION_EPSILON, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedRotation, ROTATION_EPSILON, TEST_LOCATION ); - - // Remove the constraint, then set new value - actor.RemoveConstraints(); - actor.SetProperty( index, differentRotation ); - - // Constraint should have been removed - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), differentRotation, ROTATION_EPSILON, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), differentRotation, ROTATION_EPSILON, TEST_LOCATION ); - END_TEST; -} - -int UtcDaliConstraintNewOffStageBoolean(void) -{ - TestApplication application; - - Actor actor = Actor::New(); - - // Register a boolean property - bool startValue(false); - Property::Index index = actor.RegisterProperty( "test-property", startValue ); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - - // Apply constraint to off-stage Actor - Constraint constraint = Constraint::New( index, TestAlwaysTrueConstraint() ); - actor.ApplyConstraint( constraint ); - - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), false, TEST_LOCATION ); - - // Add actor to stage - Stage::GetCurrent().Add(actor); - application.SendNotification(); - application.Render(0); - - // Constraint should be fully applied - DALI_TEST_EQUALS( actor.GetProperty(index), true, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), true, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), true, TEST_LOCATION ); - - // Take the actor off-stage - Stage::GetCurrent().Remove(actor); - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), true, TEST_LOCATION ); - - // Set a new value; the constraint will not prevent this - actor.SetProperty( index, false ); - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), false, TEST_LOCATION ); - - // Add actor to stage (2nd time) - Stage::GetCurrent().Add(actor); - application.SendNotification(); - application.Render(0); - - // Constraint should be fully applied (2nd time) - DALI_TEST_EQUALS( actor.GetProperty(index), true, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), true, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), true, TEST_LOCATION ); - - // Take the actor off-stage (2nd-time) - Stage::GetCurrent().Remove(actor); - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), true, TEST_LOCATION ); - - // Remove the constraint, and set a new value - actor.RemoveConstraints(); - actor.SetProperty( index, false ); - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), false, TEST_LOCATION ); - - // Add actor to stage (3rd time) - Stage::GetCurrent().Add(actor); - application.SendNotification(); - application.Render(0); - - // Constraint should be gone - DALI_TEST_EQUALS( actor.GetProperty(index), false, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), false, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), false, TEST_LOCATION ); - END_TEST; -} - -int UtcDaliConstraintNewOffStageFloat(void) -{ - TestApplication application; - - Actor actor = Actor::New(); - - // Register a float property - float startValue(1.0f); - Property::Index index = actor.RegisterProperty( "test-property", startValue ); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - - // Apply constraint to off-stage Actor - float constrainedValue( 2.0f ); - Constraint constraint = Constraint::New( index, TestConstraintFloat( constrainedValue ) ); - actor.ApplyConstraint( constraint ); - - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - - // Add actor to stage - Stage::GetCurrent().Add(actor); - application.SendNotification(); - application.Render(0); - - // Constraint should be fully applied - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - - // Take the actor off-stage - Stage::GetCurrent().Remove(actor); - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - - // Set back to startValue; the constraint will not prevent this - actor.SetProperty( index, startValue ); - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - - // Add actor to stage (2nd time) - Stage::GetCurrent().Add(actor); - application.SendNotification(); - application.Render(0); - - // Constraint should be fully applied (2nd time) - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - - // Take the actor off-stage (2nd-time) - Stage::GetCurrent().Remove(actor); - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - - // Remove the constraint, and set back to startValue - actor.RemoveConstraints(); - actor.SetProperty( index, startValue ); - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - - // Add actor to stage (3rd time) - Stage::GetCurrent().Add(actor); - application.SendNotification(); - application.Render(0); - - // Constraint should be gone - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - END_TEST; -} - -int UtcDaliConstraintNewOffStageInteger(void) -{ - TestApplication application; - - Actor actor = Actor::New(); - - // Register an integer property - int startValue(1); - Property::Index index = actor.RegisterProperty( "test-property", startValue ); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - - // Apply constraint to off-stage Actor - int constrainedValue( 2 ); - Constraint constraint = Constraint::New( index, TestConstraintInteger( constrainedValue ) ); - actor.ApplyConstraint( constraint ); - - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - - // Add actor to stage - Stage::GetCurrent().Add(actor); - application.SendNotification(); - application.Render(0); - - // Constraint should be fully applied - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - - // Take the actor off-stage - Stage::GetCurrent().Remove(actor); - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - - // Set back to startValue; the constraint will not prevent this - actor.SetProperty( index, startValue ); - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - - // Add actor to stage (2nd time) - Stage::GetCurrent().Add(actor); - application.SendNotification(); - application.Render(0); - - // Constraint should be fully applied (2nd time) - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - - // Take the actor off-stage (2nd-time) - Stage::GetCurrent().Remove(actor); - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - - // Remove the constraint, and set back to startValue - actor.RemoveConstraints(); - actor.SetProperty( index, startValue ); - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - - // Add actor to stage (3rd time) - Stage::GetCurrent().Add(actor); - application.SendNotification(); - application.Render(0); - - // Constraint should be gone - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - END_TEST; -} - -int UtcDaliConstraintNewOffStageVector2(void) -{ - TestApplication application; - - Actor actor = Actor::New(); - - // Register a Vector2 property - Vector2 startValue(1.0f, 1.0f); - Property::Index index = actor.RegisterProperty( "test-property", startValue ); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - - // Apply constraint to off-stage Actor - Vector2 constrainedValue( 2.0f, 2.0f ); - Constraint constraint = Constraint::New( index, TestConstraintVector2( constrainedValue ) ); - actor.ApplyConstraint( constraint ); - - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - - // Add actor to stage - Stage::GetCurrent().Add(actor); - application.SendNotification(); - application.Render(0); - - // Constraint should be fully applied - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - - // Take the actor off-stage - Stage::GetCurrent().Remove(actor); - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - - // Set back to startValue; the constraint will not prevent this - actor.SetProperty( index, startValue ); - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - - // Add actor to stage (2nd time) - Stage::GetCurrent().Add(actor); - application.SendNotification(); - application.Render(0); - - // Constraint should be fully applied (2nd time) - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - - // Take the actor off-stage (2nd-time) - Stage::GetCurrent().Remove(actor); - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - - // Remove the constraint, and set back to startValue - actor.RemoveConstraints(); - actor.SetProperty( index, startValue ); - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - - // Add actor to stage (3rd time) - Stage::GetCurrent().Add(actor); - application.SendNotification(); - application.Render(0); - - // Constraint should be gone - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - END_TEST; -} - -int UtcDaliConstraintNewOffStageVector3(void) -{ - TestApplication application; - Vector3 startValue(1.0f, 1.0f, 1.0f); - Vector3 constrainedValue = Vector3( 2.0f, 3.0f, 4.0f ); - - Actor actor = Actor::New(); - // Register a Vector3 property - - Property::Index index = actor.RegisterProperty( "test-property", startValue ); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - - // Apply constraint to off-stage Actor - Constraint constraint = Constraint::New( index, TestConstraintVector3( constrainedValue ) ); - actor.ApplyConstraint( constraint ); - - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - - // Add actor to stage - Stage::GetCurrent().Add(actor); - application.SendNotification(); - application.Render(); - - // Constraint should be fully applied - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - application.Render(); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - - // Take the actor off-stage - Stage::GetCurrent().Remove(actor); - application.SendNotification(); - application.Render(); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - - // Set back to startValue; the constraint will not prevent this - Vector3 intermediateValue(5.0f, 6.0f, 7.0f); - actor.SetProperty( index, intermediateValue ); - application.SendNotification(); - application.Render(); - application.Render(); // ensure both buffers are set to intermediateValue - DALI_TEST_EQUALS( actor.GetProperty(index), intermediateValue, TEST_LOCATION ); - - // Add actor to stage (2nd time) - Stage::GetCurrent().Add(actor); - application.SendNotification(); - application.Render(); - - // Constraint should be fully applied (2nd time) - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - application.Render(); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - - // Take the actor off-stage (2nd-time) - Stage::GetCurrent().Remove(actor); - application.SendNotification(); - application.Render(); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - - // Remove the constraint, and set back to startValue - actor.RemoveConstraints(); - actor.SetProperty( index, startValue ); - application.SendNotification(); - application.Render(); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - - // Add actor to stage (3rd time) - Stage::GetCurrent().Add(actor); - application.SendNotification(); - application.Render(); - - // Constraint should be gone - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - application.Render(); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - END_TEST; -} - -int UtcDaliConstraintNewOffStageVector4(void) -{ - TestApplication application; - - Actor actor = Actor::New(); - - // Register a Vector4 property - Vector4 startValue(1.0f, 1.0f, 1.0f, 1.0f); - Property::Index index = actor.RegisterProperty( "test-property", startValue ); - DALI_TEST_CHECK( actor.GetProperty(index) == startValue ); - - // Apply constraint to off-stage Actor - Vector4 constrainedValue( 2.0f, 2.0f, 2.0f, 2.0f ); - Constraint constraint = Constraint::New( index, TestConstraintVector4( constrainedValue ) ); - actor.ApplyConstraint( constraint ); - - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - - // Add actor to stage - Stage::GetCurrent().Add(actor); - application.SendNotification(); - application.Render(0); - - // Constraint should be fully applied - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - - // Take the actor off-stage - Stage::GetCurrent().Remove(actor); - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - - // Set back to startValue; the constraint will not prevent this - actor.SetProperty( index, startValue ); - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - - // Add actor to stage (2nd time) - Stage::GetCurrent().Add(actor); - application.SendNotification(); - application.Render(0); - - // Constraint should be fully applied (2nd time) - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - - // Take the actor off-stage (2nd-time) - Stage::GetCurrent().Remove(actor); - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedValue, TEST_LOCATION ); - - // Remove the constraint, and set back to startValue - actor.RemoveConstraints(); - actor.SetProperty( index, startValue ); - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - - // Add actor to stage (3rd time) - Stage::GetCurrent().Add(actor); - application.SendNotification(); - application.Render(0); - - // Constraint should be gone - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, TEST_LOCATION ); - END_TEST; -} - -int UtcDaliConstraintNewOffStageQuaternion(void) -{ - TestApplication application; - - Actor actor = Actor::New(); - - // Register a Quaternion property - Quaternion startValue( 0.0f, Vector3::YAXIS ); - Property::Index index = actor.RegisterProperty( "test-property", startValue ); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, ROTATION_EPSILON, TEST_LOCATION ); - - // Apply constraint to off-stage Actor - Quaternion constrainedRotation( M_PI*0.25f, Vector3::YAXIS ); - Constraint constraint = Constraint::New( index, TestConstraintRotation( constrainedRotation ) ); - actor.ApplyConstraint( constraint ); - - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, ROTATION_EPSILON, TEST_LOCATION ); - - // Add actor to stage - Stage::GetCurrent().Add(actor); - application.SendNotification(); - application.Render(0); - - // Constraint should be fully applied - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedRotation, ROTATION_EPSILON, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedRotation, ROTATION_EPSILON, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedRotation, ROTATION_EPSILON, TEST_LOCATION ); - - // Take the actor off-stage - Stage::GetCurrent().Remove(actor); - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedRotation, ROTATION_EPSILON, TEST_LOCATION ); - - // Set back to startValue; the constraint will not prevent this - actor.SetProperty( index, startValue ); - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, ROTATION_EPSILON, TEST_LOCATION ); - - // Add actor to stage (2nd time) - Stage::GetCurrent().Add(actor); - application.SendNotification(); - application.Render(0); - - // Constraint should be fully applied (2nd time) - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedRotation, ROTATION_EPSILON, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedRotation, ROTATION_EPSILON, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedRotation, ROTATION_EPSILON, TEST_LOCATION ); - - // Take the actor off-stage (2nd-time) - Stage::GetCurrent().Remove(actor); - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), constrainedRotation, ROTATION_EPSILON, TEST_LOCATION ); - - // Remove the constraint, and set back to startValue - actor.RemoveConstraints(); - actor.SetProperty( index, startValue ); - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, ROTATION_EPSILON, TEST_LOCATION ); - - // Add actor to stage (3rd time) - Stage::GetCurrent().Add(actor); - application.SendNotification(); - application.Render(0); - - // Constraint should be gone - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, ROTATION_EPSILON, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, ROTATION_EPSILON, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty(index), startValue, ROTATION_EPSILON, TEST_LOCATION ); - END_TEST; -} - -int UtcDaliConstraintNewLocalInput(void) -{ - TestApplication application; - - Actor actor = Actor::New(); - Stage::GetCurrent().Add(actor); - - Vector3 startValue( 0.0f, 0.0f, 0.0f ); - float distanceWhenFullyTransparent( 100.0f ); - - /** - * Test that the Constraint is correctly applied on a clean Node - */ - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - - // Apply constraint with a local input property - - Constraint constraint = Constraint::New( Actor::POSITION, - LocalSource( Actor::COLOR ), - MoveAwayWithFadeConstraint(distanceWhenFullyTransparent) ); - - actor.ApplyConstraint( constraint ); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - - application.SendNotification(); - application.Render(0); - - // Gradually set the color to fully-transparent; the actor should move back - - for ( float progress = 0.0f; progress < 1.1f; progress += 0.1f ) - { - actor.SetOpacity( 1.0f - progress ); - - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), ( startValue - Vector3(0.0f, 0.0f, progress*distanceWhenFullyTransparent) ), POSITION_EPSILON, TEST_LOCATION ); - } - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), ( startValue - Vector3(0.0f, 0.0f, distanceWhenFullyTransparent) ), POSITION_EPSILON, TEST_LOCATION ); - END_TEST; -} - -int UtcDaliConstraintNewParentInput(void) -{ - TestApplication application; - - Actor parent = Actor::New(); - Vector3 parentStartSize( 100.0f, 100.0f, 0.0f ); - parent.SetSize( parentStartSize ); - Stage::GetCurrent().Add( parent ); - - Actor actor = Actor::New(); - parent.Add( actor ); - - Vector3 startValue( 0.0f, 0.0f, 0.0f ); - - /** - * Test that the Constraint is correctly applied on a clean Node - */ - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - - // Apply constraint with a parent input property - - Constraint constraint = Constraint::New( Actor::POSITION, - ParentSource( Actor::SIZE ), - TestBottomRightAlignConstraint() ); - - actor.ApplyConstraint( constraint ); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - - application.SendNotification(); - application.Render(0); - - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), parentStartSize, TEST_LOCATION ); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), parent.GetCurrentSize(), TEST_LOCATION ); - - // Gradually shrink the parent; the actor should move inwards - - for ( float progress = 0.0f; progress < 1.1f; progress += 0.1f ) - { - Vector3 size( parentStartSize * std::max(0.0f, 1.0f - progress) ); - parent.SetSize( size ); - - application.SendNotification(); - application.Render(0); - - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), size, POSITION_EPSILON, TEST_LOCATION ); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), parent.GetCurrentSize(), POSITION_EPSILON, TEST_LOCATION ); - } - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), Vector3::ZERO, POSITION_EPSILON, TEST_LOCATION ); - END_TEST; -} - -int UtcDaliConstraintNewInput1(void) -{ - TestApplication application; - - Actor parent = Actor::New(); - Vector3 parentStartSize( 100.0f, 100.0f, 0.0f ); - parent.SetSize( parentStartSize ); - Stage::GetCurrent().Add( parent ); - - Actor actor = Actor::New(); - parent.Add( actor ); - - Actor sibling1 = Actor::New(); - sibling1.SetPosition( Vector3(1.0f, 2.0f, 3.0f) ); - parent.Add( sibling1 ); - - Vector3 startValue( 0.0f, 0.0f, 0.0f ); - - /** - * Test that the Constraint is correctly applied on a clean Node - */ - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - - // Apply constraint with a parent input property - - Constraint constraint = Constraint::New( Actor::POSITION, - Source( sibling1, Actor::POSITION ), - MeanPositionConstraint1() ); - - actor.ApplyConstraint( constraint ); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), sibling1.GetCurrentPosition(), TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), sibling1.GetCurrentPosition(), TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), sibling1.GetCurrentPosition(), TEST_LOCATION ); - END_TEST; -} - -int UtcDaliConstraintNewInput2(void) -{ - TestApplication application; - - Actor parent = Actor::New(); - Vector3 parentStartSize( 100.0f, 100.0f, 0.0f ); - parent.SetSize( parentStartSize ); - Stage::GetCurrent().Add( parent ); - - Actor actor = Actor::New(); - parent.Add( actor ); - - Actor sibling1 = Actor::New(); - sibling1.SetPosition( Vector3(1.0f, 2.0f, 3.0f) ); - parent.Add( sibling1 ); - - Actor sibling2 = Actor::New(); - sibling2.SetPosition( Vector3(300.0f, 300.0f, 300.0f) ); - parent.Add( sibling2 ); - - application.SendNotification(); - application.Render(0); - - Vector3 startValue( 0.0f, 0.0f, 0.0f ); - Vector3 meanValue = sibling1.GetCurrentPosition() + - sibling2.GetCurrentPosition(); - meanValue *= (1.0f / 2.0f); // divide by number of siblings - - /** - * Test that the Constraint is correctly applied on a clean Node - */ - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - - // Apply constraint with a parent input property - - Constraint constraint = Constraint::New( Actor::POSITION, - Source( sibling1, Actor::POSITION ), - Source( sibling2, Actor::POSITION ), - MeanPositionConstraint2() ); - - actor.ApplyConstraint( constraint ); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), meanValue, POSITION_EPSILON, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), meanValue, POSITION_EPSILON, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), meanValue, POSITION_EPSILON, TEST_LOCATION ); - END_TEST; -} - -int UtcDaliConstraintNewInput3(void) -{ - TestApplication application; - - Actor parent = Actor::New(); - Vector3 parentStartSize( 100.0f, 100.0f, 0.0f ); - parent.SetSize( parentStartSize ); - Stage::GetCurrent().Add( parent ); - - Actor actor = Actor::New(); - parent.Add( actor ); - - Actor sibling1 = Actor::New(); - sibling1.SetPosition( Vector3(1.0f, 2.0f, 3.0f) ); - parent.Add( sibling1 ); - - Actor sibling2 = Actor::New(); - sibling2.SetPosition( Vector3(300.0f, 300.0f, 300.0f) ); - parent.Add( sibling2 ); - - Actor sibling3 = Actor::New(); - sibling3.SetPosition( Vector3(-100.0f, -10.0f, -1.0f) ); - parent.Add( sibling3 ); - - application.SendNotification(); - application.Render(0); - - Vector3 startValue( 0.0f, 0.0f, 0.0f ); - Vector3 meanValue = sibling1.GetCurrentPosition() + - sibling2.GetCurrentPosition() + - sibling3.GetCurrentPosition(); - meanValue *= (1.0f / 3.0f); // divide by number of siblings - - /** - * Test that the Constraint is correctly applied on a clean Node - */ - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - - // Apply constraint with a parent input property - - Constraint constraint = Constraint::New( Actor::POSITION, - Source( sibling1, Actor::POSITION ), - Source( sibling2, Actor::POSITION ), - Source( sibling3, Actor::POSITION ), - MeanPositionConstraint3() ); - - actor.ApplyConstraint( constraint ); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), meanValue, POSITION_EPSILON, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), meanValue, POSITION_EPSILON, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), meanValue, POSITION_EPSILON, TEST_LOCATION ); - END_TEST; -} - -int UtcDaliConstraintNewInput4(void) -{ - TestApplication application; - - Actor parent = Actor::New(); - Vector3 parentStartSize( 100.0f, 100.0f, 0.0f ); - parent.SetSize( parentStartSize ); - parent.SetPosition( 10.0f, 10.0f, 10.0f ); - Stage::GetCurrent().Add( parent ); - - Actor actor = Actor::New(); - parent.Add( actor ); - - Actor sibling1 = Actor::New(); - sibling1.SetPosition( Vector3(1.0f, 2.0f, 3.0f) ); - parent.Add( sibling1 ); - - Actor sibling2 = Actor::New(); - sibling2.SetPosition( Vector3(300.0f, 300.0f, 300.0f) ); - parent.Add( sibling2 ); - - Actor sibling3 = Actor::New(); - sibling3.SetPosition( Vector3(-100.0f, -10.0f, -1.0f) ); - parent.Add( sibling3 ); - - application.SendNotification(); - application.Render(0); - - Vector3 startValue( 0.0f, 0.0f, 0.0f ); - Vector3 meanValue = parent.GetCurrentPosition() + - sibling1.GetCurrentPosition() + - sibling2.GetCurrentPosition() + - sibling3.GetCurrentPosition(); - meanValue *= (1.0f / 4.0f); // divide by number of positions - - /** - * Test that the Constraint is correctly applied on a clean Node - */ - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - - // Apply constraint with a parent input property - - Constraint constraint = Constraint::New( Actor::POSITION, - Source( sibling1, Actor::POSITION ), - Source( sibling2, Actor::POSITION ), - ParentSource( Actor::POSITION ), - Source( sibling3, Actor::POSITION ), - MeanPositionConstraint4() ); - - actor.ApplyConstraint( constraint ); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), meanValue, POSITION_EPSILON, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), meanValue, POSITION_EPSILON, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), meanValue, POSITION_EPSILON, TEST_LOCATION ); - END_TEST; -} - -int UtcDaliConstraintNewInput5(void) -{ - TestApplication application; - - Actor parent = Actor::New(); - Vector3 parentStartSize( 100.0f, 100.0f, 0.0f ); - parent.SetSize( parentStartSize ); - parent.SetPosition( 10.0f, 10.0f, 10.0f ); - Stage::GetCurrent().Add( parent ); - - Actor actor = Actor::New(); - parent.Add( actor ); - - Actor sibling1 = Actor::New(); - sibling1.SetPosition( Vector3(1.0f, 2.0f, 3.0f) ); - parent.Add( sibling1 ); - - Actor sibling2 = Actor::New(); - sibling2.SetPosition( Vector3(300.0f, 300.0f, 300.0f) ); - parent.Add( sibling2 ); - - Actor sibling3 = Actor::New(); - sibling3.SetPosition( Vector3(-100.0f, -10.0f, -1.0f) ); - parent.Add( sibling3 ); - - Actor sibling4 = Actor::New(); - sibling4.SetPosition( Vector3(-1.0f, 1.0f, 2.0f) ); - parent.Add( sibling4 ); - - application.SendNotification(); - application.Render(0); - - Vector3 startValue( 0.0f, 0.0f, 0.0f ); - Vector3 meanValue = parent.GetCurrentPosition() + - sibling1.GetCurrentPosition() + - sibling2.GetCurrentPosition() + - sibling3.GetCurrentPosition() + - sibling4.GetCurrentPosition(); - meanValue *= (1.0f / 5.0f); // divide by number of positions - - /** - * Test that the Constraint is correctly applied on a clean Node - */ - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - - // Apply constraint with a parent input property - - Constraint constraint = Constraint::New( Actor::POSITION, - Source( sibling1, Actor::POSITION ), - Source( sibling2, Actor::POSITION ), - ParentSource( Actor::POSITION ), - Source( sibling3, Actor::POSITION ), - Source( sibling4, Actor::POSITION ), - MeanPositionConstraint5() ); - - actor.ApplyConstraint( constraint ); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), meanValue, POSITION_EPSILON, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), meanValue, POSITION_EPSILON, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), meanValue, POSITION_EPSILON, TEST_LOCATION ); - END_TEST; -} - -int UtcDaliConstraintNewInput6(void) -{ - TestApplication application; - - Actor parent = Actor::New(); - Vector3 parentStartSize( 100.0f, 100.0f, 0.0f ); - parent.SetSize( parentStartSize ); - parent.SetPosition( 10.0f, 10.0f, 10.0f ); - Stage::GetCurrent().Add( parent ); - - Actor actor = Actor::New(); - parent.Add( actor ); - - Actor child = Actor::New(); - child.SetPosition( Vector3(7.0f, 7.0f, 7.0f) ); - actor.Add( child ); - - Actor sibling1 = Actor::New(); - sibling1.SetPosition( Vector3(1.0f, 2.0f, 3.0f) ); - parent.Add( sibling1 ); - - Actor sibling2 = Actor::New(); - sibling2.SetPosition( Vector3(300.0f, 300.0f, 300.0f) ); - parent.Add( sibling2 ); - - Actor sibling3 = Actor::New(); - sibling3.SetPosition( Vector3(-100.0f, -10.0f, -1.0f) ); - parent.Add( sibling3 ); - - Actor sibling4 = Actor::New(); - sibling4.SetPosition( Vector3(-1.0f, 1.0f, 2.0f) ); - parent.Add( sibling4 ); - - application.SendNotification(); - application.Render(0); - - Vector3 startValue( 0.0f, 0.0f, 0.0f ); - Vector3 meanValue = parent.GetCurrentPosition() + - child.GetCurrentPosition() + - sibling1.GetCurrentPosition() + - sibling2.GetCurrentPosition() + - sibling3.GetCurrentPosition() + - sibling4.GetCurrentPosition(); - meanValue *= (1.0f / 6.0f); // divide by number of positions - - /** - * Test that the Constraint is correctly applied on a clean Node - */ - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - - // Apply constraint with a parent input property - - Constraint constraint = Constraint::New( Actor::POSITION, - Source( child, Actor::POSITION ), - Source( sibling1, Actor::POSITION ), - Source( sibling2, Actor::POSITION ), - ParentSource( Actor::POSITION ), - Source( sibling3, Actor::POSITION ), - Source( sibling4, Actor::POSITION ), - MeanPositionConstraint6() ); - - actor.ApplyConstraint( constraint ); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), meanValue, POSITION_EPSILON, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), meanValue, POSITION_EPSILON, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), meanValue, POSITION_EPSILON, TEST_LOCATION ); - END_TEST; -} - -int UtcDaliConstraintDownCast(void) -{ - TestApplication application; - tet_infoline("Testing Dali::Constraint::DownCast()"); - - Actor actor = Actor::New(); - - // Register a boolean property - bool startValue(false); - Property::Index index = actor.RegisterProperty( "test-property", startValue ); - Constraint constraint = Constraint::New( index, TestAlwaysTrueConstraint() ); - - BaseHandle object(constraint); - - Constraint constraint2 = Constraint::DownCast(object); - DALI_TEST_CHECK(constraint2); - - Constraint constraint3 = DownCast< Constraint >(object); - DALI_TEST_CHECK(constraint3); - - BaseHandle unInitializedObject; - Constraint constraint4 = Constraint::DownCast(unInitializedObject); - DALI_TEST_CHECK(!constraint4); - - Constraint constraint5 = DownCast< Constraint >(unInitializedObject); - DALI_TEST_CHECK(!constraint5); - END_TEST; -} - -int UtcDaliConstraintSetApplyTime(void) -{ - TestApplication application; - - // Build constraint - - Vector4 targetColor(Color::BLACK); - Constraint constraint = Constraint::New( Actor::COLOR, TestColorConstraint(targetColor) ); - DALI_TEST_EQUALS(constraint.GetApplyTime(), TimePeriod(0.0f), TEST_LOCATION); - - float applySeconds(7.0f); - constraint.SetApplyTime(applySeconds); - DALI_TEST_EQUALS(constraint.GetApplyTime(), TimePeriod(applySeconds), TEST_LOCATION); - - // Apply to an actor - - Actor actor = Actor::New(); - Stage::GetCurrent().Add(actor); - - actor.ApplyConstraint( constraint ); - DALI_TEST_EQUALS( actor.GetCurrentColor(), Color::WHITE, TEST_LOCATION ); - - application.SendNotification(); - application.Render(static_cast(applySeconds*200.0f)/* 20% progress */); - - // Constraint shouldn't be fully applied yet - Vector4 twentyPercentColor( Color::WHITE.x*0.8f, Color::WHITE.y*0.8f, Color::WHITE.z*0.8f, Color::WHITE.a ); - DALI_TEST_EQUALS( actor.GetCurrentColor(), twentyPercentColor, TEST_LOCATION ); - - // Constraint shouldn't be fully applied yet - application.Render(static_cast(applySeconds*200.0f)/* 40% progress */); - Vector4 fourtyPercentColor( Color::WHITE.x*0.6f, Color::WHITE.y*0.6f, Color::WHITE.z*0.6f, Color::WHITE.a ); - DALI_TEST_EQUALS( actor.GetCurrentColor(), fourtyPercentColor, TEST_LOCATION ); - - // Constraint shouldn't be fully applied yet - application.Render(static_cast(applySeconds*200.0f)/* 60% progress */); - Vector4 sixtyPercentColor( Color::WHITE.x*0.4f, Color::WHITE.y*0.4f, Color::WHITE.z*0.4f, Color::WHITE.a ); - DALI_TEST_EQUALS( actor.GetCurrentColor(), sixtyPercentColor, TEST_LOCATION ); - - // Constraint shouldn't be fully applied yet - application.Render(static_cast(applySeconds*200.0f)/* 80% progress */); - Vector4 eightyPercentColor( Color::WHITE.x*0.2f, Color::WHITE.y*0.2f, Color::WHITE.z*0.2f, Color::WHITE.a ); - DALI_TEST_EQUALS( actor.GetCurrentColor(), eightyPercentColor, TEST_LOCATION ); - - // Constraint should be fully applied - application.Render(static_cast(applySeconds*200.0f)/* 100% progress */); - DALI_TEST_EQUALS( actor.GetCurrentColor(), targetColor, TEST_LOCATION ); - - // Constraint should still be fully applied - application.Render(static_cast(applySeconds*200.0f)/* Still 100% progress */); - DALI_TEST_EQUALS( actor.GetCurrentColor(), targetColor, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetCurrentColor(), targetColor, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetCurrentColor(), targetColor, TEST_LOCATION ); - END_TEST; -} - -int UtcDaliConstraintGetApplyTime(void) -{ - TestApplication application; - - Constraint constraint = Constraint::New( Actor::COLOR, TestConstraint() ); - DALI_TEST_EQUALS(constraint.GetApplyTime(), TimePeriod(0.0f), TEST_LOCATION); - - float applySeconds(7.0f); - constraint.SetApplyTime(applySeconds); - DALI_TEST_EQUALS(constraint.GetApplyTime(), TimePeriod(applySeconds), TEST_LOCATION); +{ - constraint.SetApplyTime(applySeconds - 3.0f); - DALI_TEST_EQUALS(constraint.GetApplyTime(), TimePeriod(applySeconds - 3.0f), TEST_LOCATION); - END_TEST; +/** + * A function to use for a constraint, no data collected. + */ +template< typename T > +void BasicFunction( T& /* current */, const PropertyInputContainer& /* inputs */ ) +{ } -int UtcDaliConstraintSetRemoveTime(void) +/** + * A functor which sets a given boolean when the functor is called. + */ +template< typename T > +struct BasicCalledFunctor { - TestApplication application; + BasicCalledFunctor( bool& functorCalled ) : mCalled( functorCalled ) { } - Vector3 sourcePosition(0.0f, 0.0f, 0.0f); - Vector3 targetPosition(100.0f, 100.0f, 100.0f); + void operator()( T& /* current */, const PropertyInputContainer& /* inputs */ ) + { + mCalled = true; + } - // Build constraint + bool& mCalled; +}; - Constraint constraint = Constraint::New( Actor::POSITION, TestPositionConstraint(targetPosition) ); - DALI_TEST_EQUALS(constraint.GetRemoveTime(), TimePeriod(0.0f), TEST_LOCATION); +/** + * A functor which increments a given integer when the functor is called. + */ +template< typename T > +struct CalledCountFunctor +{ + CalledCountFunctor( int& callCount ) : mCallCount( callCount ) { } - float removeSeconds(8.0f); - constraint.SetRemoveTime(removeSeconds); - DALI_TEST_EQUALS(constraint.GetRemoveTime(), TimePeriod(removeSeconds), TEST_LOCATION); + void operator()( T& /* current */, const PropertyInputContainer& /* inputs */ ) + { + ++mCallCount; + } - // Apply to an actor + int& mCallCount; +}; - Actor actor = Actor::New(); - Stage::GetCurrent().Add(actor); +/** + * A functor which sets the given value as the value required when the functor is called. + */ +template< typename T > +struct SetValueFunctor +{ + SetValueFunctor( const T& value ) : mValue( value ) { } - actor.ApplyConstraint( constraint ); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION ); + void operator()( T& current, const PropertyInputContainer& /* inputs */ ) + { + current = mValue; + } - application.SendNotification(); - application.Render(100u/*0.1 seconds*/); + T mValue; +}; - // Constraint should be fully applied - DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION ); +} // unnamed namespace +/////////////////////////////////////////////////////////////////////////////// - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION ); +/////////////////////////////////////////////////////////////////////////////// +// Constraint::New( +// Handle, +// Property::Index, +// void( *function )( T&, const PropertyInputContainer& ) ) +/////////////////////////////////////////////////////////////////////////////// +namespace UtcDaliConstraintNewFunction +{ +bool gConstraintFunctionCalled = false; +void ConstraintFunction( Vector3& /* current */, const PropertyInputContainer& /* inputs */ ) +{ + gConstraintFunctionCalled = true; +} +} // namespace UtcDaliConstraintNewFunction - // Remove from the actor, and set to alternative position +int UtcDaliConstraintNewFunctionP(void) +{ + // Ensure that we can create a constraint using a C function and that it is called. - actor.RemoveConstraints(); + TestApplication application; + UtcDaliConstraintNewFunction::gConstraintFunctionCalled = false; - Vector3 thirdPosition(200.0f, 200.0f, 200.0f); - actor.SetPosition(thirdPosition); // Go back to 3rd position + Actor actor = Actor::New(); + Stage::GetCurrent().Add( actor ); application.SendNotification(); - application.Render(static_cast(removeSeconds*200.0f)/* 20% removal progress */); - - // Constraint shouldn't be fully removed yet - Vector3 twentyPercentBack( targetPosition + (thirdPosition - targetPosition)*0.2f ); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), twentyPercentBack, TEST_LOCATION ); - - application.Render(static_cast(removeSeconds*200.0f)/* 40% removal progress */); - - // Constraint shouldn't be fully removed yet - Vector3 fourtyPercentBack( targetPosition + (thirdPosition - targetPosition)*0.4f ); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), fourtyPercentBack, TEST_LOCATION ); - - application.Render(static_cast(removeSeconds*200.0f)/* 60% removal progress */); - - // Constraint shouldn't be fully removed yet - Vector3 sixtyPercentBack( targetPosition + (thirdPosition - targetPosition)*0.6f ); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), sixtyPercentBack, TEST_LOCATION ); + application.Render(); - application.Render(static_cast(removeSeconds*200.0f)/* 80% removal progress */); + DALI_TEST_EQUALS( UtcDaliConstraintNewFunction::gConstraintFunctionCalled, false, TEST_LOCATION ); - // Constraint shouldn't be fully removed yet - Vector3 eightyPercentBack( targetPosition + (thirdPosition - targetPosition)*0.8f ); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), eightyPercentBack, TEST_LOCATION ); + // Add a constraint + Constraint constraint = Constraint::New< Vector3 >( actor, Actor::Property::POSITION, &UtcDaliConstraintNewFunction::ConstraintFunction ); + DALI_TEST_CHECK( constraint ); + constraint.Apply(); - // Constraint should be fully removed - application.Render(static_cast(removeSeconds*200.0f)/* 100% removal progress */); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), thirdPosition, TEST_LOCATION ); + application.SendNotification(); + application.Render(); - // Constraint should still be fully applied - application.Render(static_cast(removeSeconds*200.0f)/* Still 100% removal progress */); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), thirdPosition, TEST_LOCATION ); + DALI_TEST_EQUALS( UtcDaliConstraintNewFunction::gConstraintFunctionCalled, true, TEST_LOCATION ); - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), thirdPosition, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), thirdPosition, TEST_LOCATION ); END_TEST; } -int UtcDaliConstraintGetRemoveTime(void) +int UtcDaliConstraintNewFunctionN(void) { + // Create a constraint with an uninitialised handle + TestApplication application; - Constraint constraint = Constraint::New( Actor::COLOR, TestConstraint() ); - DALI_TEST_EQUALS(constraint.GetRemoveTime(), TimePeriod(0.0f), TEST_LOCATION); + // Add a constraint with an uninitialised handle + try + { + Constraint constraint = Constraint::New< Vector3 >( Actor(), Actor::Property::POSITION, &UtcDaliConstraintNewFunction::ConstraintFunction ); + DALI_TEST_CHECK( false ); // Should not reach here + } + catch ( ... ) + { + DALI_TEST_CHECK( true ); // Should assert! + } + END_TEST; } -int UtcDaliConstraintSetAlphaFunction(void) +// helper for next test +void StringConstraintFunction( std::string& /* current */, const PropertyInputContainer& /* inputs */ ) { - TestApplication application; - - Vector3 startValue( Vector3::ZERO ); - Vector3 targetValue(100.0f, 100.0f, 100.0f); - - Constraint constraint = Constraint::New( Actor::POSITION, - TestConstraintVector3( targetValue ) ); - - // Test the alpha-function itself +} - AlphaFunction func = constraint.GetAlphaFunction(); - DALI_TEST_EQUALS(func(0.1f), 0.1f, TEST_LOCATION); // Default is Linear +int UtcDaliConstraintNewFunctionNonConstrainableTypeN(void) +{ + // Ensure that we can create a constraint using a C function and that it is called. - // Test that the alpha-function is used correctly + TestApplication application; + UtcDaliConstraintNewFunction::gConstraintFunctionCalled = false; Actor actor = Actor::New(); - Stage::GetCurrent().Add(actor); - - application.SendNotification(); - application.Render(static_cast(1000.0f/*1 second*/)); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - application.Render(static_cast(1000.0f/*1 second*/)); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - application.Render(static_cast(1000.0f/*1 second*/)); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - - constraint.SetApplyTime( 10.0f ); - actor.ApplyConstraint( constraint ); + Stage::GetCurrent().Add( actor ); application.SendNotification(); - application.Render(static_cast(1000.0f/*1 second*/)); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), (targetValue - startValue) * 0.1f, TEST_LOCATION ); - application.Render(static_cast(1000.0f/*1 second*/)); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), (targetValue - startValue) * 0.2f, TEST_LOCATION ); - application.Render(static_cast(1000.0f/*1 second*/)); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), (targetValue - startValue) * 0.3f, TEST_LOCATION ); - application.Render(static_cast(1000.0f/*1 second*/)); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), (targetValue - startValue) * 0.4f, TEST_LOCATION ); - application.Render(static_cast(1000.0f/*1 second*/)); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), (targetValue - startValue) * 0.5f, TEST_LOCATION ); - application.Render(static_cast(1000.0f/*1 second*/)); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), (targetValue - startValue) * 0.6f, TEST_LOCATION ); - application.Render(static_cast(1000.0f/*1 second*/)); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), (targetValue - startValue) * 0.7f, TEST_LOCATION ); - application.Render(static_cast(1000.0f/*1 second*/)); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), (targetValue - startValue) * 0.8f, TEST_LOCATION ); - application.Render(static_cast(1000.0f/*1 second*/)); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), (targetValue - startValue) * 0.9f, TEST_LOCATION ); - application.Render(static_cast(1000.0f/*1 second*/)); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), (targetValue - startValue), TEST_LOCATION ); - - // Check that the constrained value is stable - application.Render(static_cast(1000.0f/*1 second*/)); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), (targetValue - startValue), TEST_LOCATION ); - application.Render(static_cast(1000.0f/*1 second*/)); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), (targetValue - startValue), TEST_LOCATION ); + application.Render(); - // Remove the constraint + try + { + // Add a constraint + Constraint constraint = Constraint::New< std::string >( actor, Actor::Property::COLOR_MODE, &StringConstraintFunction ); + DALI_TEST_CHECK( constraint ); + constraint.Apply(); + tet_result(TET_FAIL); + } + catch ( Dali::DaliException& e ) + { + DALI_TEST_ASSERT( e, "Property not constrainable", TEST_LOCATION ); + } - actor.RemoveConstraints(); - actor.SetPosition( startValue ); + END_TEST; +} - application.SendNotification(); - application.Render(static_cast(1000.0f/*1 second*/)); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - application.Render(static_cast(1000.0f/*1 second*/)); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); - application.Render(static_cast(1000.0f/*1 second*/)); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), startValue, TEST_LOCATION ); +/////////////////////////////////////////////////////////////////////////////// - // Change to non-linear alpha and retest +/////////////////////////////////////////////////////////////////////////////// +// Constraint::New( +// Handle, +// Property::Index, +// const T& object ) +/////////////////////////////////////////////////////////////////////////////// +int UtcDaliConstraintNewFunctorP(void) +{ + // Ensure that we can create a constraint using a functor and that it is called. - constraint.SetAlphaFunction(AlphaFunctions::EaseIn); - func = constraint.GetAlphaFunction(); - DALI_TEST_CHECK(func(0.1f) < 0.09f); + TestApplication application; + bool functorCalled = false; - actor.ApplyConstraint( constraint ); + Actor actor = Actor::New(); + Stage::GetCurrent().Add( actor ); application.SendNotification(); - application.Render(static_cast(1000.0f/*1 second*/)); + application.Render(); + + DALI_TEST_EQUALS( functorCalled, false, TEST_LOCATION ); - DALI_TEST_CHECK( actor.GetProperty( Actor::POSITION ).x > startValue.x ); - DALI_TEST_CHECK( actor.GetProperty( Actor::POSITION ).y > startValue.y ); - DALI_TEST_CHECK( actor.GetProperty( Actor::POSITION ).z > startValue.z ); + // Add a constraint + Constraint constraint = Constraint::New< Vector3 >( actor, Actor::Property::POSITION, BasicCalledFunctor< Vector3 >( functorCalled ) ); + DALI_TEST_CHECK( constraint ); + constraint.Apply(); - Vector3 lessThanTenPercentProgress( (targetValue - startValue) * 0.09f ); - DALI_TEST_CHECK( actor.GetProperty( Actor::POSITION ).x < lessThanTenPercentProgress.x ); - DALI_TEST_CHECK( actor.GetProperty( Actor::POSITION ).y < lessThanTenPercentProgress.y ); - DALI_TEST_CHECK( actor.GetProperty( Actor::POSITION ).z < lessThanTenPercentProgress.z ); + application.SendNotification(); + application.Render(); - application.Render(static_cast(9000.0f/*9 seconds*/)); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), (targetValue - startValue), TEST_LOCATION ); + DALI_TEST_EQUALS( functorCalled, true, TEST_LOCATION ); - // Check that the constrained value is stable - application.Render(static_cast(1000.0f/*1 second*/)); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), (targetValue - startValue), TEST_LOCATION ); - application.Render(static_cast(1000.0f/*1 second*/)); - DALI_TEST_EQUALS( actor.GetProperty( Actor::POSITION ), (targetValue - startValue), TEST_LOCATION ); END_TEST; } -int UtcDaliConstraintGetAlphaFunction(void) +int UtcDaliConstraintNewFunctorN(void) { + // Create a constraint with an uninitialised handle + TestApplication application; + bool functorCalled = false; - Constraint constraint = Constraint::New( Actor::COLOR, TestConstraint() ); + // Add a constraint with an uninitialised handle + try + { + Constraint constraint = Constraint::New< Vector3 >( Actor(), Actor::Property::POSITION, BasicCalledFunctor< Vector3 >( functorCalled ) ); + DALI_TEST_CHECK( false ); // Should not reach here + } + catch ( ... ) + { + DALI_TEST_CHECK( true ); // Should assert! + } - AlphaFunction func = constraint.GetAlphaFunction(); - DALI_TEST_EQUALS(func(0.5f), 0.5f, TEST_LOCATION); // Default is Linear END_TEST; } +/////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////// +// Constraint::New( +// Handle, +// Property::Index, +// const T& object, +// void ( T::*memberFunction ) ( P&, const PropertyInputContainer& ) ) +/////////////////////////////////////////////////////////////////////////////// +namespace UtcDaliConstraintNewFunctorMember +{ +struct Functor +{ + Functor( bool& positionCalled, bool& scaleCalled ) + : mPositionCalled( positionCalled ), + mScaleCalled( scaleCalled ) + { + } -int UtcDaliConstraintSetRemoveAction(void) -{ - TestApplication application; - - Vector3 sourcePosition(0.0f, 0.0f, 0.0f); - Vector3 targetPosition(100.0f, 100.0f, 100.0f); - - // Build constraint, with "Discard" remove action + void Position( Vector3& /* current */, const PropertyInputContainer& /* inputs */ ) + { + mPositionCalled = true; + } - Constraint constraint = Constraint::New( Actor::POSITION, TestPositionConstraint(targetPosition) ); - DALI_TEST_EQUALS((unsigned int)constraint.GetRemoveAction(), (unsigned int)Constraint::Bake, TEST_LOCATION); + void Scale( Vector3& /* current */, const PropertyInputContainer& /* inputs */ ) + { + mScaleCalled = true; + } - constraint.SetRemoveAction(Constraint::Discard); - DALI_TEST_EQUALS((unsigned int)constraint.GetRemoveAction(), (unsigned int)Constraint::Discard, TEST_LOCATION); + bool& mPositionCalled; + bool& mScaleCalled; +}; +} // namespace UtcDaliConstraintNewFunctorMember - float removeSeconds(8.0f); - constraint.SetRemoveTime(removeSeconds); - DALI_TEST_EQUALS(constraint.GetRemoveTime(), TimePeriod(removeSeconds), TEST_LOCATION); +int UtcDaliConstraintNewFunctorMemberP(void) +{ + // Ensure that we can create a constraint using a functor and that it is called. - // Apply to an actor + TestApplication application; + bool positionFunctorCalled = false; + bool sizeFunctorCalled = false; Actor actor = Actor::New(); - Stage::GetCurrent().Add(actor); - - actor.ApplyConstraint( constraint ); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION ); + Stage::GetCurrent().Add( actor ); application.SendNotification(); - application.Render(100u/*0.1 seconds*/); - - // Constraint should be fully applied - DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION ); + application.Render(); - // Remove from the actor + DALI_TEST_EQUALS( positionFunctorCalled, false, TEST_LOCATION ); + DALI_TEST_EQUALS( sizeFunctorCalled, false, TEST_LOCATION ); - actor.RemoveConstraints(); // should go back to source position + // Add a constraint that calls Functor::Position + Constraint constraint = Constraint::New< Vector3 >( + actor, + Actor::Property::POSITION, + UtcDaliConstraintNewFunctorMember::Functor( positionFunctorCalled, sizeFunctorCalled ), + &UtcDaliConstraintNewFunctorMember::Functor::Position ); + DALI_TEST_CHECK( constraint ); + constraint.Apply(); application.SendNotification(); - application.Render(static_cast(removeSeconds*200.0f)/* 20% removal progress */); - - // Constraint shouldn't be fully removed yet - Vector3 twentyPercentBack( targetPosition * 0.8f ); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), twentyPercentBack, TEST_LOCATION ); - - application.Render(static_cast(removeSeconds*200.0f)/* 40% removal progress */); - - // Constraint shouldn't be fully removed yet - Vector3 fourtyPercentBack( targetPosition * 0.6f ); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), fourtyPercentBack, TEST_LOCATION ); - - application.Render(static_cast(removeSeconds*200.0f)/* 60% removal progress */); - - // Constraint shouldn't be fully removed yet - Vector3 sixtyPercentBack( targetPosition * 0.4f ); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), sixtyPercentBack, TEST_LOCATION ); + application.Render(); - application.Render(static_cast(removeSeconds*200.0f)/* 80% removal progress */); + DALI_TEST_EQUALS( positionFunctorCalled, true, TEST_LOCATION ); + DALI_TEST_EQUALS( sizeFunctorCalled, false, TEST_LOCATION ); - // Constraint shouldn't be fully removed yet - Vector3 eightyPercentBack( targetPosition * 0.2f ); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), eightyPercentBack, TEST_LOCATION ); + // Add another constraint that calls Functor::Size + Constraint constraint2 = Constraint::New< Vector3 >( + actor, + Actor::Property::SCALE, + UtcDaliConstraintNewFunctorMember::Functor( positionFunctorCalled, sizeFunctorCalled ), + &UtcDaliConstraintNewFunctorMember::Functor::Scale ); + DALI_TEST_CHECK( constraint2 ); + constraint2.Apply(); - // Constraint should be fully removed - application.Render(static_cast(removeSeconds*200.0f)/* 100% removal progress */); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION ); + application.SendNotification(); + application.Render(); - // Constraint should still be fully applied - application.Render(static_cast(removeSeconds*200.0f)/* Still 100% removal progress */); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION ); + DALI_TEST_EQUALS( positionFunctorCalled, true, TEST_LOCATION ); + DALI_TEST_EQUALS( sizeFunctorCalled, true, TEST_LOCATION ); - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION ); END_TEST; } -int UtcDaliConstraintGetRemoveAction(void) +int UtcDaliConstraintNewFunctorMemberN(void) { - TestApplication application; + // Create a constraint with an uninitialised handle - Constraint constraint = Constraint::New( Actor::COLOR, TestConstraint() ); - DALI_TEST_EQUALS((unsigned int)constraint.GetRemoveAction(), (unsigned int)Constraint::Bake, TEST_LOCATION); + TestApplication application; + bool positionFunctorCalled = false; + bool sizeFunctorCalled = false; - constraint.SetRemoveAction(Constraint::Discard); - DALI_TEST_EQUALS((unsigned int)constraint.GetRemoveAction(), (unsigned int)Constraint::Discard, TEST_LOCATION); + // Add a constraint with an uninitialised handle + try + { + Constraint constraint = Constraint::New< Vector3 >( + Actor(), + Actor::Property::POSITION, + UtcDaliConstraintNewFunctorMember::Functor( positionFunctorCalled, sizeFunctorCalled ), + &UtcDaliConstraintNewFunctorMember::Functor::Position ); + DALI_TEST_CHECK( false ); // Should not reach here + } + catch ( Dali::DaliException& e ) + { + DALI_TEST_CHECK( true ); // Should assert! + } - constraint.SetRemoveAction(Constraint::Bake); - DALI_TEST_EQUALS((unsigned int)constraint.GetRemoveAction(), (unsigned int)Constraint::Bake, TEST_LOCATION); END_TEST; } +/////////////////////////////////////////////////////////////////////////////// -/** - * Test a constraint with non-zero apply-time and remove-time, where the constraint is removed during the apply-time - */ -int UtcDaliConstraintRemoveDuringApply(void) +/////////////////////////////////////////////////////////////////////////////// +// Constraint::Clone +/////////////////////////////////////////////////////////////////////////////// +int UtcDaliConstraintCloneP(void) { - TestApplication application; - - Vector3 sourcePosition(0.0f, 0.0f, 0.0f); - Vector3 targetPosition(100.0f, 100.0f, 100.0f); - Vector3 halfwayPosition(targetPosition * 0.5f); - - // Build constraint + // Ensure we can clone for another actor and it's called appropriately - Constraint constraint = Constraint::New( Actor::POSITION, TestPositionConstraint(targetPosition) ); - DALI_TEST_EQUALS((unsigned int)constraint.GetRemoveAction(), (unsigned int)Constraint::Bake, TEST_LOCATION); - - float applySeconds(4.0f); - constraint.SetApplyTime(applySeconds); - DALI_TEST_EQUALS(constraint.GetApplyTime(), TimePeriod(applySeconds), TEST_LOCATION); - - float removeSeconds(8.0f); - constraint.SetRemoveTime(removeSeconds); - DALI_TEST_EQUALS(constraint.GetRemoveTime(), TimePeriod(removeSeconds), TEST_LOCATION); - - // Apply to an actor + TestApplication application; + int calledCount = 0; Actor actor = Actor::New(); - Stage::GetCurrent().Add(actor); + Actor clone = Actor::New(); - actor.ApplyConstraint( constraint ); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION ); + Stage stage = Stage::GetCurrent(); + stage.Add( actor ); + stage.Add( clone ); application.SendNotification(); - application.Render(static_cast(applySeconds*250.0f)/* 25% progress */); - - // Constraint shouldn't be fully applied yet - Vector3 twentyFivePercent( targetPosition * 0.25f ); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), twentyFivePercent, TEST_LOCATION ); - - application.Render(static_cast(applySeconds*250.0f)/* 50% progress */); + application.Render(); - // Constraint shouldn't be fully applied yet - Vector3 fiftyPercent( targetPosition * 0.5f ); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), fiftyPercent, TEST_LOCATION ); + DALI_TEST_EQUALS( calledCount, 0, TEST_LOCATION ); - // Remove from the actor + // Add a constraint to actor + Constraint constraint = Constraint::New< Vector3 >( actor, Actor::Property::POSITION, CalledCountFunctor< Vector3 >( calledCount ) ); + DALI_TEST_CHECK( constraint ); + constraint.Apply(); - actor.RemoveConstraints(); // should go back to source position + // Create a clone but don't apply + Constraint constraintClone = constraint.Clone( clone ); application.SendNotification(); - application.Render(static_cast(removeSeconds*100.0f)/* 50% - 5% = 45% progress */); - - // Constraint shouldn't be fully removed yet - Vector3 fourtyFivePercent( targetPosition * 0.45f ); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), fourtyFivePercent, TEST_LOCATION ); - - application.Render(static_cast(removeSeconds*400.0f)/* 50% - 25% = 25% progress */); - - // Constraint shouldn't be fully removed yet - DALI_TEST_EQUALS( actor.GetCurrentPosition(), twentyFivePercent, TEST_LOCATION ); - - // Constraint should be fully removed - application.Render(static_cast(removeSeconds*500.0f)/* 0% progress */); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION ); - - // Constraint should still be fully applied - application.Render(static_cast(removeSeconds*200.0f)/* Still 0% progress */); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION ); - END_TEST; -} - -/** - * Test a constraint with non-zero apply-time & zero (immediate) remove-time, where the constraint is removed during the apply-time - */ -int UtcDaliConstraintImmediateRemoveDuringApply(void) -{ - TestApplication application; - - Vector3 sourcePosition(0.0f, 0.0f, 0.0f); - Vector3 targetPosition(100.0f, 100.0f, 100.0f); - - // Build constraint + application.Render(); - Constraint constraint = Constraint::New( Actor::POSITION, TestPositionConstraint(targetPosition) ); - DALI_TEST_EQUALS((unsigned int)constraint.GetRemoveAction(), (unsigned int)Constraint::Bake, TEST_LOCATION); + DALI_TEST_EQUALS( calledCount, 1, TEST_LOCATION ); - float applySeconds(4.0f); - constraint.SetApplyTime(applySeconds); - DALI_TEST_EQUALS(constraint.GetApplyTime(), TimePeriod(applySeconds), TEST_LOCATION); - DALI_TEST_EQUALS(constraint.GetRemoveTime(), TimePeriod(0.0f), TEST_LOCATION); + // Reset + calledCount = 0; - // Apply to an actor + application.SendNotification(); + application.Render(); - Actor actor = Actor::New(); - Stage::GetCurrent().Add(actor); + DALI_TEST_EQUALS( calledCount, 1, TEST_LOCATION ); - actor.ApplyConstraint( constraint ); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION ); + // Apply the clone constraint + constraintClone.Apply(); application.SendNotification(); - application.Render(static_cast(applySeconds*250.0f)/* 25% progress */); - - // Constraint shouldn't be fully applied yet - Vector3 twentyFivePercent( targetPosition * 0.25f ); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), twentyFivePercent, TEST_LOCATION ); + application.Render(); - application.Render(static_cast(applySeconds*250.0f)/* 50% progress */); + // Should be called once for the new constraint clone and once for the original constraint + DALI_TEST_EQUALS( calledCount, 3, TEST_LOCATION ); - // Constraint shouldn't be fully applied yet - Vector3 fiftyPercent( targetPosition * 0.5f ); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), fiftyPercent, TEST_LOCATION ); + // Reset + calledCount = 0; - // Remove from the actor + // Change the position of both actors + actor.SetPosition( 100.0f, 100.0f ); + clone.SetPosition( 100.0f, 100.0f ); - actor.RemoveConstraints(); // should go back to source position application.SendNotification(); + application.Render(); - // Constraint should be fully removed - application.Render(static_cast(200.0f /*0.2 seconds*/)); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION ); - - // Constraint should still be fully applied - application.Render(static_cast(200.0f /*0.2 seconds*/)); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION ); + // Functor should have been called twice + DALI_TEST_EQUALS( calledCount, 2, TEST_LOCATION ); - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION ); END_TEST; } -int UtcDaliConstraintActorSize(void) +int UtcDaliConstraintCloneN(void) { - TestApplication application; - - // Build constraint, to make child 20% of parent size + // Attempt to clone an uninitialised constraint should cause an assert - Constraint constraint = Constraint::New( Actor::SIZE, - ParentSource( Actor::SIZE ), - TestRelativeConstraintVector3(0.2f) ); - // Apply to a child actor - - Actor parent = Actor::New(); - Stage::GetCurrent().Add(parent); - - Actor child = Actor::New(); - parent.Add(child); - - child.ApplyConstraint( constraint ); - DALI_TEST_EQUALS( child.GetCurrentSize(), Vector3::ZERO, TEST_LOCATION ); - - // Animate the parent between two sizes - - Vector3 targetParentSize(100.0f, 100.0f, 100.0f); + TestApplication application; - float durationSeconds(10.0f); - Animation animation = Animation::New(durationSeconds); - animation.AnimateTo( Property(parent, Actor::SIZE), targetParentSize ); - animation.Play(); + Constraint constraint; - application.SendNotification(); + try + { + Actor actor = Actor::New(); + Constraint clone = constraint.Clone( actor ); + DALI_TEST_CHECK( false ); + } + catch ( ... ) + { + DALI_TEST_CHECK( true ); + } - application.Render(static_cast(durationSeconds*250.0f)/* 25% progress */); - DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize*0.25f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize(), targetParentSize*0.25f * 0.2f, TEST_LOCATION ); - - application.Render(static_cast(durationSeconds*250.0f)/* 50% progress */); - DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize*0.5f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize(), targetParentSize*0.5f * 0.2f, TEST_LOCATION ); - - application.Render(static_cast(durationSeconds*250.0f)/* 75% progress */); - DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize*0.75f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize(), targetParentSize*0.75f * 0.2f, TEST_LOCATION ); - - application.Render(static_cast(durationSeconds*250.0f)/* 100% progress */); - DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize(), targetParentSize * 0.2f, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize(), targetParentSize * 0.2f, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize(), targetParentSize * 0.2f, TEST_LOCATION ); END_TEST; } -int UtcDaliConstraintActorSizeWidth(void) +namespace UtcDaliConstraintClone { - TestApplication application; - - // Build constraint, to make child 20% of parent width - - Constraint constraint = Constraint::New( Actor::SIZE_WIDTH, - ParentSource( Actor::SIZE_WIDTH ), - TestRelativeConstraintFloat(0.2f) ); - // Apply to a child actor - - Actor parent = Actor::New(); - Stage::GetCurrent().Add(parent); - - Actor child = Actor::New(); - parent.Add(child); - - child.ApplyConstraint( constraint ); - DALI_TEST_EQUALS( child.GetCurrentSize(), Vector3::ZERO, TEST_LOCATION ); - - // Animate the parent between two sizes - - Vector3 targetParentSize(80.0f, 90.0f, 100.0f); - - float durationSeconds(10.0f); - Animation animation = Animation::New(durationSeconds); - animation.AnimateTo( Property(parent, Actor::SIZE), targetParentSize ); - animation.Play(); - - application.SendNotification(); - - application.Render(static_cast(durationSeconds*250.0f)/* 25% progress */); - DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize*0.25f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().width, targetParentSize.width*0.25f * 0.2f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().height, 0.0f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().depth, 0.0f, TEST_LOCATION ); - - application.Render(static_cast(durationSeconds*250.0f)/* 50% progress */); - DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize*0.5f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().width, targetParentSize.width*0.5f * 0.2f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().height, 0.0f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().depth, 0.0f, TEST_LOCATION ); - - application.Render(static_cast(durationSeconds*250.0f)/* 75% progress */); - DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize*0.75f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().width, targetParentSize.width*0.75f * 0.2f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().height, 0.0f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().depth, 0.0f, TEST_LOCATION ); - - application.Render(static_cast(durationSeconds*250.0f)/* 100% progress */); - DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().width, targetParentSize.width * 0.2f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().height, 0.0f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().depth, 0.0f, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().width, targetParentSize.width * 0.2f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().height, 0.0f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().depth, 0.0f, TEST_LOCATION ); - - application.Render(0); - DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().width, targetParentSize.width * 0.2f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().height, 0.0f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().depth, 0.0f, TEST_LOCATION ); - END_TEST; +void Function( Vector3& /* current */, const PropertyInputContainer& inputs ) +{ + DALI_TEST_EQUALS( inputs[0]->GetType(), Property::VECTOR3, TEST_LOCATION ); + DALI_TEST_EQUALS( inputs[1]->GetType(), Property::ROTATION, TEST_LOCATION ); + DALI_TEST_EQUALS( inputs[2]->GetType(), Property::VECTOR4, TEST_LOCATION ); + DALI_TEST_EQUALS( inputs[3]->GetType(), Property::BOOLEAN, TEST_LOCATION ); } +} // namespace UtcDaliConstraintClone -int UtcDaliConstraintActorSizeHeight(void) +int UtcDaliConstraintCloneCheckSourcesAndSetters(void) { - TestApplication application; + // Ensure all sources, the tag and remove-action are cloned appropriately - // Build constraint, to make child 20% of parent height - - Constraint constraint = Constraint::New( Actor::SIZE_HEIGHT, - ParentSource( Actor::SIZE_HEIGHT ), - TestRelativeConstraintFloat(0.2f) ); - // Apply to a child actor - - Actor parent = Actor::New(); - Stage::GetCurrent().Add(parent); + TestApplication application; - Actor child = Actor::New(); - parent.Add(child); + Actor actor = Actor::New(); + Actor clone = Actor::New(); - child.ApplyConstraint( constraint ); - DALI_TEST_EQUALS( child.GetCurrentSize(), Vector3::ZERO, TEST_LOCATION ); + Stage stage = Stage::GetCurrent(); + stage.Add( actor ); + stage.Add( clone ); - // Animate the parent between two sizes + application.SendNotification(); + application.Render(); - Vector3 targetParentSize(80.0f, 90.0f, 100.0f); + // Create a constraint, DON'T Apply it though + Constraint constraint = Constraint::New< Vector3 >( actor, Actor::Property::POSITION, &UtcDaliConstraintClone::Function ); + constraint.AddSource( LocalSource( Actor::Property::SIZE ) ); + constraint.AddSource( LocalSource( Actor::Property::ORIENTATION ) ); + constraint.AddSource( LocalSource( Actor::Property::COLOR ) ); + constraint.AddSource( LocalSource( Actor::Property::VISIBLE ) ); + constraint.SetRemoveAction( Constraint::Discard ); + constraint.SetTag( 123 ); - float durationSeconds(10.0f); - Animation animation = Animation::New(durationSeconds); - animation.AnimateTo( Property(parent, Actor::SIZE), targetParentSize ); - animation.Play(); + // Clone the constraint & apply the clone + Constraint constraintClone = constraint.Clone( clone ); + constraintClone.Apply(); application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( constraint.GetRemoveAction(), constraintClone.GetRemoveAction(), TEST_LOCATION ); + DALI_TEST_EQUALS( constraint.GetTag(), constraintClone.GetTag(), TEST_LOCATION ); - application.Render(static_cast(durationSeconds*250.0f)/* 25% progress */); - DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize*0.25f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().width, 0.0f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().height, targetParentSize.height*0.25f * 0.2f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().depth, 0.0f, TEST_LOCATION ); - - application.Render(static_cast(durationSeconds*250.0f)/* 50% progress */); - DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize*0.5f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().width, 0.0f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().height, targetParentSize.height*0.5f * 0.2f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().depth, 0.0f, TEST_LOCATION ); - - application.Render(static_cast(durationSeconds*250.0f)/* 75% progress */); - DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize*0.75f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().width, 0.0f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().height, targetParentSize.height*0.75f * 0.2f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().depth, 0.0f, TEST_LOCATION ); - - application.Render(static_cast(durationSeconds*250.0f)/* 100% progress */); - DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().width, 0.0f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().height, targetParentSize.height * 0.2f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().depth, 0.0f, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().width, 0.0f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().height, targetParentSize.height * 0.2f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().depth, 0.0f, TEST_LOCATION ); - - application.Render(0); - DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().width, 0.0f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().height, targetParentSize.height * 0.2f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().depth, 0.0f, TEST_LOCATION ); END_TEST; } +/////////////////////////////////////////////////////////////////////////////// -int UtcDaliConstraintActorSizeDepth(void) +/////////////////////////////////////////////////////////////////////////////// +// Constraint::Constraint( const Constraint& ) +// Constraint::operator= +/////////////////////////////////////////////////////////////////////////////// +int UtcDaliConstraintCopyAndAssignment(void) { - TestApplication application; - - // Build constraint, to make child 20% of parent height - - Constraint constraint = Constraint::New( Actor::SIZE_DEPTH, - ParentSource( Actor::SIZE_DEPTH ), - TestRelativeConstraintFloat(0.2f) ); - // Apply to a child actor + // Ensure copy constructor & assignment operators work - Actor parent = Actor::New(); - Stage::GetCurrent().Add(parent); - - Actor child = Actor::New(); - parent.Add(child); - - child.ApplyConstraint( constraint ); - DALI_TEST_EQUALS( child.GetCurrentSize(), Vector3::ZERO, TEST_LOCATION ); - - // Animate the parent between two sizes + TestApplication application; - Vector3 targetParentSize(80.0f, 90.0f, 100.0f); + Actor actor = Actor::New(); + Stage::GetCurrent().Add( actor ); - float durationSeconds(10.0f); - Animation animation = Animation::New(durationSeconds); - animation.AnimateTo( Property(parent, Actor::SIZE), targetParentSize ); - animation.Play(); + Constraint constraint = Constraint::New< Vector3 >( actor, Actor::Property::POSITION, &BasicFunction< Vector3 > ); + Constraint copied( constraint ); + Constraint assigned; + DALI_TEST_CHECK( constraint == copied ); + DALI_TEST_CHECK( copied != assigned ); - application.SendNotification(); + assigned = constraint; + DALI_TEST_CHECK( constraint == assigned ); - application.Render(static_cast(durationSeconds*250.0f)/* 25% progress */); - DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize*0.25f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().width, 0.0f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().height, 0.0f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().depth, targetParentSize.depth*0.25f * 0.2f, TEST_LOCATION ); - - application.Render(static_cast(durationSeconds*250.0f)/* 50% progress */); - DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize*0.5f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().width, 0.0f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().height, 0.0f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().depth, targetParentSize.depth*0.5f * 0.2f, TEST_LOCATION ); - - application.Render(static_cast(durationSeconds*250.0f)/* 75% progress */); - DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize*0.75f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().width, 0.0f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().height, 0.0f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().depth, targetParentSize.depth*0.75f * 0.2f, TEST_LOCATION ); - - application.Render(static_cast(durationSeconds*250.0f)/* 100% progress */); - DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().width, 0.0f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().height, 0.0f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().depth, targetParentSize.depth * 0.2f, TEST_LOCATION ); - - // Check that nothing has changed after a couple of buffer swaps - application.Render(0); - DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().width, 0.0f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().height, 0.0f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().depth, targetParentSize.depth * 0.2f, TEST_LOCATION ); - - application.Render(0); - DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().width, 0.0f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().height, 0.0f, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentSize().depth, targetParentSize.depth * 0.2f, TEST_LOCATION ); END_TEST; } +/////////////////////////////////////////////////////////////////////////////// -int UtcDaliConstraintInputWorldPosition(void) +/////////////////////////////////////////////////////////////////////////////// +// Constraint::DownCast +/////////////////////////////////////////////////////////////////////////////// +int UtcDaliConstraintDownCast(void) { - TestApplication application; - - Actor parent = Actor::New(); - Vector3 parentPosition( 10.0f, 10.0f, 10.0f ); - parent.SetPosition( parentPosition ); - parent.SetParentOrigin( ParentOrigin::CENTER ); - parent.SetAnchorPoint( AnchorPoint::CENTER ); - Stage::GetCurrent().Add( parent ); - - Actor child = Actor::New(); - child.SetParentOrigin( ParentOrigin::CENTER ); - child.SetAnchorPoint( AnchorPoint::CENTER ); - Vector3 childPosition( 10.0f, 10.0f, 10.0f ); - child.SetPosition( childPosition ); - parent.Add( child ); - - Actor trackingActor = Actor::New(); - trackingActor.SetParentOrigin( ParentOrigin::CENTER ); - trackingActor.SetAnchorPoint( AnchorPoint::CENTER ); - Stage::GetCurrent().Add( trackingActor ); - - // The actors should not have a world position yet - DALI_TEST_EQUALS( parent.GetCurrentWorldPosition(), Vector3::ZERO, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentWorldPosition(), Vector3::ZERO, TEST_LOCATION ); - DALI_TEST_EQUALS( trackingActor.GetCurrentWorldPosition(), Vector3::ZERO, TEST_LOCATION ); - - application.SendNotification(); - application.Render(0); - - DALI_TEST_EQUALS( parent.GetCurrentPosition(), parentPosition, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentPosition(), childPosition, TEST_LOCATION ); - DALI_TEST_EQUALS( trackingActor.GetCurrentPosition(), Vector3::ZERO, TEST_LOCATION ); - - DALI_TEST_EQUALS( parent.GetCurrentWorldPosition(), parentPosition, TEST_LOCATION ); - Vector3 previousPosition( parentPosition + childPosition ); - DALI_TEST_EQUALS( child.GetCurrentWorldPosition(), previousPosition, TEST_LOCATION ); - DALI_TEST_EQUALS( trackingActor.GetCurrentWorldPosition(), Vector3::ZERO, TEST_LOCATION ); - - // Build constraint, to make actor track the world-position of another actor - // Note that the world-position is always from the previous frame, so the tracking actor will lag behind - - Constraint constraint = Constraint::New( Actor::POSITION, - Source( child, Actor::WORLD_POSITION ), - EqualToConstraint() ); + // Ensure DownCast works as expected - trackingActor.ApplyConstraint( constraint ); - - application.SendNotification(); - application.Render(0); - - DALI_TEST_EQUALS( trackingActor.GetCurrentPosition(), previousPosition, TEST_LOCATION ); - - // Move the actors and try again - Vector3 relativePosition( 5, 5, 5 ); - parent.MoveBy( relativePosition ); - - application.SendNotification(); - application.Render(0); - - DALI_TEST_EQUALS( parent.GetCurrentPosition(), parentPosition + relativePosition, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentPosition(), childPosition, TEST_LOCATION ); + TestApplication application; - // The tracking actor lags behind - DALI_TEST_EQUALS( trackingActor.GetCurrentPosition(), previousPosition, TEST_LOCATION ); + Actor actor = Actor::New(); + Constraint constraint = Constraint::New< Vector3 >( actor, Actor::Property::POSITION, &BasicFunction< Vector3 > ); - DALI_TEST_EQUALS( parent.GetCurrentWorldPosition(), parentPosition + relativePosition, TEST_LOCATION ); - previousPosition = Vector3( parentPosition + childPosition + relativePosition ); - DALI_TEST_EQUALS( child.GetCurrentWorldPosition(), previousPosition, TEST_LOCATION ); + // Another BaseHandle type + Constraint downCast = Constraint::DownCast( actor ); + DALI_TEST_CHECK( ! downCast ); - // Allow the tracking actor to catch up - application.SendNotification(); - application.Render(0); + // A constraint + downCast = Constraint::DownCast( constraint ); + DALI_TEST_CHECK( downCast ); - DALI_TEST_EQUALS( parent.GetCurrentPosition(), parentPosition + relativePosition, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentPosition(), childPosition, TEST_LOCATION ); + // An empty constraint + downCast = Constraint::DownCast( Constraint() ); + DALI_TEST_CHECK( ! downCast ); - // The tracking actor catches up! - DALI_TEST_EQUALS( trackingActor.GetCurrentPosition(), previousPosition, TEST_LOCATION ); - DALI_TEST_EQUALS( parent.GetCurrentWorldPosition(), parentPosition + relativePosition, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentWorldPosition(), previousPosition, TEST_LOCATION ); END_TEST; } +/////////////////////////////////////////////////////////////////////////////// -int UtcDaliConstraintInputWorldRotation(void) +/////////////////////////////////////////////////////////////////////////////// +// Constraint::GetTargetObject +/////////////////////////////////////////////////////////////////////////////// +int UtcDaliConstraintGetTargetObjectP(void) { TestApplication application; - Actor parent = Actor::New(); - Radian rotationAngle( Degree(90.0f) ); - Quaternion rotation( rotationAngle, Vector3::YAXIS ); - parent.SetRotation( rotation ); - Stage::GetCurrent().Add( parent ); - - Actor child = Actor::New(); - child.SetRotation( rotation ); - parent.Add( child ); - - Actor trackingActor = Actor::New(); - Stage::GetCurrent().Add( trackingActor ); - - // The actors should not have a world rotation yet - DALI_TEST_EQUALS( parent.GetCurrentWorldRotation(), Quaternion(0.0f, Vector3::YAXIS), 0.001, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentWorldRotation(), Quaternion(0.0f, Vector3::YAXIS), 0.001, TEST_LOCATION ); - - application.SendNotification(); - application.Render(0); - - DALI_TEST_EQUALS( parent.GetCurrentRotation(), rotation, 0.001, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentRotation(), rotation, 0.001, TEST_LOCATION ); - DALI_TEST_EQUALS( trackingActor.GetCurrentRotation(), Quaternion(0.0f, Vector3::YAXIS), 0.001, TEST_LOCATION ); - - DALI_TEST_EQUALS( parent.GetCurrentWorldRotation(), Quaternion( rotationAngle, Vector3::YAXIS ), 0.001, TEST_LOCATION ); - Quaternion previousRotation( rotationAngle * 2.0f, Vector3::YAXIS ); - DALI_TEST_EQUALS( child.GetCurrentWorldRotation(), previousRotation, 0.001, TEST_LOCATION ); - - // Build constraint, to make actor track the world-rotation of another actor - // Note that the world-rotation is always from the previous frame, so the tracking actor will lag behind - - Constraint constraint = Constraint::New( Actor::ROTATION, - Source( child, Actor::WORLD_ROTATION ), - EqualToQuaternion() ); - - trackingActor.ApplyConstraint( constraint ); - - application.SendNotification(); - application.Render(0); - - DALI_TEST_EQUALS( trackingActor.GetCurrentRotation(), previousRotation, 0.001, TEST_LOCATION ); - - // Rotate the actors and try again - parent.RotateBy( rotation ); - - application.SendNotification(); - application.Render(0); - - DALI_TEST_EQUALS( parent.GetCurrentRotation(), rotation * rotation, 0.001, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentRotation(), rotation, 0.001, TEST_LOCATION ); - - // The tracking actor lags behind - DALI_TEST_EQUALS( trackingActor.GetCurrentRotation(), previousRotation, 0.001, TEST_LOCATION ); - - DALI_TEST_EQUALS( parent.GetCurrentWorldRotation(), Quaternion( rotationAngle * 2.0f, Vector3::YAXIS ), 0.001, TEST_LOCATION ); - previousRotation = Quaternion( rotationAngle * 3.0f, Vector3::YAXIS ); - DALI_TEST_EQUALS( child.GetCurrentWorldRotation(), previousRotation, 0.001, TEST_LOCATION ); - - // Allow the tracking actor to catch up - application.SendNotification(); - application.Render(0); + Actor actor = Actor::New(); + Constraint constraint = Constraint::New< Vector3 >( actor, Actor::Property::POSITION, &BasicFunction< Vector3 > ); + DALI_TEST_CHECK( constraint.GetTargetObject() == actor ); - DALI_TEST_EQUALS( parent.GetCurrentRotation(), rotation * rotation, 0.001, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentRotation(), rotation, 0.001, TEST_LOCATION ); + Actor actor2 = Actor::New(); + DALI_TEST_CHECK( constraint.GetTargetObject() != actor2 ); - // The tracking actor catches up! - DALI_TEST_EQUALS( trackingActor.GetCurrentRotation(), previousRotation, 0.001, TEST_LOCATION ); - DALI_TEST_EQUALS( parent.GetCurrentWorldRotation(), Quaternion( rotationAngle * 2.0f, Vector3::YAXIS ), 0.001, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentWorldRotation(), previousRotation, 0.001, TEST_LOCATION ); END_TEST; } -int UtcDaliConstraintInputWorldScale(void) +int UtcDaliConstraintGetTargetObjectN(void) { - TestApplication application; - - Actor parent = Actor::New(); - Vector3 parentScale( 2.0f, 2.0f, 2.0f ); - parent.SetScale( parentScale ); - Stage::GetCurrent().Add( parent ); - - Actor child = Actor::New(); - Vector3 childScale( 1.0f, 2.0f, 3.0f ); - child.SetScale( childScale ); - parent.Add( child ); - - Actor trackingActor = Actor::New(); - Stage::GetCurrent().Add( trackingActor ); - - // The actors should not have a world scale yet - DALI_TEST_EQUALS( parent.GetCurrentWorldScale(), Vector3::ONE, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentWorldScale(), Vector3::ONE, TEST_LOCATION ); - DALI_TEST_EQUALS( trackingActor.GetCurrentWorldScale(), Vector3::ONE, TEST_LOCATION ); - - application.SendNotification(); - application.Render(0); + // Attempt to retrieve from uninitialised constraint - DALI_TEST_EQUALS( parent.GetCurrentScale(), parentScale, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentScale(), childScale, TEST_LOCATION ); - DALI_TEST_EQUALS( trackingActor.GetCurrentScale(), Vector3::ONE, TEST_LOCATION ); - - DALI_TEST_EQUALS( parent.GetCurrentWorldScale(), parentScale, TEST_LOCATION ); - Vector3 previousScale( parentScale * childScale ); - DALI_TEST_EQUALS( child.GetCurrentWorldScale(), previousScale, TEST_LOCATION ); - DALI_TEST_EQUALS( trackingActor.GetCurrentScale(), Vector3::ONE, TEST_LOCATION ); - - // Build constraint, to make actor track the world-scale of another actor - // Note that the world-scale is always from the previous frame, so the tracking actor will lag behind - - Constraint constraint = Constraint::New( Actor::SCALE, - Source( child, Actor::WORLD_SCALE ), - EqualToConstraint() ); - - trackingActor.ApplyConstraint( constraint ); - - application.SendNotification(); - application.Render(0); + TestApplication application; - DALI_TEST_EQUALS( trackingActor.GetCurrentScale(), previousScale, TEST_LOCATION ); + Constraint constraint; + try + { + Handle handle = constraint.GetTargetObject(); + DALI_TEST_CHECK( false ); // Should not reach here! + } + catch( ... ) + { + DALI_TEST_CHECK( true ); + } - // Scale the actors and try again - Vector3 relativeScale( 3, 3, 3 ); - parent.ScaleBy( relativeScale ); + END_TEST; +} +/////////////////////////////////////////////////////////////////////////////// - application.SendNotification(); - application.Render(0); +/////////////////////////////////////////////////////////////////////////////// +// Constraint::GetTargetProperty +/////////////////////////////////////////////////////////////////////////////// +int UtcDaliConstraintGetTargetPropertyP(void) +{ + TestApplication application; - DALI_TEST_EQUALS( parent.GetCurrentScale(), parentScale * relativeScale, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentScale(), childScale, TEST_LOCATION ); + Actor actor = Actor::New(); + Constraint constraint = Constraint::New< Vector3 >( actor, Actor::Property::POSITION, &BasicFunction< Vector3 > ); + DALI_TEST_EQUALS( constraint.GetTargetProperty(), (Property::Index)Actor::Property::POSITION, TEST_LOCATION ); - // The tracking actor lags behind - DALI_TEST_EQUALS( trackingActor.GetCurrentScale(), previousScale, TEST_LOCATION ); + END_TEST; +} - DALI_TEST_EQUALS( parent.GetCurrentWorldScale(), parentScale * relativeScale, TEST_LOCATION ); - previousScale = Vector3( parentScale * childScale * relativeScale ); - DALI_TEST_EQUALS( child.GetCurrentWorldScale(), previousScale, TEST_LOCATION ); +int UtcDaliConstraintGetTargetPropertyN(void) +{ + // Attempt to retrieve from uninitialised constraint - // Allow the tracking actor to catch up - application.SendNotification(); - application.Render(0); + TestApplication application; - DALI_TEST_EQUALS( parent.GetCurrentScale(), parentScale * relativeScale, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentScale(), childScale, TEST_LOCATION ); + Constraint constraint; + try + { + Property::Index propertyIndex = constraint.GetTargetProperty(); + ( void )propertyIndex; + DALI_TEST_CHECK( false ); // Should not reach here! + } + catch( ... ) + { + DALI_TEST_CHECK( true ); + } - // The tracking actor catches up! - DALI_TEST_EQUALS( trackingActor.GetCurrentScale(), previousScale, TEST_LOCATION ); - DALI_TEST_EQUALS( parent.GetCurrentWorldScale(), parentScale * relativeScale, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentWorldScale(), previousScale, TEST_LOCATION ); END_TEST; } +/////////////////////////////////////////////////////////////////////////////// -int UtcDaliConstraintInputWorldColor(void) +/////////////////////////////////////////////////////////////////////////////// +// Constraint::SetTag +// Constraint::GetTag +/////////////////////////////////////////////////////////////////////////////// +int UtcDaliConstraintTagP(void) { TestApplication application; - Actor parent = Actor::New(); - Vector4 parentColor( 1.0f, 0.5f, 0.0f, 1.0f ); - parent.SetColor( parentColor ); - Stage::GetCurrent().Add( parent ); + Actor actor = Actor::New(); + Constraint constraint = Constraint::New< Vector3 >( actor, Actor::Property::POSITION, &BasicFunction< Vector3 > ); + DALI_TEST_EQUALS( constraint.GetTag(), 0u, TEST_LOCATION ); + + const unsigned int tag = 123; + constraint.SetTag( tag ); + DALI_TEST_EQUALS( constraint.GetTag(), tag, TEST_LOCATION ); - Actor child = Actor::New(); - Vector4 childColor( 0.5f, 0.5f, 0.5f, 1.0f ); - child.SetColor( childColor ); - parent.Add( child ); + END_TEST; +} - Actor trackingActor = Actor::New(); - Stage::GetCurrent().Add( trackingActor ); +int UtcDaliConstraintSetTagN(void) +{ + // Attempt to set from uninitialised constraint - // The actors should not have a world color yet - DALI_TEST_EQUALS( parent.GetCurrentWorldColor(), Color::WHITE, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentWorldColor(), Color::WHITE, TEST_LOCATION ); + TestApplication application; - application.SendNotification(); - application.Render(0); + Constraint constraint; + try + { + constraint.SetTag( 123 ); + DALI_TEST_CHECK( false ); // Should not reach here! + } + catch( ... ) + { + DALI_TEST_CHECK( true ); + } - DALI_TEST_EQUALS( parent.GetCurrentColor(), parentColor, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentColor(), childColor, TEST_LOCATION ); - DALI_TEST_EQUALS( trackingActor.GetCurrentColor(), Color::WHITE, TEST_LOCATION ); + END_TEST; +} - DALI_TEST_EQUALS( parent.GetCurrentWorldColor(), parentColor, TEST_LOCATION ); - Vector4 previousColor( childColor ); - previousColor.a *= parentColor.a; - DALI_TEST_EQUALS( child.GetCurrentWorldColor(), previousColor, TEST_LOCATION ); +int UtcDaliConstraintGetTagN(void) +{ + // Attempt to retrieve from uninitialised constraint - // Build constraint, to make actor track the world-color of another actor - // Note that the world-color is always from the previous frame, so the tracking actor will lag behind + TestApplication application; - Constraint constraint = Constraint::New( Actor::COLOR, - Source( child, Actor::WORLD_COLOR ), - EqualToVector4() ); + Constraint constraint; + try + { + int tag = constraint.GetTag(); + ( void )tag; + DALI_TEST_CHECK( false ); // Should not reach here! + } + catch( ... ) + { + DALI_TEST_CHECK( true ); + } - trackingActor.ApplyConstraint( constraint ); + END_TEST; +} - application.SendNotification(); - application.Render(0); +/////////////////////////////////////////////////////////////////////////////// - DALI_TEST_EQUALS( trackingActor.GetCurrentColor(), previousColor, TEST_LOCATION ); +/////////////////////////////////////////////////////////////////////////////// +// Constraint::SetRemoveAction +// Constraint::GetRemoveAction +/////////////////////////////////////////////////////////////////////////////// +int UtcDaliConstraintRemoveActionP(void) +{ + TestApplication application; - // Set the color and try again - Vector4 newChildColor( 0.75f, 0.75f, 0.75f, 1.0f ); - child.SetColor( newChildColor ); + Actor actor = Actor::New(); + Constraint constraint = Constraint::New< Vector3 >( actor, Actor::Property::POSITION, &BasicFunction< Vector3 > ); + DALI_TEST_EQUALS( constraint.GetRemoveAction(), Constraint::DEFAULT_REMOVE_ACTION, TEST_LOCATION ); - application.SendNotification(); - application.Render(0); + constraint.SetRemoveAction( Constraint::Discard ); + DALI_TEST_EQUALS( constraint.GetRemoveAction(), Constraint::Discard, TEST_LOCATION ); - DALI_TEST_EQUALS( parent.GetCurrentColor(), parentColor, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentColor(), newChildColor, TEST_LOCATION ); + constraint.SetRemoveAction( Constraint::Bake ); + DALI_TEST_EQUALS( constraint.GetRemoveAction(), Constraint::Bake, TEST_LOCATION ); - // The tracking actor lags behind - DALI_TEST_EQUALS( trackingActor.GetCurrentColor(), previousColor, TEST_LOCATION ); + END_TEST; +} - DALI_TEST_EQUALS( parent.GetCurrentWorldColor(), parentColor, TEST_LOCATION ); - previousColor = Vector3( newChildColor ); - DALI_TEST_EQUALS( child.GetCurrentWorldColor(), previousColor, TEST_LOCATION ); +int UtcDaliConstraintSetRemoveActionN(void) +{ + // Attempt to set from uninitialised constraint - // Allow the tracking actor to catch up - application.SendNotification(); - application.Render(0); + TestApplication application; - DALI_TEST_EQUALS( parent.GetCurrentColor(), parentColor, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentColor(), newChildColor, TEST_LOCATION ); + Constraint constraint; + try + { + constraint.SetRemoveAction( Constraint::Discard ); + DALI_TEST_CHECK( false ); // Should not reach here! + } + catch( ... ) + { + DALI_TEST_CHECK( true ); + } - // The tracking actor catches up! - DALI_TEST_EQUALS( trackingActor.GetCurrentColor(), previousColor, TEST_LOCATION ); - DALI_TEST_EQUALS( parent.GetCurrentWorldColor(), parentColor, TEST_LOCATION ); - DALI_TEST_EQUALS( child.GetCurrentWorldColor(), previousColor, TEST_LOCATION ); END_TEST; } -int UtcDaliConstraintInvalidInputProperty(void) +int UtcDaliConstraintGetRemoveActionN(void) { - TestApplication application; - Actor actor = Actor::New(); - Constraint constraint = Constraint::New( Actor::POSITION, LocalSource( PROPERTY_REGISTRATION_START_INDEX ), MultiplyConstraint() ); + // Attempt to retrieve from uninitialised constraint - Stage::GetCurrent().Add( actor ); + TestApplication application; - // Cannot use type registered properties as input to constraints + Constraint constraint; try { - actor.ApplyConstraint( constraint ); - tet_result( TET_FAIL ); + Constraint::RemoveAction removeAction = constraint.GetRemoveAction(); + ( void )removeAction; + DALI_TEST_CHECK( false ); // Should not reach here! } - catch ( DaliException& e ) + catch( ... ) { - DALI_TEST_ASSERT( e, "mTargetProxy->IsPropertyAConstraintInput( source.propertyIndex )", TEST_LOCATION ); + DALI_TEST_CHECK( true ); } + END_TEST; } -int UtcDaliBuiltinConstraintParentSize(void) +int UtcDaliConstraintBakeRemoveAction(void) { - TestApplication application; + // Ensure value is baked when constraint is removed - Actor parent = Actor::New(); - Vector3 parentSize(9,9,9); - parent.SetSize( parentSize ); - Stage::GetCurrent().Add( parent ); + TestApplication application; Actor actor = Actor::New(); - parent.Add( actor ); - - Vector3 startValue( Vector3::ZERO ); + Stage::GetCurrent().Add( actor ); application.SendNotification(); - application.Render(0); - DALI_TEST_CHECK( actor.GetCurrentSize() == startValue ); + application.Render(); - // Apply constraint + // Should not equal position by default + Vector3 position( 10.0f, 20.0f, 30.0f ); + DALI_TEST_CHECK( actor.GetCurrentPosition() != position ); - Constraint constraint = Constraint::New( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ); - actor.ApplyConstraint( constraint ); + // Create a constraint that constrains to position + Constraint constraint = Constraint::New< Vector3 >( actor, Actor::Property::POSITION, SetValueFunctor< Vector3 >( position ) ); + constraint.SetRemoveAction( Constraint::Bake ); + constraint.Apply(); application.SendNotification(); - application.Render(0); + application.Render(); - // Constraint should be fully applied - DALI_TEST_EQUALS( actor.GetCurrentSize(), parentSize, TEST_LOCATION ); + DALI_TEST_EQUALS( actor.GetCurrentPosition(), position, TEST_LOCATION ); - // This should be ignored - actor.SetSize( startValue ); + // Remove the constraint, it should still be at position + constraint.Remove(); - // Check that nothing has changed after a couple of buffer swaps application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetCurrentSize(), parentSize, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetCurrentSize(), parentSize, TEST_LOCATION ); + application.Render(); - // Remove the constraint, then set new value - actor.RemoveConstraints(); - actor.SetSize( startValue ); + DALI_TEST_EQUALS( actor.GetCurrentPosition(), position, TEST_LOCATION ); - // Constraint should have been removed - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetCurrentSize(), startValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetCurrentSize(), startValue, TEST_LOCATION ); END_TEST; } -int UtcDaliBuiltinConstraintParentSizeRelative(void) +int UtcDaliConstraintDiscardRemoveAction(void) { - TestApplication application; + // Ensure value is baked when constraint is removed - Actor parent = Actor::New(); - Vector3 parentSize(9,9,9); - parent.SetSize( parentSize ); - Stage::GetCurrent().Add( parent ); + TestApplication application; Actor actor = Actor::New(); - parent.Add( actor ); - - Vector3 startValue( Vector3::ZERO ); - Vector3 scale(2,3,4); - Vector3 endValue( parentSize * scale ); + Stage::GetCurrent().Add( actor ); application.SendNotification(); - application.Render(0); - DALI_TEST_CHECK( actor.GetCurrentSize() == startValue ); + application.Render(); + + // Get and store current position + Vector3 originalPosition = actor.GetCurrentPosition(); - // Apply constraint + // Should not equal position by default + Vector3 position( 10.0f, 20.0f, 30.0f ); + DALI_TEST_CHECK( actor.GetCurrentPosition() != position ); - Constraint constraint = Constraint::New( Actor::SIZE, ParentSource( Actor::SIZE ), RelativeToConstraint( scale ) ); - actor.ApplyConstraint( constraint ); + // Create a constraint that constrains to position + Constraint constraint = Constraint::New< Vector3 >( actor, Actor::Property::POSITION, SetValueFunctor< Vector3 >( position ) ); + constraint.SetRemoveAction( Constraint::Discard ); + constraint.Apply(); application.SendNotification(); - application.Render(0); + application.Render(); - // Constraint should be fully applied - DALI_TEST_EQUALS( actor.GetCurrentSize(), endValue, TEST_LOCATION ); + DALI_TEST_EQUALS( actor.GetCurrentPosition(), position, TEST_LOCATION ); - // This should be ignored - actor.SetSize( startValue ); + // Remove the constraint, it should still be at position + constraint.Remove(); - // Check that nothing has changed after a couple of buffer swaps application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetCurrentSize(), endValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetCurrentSize(), endValue, TEST_LOCATION ); + application.Render(); - // Remove the constraint, then set new value - actor.RemoveConstraints(); - actor.SetSize( startValue ); + DALI_TEST_EQUALS( actor.GetCurrentPosition(), originalPosition, TEST_LOCATION ); + DALI_TEST_CHECK( actor.GetCurrentPosition() != position ); - // Constraint should have been removed - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetCurrentSize(), startValue, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetCurrentSize(), startValue, TEST_LOCATION ); END_TEST; } -int UtcDaliBuiltinConstraintScaleToFitConstraint(void) +/////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////// +// Constraint::Apply +// Constraint::Remove +/////////////////////////////////////////////////////////////////////////////// +int UtcDaliConstraintApplyRemove(void) { - TestApplication application; + // Ensure constraint functors are called appropriately - Actor parent = Actor::New(); - Vector3 startParentSize( 10, 10, 10 ); - parent.SetSize( startParentSize ); - Stage::GetCurrent().Add( parent ); + TestApplication application; + bool functorCalled = false; Actor actor = Actor::New(); - Vector3 startChildSize( 5, 5, 5 ); - actor.SetSize( startChildSize ); - parent.Add( actor ); - - Vector3 endChildSize( 8, 8, 8 ); - Vector3 endParentSize( 4, 4, 4 ); - Vector3 startChildScale( 2, 2, 2 ); // startParentSize / startChildSize - Vector3 intermediateChildScale( 1.25, 1.25, 1.25 ); // startParentSize / endChildSize - Vector3 endChildScale( 0.5, 0.5, 0.5 ); // endParentSize / endChildSize + Stage::GetCurrent().Add( actor ); application.SendNotification(); - application.Render(0); - DALI_TEST_CHECK( actor.GetCurrentSize() == startChildSize ); + application.Render(); - // Apply constraint + DALI_TEST_EQUALS( functorCalled, false, TEST_LOCATION ); - Constraint constraint = Constraint::New( Actor::SCALE, - LocalSource( Actor::SIZE ), - ParentSource( Actor::SIZE ), - ScaleToFitConstraint() ); - actor.ApplyConstraint( constraint ); + // Create a constraint and apply, functor should be called + Constraint constraint = Constraint::New< Vector3 >( actor, Actor::Property::POSITION, BasicCalledFunctor< Vector3 >( functorCalled ) ); + constraint.Apply(); application.SendNotification(); - application.Render(0); + application.Render(); + + DALI_TEST_EQUALS( functorCalled, true, TEST_LOCATION ); - // Constraint should be fully applied, but parent size is larger than child - DALI_TEST_EQUALS( actor.GetCurrentSize(), startChildSize, TEST_LOCATION ); - DALI_TEST_EQUALS( actor.GetCurrentScale(), startChildScale, TEST_LOCATION ); + // Reset + functorCalled = false; - // This should be allowed (still less than parent size) - actor.SetSize( endChildSize ); + // Remove the constraint, functor should not be called + constraint.Remove(); application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor.GetCurrentSize(), endChildSize, TEST_LOCATION ); - DALI_TEST_EQUALS( actor.GetCurrentScale(), intermediateChildScale, TEST_LOCATION ); + application.Render(); + + DALI_TEST_EQUALS( functorCalled, false, TEST_LOCATION ); - // Reduce the parent size - parent.SetSize( endParentSize ); + // Re-apply the constraint, functor should be called again + constraint.Apply(); application.SendNotification(); - application.Render(0); - - // Constraint should be fully applied - DALI_TEST_EQUALS( actor.GetCurrentSize(), endChildSize, TEST_LOCATION ); - DALI_TEST_EQUALS( actor.GetCurrentScale(), endChildScale, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor.GetCurrentSize(), endChildSize, TEST_LOCATION ); - DALI_TEST_EQUALS( actor.GetCurrentScale(), endChildScale, TEST_LOCATION ); + application.Render(); + + DALI_TEST_EQUALS( functorCalled, true, TEST_LOCATION ); + END_TEST; } -int UtcDaliBuiltinConstraintScaleToFitKeepAspectRatio(void) +int UtcDaliConstraintApplyBeforeAddedToStage(void) { - TestApplication application; + // Constraint gets applied to an off-stage actor. + // Constraint should be automatically applied when the actor is added to the stage and not before - Actor parent = Actor::New(); - Vector3 parentSize1( 10, 10, 10 ); - parent.SetSize( parentSize1 ); - Stage::GetCurrent().Add( parent ); + TestApplication application; + bool functorCalled = false; + // Create an actor and a constraint and apply, DON'T add to stage just yet Actor actor = Actor::New(); - Vector3 childSize( 4, 5, 5 ); - actor.SetSize( childSize ); - parent.Add( actor ); + Constraint constraint = Constraint::New< Vector3 >( actor, Actor::Property::POSITION, BasicCalledFunctor< Vector3 >( functorCalled ) ); + constraint.Apply(); application.SendNotification(); - application.Render(0); - Vector3 childScale1( 1.0f, 1.0f, 1.0f ); - DALI_TEST_EQUALS( actor.GetCurrentScale(), childScale1, TEST_LOCATION ); + application.Render(); - // Apply constraint + // Should NOT be called + DALI_TEST_EQUALS( functorCalled, false, TEST_LOCATION ); - Constraint constraint = Constraint::New( Actor::SCALE, - LocalSource( Actor::SIZE ), - ParentSource( Actor::SIZE ), - ScaleToFitKeepAspectRatioConstraint() ); - actor.ApplyConstraint( constraint ); + // Add actor to stage + Stage::GetCurrent().Add( actor ); application.SendNotification(); - application.Render(0); - - // Constraint should be fully applied, but parent size is larger than child - Vector3 childScale2( 2.0f, 2.0f, 2.0f ); - DALI_TEST_EQUALS( actor.GetCurrentScale(), childScale2, TEST_LOCATION ); - - // change parent size - Vector3 parentSize2( 40, 50, 50 ); - parent.SetSize( parentSize2 ); + application.Render(); - application.SendNotification(); - application.Render(0); + // Should now be called + DALI_TEST_EQUALS( functorCalled, true, TEST_LOCATION ); - // Constraint should be fully applied, but parent size is larger than child - Vector3 childScale3( 10.0f, 10.0f, 10.0f ); - DALI_TEST_EQUALS( actor.GetCurrentScale(), childScale3, TEST_LOCATION ); END_TEST; } -int UtcDaliBuiltinConstraintScaleToFillKeepAspectRatio(void) +int UtcDaliConstraintApplyAndRemoveBeforeAddedToStage(void) { - TestApplication application; + // Constraint gets applied to an off-stage actor, then gets removed before it's added to the stage + // Constraint should NOT be called at all - Actor parent = Actor::New(); - Vector3 parentSize1( 10, 10, 10 ); - parent.SetSize( parentSize1 ); - Stage::GetCurrent().Add( parent ); + TestApplication application; + bool functorCalled = false; + // Create an actor and a constraint and apply, DON'T add to stage just yet Actor actor = Actor::New(); - Vector3 childSize( 4, 5, 5 ); - actor.SetSize( childSize ); - parent.Add( actor ); + Constraint constraint = Constraint::New< Vector3 >( actor, Actor::Property::POSITION, BasicCalledFunctor< Vector3 >( functorCalled ) ); + constraint.Apply(); application.SendNotification(); - application.Render(0); - Vector3 childScale1( 1.0f, 1.0f, 1.0f ); - DALI_TEST_EQUALS( actor.GetCurrentScale(), childScale1, TEST_LOCATION ); - - // Apply constraint - - Constraint constraint = Constraint::New( Actor::SCALE, - LocalSource( Actor::SIZE ), - ParentSource( Actor::SIZE ), - ScaleToFillKeepAspectRatioConstraint() ); - actor.ApplyConstraint( constraint ); + application.Render(); - application.SendNotification(); - application.Render(0); + // Should NOT be called + DALI_TEST_EQUALS( functorCalled, false, TEST_LOCATION ); - // Constraint should be fully applied, but parent size is larger than child - float val = 10.f / 4.f; - Vector3 childScale2( val, val, val ); - DALI_TEST_EQUALS( actor.GetCurrentScale(), childScale2, TEST_LOCATION ); + // Remove the constraint + constraint.Remove(); - // change parent size - Vector3 parentSize2( 40, 50, 50 ); - parent.SetSize( parentSize2 ); + // Add actor to stage + Stage::GetCurrent().Add( actor ); application.SendNotification(); - application.Render(0); + application.Render(); + + // Still should NOT be called + DALI_TEST_EQUALS( functorCalled, false, TEST_LOCATION ); - // Constraint should be fully applied, but parent size is larger than child - Vector3 childScale3( 10.0f, 10.0f, 10.0f ); - DALI_TEST_EQUALS( actor.GetCurrentScale(), childScale3, TEST_LOCATION ); END_TEST; } -int UtcDaliBuiltinConstraintScaleToFillXYKeepAspectRatio(void) +int UtcDaliConstraintApplyActorStagedUnstaged(void) { - TestApplication application; + // Apply a constraint to an actor which is staged and unstaged. + // Functor should only be called while the actor is staged. - Actor parent = Actor::New(); - Vector3 parentSize1( 10, 10, 10 ); - parent.SetSize( parentSize1 ); - Stage::GetCurrent().Add( parent ); + TestApplication application; + bool functorCalled = false; + // Create an actor and add to stage Actor actor = Actor::New(); - Vector3 childSize( 4, 5, 5 ); - actor.SetSize( childSize ); - parent.Add( actor ); + Stage stage = Stage::GetCurrent(); + stage.Add( actor ); + + // Create a constraint and apply + Constraint constraint = Constraint::New< Vector3 >( actor, Actor::Property::POSITION, BasicCalledFunctor< Vector3 >( functorCalled ) ); + constraint.Apply(); application.SendNotification(); - application.Render(0); - Vector3 childScale1( 1.0f, 1.0f, 1.0f ); - DALI_TEST_EQUALS( actor.GetCurrentScale(), childScale1, TEST_LOCATION ); + application.Render(); + + // Constraint should be called + DALI_TEST_EQUALS( functorCalled, true, TEST_LOCATION ); - // Apply constraint + // Reset + functorCalled = false; - Constraint constraint = Constraint::New( Actor::SCALE, - LocalSource( Actor::SIZE ), - ParentSource( Actor::SIZE ), - ScaleToFillXYKeepAspectRatioConstraint() ); - actor.ApplyConstraint( constraint ); + // Remove actor from stage + stage.Remove( actor ); application.SendNotification(); - application.Render(0); + application.Render(); - // Constraint should be fully applied, but parent size is larger than child - float val = 10.f / 4.f; - Vector3 childScale2( val, val, val ); - DALI_TEST_EQUALS( actor.GetCurrentScale(), childScale2, TEST_LOCATION ); + // Constraint should NOT be called + DALI_TEST_EQUALS( functorCalled, false, TEST_LOCATION ); - // change parent size - Vector3 parentSize2( 40, 50, 50 ); - parent.SetSize( parentSize2 ); + // Re-add to stage + stage.Add( actor ); application.SendNotification(); - application.Render(0); + application.Render(); + + // Constraint should be called + DALI_TEST_EQUALS( functorCalled, true, TEST_LOCATION ); - // Constraint should be fully applied, but parent size is larger than child - Vector3 childScale3( 10.0f, 10.0f, 10.0f ); - DALI_TEST_EQUALS( actor.GetCurrentScale(), childScale3, TEST_LOCATION ); END_TEST; } -int UtcDaliBuiltinConstraintShrinkInsideKeepAspectRatioConstraint(void) +int UtcDaliConstraintApplySeveralTimes(void) { - TestApplication application; + // Apply the same constraint several times. + // Should not cause any problems (subsequent attempts should be no-ops) - Actor parent = Actor::New(); - Vector3 parentSize1( 10, 10, 10 ); - parent.SetSize( parentSize1 ); - Stage::GetCurrent().Add( parent ); + TestApplication application; + int count = 0; + // Create an actor and add to stage Actor actor = Actor::New(); - Vector3 childSize( 4, 5, 5 ); - actor.SetSize( childSize ); - parent.Add( actor ); + Stage stage = Stage::GetCurrent(); + stage.Add( actor ); + + // Create a constraint and apply + Constraint constraint = Constraint::New< Vector3 >( actor, Actor::Property::POSITION, CalledCountFunctor< Vector3 >( count ) ); + constraint.Apply(); + + // Apply again + constraint.Apply(); // no-op application.SendNotification(); - application.Render(0); - Vector3 childScale1( 1.0f, 1.0f, 1.0f ); - DALI_TEST_EQUALS( actor.GetCurrentScale(), childScale1, TEST_LOCATION ); + application.Render(); - // Apply constraint + // Should only have been called once + DALI_TEST_EQUALS( count, 1, TEST_LOCATION ); - Constraint constraint = Constraint::New( Actor::SCALE, - LocalSource( Actor::SIZE ), - ParentSource( Actor::SIZE ), - ShrinkInsideKeepAspectRatioConstraint() ); - actor.ApplyConstraint( constraint ); + // Reset + count = 0; + + // Apply again + constraint.Apply(); // no-op application.SendNotification(); - application.Render(0); + application.Render(); - // Constraint should be fully applied, but parent size is larger than child - Vector3 childScale2( 1.0f, 1.0f, 1.0f ); - DALI_TEST_EQUALS( actor.GetCurrentScale(), childScale2, TEST_LOCATION ); + DALI_TEST_EQUALS( count, 1, TEST_LOCATION ); - // change parent size - Vector3 parentSize2( 40, 50, 50 ); - parent.SetSize( parentSize2 ); + // Reset + count = 0; + + // Change the position property, apply again + actor.SetPosition( 10.0f, 10.0f ); + constraint.Apply(); application.SendNotification(); - application.Render(0); + application.Render(); + + // Constraint should have been called once + DALI_TEST_EQUALS( count, 1, TEST_LOCATION ); - // Constraint should be fully applied, but parent size is larger than child - Vector3 childScale3( 1.0f, 1.0f, 1.0f ); - DALI_TEST_EQUALS( actor.GetCurrentScale(), childScale3, TEST_LOCATION ); END_TEST; } -int UtcDaliBuiltinConstraintMultiplyConstraint(void) -{ - TestApplication application; - - Actor actor1 = Actor::New(); - Vector3 startPosition( 10, 10, 10 ); - actor1.SetPosition( startPosition ); - Stage::GetCurrent().Add( actor1 ); +/////////////////////////////////////////////////////////////////////////////// - Actor actor2 = Actor::New(); - Vector3 startSize( 100, 100, 100 ); - actor2.SetSize( startSize ); - Stage::GetCurrent().Add( actor2 ); - - application.SendNotification(); - application.Render(0); - DALI_TEST_CHECK( actor1.GetCurrentPosition() == startPosition ); - DALI_TEST_CHECK( actor2.GetCurrentSize() == startSize ); - - // Apply constraint - multiply actor1 size by actor2 position +/////////////////////////////////////////////////////////////////////////////// +// Constraint::AddSource +/////////////////////////////////////////////////////////////////////////////// +namespace UtcDaliConstraintAddSource +{ +void Function( Vector3& /* current */, const PropertyInputContainer& inputs ) +{ + DALI_TEST_EQUALS( inputs.Size(), 4u, TEST_LOCATION ); + DALI_TEST_EQUALS( inputs[0]->GetType(), Property::VECTOR3, TEST_LOCATION ); + DALI_TEST_EQUALS( inputs[1]->GetType(), Property::ROTATION, TEST_LOCATION ); + DALI_TEST_EQUALS( inputs[2]->GetType(), Property::VECTOR4, TEST_LOCATION ); + DALI_TEST_EQUALS( inputs[3]->GetType(), Property::BOOLEAN, TEST_LOCATION ); +} +} // namespace UtcDaliConstraintAddSource - Constraint constraint = Constraint::New( Actor::SIZE, - Source( actor1, Actor::POSITION ), - MultiplyConstraint() ); - constraint.SetRemoveAction( Constraint::Discard ); - actor2.ApplyConstraint( constraint ); +int UtcDaliConstraintAddSourceP(void) +{ + // Ensure all sources are in the correct order in the functor - application.SendNotification(); - application.Render(0); + TestApplication application; - // Constraint should be fully applied - Vector3 size( startSize * startPosition ); - DALI_TEST_EQUALS( actor2.GetCurrentSize(), size, TEST_LOCATION ); + Actor actor = Actor::New(); + Stage::GetCurrent().Add( actor ); - // Change the multiply input - Vector3 endPosition( 2, 2, 2 ); - actor1.SetPosition( endPosition ); + // Create a constraint, add sources + Constraint constraint = Constraint::New< Vector3 >( actor, Actor::Property::POSITION, &UtcDaliConstraintAddSource::Function ); + constraint.AddSource( LocalSource( Actor::Property::SIZE ) ); + constraint.AddSource( LocalSource( Actor::Property::ORIENTATION ) ); + constraint.AddSource( LocalSource( Actor::Property::COLOR ) ); + constraint.AddSource( LocalSource( Actor::Property::VISIBLE ) ); + constraint.Apply(); application.SendNotification(); - application.Render(0); + application.Render(); - // Constraint should be fully applied - size = Vector3( startSize * endPosition ); - DALI_TEST_EQUALS( actor2.GetCurrentSize(), size, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor2.GetCurrentSize(), size, TEST_LOCATION ); END_TEST; } -int UtcDaliBuiltinConstraintDivideConstraint(void) +int UtcDaliConstraintAddSourceN(void) { + // Attempt to set from uninitialised constraint + TestApplication application; - Actor actor1 = Actor::New(); - Vector3 startPosition( 10, 10, 10 ); - actor1.SetPosition( startPosition ); - Stage::GetCurrent().Add( actor1 ); + Constraint constraint; + try + { + constraint.AddSource( LocalSource( Actor::Property::POSITION ) ); + DALI_TEST_CHECK( false ); // Should not reach here! + } + catch( ... ) + { + DALI_TEST_CHECK( true ); + } - Actor actor2 = Actor::New(); - Vector3 startSize( 100, 100, 100 ); - actor2.SetSize( startSize ); - Stage::GetCurrent().Add( actor2 ); + END_TEST; +} +/////////////////////////////////////////////////////////////////////////////// - application.SendNotification(); - application.Render(0); - DALI_TEST_CHECK( actor1.GetCurrentPosition() == startPosition ); - DALI_TEST_CHECK( actor2.GetCurrentSize() == startSize ); +/////////////////////////////////////////////////////////////////////////////// +namespace TestChaining +{ - // Apply constraint - divide actor1 size by actor2 position +const Vector3 gFunction1Output( Vector3::ONE ); +void Function1( Vector3& current, const PropertyInputContainer& /* inputs */ ) +{ + // current is original position + DALI_TEST_EQUALS( current, Vector3::ZERO, TEST_LOCATION ); + current = gFunction1Output; +} - Constraint constraint = Constraint::New( Actor::SIZE, - Source( actor1, Actor::POSITION ), - DivideConstraint() ); - constraint.SetRemoveAction( Constraint::Discard ); - actor2.ApplyConstraint( constraint ); +const Vector3 gFunction2Output( 10.0f, 20.0f, 30.0f ); +void Function2( Vector3& current, const PropertyInputContainer& /* inputs */ ) +{ + // current is output from Function1 + DALI_TEST_EQUALS( current, gFunction1Output, TEST_LOCATION ); - application.SendNotification(); - application.Render(0); + current = gFunction2Output; +} - // Constraint should be fully applied - Vector3 size( 10, 10, 10 ); // startSize / startPosition - DALI_TEST_EQUALS( actor2.GetCurrentSize(), size, TEST_LOCATION ); +const Vector3 gFunction3Output( 10.0f, 20.0f, 30.0f ); +void Function3( Vector3& current, const PropertyInputContainer& /* inputs */ ) +{ + // current is output from Function2 + DALI_TEST_EQUALS( current, gFunction2Output, TEST_LOCATION ); - // Change the divide input - Vector3 endPosition( 2, 2, 2 ); - actor1.SetPosition( endPosition ); + current = gFunction3Output; +} - application.SendNotification(); - application.Render(0); +const Vector3 gFunction4Output( 10.0f, 20.0f, 30.0f ); +void Function4( Vector3& current, const PropertyInputContainer& /* inputs */ ) +{ + // current is output from Function3 + DALI_TEST_EQUALS( current, gFunction3Output, TEST_LOCATION ); - // Constraint should be fully applied - size = Vector3( 50, 50, 50 ); // startSize / endPosition - DALI_TEST_EQUALS( actor2.GetCurrentSize(), size, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor2.GetCurrentSize(), size, TEST_LOCATION ); - END_TEST; + current = gFunction4Output; } -int UtcDaliBuiltinConstraintEqualToConstraint(void) +void Function5( Vector3& current, const PropertyInputContainer& /* inputs */ ) { - TestApplication application; - - Actor actor1 = Actor::New(); - Vector3 startPosition( 10, 10, 10 ); - actor1.SetPosition( startPosition ); - Stage::GetCurrent().Add( actor1 ); + // current is output from Function4 + DALI_TEST_EQUALS( current, gFunction4Output, TEST_LOCATION ); - Actor actor2 = Actor::New(); - Vector3 startSize( 100, 100, 100 ); - actor2.SetSize( startSize ); - Stage::GetCurrent().Add( actor2 ); + current = Vector3::ZERO; +} - application.SendNotification(); - application.Render(0); - DALI_TEST_CHECK( actor1.GetCurrentPosition() == startPosition ); - DALI_TEST_CHECK( actor2.GetCurrentSize() == startSize ); +} // namespace TestChaining - // Apply constraint - actor1 size == actor2 position +int UtcDaliConstraintChaining(void) +{ + // Apply several constraints to the same property and ensure the functors are called in the correct order. - Constraint constraint = Constraint::New( Actor::SIZE, - Source( actor1, Actor::POSITION ), - EqualToConstraint() ); - constraint.SetRemoveAction( Constraint::Discard ); - actor2.ApplyConstraint( constraint ); + TestApplication application; - application.SendNotification(); - application.Render(0); + Actor actor = Actor::New(); + Stage::GetCurrent().Add( actor ); - // Constraint should be fully applied - DALI_TEST_EQUALS( actor2.GetCurrentSize(), startPosition, TEST_LOCATION ); + Constraint constraint1 = Constraint::New< Vector3 >( actor, Actor::Property::POSITION, &TestChaining::Function1 ); + Constraint constraint2 = Constraint::New< Vector3 >( actor, Actor::Property::POSITION, &TestChaining::Function2 ); + Constraint constraint3 = Constraint::New< Vector3 >( actor, Actor::Property::POSITION, &TestChaining::Function3 ); + Constraint constraint4 = Constraint::New< Vector3 >( actor, Actor::Property::POSITION, &TestChaining::Function4 ); + Constraint constraint5 = Constraint::New< Vector3 >( actor, Actor::Property::POSITION, &TestChaining::Function5 ); - // Change the input - Vector3 endPosition( 2, 2, 2 ); - actor1.SetPosition( endPosition ); + constraint1.Apply(); + constraint2.Apply(); + constraint3.Apply(); + constraint4.Apply(); + constraint5.Apply(); application.SendNotification(); - application.Render(0); - - // Constraint should be fully applied - DALI_TEST_EQUALS( actor2.GetCurrentSize(), endPosition, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor2.GetCurrentSize(), endPosition, TEST_LOCATION ); + application.Render(); - // - // Check float variant of constraint - // - float startOpacity(1.0f); - float endOpacity(0.2f); - actor1.SetOpacity( startOpacity ); - actor2.SetOpacity( startOpacity ); + END_TEST; +} +/////////////////////////////////////////////////////////////////////////////// - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor1.GetCurrentOpacity(), startOpacity, TEST_LOCATION ); - DALI_TEST_EQUALS( actor2.GetCurrentOpacity(), startOpacity, TEST_LOCATION ); +/////////////////////////////////////////////////////////////////////////////// +namespace TestPropertyTypes +{ +template< typename T > +void Execute( T value ) +{ + TestApplication application; + bool functorCalled = false; - Constraint constraint2 = Constraint::New( Actor::COLOR_ALPHA, - Source( actor1, Actor::COLOR_ALPHA ), - EqualToConstraint() ); - constraint2.SetRemoveAction( Constraint::Discard ); - actor2.ApplyConstraint( constraint2 ); + Actor actor = Actor::New(); + Property::Index index = actor.RegisterProperty( "TEMP_PROPERTY_NAME", value ); - actor1.SetOpacity(endOpacity); + Stage::GetCurrent().Add( actor ); application.SendNotification(); - application.Render(0); + application.Render(); - DALI_TEST_EQUALS( actor2.GetCurrentOpacity(), endOpacity, 0.000001f, TEST_LOCATION ); + DALI_TEST_EQUALS( functorCalled, false, TEST_LOCATION ); - // - // Check Vector4 variant of constraint - // - actor1.SetColor( Color::GREEN ); - actor2.SetColor( Color::RED ); + // Add a constraint + Constraint constraint = Constraint::New< T >( actor, index, BasicCalledFunctor< T >( functorCalled ) ); + DALI_TEST_CHECK( constraint ); + constraint.Apply(); application.SendNotification(); - application.Render(0); - DALI_TEST_CHECK( actor1.GetCurrentColor() == Color::GREEN ); - DALI_TEST_CHECK( actor2.GetCurrentColor() == Color::RED ); - - Constraint constraint3 = Constraint::New( Actor::COLOR, - Source( actor1, Actor::COLOR ), - EqualToConstraint() ); - constraint3.SetRemoveAction( Constraint::Discard ); - actor2.ApplyConstraint( constraint3 ); - application.SendNotification(); - application.Render(0); - DALI_TEST_CHECK( actor2.GetCurrentColor() == Color::GREEN ); + application.Render(); - // - // Check Quaternion variant of constraint - // - Quaternion q1 = Quaternion( Math::PI_2, Vector3::XAXIS ); - Quaternion q2 = Quaternion( Math::PI_4, Vector3::YAXIS ); - actor1.SetRotation( q1 ); - actor2.SetRotation( q2 ); + DALI_TEST_EQUALS( functorCalled, true, TEST_LOCATION ); +} +} // namespace UtcDaliConstraintNewFunctor + +int UtcDaliConstraintTestPropertyTypesP(void) +{ + // Ensure we can use a constraint functor with all supported property types + + TestPropertyTypes::Execute< bool >( false ); + TestPropertyTypes::Execute< int >( 0 ); + TestPropertyTypes::Execute< float >( 0.0f ); + TestPropertyTypes::Execute< Vector2 >( Vector2::ZERO ); + TestPropertyTypes::Execute< Vector3 >( Vector3::ZERO ); + TestPropertyTypes::Execute< Vector4 >( Vector4::ZERO ); + TestPropertyTypes::Execute< Quaternion >( Quaternion::IDENTITY ); + TestPropertyTypes::Execute< Matrix >( Matrix::IDENTITY ); + TestPropertyTypes::Execute< Matrix3 >( Matrix3::IDENTITY ); - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor1.GetCurrentRotation(), q1, 0.01, TEST_LOCATION ); - DALI_TEST_EQUALS( actor2.GetCurrentRotation(), q2, 0.01, TEST_LOCATION ); - - Constraint constraint4 = Constraint::New( Actor::ROTATION, - Source( actor1, Actor::ROTATION ), - EqualToConstraint() ); - constraint4.SetRemoveAction( Constraint::Discard ); - actor2.ApplyConstraint( constraint4 ); - application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor2.GetCurrentRotation(), q1, 0.01, TEST_LOCATION ); - - // - // Check Matrix3 variant - // - EqualToConstraint equalToConstraint; - - Matrix3 a; - a.AsFloat()[0] = 1.f; - Matrix3 b; - b.AsFloat()[0] = 2.f; - PropertyInputAbstraction pi(b); - - Matrix3 c = equalToConstraint(a,pi); - DALI_TEST_EQUALS( c.AsFloat()[0], b.AsFloat()[0], 0.01, TEST_LOCATION); END_TEST; } -int UtcDaliBuiltinConstraintRelativeToConstraint(void) +/////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////// +namespace { - TestApplication application; +void SetHalfOpacity( Vector4& current, const PropertyInputContainer& inputs ) +{ + current.a = 0.5f; +} +} // unnamed namespace + +int UtcDaliConstraintEnsureResetterAppliedOnStageRemoval(void) +{ + // Ensure BOTH double-buffered values of our color property is reset when a constraint is applied to it. - Actor actor1 = Actor::New(); - Vector3 startPosition( 10, 10, 10 ); - actor1.SetPosition( startPosition ); - Stage::GetCurrent().Add( actor1 ); + TestApplication application; - Actor actor2 = Actor::New(); - Vector3 startSize( 100, 100, 100 ); - actor2.SetSize( startSize ); - Stage::GetCurrent().Add( actor2 ); + Actor actor = Actor::New(); + Stage::GetCurrent().Add( actor ); + // Check initial value is fully opaque application.SendNotification(); - application.Render(0); - DALI_TEST_CHECK( actor1.GetCurrentPosition() == startPosition ); - DALI_TEST_CHECK( actor2.GetCurrentSize() == startSize ); - - // Apply constraint - actor1 size == actor2 position + application.Render(); + DALI_TEST_EQUALS( actor.GetCurrentColor().a, 1.0f, TEST_LOCATION ); - RelativeToConstraint( 0.f ); - Vector3 scale( 0.5, 0.6, 0.7 ); - Constraint constraint = Constraint::New( Actor::SIZE, - Source( actor1, Actor::POSITION ), - RelativeToConstraint( scale ) ); - constraint.SetRemoveAction( Constraint::Discard ); - actor2.ApplyConstraint( constraint ); + // Create a constraint whose value is discarded when it is removed + Constraint constraint = Constraint::New< Vector4 >( actor, Actor::Property::COLOR, SetHalfOpacity ); + constraint.SetRemoveAction( Constraint::RemoveAction::Discard ); + constraint.Apply(); + // Check value after one render, it should be constrained application.SendNotification(); - application.Render(0); + application.Render(); + DALI_TEST_EQUALS( actor.GetCurrentColor().a, 0.5f, TEST_LOCATION ); - // Constraint should be fully applied - DALI_TEST_EQUALS( actor2.GetCurrentSize(), scale * startPosition, TEST_LOCATION ); + // Render another frame, ensure the other value has also been updated + application.SendNotification(); + application.Render(); + DALI_TEST_EQUALS( actor.GetCurrentColor().a, 0.5f, TEST_LOCATION ); - // Change the input - Vector3 endPosition( 2, 2, 2 ); - actor1.SetPosition( endPosition ); + // Remove the actor from the stage and delete the constraint + actor.Unparent(); + constraint.Remove(); + constraint.Reset(); + // Check value while off-stage, it should be fully opaque application.SendNotification(); - application.Render(0); - - // Constraint should be fully applied - DALI_TEST_EQUALS( actor2.GetCurrentSize(), scale * endPosition, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor2.GetCurrentSize(), scale * endPosition, TEST_LOCATION ); + application.Render(); + DALI_TEST_EQUALS( actor.GetCurrentColor().a, 1.0f, TEST_LOCATION ); - // - // Check float variant of constraint - // - float scale2( 0.5f ); - float startOpacity(1.0f); - actor1.SetOpacity( startOpacity ); - actor2.SetOpacity( startOpacity ); + // Add the actor back to the stage and check the value, it should be fully opaque again + Stage::GetCurrent().Add( actor ); + // Check value when back on-stage, it should be fully opaque as the constraint is no longer applied to it. application.SendNotification(); - application.Render(0); - DALI_TEST_EQUALS( actor1.GetCurrentOpacity(), startOpacity, TEST_LOCATION ); - DALI_TEST_EQUALS( actor2.GetCurrentOpacity(), startOpacity, TEST_LOCATION ); - - Constraint constraint2 = Constraint::New( Actor::COLOR_ALPHA, - Source( actor1, Actor::COLOR_ALPHA ), - RelativeToConstraintFloat(scale2) ); - constraint2.SetRemoveAction( Constraint::Discard ); - actor2.ApplyConstraint(constraint2); + application.Render(); + DALI_TEST_EQUALS( actor.GetCurrentColor().a, 1.0f, TEST_LOCATION ); + + // Render for another frame to ensure both buffers have the correct value application.SendNotification(); - application.Render(0); + application.Render(); + DALI_TEST_EQUALS( actor.GetCurrentColor().a, 1.0f, TEST_LOCATION ); - DALI_TEST_EQUALS( actor2.GetCurrentOpacity(), startOpacity * scale2, TEST_LOCATION ); END_TEST; } -int UtcDaliBuiltinConstraintInverseOfConstraint(void) +int UtcDaliConstraintOnActorAddedAndRemoved(void) { - TestApplication application; + // Ensure adding and removing an actor from stage with a constraint still has it applied when it is re-added back to the stage - Actor actor1 = Actor::New(); - Vector3 startPosition( 10, 10, 10 ); - actor1.SetPosition( startPosition ); - Stage::GetCurrent().Add( actor1 ); + TestApplication application; - Actor actor2 = Actor::New(); - Vector3 startSize( 100, 100, 100 ); - actor2.SetSize( startSize ); - Stage::GetCurrent().Add( actor2 ); + Actor actor = Actor::New(); + Stage::GetCurrent().Add( actor ); + // Check initial value is fully opaque application.SendNotification(); - application.Render(0); - DALI_TEST_CHECK( actor1.GetCurrentPosition() == startPosition ); - DALI_TEST_CHECK( actor2.GetCurrentSize() == startSize ); - - // Apply constraint - actor1 size == ( 1 / actor2 position ) + application.Render(); + DALI_TEST_EQUALS( actor.GetCurrentColor().a, 1.0f, TEST_LOCATION ); - Constraint constraint = Constraint::New( Actor::SIZE, - Source( actor1, Actor::POSITION ), - InverseOfConstraint() ); - constraint.SetRemoveAction( Constraint::Discard ); - actor2.ApplyConstraint( constraint ); + // Create a constraint whose value is discarded when it is removed + Constraint constraint = Constraint::New< Vector4 >( actor, Actor::Property::COLOR, SetHalfOpacity ); + constraint.SetRemoveAction( Constraint::RemoveAction::Discard ); + constraint.Apply(); + // Check value after one render, it should be constrained application.SendNotification(); - application.Render(0); - - // Constraint should be fully applied - Vector3 size( 0.1, 0.1, 0.1 ); // 1 / startPosition - DALI_TEST_EQUALS( actor2.GetCurrentSize(), size, 0.00001f, TEST_LOCATION ); - - // Change the input - Vector3 endPosition( 2, 2, 2 ); - actor1.SetPosition( endPosition ); + application.Render(); + DALI_TEST_EQUALS( actor.GetCurrentColor().a, 0.5f, TEST_LOCATION ); + // Render another frame, ensure the other value has also been updated application.SendNotification(); - application.Render(0); + application.Render(); + DALI_TEST_EQUALS( actor.GetCurrentColor().a, 0.5f, TEST_LOCATION ); - // Constraint should be fully applied - size = Vector3( 0.5, 0.5, 0.5 ); // 1 / endPosition - DALI_TEST_EQUALS( actor2.GetCurrentSize(), size, TEST_LOCATION ); - application.Render(0); - DALI_TEST_EQUALS( actor2.GetCurrentSize(), size, TEST_LOCATION ); - END_TEST; -} + // Remove the actor from the stage + actor.Unparent(); -int UtcDaliBuiltinConstraintFunctions(void) -{ - TestApplication application; + // Check value while off-stage, the constraint is no longer being applied as it's off-stage + application.SendNotification(); + application.Render(); + DALI_TEST_EQUALS( actor.GetCurrentColor().a, 1.0f, TEST_LOCATION ); - { - SourceWidthFixedHeight sourceWidthFixedHeight( 10.f ); - Vector3 current; - { - Vector3 reference(1, 10, 0); - Vector3 value = sourceWidthFixedHeight( current, PropertyInputAbstraction(Vector3::ONE) ); - DALI_TEST_EQUALS( reference, value, TEST_LOCATION ); - } - { - Vector3 reference(10, 10, 0); - Vector3 value = sourceWidthFixedHeight( current, PropertyInputAbstraction(Vector3::ONE*10.f) ); - DALI_TEST_EQUALS( reference, value, TEST_LOCATION ); - } - { - Vector3 reference(10,10,0); - Vector3 value = sourceWidthFixedHeight( current, PropertyInputAbstraction(Vector3::ONE*10.f) ); - DALI_TEST_EQUALS( reference, value, TEST_LOCATION ); - } - } + // Check the other buffer, the constraint should not be applied to this either. + application.SendNotification(); + application.Render(); + DALI_TEST_EQUALS( actor.GetCurrentColor().a, 1.0f, TEST_LOCATION ); - { - SourceHeightFixedWidth sourceHeightFixedWidth( 10.f ); - Vector3 current; - { - Vector3 reference(10,1,0); - Vector3 value = sourceHeightFixedWidth( current, PropertyInputAbstraction(Vector3::ONE) ); - DALI_TEST_EQUALS( reference, value, TEST_LOCATION ); - } - { - Vector3 reference(10,10,0); - Vector3 value = sourceHeightFixedWidth( current, PropertyInputAbstraction(Vector3::ONE*10.f) ); - DALI_TEST_EQUALS( reference, value, TEST_LOCATION ); - } - { - Vector3 reference(10,100,0); - Vector3 value = sourceHeightFixedWidth( current, PropertyInputAbstraction(Vector3::ONE*100.f) ); - DALI_TEST_EQUALS( reference, value, TEST_LOCATION ); - } - } + // Add the actor back to the stage and check the value, the constraint should have been re-applied + Stage::GetCurrent().Add( actor ); + application.SendNotification(); + application.Render(); + DALI_TEST_EQUALS( actor.GetCurrentColor().a, 0.5f, TEST_LOCATION ); - { // LookAt - Quaternion current(0, Vector3::YAXIS); - PropertyInputAbstraction target(Vector3::ZAXIS); - PropertyInputAbstraction targetRotation(Vector3::YAXIS); - PropertyInputAbstraction camera(Vector3::ZERO); - - { - Quaternion reference(1., 0., 0., 0.); - Quaternion value = LookAt( current, target, camera, targetRotation ); - DALI_TEST_EQUALS( reference, value, 0.001, TEST_LOCATION ); - } - - { - OrientedLookAt orientedLookAt(90.f); - Quaternion reference(.525322, 0., 0., 0.850904); - Quaternion value = orientedLookAt( current, target, camera, targetRotation ); - DALI_TEST_EQUALS( reference, value, 0.001, TEST_LOCATION ); - } - } + // Render for another frame to ensure both buffers have the correct value + application.SendNotification(); + application.Render(); + DALI_TEST_EQUALS( actor.GetCurrentColor().a, 0.5f, TEST_LOCATION ); END_TEST; } + +///////////////////////////////////////////////////////////////////////////////