5 * Copyright (c) 2015 Samsung Electronics Co., Ltd.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
21 // Helper classes for testing DALi signal and slots
27 TestButton( unsigned int id )
34 mPanelDown.Emit( *this );
39 mPanelUp.Emit( *this );
42 typedef Signal< void (TestButton&) > PanelDownSignal;
43 typedef Signal< void (TestButton&) > PanelUpSignal;
45 PanelDownSignal& DownSignal()
50 PanelUpSignal& SignalUp()
63 PanelDownSignal mPanelDown;
64 PanelUpSignal mPanelUp;
67 class TestApp : public ConnectionTracker
72 : mButtonPressed( false ),
73 mVoidFunctionCalled( false )
77 void OnButtonPress( TestButton& button )
79 mButtonPressed = true;
80 mButtonId = button.GetId();
83 void OnButtonRelease( TestButton& button )
85 mButtonPressed = false;
86 mButtonId = button.GetId();
89 int GetButtonPressedId()
94 bool BoolReturnTestFalse()
99 bool BoolReturnTestTrue()
106 mVoidFunctionCalled = true;
110 bool mVoidFunctionCalled;
118 // Void return, no parameters
119 typedef Signal<void ()> VoidRetNoParamSignal;
121 // Void return, 1 value parameter
122 typedef Signal<void (int)> VoidRet1ValueParamSignal;
124 // Void return, 1 reference parameter
125 typedef Signal< void (int&)> VoidRet1RefParamSignal;
127 // Void return, 2 value parameters
128 typedef Signal<void (int, int)> VoidRet2ValueParamSignal;
130 // Void return, 3 value parameters
131 typedef Signal<void (int, int, int)> VoidRet3ValueParamSignal;
133 // bool return, 1 value parameter
134 typedef Signal< bool (float)> BoolRet1ValueParamSignal;
136 // bool return, 2 value parameter
137 typedef Signal<bool (float, int) > BoolRet2ValueParamSignal;
139 // int return, 2 value parameter
140 typedef Signal<int (float, int)> IntRet2ValueParamSignal;
142 // float return, 0 parameters
143 typedef Signal< float () > FloatRet0ParamSignal;
145 // float return, 1 value parameters
146 typedef Signal< float (float ) > FloatRet1ParamSignal;
148 // float return, 2 value parameters
149 typedef Signal<float (float, float) > FloatRet2ValueParamSignal;
151 // float return, 3 value parameters
152 typedef Signal<float (float, float, float) > FloatRet3ValueParamSignal;
154 // void return, 3 value parameters
155 typedef Signal<void (float, float, float) > VoidSignalTypeFloatValue3;
158 VoidRetNoParamSignal& SignalVoidNone() { return mSignalVoid0; }
159 VoidRet1RefParamSignal& SignalVoid1Ref() { return mSignalVoid1R; }
160 VoidRet1ValueParamSignal& SignalVoid1Value() { return mSignalVoid1V; }
161 VoidRet2ValueParamSignal& SignalVoid2Value() { return mSignalVoid2V; }
162 VoidRet3ValueParamSignal& SignalVoid3Value() { return mSignalVoid3V; }
164 BoolRet1ValueParamSignal& SignalBool1Value() { return mSignalBool1V; }
165 BoolRet2ValueParamSignal& SignalBool2Value() { return mSignalBool2V; }
166 IntRet2ValueParamSignal& SignalInt2Value() { return mSignalInt2V; }
167 FloatRet0ParamSignal& SignalFloat0() { return mSignalFloat0; }
168 FloatRet1ParamSignal& SignalFloat1Value() {return mSignalFloat1V; }
169 FloatRet2ValueParamSignal& SignalFloat2Value() { return mSignalFloat2V; }
171 VoidSignalTypeFloatValue3& VoidSignalFloatValue3() { return mVoidSignalFloatValue3; }
172 FloatRet3ValueParamSignal& SignalFloat3Value() { return mFloatSignalFloatValue3; }
178 void CheckNoConnections()
180 DALI_TEST_EQUALS( mSignalVoid0.GetConnectionCount(), 0u, TEST_LOCATION );
181 DALI_TEST_EQUALS( mSignalVoid1R.GetConnectionCount(), 0u, TEST_LOCATION );
182 DALI_TEST_EQUALS( mSignalVoid1V.GetConnectionCount(), 0u, TEST_LOCATION );
183 DALI_TEST_EQUALS( mSignalVoid2V.GetConnectionCount(), 0u, TEST_LOCATION );
184 DALI_TEST_EQUALS( mSignalVoid3V.GetConnectionCount(), 0u, TEST_LOCATION );
185 DALI_TEST_EQUALS( mSignalBool1V.GetConnectionCount(), 0u, TEST_LOCATION );
186 DALI_TEST_EQUALS( mSignalBool2V.GetConnectionCount(), 0u, TEST_LOCATION );
187 DALI_TEST_EQUALS( mSignalInt2V.GetConnectionCount(), 0u, TEST_LOCATION );
188 DALI_TEST_EQUALS( mSignalFloat0.GetConnectionCount(), 0u, TEST_LOCATION );
189 DALI_TEST_EQUALS( mSignalFloat1V.GetConnectionCount(), 0u, TEST_LOCATION );
190 DALI_TEST_EQUALS( mSignalFloat2V.GetConnectionCount(), 0u, TEST_LOCATION );
191 DALI_TEST_EQUALS( mVoidSignalFloatValue3.GetConnectionCount(), 0u, TEST_LOCATION );
192 DALI_TEST_EQUALS( mFloatSignalFloatValue3.GetConnectionCount(), 0u, TEST_LOCATION );
195 void EmitVoidSignalVoid()
200 void EmitVoidSignalIntRef(int& ref)
202 mSignalVoid1R.Emit(ref);
205 void EmitVoidSignal1IntValue(int p1)
207 mSignalVoid1V.Emit(p1);
210 void EmitVoidSignal2IntValue(int p1, int p2)
212 mSignalVoid2V.Emit(p1,p2);
215 void EmitVoidSignal3IntValue(int p1, int p2, int p3)
217 mSignalVoid3V.Emit(p1,p2,p3);
221 bool EmitBoolSignalFloatValue(float p1)
223 return mSignalBool1V.Emit(p1);
226 bool EmitBoolSignalFloatValueIntValue(float p1, int p2)
228 return mSignalBool2V.Emit(p1, p2);
231 int EmitIntSignalFloatValueIntValue(float p1, int p2)
233 return mSignalInt2V.Emit(p1, p2);
236 float EmitFloat1VSignal(float p1 )
238 return mSignalFloat1V.Emit(p1 );
241 float EmitFloat2VSignal(float p1, float p2)
243 return mSignalFloat2V.Emit(p1, p2);
246 float EmitFloat0Signal()
248 return mSignalFloat0.Emit();
251 void EmitVoidSignalFloatValue3(float p1, float p2, float p3)
253 mVoidSignalFloatValue3.Emit(p1, p2, p3);
256 float EmitFloat3VSignal(float p1, float p2, float p3)
258 return mFloatSignalFloatValue3.Emit(p1, p2, p3);
263 VoidRetNoParamSignal mSignalVoid0;
264 VoidRet1RefParamSignal mSignalVoid1R;
265 VoidRet1ValueParamSignal mSignalVoid1V;
266 VoidRet2ValueParamSignal mSignalVoid2V;
267 VoidRet3ValueParamSignal mSignalVoid3V;
269 BoolRet1ValueParamSignal mSignalBool1V;
270 BoolRet2ValueParamSignal mSignalBool2V;
271 IntRet2ValueParamSignal mSignalInt2V;
272 FloatRet0ParamSignal mSignalFloat0;
273 FloatRet1ParamSignal mSignalFloat1V;
274 FloatRet2ValueParamSignal mSignalFloat2V;
275 VoidSignalTypeFloatValue3 mVoidSignalFloatValue3;
276 FloatRet3ValueParamSignal mFloatSignalFloatValue3;
280 * A helper class with various slots
282 class TestSlotHandler : public ConnectionTracker
290 mFloatParam1( 0.0f ),
291 mFloatParam2( 0.0f ),
292 mFloatParam3( 0.0f ),
293 mBoolReturn( false ),
295 mFloatReturn( 0.0f ),
321 void VoidSlotVoidAlternative()
327 void VoidSlotIntRef( int& p1 )
334 void VoidSlotIntValue( int p1 )
341 void VoidDuplicateSlotIntValue( int p1 )
348 void VoidSlotIntValueIntValue( int p1, int p2 )
356 bool BoolSlotFloatValue( float p1 )
364 bool BoolSlotFloatValueIntValue( float p1, int p2 )
373 int IntSlotFloatValueIntValue( float p1, int p2 )
382 float FloatSlotVoid()
389 float FloatSlotFloatValueFloatValue( float p1, float p2 )
398 void VoidSlotFloatValue3( float p1, float p2, float p3 )
407 float FloatSlotFloatValue3( float p1, float p2, float p3 )
417 int mIntParam1, mIntParam2, mIntParam3;
418 float mFloatParam1, mFloatParam2, mFloatParam3;
427 * A version of TestSlotHandler which disconnects during the callback
429 class TestSlotDisconnector : public ConnectionTracker
433 TestSlotDisconnector()
437 mFloatParam1( 0.0f ),
438 mFloatParam2( 0.0f ),
439 mBoolReturn( false ),
441 mFloatReturn( 0.0f ),
459 void VoidConnectVoid( TestSignals::VoidRetNoParamSignal& signal )
461 mVoidSignalVoid = &signal;
462 signal.Connect( this, &TestSlotDisconnector::VoidSlotVoid );
467 mVoidSignalVoid->Disconnect( this, &TestSlotDisconnector::VoidSlotVoid );
471 void VoidConnectIntRef( TestSignals::VoidRet1RefParamSignal& signal )
473 mVoidSignalIntRef = &signal;
474 signal.Connect( this, &TestSlotDisconnector::VoidSlotIntRef );
477 void VoidSlotIntRef( int& p1 )
479 mVoidSignalIntRef->Disconnect( this, &TestSlotDisconnector::VoidSlotIntRef );
484 void VoidSlotIntValue( int p1 )
490 void VoidSlotIntValueIntValue( int p1, int p2 )
497 bool BoolSlotFloatValue( float p1 )
504 bool BoolSlotFloatValueIntValue( float p1, int p2 )
512 int IntSlotFloatValueIntValue( float p1, int p2 )
520 float FloatSlotVoid()
526 float FloatSlotFloatValueFloatValue( float p1, float p2 )
534 TestSignals::VoidRetNoParamSignal* mVoidSignalVoid;
535 TestSignals::VoidRet1RefParamSignal* mVoidSignalIntRef;
537 int mIntParam1, mIntParam2, mIntParam3;
538 float mFloatParam1, mFloatParam2;
546 * A more complicated version of TestSlotDisconnector, which disconnects some but not all callbacks
548 class TestSlotMultiDisconnector : public ConnectionTracker
552 static const int NUM_SLOTS = 10;
554 TestSlotMultiDisconnector()
555 : mVoidSignalVoid( NULL )
562 for( int i=0; i<NUM_SLOTS; ++i )
564 mSlotHandled[i] = false;
568 void ConnectAll( TestSignals::VoidRetNoParamSignal& signal )
570 mVoidSignalVoid = &signal;
571 signal.Connect( this, &TestSlotMultiDisconnector::Slot0 );
572 signal.Connect( this, &TestSlotMultiDisconnector::Slot1 );
573 signal.Connect( this, &TestSlotMultiDisconnector::Slot2 );
574 signal.Connect( this, &TestSlotMultiDisconnector::Slot3 );
575 signal.Connect( this, &TestSlotMultiDisconnector::Slot4 );
576 signal.Connect( this, &TestSlotMultiDisconnector::Slot5 );
577 signal.Connect( this, &TestSlotMultiDisconnector::Slot6 );
578 signal.Connect( this, &TestSlotMultiDisconnector::Slot7 );
579 signal.Connect( this, &TestSlotMultiDisconnector::Slot8 );
580 signal.Connect( this, &TestSlotMultiDisconnector::Slot9 );
585 mSlotHandled[0] = true;
590 mSlotHandled[1] = true;
595 mSlotHandled[2] = true;
600 mSlotHandled[3] = true;
602 // Disconnect the odd numbered lots, because we can
603 mVoidSignalVoid->Disconnect( this, &TestSlotMultiDisconnector::Slot1 );
604 mVoidSignalVoid->Disconnect( this, &TestSlotMultiDisconnector::Slot3 );
605 mVoidSignalVoid->Disconnect( this, &TestSlotMultiDisconnector::Slot5 );
606 mVoidSignalVoid->Disconnect( this, &TestSlotMultiDisconnector::Slot7 );
607 mVoidSignalVoid->Disconnect( this, &TestSlotMultiDisconnector::Slot9 );
612 mSlotHandled[4] = true;
617 mSlotHandled[5] = true;
622 mSlotHandled[6] = true;
627 mSlotHandled[7] = true;
632 mSlotHandled[8] = true;
637 mSlotHandled[9] = true;
640 TestSignals::VoidRetNoParamSignal* mVoidSignalVoid;
642 bool mSlotHandled[NUM_SLOTS];
647 * A version of TestSlotHandler which disconnects during the callback
649 class TestEmitDuringCallback : public ConnectionTracker
653 TestEmitDuringCallback()
654 : mVoidSignalVoid( NULL ),
655 mFloatRet0ParamSignal( NULL),
656 mFloatRet1ParamSignal( NULL ),
657 mFloatRet2ParamSignal( NULL ),
658 mFloatRet3ParamSignal( NULL ),
663 void VoidConnectVoid( TestSignals::VoidRetNoParamSignal& signal )
665 mVoidSignalVoid = &signal;
666 signal.Connect( this, &TestEmitDuringCallback::VoidSlotVoid );
669 void FloatRet0ParamConnect( TestSignals::FloatRet0ParamSignal& signal )
671 mFloatRet0ParamSignal = &signal;
672 signal.Connect( this, &TestEmitDuringCallback::FloatRet0Param );
674 void FloatRet1ParamConnect( TestSignals::FloatRet1ParamSignal& signal )
676 mFloatRet1ParamSignal = &signal;
677 signal.Connect( this, &TestEmitDuringCallback::FloatRet1Param );
679 void FloatRet2ParamConnect( TestSignals::FloatRet2ValueParamSignal& signal )
681 mFloatRet2ParamSignal = &signal;
682 signal.Connect( this, &TestEmitDuringCallback::FloatRet2Param );
684 void FloatRet3ParamConnect( TestSignals::FloatRet3ValueParamSignal& signal )
686 mFloatRet3ParamSignal = &signal;
687 signal.Connect( this, &TestEmitDuringCallback::FloatRet3Param );
690 void DeleteDuringEmitConnect( TestSignals::VoidRetNoParamSignal& signal )
692 mVoidSignalVoid = &signal;
693 signal.Connect( this, &TestEmitDuringCallback::DeleteSignalDuringEmit );
698 // Emitting during Emit is very bad!
699 mVoidSignalVoid->Emit();
703 void DeleteSignalDuringEmit()
705 // deleting the signal during the emit
706 delete mVoidSignalVoid;
709 float FloatRet0Param()
711 // Emitting during Emit is very bad!
713 return mFloatRet0ParamSignal->Emit();
715 float FloatRet1Param( float x )
717 // Emitting during Emit is very bad!
719 return mFloatRet1ParamSignal->Emit(x);
721 float FloatRet2Param( float x, float y )
723 // Emitting during Emit is very bad!
725 return mFloatRet2ParamSignal->Emit( x, y );
727 float FloatRet3Param( float x, float y, float z)
729 // Emitting during Emit is very bad!
731 return mFloatRet3ParamSignal->Emit( x, y, z );
734 TestSignals::VoidRetNoParamSignal* mVoidSignalVoid;
735 TestSignals::FloatRet0ParamSignal* mFloatRet0ParamSignal;
736 TestSignals::FloatRet1ParamSignal* mFloatRet1ParamSignal;
737 TestSignals::FloatRet2ValueParamSignal* mFloatRet2ParamSignal;
738 TestSignals::FloatRet3ValueParamSignal* mFloatRet3ParamSignal;
746 * A version of TestSlotHandler which uses SlotDelegate
748 class TestSlotDelegateHandler // This does not inherit from ConnectionTrackerInterface!
752 TestSlotDelegateHandler()
753 : mSlotDelegate( this ),
757 mFloatParam1( 0.0f ),
758 mFloatParam2( 0.0f ),
759 mFloatParam3( 0.0f ),
760 mBoolReturn( false ),
762 mFloatReturn( 0.0f ),
788 void AlternativeVoidSlotVoid()
794 void VoidSlotIntRef( int& p1 )
801 void VoidSlotIntValue( int p1 )
808 void VoidDuplicateSlotIntValue( int p1 )
815 void VoidSlotIntValueIntValue( int p1, int p2 )
823 bool BoolSlotFloatValue( float p1 )
831 bool BoolSlotFloatValueIntValue( float p1, int p2 )
840 int IntSlotFloatValueIntValue( float p1, int p2 )
849 float FloatSlotVoid()
856 float FloatSlotFloatValueFloatValue( float p1, float p2 )
865 void VoidSlotFloatValue3( float p1, float p2, float p3 )
874 float FloatSlotFloatValue3( float p1, float p2, float p3 )
884 SlotDelegate<TestSlotDelegateHandler> mSlotDelegate;
886 int mIntParam1, mIntParam2, mIntParam3;
887 float mFloatParam1, mFloatParam2, mFloatParam3;
896 * Test that reimplmenting ConnectionTrackerInterface actually works.
897 * This basic connection tracker only allows one callback to be connected.
899 class TestBasicConnectionTrackerInterface : public ConnectionTrackerInterface
903 TestBasicConnectionTrackerInterface()
904 : mCallbackHandled( false ),
906 mSlotObserver( NULL )
910 ~TestBasicConnectionTrackerInterface()
912 if( mSlotObserver && mCallback )
914 // Notify signal since the slot has been destroyed
915 mSlotObserver->SlotDisconnected( mCallback );
916 // mCallback and mSlotObserver are not owned
925 mCallbackHandled = true;
929 * @copydoc ConnectionTrackerInterface::GetConnectionCount
931 virtual std::size_t GetConnectionCount() const
942 * @copydoc ConnectionTrackerInterface::SignalConnected
944 virtual void SignalConnected( SlotObserver* slotObserver, CallbackBase* callback )
946 DALI_ASSERT_ALWAYS( NULL == mCallback && "Only one connection supported!" );
948 mCallback = callback;
949 mSlotObserver = slotObserver;
953 * @copydoc ConnectionTrackerInterface::SignalDisconnected
955 virtual void SignalDisconnected( SlotObserver* slotObserver, CallbackBase* callback )
957 if( mSlotObserver == slotObserver )
959 mSlotObserver = NULL;
961 // mCallback and mSlotObserver are not owned
966 * RemoveNullCallback,
967 * testing what occurs when we pass a callback that doesn't exist
969 void RemoveNullCallback()
971 mSlotObserver->SlotDisconnected( NULL );
976 TestBasicConnectionTrackerInterface( const TestBasicConnectionTrackerInterface& ); ///< undefined copy constructor
977 TestBasicConnectionTrackerInterface& operator=( const TestBasicConnectionTrackerInterface& ); ///< undefined assignment operator
981 bool mCallbackHandled;
985 CallbackBase* mCallback; ///< callback, has ownership
986 SlotObserver* mSlotObserver; ///< a pointer to the slot observer (not owned)
992 // for testing static function callbacks
993 class StaticFunctionHandlers
996 StaticFunctionHandlers()
998 staticFunctionHandled = false;
1002 staticFunctionHandled = false;
1005 static void VoidSlotVoid()
1007 staticFunctionHandled = true;
1009 static void VoidSlot1Param( int p1 )
1011 staticFunctionHandled = true;
1013 static void VoidSlot2Param( int p1, int p2 )
1015 staticFunctionHandled = true;
1017 static void VoidSlot3Param( int p1, int p2, int p3 )
1019 staticFunctionHandled = true;
1022 static float RetSlot0Param( )
1024 staticFunctionHandled = true;
1027 static float RetSlot1Param( float p1 )
1029 staticFunctionHandled = true;
1032 static float RetSlot2Param( float p1, float p2 )
1034 staticFunctionHandled = true;
1037 static float RetSlot3Param( float p1, float p2, float p3 )
1039 staticFunctionHandled = true;
1043 static bool staticFunctionHandled;
1048 * test functor, we store a reference to a bool which is outside of the functor
1049 * so when the functor is copied, the copy can reference the original data
1053 TestFunctor( bool& functorCalled):
1054 mFunctorCalled( functorCalled )
1060 mFunctorCalled = true;
1063 bool& mFunctorCalled;
1066 struct VoidFunctorVoid
1068 VoidFunctorVoid( bool& functorCalled):
1069 mFunctorCalled( functorCalled )
1076 mFunctorCalled = true;
1079 bool& mFunctorCalled;
1082 #endif // #define SIGNAL_HELPER