Merge "Add the logical key to Integration::KeyEvent" into devel/master
[platform/core/uifw/dali-core.git] / automated-tests / src / dali / utc-Dali-SignalTemplates.cpp
index 7e33ff0..09c8704 100644 (file)
 // INTERNAL INCLUDES
 #include <dali/public-api/dali-core.h>
 #include <dali-test-suite-utils.h>
+#include "signal-helper.h"
 
 using namespace Dali;
 
+bool StaticFunctionHandlers::staticFunctionHandled;
+
 void utc_dali_signal_templates_startup(void)
 {
   test_return_value = TET_UNDEF;
@@ -37,979 +40,417 @@ void utc_dali_signal_templates_cleanup(void)
 
 namespace {
 
-class TestButton
-{
-public:
-
-  TestButton( unsigned int id )
-  : mId(id)
-  {
-  }
-
-  void Press()
-  {
-    mPanelDown.Emit( *this );
-  }
-
-  void Release()
-  {
-    mPanelUp.Emit( *this );
-  }
-
-  typedef Signal< void (TestButton&) > PanelDownSignal;
-  typedef Signal< void (TestButton&) > PanelUpSignal;
-
-  PanelDownSignal& DownSignal()
-  {
-    return mPanelDown;
-  }
-
-  PanelUpSignal& SignalUp()
-  {
-    return mPanelUp;
-  }
-
-  int GetId()
-  {
-    return mId;
-  }
-
-private:
 
-  int mId;
-  PanelDownSignal mPanelDown;
-  PanelUpSignal   mPanelUp;
-};
+bool wasStaticVoidCallbackVoidCalled  = false;
+bool wasStaticFloatCallbackVoidCalled = false;
+bool wasStaticVoidCallbackIntValueCalled = false;
+int staticIntValue = 0;
+bool wasStaticFloatCallbackFloatValueFloatValueCalled = false;
+float staticFloatValue1 = 0.0f;
+float staticFloatValue2 = 0.0f;
 
-class TestApp : public ConnectionTracker
+void StaticVoidCallbackVoid()
 {
-public:
-
-  TestApp()
-  : mButtonPressed( false ),
-    mVoidFunctionCalled( false )
-  {
-  }
-
-  void OnButtonPress( TestButton& button )
-  {
-    mButtonPressed = true;
-    mButtonId = button.GetId();
-  }
-
-  void OnButtonRelease( TestButton& button )
-  {
-    mButtonPressed = false;
-    mButtonId = button.GetId();
-  }
-
-  int GetButtonPressedId()
-  {
-    return mButtonId;
-  }
-
-  bool BoolReturnTestFalse()
-  {
-    return false;
-  }
-
-  bool BoolReturnTestTrue()
-  {
-    return true;
-  }
-
-  void VoidFunction()
-  {
-    mVoidFunctionCalled = true;
-  }
-
-  bool mButtonPressed;
-  bool mVoidFunctionCalled;
-  int mButtonId;
-};
+  wasStaticVoidCallbackVoidCalled = true;
+}
 
-class TestSignals
+void AlternativeVoidCallbackVoid()
 {
-public:
-
-  // Void return, no parameters
-  typedef Signal<void ()> VoidRetNoParamSignal;
-
-  // Void return, 1 value parameter
-  typedef Signal<void (int)> VoidRet1ValueParamSignal;
-
-  // Void return, 1 reference parameter
-  typedef Signal< void (int&)> VoidRet1RefParamSignal;
-
-  // Void return, 2 value parameters
-  typedef Signal<void (int, int)> VoidRet2ValueParamSignal;
-
-  // bool return, 1 value parameter
-  typedef Signal< bool (float)> BoolRet1ValueParamSignal;
-
-  // bool return, 2 value parameter
-  typedef Signal<bool (float, int) > BoolRet2ValueParamSignal;
-
-  // int return, 2 value parameter
-  typedef Signal<int (float, int)> IntRet2ValueParamSignal;
-
-  // float return, 0 parameters
-  typedef Signal< float () > FloatRet0ParamSignal;
-
-  // float return, 2 value parameters
-  typedef Signal<float (float, float) > FloatRet2ValueParamSignal;
-
-  // void return, 3 value parameters
-  typedef Signal<void (float, float, float) > VoidSignalTypeFloatValue3;
-
-  // float return, 3 value parameters
-  typedef Signal<float (float, float, float) > FloatSignalTypeFloatValue3;
-
-  VoidRetNoParamSignal&       SignalVoidNone()    { return mSignalVoid0;  }
-  VoidRet1RefParamSignal&     SignalVoid1Ref()    { return mSignalVoid1R; }
-  VoidRet1ValueParamSignal&   SignalVoid1Value()  { return mSignalVoid1V; }
-  VoidRet2ValueParamSignal&   SignalVoid2Value()  { return mSignalVoid2V; }
-
-  BoolRet1ValueParamSignal&   SignalBool1Value()  { return mSignalBool1V;  }
-  BoolRet2ValueParamSignal&   SignalBool2Value()  { return mSignalBool2V;  }
-  IntRet2ValueParamSignal&    SignalInt2Value()   { return mSignalInt2V;   }
-  FloatRet0ParamSignal&       SignalFloat0()      { return mSignalFloat0;  }
-  FloatRet2ValueParamSignal&  SignalFloat2Value() { return mSignalFloat2V; }
-
-  VoidSignalTypeFloatValue3&  VoidSignalFloatValue3()  { return mVoidSignalFloatValue3;  }
-  FloatSignalTypeFloatValue3& FloatSignalFloatValue3() { return mFloatSignalFloatValue3; }
-
-  TestSignals()
-  {
-  }
-
-  void CheckNoConnections()
-  {
-    DALI_TEST_EQUALS( mSignalVoid0.GetConnectionCount(), 0u, TEST_LOCATION );
-    DALI_TEST_EQUALS( mSignalVoid1R.GetConnectionCount(), 0u, TEST_LOCATION );
-    DALI_TEST_EQUALS( mSignalVoid1V.GetConnectionCount(), 0u, TEST_LOCATION );
-    DALI_TEST_EQUALS( mSignalVoid2V.GetConnectionCount(), 0u, TEST_LOCATION );
-    DALI_TEST_EQUALS( mSignalBool1V.GetConnectionCount(), 0u, TEST_LOCATION );
-    DALI_TEST_EQUALS( mSignalBool2V.GetConnectionCount(), 0u, TEST_LOCATION );
-    DALI_TEST_EQUALS( mSignalInt2V.GetConnectionCount(), 0u, TEST_LOCATION );
-    DALI_TEST_EQUALS( mSignalFloat0.GetConnectionCount(), 0u, TEST_LOCATION );
-    DALI_TEST_EQUALS( mSignalFloat2V.GetConnectionCount(), 0u, TEST_LOCATION );
-    DALI_TEST_EQUALS( mVoidSignalFloatValue3.GetConnectionCount(), 0u, TEST_LOCATION );
-    DALI_TEST_EQUALS( mFloatSignalFloatValue3.GetConnectionCount(), 0u, TEST_LOCATION );
-  }
-
-  void EmitVoidSignalVoid()
-  {
-    mSignalVoid0.Emit();
-  }
-
-  void EmitVoidSignalIntRef(int& ref)
-  {
-    mSignalVoid1R.Emit(ref);
-  }
-
-  void EmitVoidSignalIntValue(int p1)
-  {
-    mSignalVoid1V.Emit(p1);
-  }
-
-  void EmitVoidSignalIntValueIntValue(int p1, int p2)
-  {
-    mSignalVoid2V.Emit(p1,p2);
-  }
-
-  bool EmitBoolSignalFloatValue(float p1)
-  {
-    return mSignalBool1V.Emit(p1);
-  }
-
-  bool EmitBoolSignalFloatValueIntValue(float p1, int p2)
-  {
-    return mSignalBool2V.Emit(p1, p2);
-  }
-
-  int EmitIntSignalFloatValueIntValue(float p1, int p2)
-  {
-    return mSignalInt2V.Emit(p1, p2);
-  }
-
-  float EmitFloat2VSignal(float p1, float p2)
-  {
-    return mSignalFloat2V.Emit(p1, p2);
-  }
-
-  float EmitFloat0Signal()
-  {
-    return mSignalFloat0.Emit();
-  }
-
-  void EmitVoidSignalFloatValue3(float p1, float p2, float p3)
-  {
-    mVoidSignalFloatValue3.Emit(p1, p2, p3);
-  }
-
-  float EmitFloatSignalFloatValue3(float p1, float p2, float p3)
-  {
-    return mFloatSignalFloatValue3.Emit(p1, p2, p3);
-  }
-
-private:
-
-  VoidRetNoParamSignal         mSignalVoid0;
-  VoidRet1RefParamSignal       mSignalVoid1R;
-  VoidRet1ValueParamSignal     mSignalVoid1V;
-  VoidRet2ValueParamSignal     mSignalVoid2V;
-  BoolRet1ValueParamSignal     mSignalBool1V;
-  BoolRet2ValueParamSignal     mSignalBool2V;
-  IntRet2ValueParamSignal      mSignalInt2V;
-  FloatRet0ParamSignal         mSignalFloat0;
-  FloatRet2ValueParamSignal    mSignalFloat2V;
-  VoidSignalTypeFloatValue3    mVoidSignalFloatValue3;
-  FloatSignalTypeFloatValue3   mFloatSignalFloatValue3;
-};
+}
 
-/**
- * A helper class with various slots
- */
-class TestSlotHandler : public ConnectionTracker
+float StaticFloatCallbackVoid()
 {
-public:
-
-  TestSlotHandler()
-  : mIntParam1( 0 ),
-    mIntParam2( 0 ),
-    mIntParam3( 0 ),
-    mFloatParam1( 0.0f ),
-    mFloatParam2( 0.0f ),
-    mFloatParam3( 0.0f ),
-    mBoolReturn( false ),
-    mIntReturn( 0 ),
-    mFloatReturn( 0.0f ),
-    mHandled( false ),
-    mHandledCount( 0 )
-  {
-  }
-
-  void Reset()
-  {
-    mIntParam1 = 0;
-    mIntParam2 = 0;
-    mIntParam3 = 0;
-    mFloatParam1 = 0.0f;
-    mFloatParam2 = 0.0f;
-    mFloatParam3 = 0.0f;
-    mBoolReturn = false;
-    mIntReturn = 0;
-    mFloatReturn = 0.0f;
-    mHandled = false;
-  }
-
-  void VoidSlotVoid()
-  {
-    mHandled = true;
-    ++mHandledCount;
-  }
-
-  void VoidSlotIntRef( int& p1 )
-  {
-    mIntParam1 = p1;
-    mHandled = true;
-    ++mHandledCount;
-  }
-
-  void VoidSlotIntValue( int p1 )
-  {
-    mIntParam1 = p1;
-    mHandled = true;
-    ++mHandledCount;
-  }
-
-  void VoidDuplicateSlotIntValue( int p1 )
-  {
-    mIntParam2 = p1;
-    mHandled = true;
-    ++mHandledCount;
-  }
-
-  void VoidSlotIntValueIntValue( int p1, int p2 )
-  {
-    mIntParam1 = p1;
-    mIntParam2 = p2;
-    mHandled = true;
-    ++mHandledCount;
-  }
-
-  bool BoolSlotFloatValue( float p1 )
-  {
-    mFloatParam1 = p1;
-    mHandled = true;
-    ++mHandledCount;
-    return mBoolReturn;
-  }
-
-  bool BoolSlotFloatValueIntValue( float p1, int p2 )
-  {
-    mFloatParam1 = p1;
-    mIntParam2 = p2;
-    mHandled = true;
-    ++mHandledCount;
-    return mBoolReturn;
-  }
-
-  int IntSlotFloatValueIntValue( float p1, int p2 )
-  {
-    mFloatParam1 = p1;
-    mIntParam2 = p2;
-    mHandled = true;
-    ++mHandledCount;
-    return mIntReturn;
-  }
-
-  float FloatSlotVoid()
-  {
-    mHandled = true;
-    ++mHandledCount;
-    return mFloatReturn;
-  }
-
-  float FloatSlotFloatValueFloatValue( float p1, float p2 )
-  {
-    mFloatParam1 = p1;
-    mFloatParam2 = p2;
-    mHandled = true;
-    ++mHandledCount;
-    return mFloatReturn;
-  }
-
-  void VoidSlotFloatValue3( float p1, float p2, float p3 )
-  {
-    mFloatParam1 = p1;
-    mFloatParam2 = p2;
-    mFloatParam3 = p3;
-    mHandled = true;
-    ++mHandledCount;
-  }
-
-  float FloatSlotFloatValue3( float p1, float p2, float p3 )
-  {
-    mFloatParam1 = p1;
-    mFloatParam2 = p2;
-    mFloatParam3 = p3;
-    mHandled = true;
-    ++mHandledCount;
-    return mFloatReturn;
-  }
-
-  int mIntParam1, mIntParam2, mIntParam3;
-  float mFloatParam1, mFloatParam2, mFloatParam3;
-  bool mBoolReturn;
-  int mIntReturn;
-  float mFloatReturn;
-  bool mHandled;
-  int mHandledCount;
-};
+  wasStaticFloatCallbackVoidCalled = true;
+  return 7.0f;
+}
 
-/**
- * A version of TestSlotHandler which disconnects during the callback
- */
-class TestSlotDisconnector : public ConnectionTracker
+void StaticVoidCallbackIntValue( int value )
 {
-public:
-
-  TestSlotDisconnector()
-  : mIntParam1( 0 ),
-    mIntParam2( 0 ),
-    mIntParam3( 0 ),
-    mFloatParam1( 0.0f ),
-    mFloatParam2( 0.0f ),
-    mBoolReturn( false ),
-    mIntReturn( 0 ),
-    mFloatReturn( 0.0f ),
-    mHandled( false )
-  {
-  }
-
-  void Reset()
-  {
-    mIntParam1 = 0;
-    mIntParam2 = 0;
-    mIntParam3 = 0;
-    mFloatParam1 = 0.0f;
-    mFloatParam2 = 0.0f;
-    mBoolReturn = false;
-    mIntReturn = 0;
-    mFloatReturn = 0.0f;
-    mHandled = false;
-  }
-
-  void VoidConnectVoid( TestSignals::VoidRetNoParamSignal& signal )
-  {
-    mVoidSignalVoid = &signal;
-    signal.Connect( this, &TestSlotDisconnector::VoidSlotVoid );
-  }
-
-  void VoidSlotVoid()
-  {
-    mVoidSignalVoid->Disconnect( this, &TestSlotDisconnector::VoidSlotVoid );
-    mHandled = true;
-  }
-
-  void VoidConnectIntRef( TestSignals::VoidRet1RefParamSignal& signal )
-  {
-    mVoidSignalIntRef = &signal;
-    signal.Connect( this, &TestSlotDisconnector::VoidSlotIntRef );
-  }
-
-  void VoidSlotIntRef( int& p1 )
-  {
-    mVoidSignalIntRef->Disconnect( this, &TestSlotDisconnector::VoidSlotIntRef );
-    mIntParam1 = p1;
-    mHandled = true;
-  }
-
-  void VoidSlotIntValue( int p1 )
-  {
-    mIntParam1 = p1;
-    mHandled = true;
-  }
-
-  void VoidSlotIntValueIntValue( int p1, int p2 )
-  {
-    mIntParam1 = p1;
-    mIntParam2 = p2;
-    mHandled = true;
-  }
-
-  bool BoolSlotFloatValue( float p1 )
-  {
-    mFloatParam1 = p1;
-    mHandled = true;
-    return mBoolReturn;
-  }
-
-  bool BoolSlotFloatValueIntValue( float p1, int p2 )
-  {
-    mFloatParam1 = p1;
-    mIntParam2 = p2;
-    mHandled = true;
-    return mBoolReturn;
-  }
-
-  int IntSlotFloatValueIntValue( float p1, int p2 )
-  {
-    mFloatParam1 = p1;
-    mIntParam2 = p2;
-    mHandled = true;
-    return mIntReturn;
-  }
-
-  float FloatSlotVoid()
-  {
-    mHandled = true;
-    return mFloatReturn;
-  }
-
-  float FloatSlotFloatValueFloatValue( float p1, float p2 )
-  {
-    mFloatParam1 = p1;
-    mFloatParam2 = p2;
-    mHandled = true;
-    return mFloatReturn;
-  }
-
-  TestSignals::VoidRetNoParamSignal*   mVoidSignalVoid;
-  TestSignals::VoidRet1RefParamSignal* mVoidSignalIntRef;
-
-  int mIntParam1, mIntParam2, mIntParam3;
-  float mFloatParam1, mFloatParam2;
-  bool mBoolReturn;
-  int mIntReturn;
-  float mFloatReturn;
-  bool mHandled;
-};
+  wasStaticVoidCallbackIntValueCalled = true;
+  staticIntValue = value;
+}
 
-/**
- * A more complicated version of TestSlotDisconnector, which disconnects some but not all callbacks
- */
-class TestSlotMultiDisconnector : public ConnectionTracker
+float StaticFloatCallbackFloatValueFloatValue( float value1, float value2 )
 {
-public:
+  wasStaticFloatCallbackFloatValueFloatValueCalled = true;
+  staticFloatValue1 = value1;
+  staticFloatValue2 = value2;
+  return value1 + value2;
+}
 
-  static const int NUM_SLOTS = 10;
+} // anon namespace
 
-  TestSlotMultiDisconnector()
-  : mVoidSignalVoid( NULL )
-  {
-    Reset();
-  }
 
-  void Reset()
-  {
-    for( int i=0; i<NUM_SLOTS; ++i )
-    {
-      mSlotHandled[i] = false;
-    }
-  }
 
-  void ConnectAll( TestSignals::VoidRetNoParamSignal& signal )
-  {
-    mVoidSignalVoid = &signal;
-    signal.Connect( this, &TestSlotMultiDisconnector::Slot0 );
-    signal.Connect( this, &TestSlotMultiDisconnector::Slot1 );
-    signal.Connect( this, &TestSlotMultiDisconnector::Slot2 );
-    signal.Connect( this, &TestSlotMultiDisconnector::Slot3 );
-    signal.Connect( this, &TestSlotMultiDisconnector::Slot4 );
-    signal.Connect( this, &TestSlotMultiDisconnector::Slot5 );
-    signal.Connect( this, &TestSlotMultiDisconnector::Slot6 );
-    signal.Connect( this, &TestSlotMultiDisconnector::Slot7 );
-    signal.Connect( this, &TestSlotMultiDisconnector::Slot8 );
-    signal.Connect( this, &TestSlotMultiDisconnector::Slot9 );
-  }
+/*******************************************
+ *
+ * Start of Utc test cases.
+ * Test cases performed in order of API listed in dali-signal.h
+ * UtcDaliSignal + FunctionName + P=positive test, N = Negative test
+ *
+ */
 
-  void Slot0()
-  {
-    mSlotHandled[0] = true;
-  }
+int UtcDaliSignalEmptyP(void)
+{
+  TestApplication app; // Create core for debug logging
 
-  void Slot1()
-  {
-    mSlotHandled[1] = true;
-  }
+  // Test that Empty() is true, when no slots connected to the signal
 
-  void Slot2()
   {
-    mSlotHandled[2] = true;
+    TestSignals::VoidRetNoParamSignal signal;
+    DALI_TEST_CHECK( signal.Empty() );
   }
 
-  void Slot3()
+  // Test that Empty() is true, when a slot has connected and disconnected
   {
-    mSlotHandled[3] = true;
-
-    // Disconnect the odd numbered lots, because we can
-    mVoidSignalVoid->Disconnect( this, &TestSlotMultiDisconnector::Slot1 );
-    mVoidSignalVoid->Disconnect( this, &TestSlotMultiDisconnector::Slot3 );
-    mVoidSignalVoid->Disconnect( this, &TestSlotMultiDisconnector::Slot5 );
-    mVoidSignalVoid->Disconnect( this, &TestSlotMultiDisconnector::Slot7 );
-    mVoidSignalVoid->Disconnect( this, &TestSlotMultiDisconnector::Slot9 );
+    TestSignals::VoidRetNoParamSignal signal;
+    TestSlotHandler handler;
+    signal.Connect( &handler, &TestSlotHandler::VoidSlotVoid );
+    signal.Disconnect( &handler, &TestSlotHandler::VoidSlotVoid );
+    DALI_TEST_CHECK( signal.Empty() );
   }
 
-  void Slot4()
-  {
-    mSlotHandled[4] = true;
-  }
+  END_TEST;
+}
 
-  void Slot5()
-  {
-    mSlotHandled[5] = true;
-  }
+int UtcDaliSignalEmptyN(void)
+{
+  TestApplication app; // Create core for debug logging
 
-  void Slot6()
-  {
-    mSlotHandled[6] = true;
-  }
+  // Test that Empty() is false after signal connection
+  TestSignals::VoidRetNoParamSignal signal;
+  TestSlotHandler handler;
+  signal.Connect( &handler, &TestSlotHandler::VoidSlotVoid );
+  DALI_TEST_CHECK( ! signal.Empty() );
 
-  void Slot7()
-  {
-    mSlotHandled[7] = true;
-  }
+  END_TEST;
+}
 
-  void Slot8()
-  {
-    mSlotHandled[8] = true;
-  }
+int UtcDaliSignalGetConnectionCountP(void)
+{
+  TestApplication app; // Create core for debug logging
 
-  void Slot9()
-  {
-    mSlotHandled[9] = true;
-  }
+  TestSignals::VoidRetNoParamSignal signal;
+  TestSlotHandler handler;
+  signal.Connect( &handler, &TestSlotHandler::VoidSlotVoid );
+  DALI_TEST_CHECK( signal.GetConnectionCount() == 1 );
 
-  TestSignals::VoidRetNoParamSignal* mVoidSignalVoid;
+  TestSlotHandler handler2;
+  signal.Connect( &handler2, &TestSlotHandler::VoidSlotVoid );
+  DALI_TEST_CHECK( signal.GetConnectionCount() == 2 );
 
-  bool mSlotHandled[NUM_SLOTS];
-};
+  END_TEST;
+}
 
+int UtcDaliSignalGetConnectionCountN(void)
+{
+  TestApplication app; // Create core for debug logging
+  TestSignals::VoidRetNoParamSignal signal;
+  DALI_TEST_CHECK( signal.GetConnectionCount() == 0 );
+  END_TEST;
+}
 
 /**
- * A version of TestSlotHandler which disconnects during the callback
+ * there are 5 different connection functions
+ * we go through them here in order of definition in dali-signal.h
  */
-class TestEmitDuringCallback : public ConnectionTracker
+int UtcDaliSignalConnectP01(void)
 {
-public:
-
-  TestEmitDuringCallback()
-  : mVoidSignalVoid( NULL ),
-    mHandled( false )
-  {
-  }
-
-  void VoidConnectVoid( TestSignals::VoidRetNoParamSignal& signal )
-  {
-    mVoidSignalVoid = &signal;
-    signal.Connect( this, &TestEmitDuringCallback::VoidSlotVoid );
-  }
-
-  void VoidSlotVoid()
-  {
-    // Emitting during Emit is very bad!
-    mVoidSignalVoid->Emit();
-
-    mHandled = true;
-  }
+  TestApplication app; // Create core for debug logging
 
-  TestSignals::VoidRetNoParamSignal* mVoidSignalVoid;
+  // test static function: void Connect( void (*func)() )
+  TestSignals::VoidRetNoParamSignal signal;
+  signal.Connect( StaticVoidCallbackVoid );
+  DALI_TEST_CHECK( ! signal.Empty() );
 
-  bool mHandled;
-};
 
+  END_TEST;
+}
 
-/**
- * A version of TestSlotHandler which uses SlotDelegate
- */
-class TestSlotDelegateHandler // This does not inherit from ConnectionTrackerInterface!
+int UtcDaliSignalConnectN01(void)
 {
-public:
-
-  TestSlotDelegateHandler()
-  : mSlotDelegate( this ),
-    mIntParam1( 0 ),
-    mIntParam2( 0 ),
-    mIntParam3( 0 ),
-    mFloatParam1( 0.0f ),
-    mFloatParam2( 0.0f ),
-    mFloatParam3( 0.0f ),
-    mBoolReturn( false ),
-    mIntReturn( 0 ),
-    mFloatReturn( 0.0f ),
-    mHandled( false ),
-    mHandledCount( 0 )
-  {
-  }
-
-  void Reset()
-  {
-    mIntParam1 = 0;
-    mIntParam2 = 0;
-    mIntParam3 = 0;
-    mFloatParam1 = 0.0f;
-    mFloatParam2 = 0.0f;
-    mFloatParam3 = 0.0f;
-    mBoolReturn = false;
-    mIntReturn = 0;
-    mFloatReturn = 0.0f;
-    mHandled = false;
-  }
-
-  void VoidSlotVoid()
-  {
-    mHandled = true;
-    ++mHandledCount;
-  }
+  // difficult to perform a negative test on Connect as no checks are performed
+  // when creating a callback for a null function ( during Connect).
+  // so we test an assert on Emit
+  TestApplication app; // Create core for debug logging
 
-  void VoidSlotIntRef( int& p1 )
+  TestSignals::VoidRetNoParamSignal signal;
+  signal.Connect( NULL );
+  try
   {
-    mIntParam1 = p1;
-    mHandled = true;
-    ++mHandledCount;
+    signal.Emit();
   }
-
-  void VoidSlotIntValue( int p1 )
+  catch (Dali::DaliException& e)
   {
-    mIntParam1 = p1;
-    mHandled = true;
-    ++mHandledCount;
+    // Tests that a negative test of an assertion succeeds
+    DALI_TEST_PRINT_ASSERT( e );
+    tet_result(TET_PASS);
   }
+  END_TEST;
+}
 
-  void VoidDuplicateSlotIntValue( int p1 )
-  {
-    mIntParam2 = p1;
-    mHandled = true;
-    ++mHandledCount;
-  }
 
-  void VoidSlotIntValueIntValue( int p1, int p2 )
-  {
-    mIntParam1 = p1;
-    mIntParam2 = p2;
-    mHandled = true;
-    ++mHandledCount;
-  }
+int UtcDaliSignalConnectP02(void)
+{
+  TestApplication app; // Create core for debug logging
 
-  bool BoolSlotFloatValue( float p1 )
-  {
-    mFloatParam1 = p1;
-    mHandled = true;
-    ++mHandledCount;
-    return mBoolReturn;
-  }
+  // test member function: Connect( X* obj, void (X::*func)() ))
+  TestSignals::VoidRetNoParamSignal signal;
+  TestSlotHandler handler;
+  signal.Connect( &handler, &TestSlotHandler::VoidSlotVoid );
+  DALI_TEST_CHECK( ! signal.Empty() );
+  signal.Emit();
+  DALI_TEST_CHECK( handler.mHandled == true );
+  END_TEST;
+}
 
-  bool BoolSlotFloatValueIntValue( float p1, int p2 )
-  {
-    mFloatParam1 = p1;
-    mIntParam2 = p2;
-    mHandled = true;
-    ++mHandledCount;
-    return mBoolReturn;
-  }
+int UtcDaliSignalConnectN02(void)
+{
+  TestApplication app; // Create core for debug logging
 
-  int IntSlotFloatValueIntValue( float p1, int p2 )
+  TestSignals::VoidRetNoParamSignal signal;
+  try
   {
-    mFloatParam1 = p1;
-    mIntParam2 = p2;
-    mHandled = true;
-    ++mHandledCount;
-    return mIntReturn;
+    // test member function: Connect( X* obj, void (X::*func)() )) with NULL object
+    signal.Connect( static_cast<TestSlotHandler*>(NULL), &TestSlotHandler::VoidSlotVoid );
   }
-
-  float FloatSlotVoid()
+  catch (Dali::DaliException& e)
   {
-    mHandled = true;
-    ++mHandledCount;
-    return mFloatReturn;
+    // Tests that a negative test of an assertion succeeds
+    DALI_TEST_PRINT_ASSERT( e );
+    tet_result(TET_PASS);
   }
+  END_TEST;
+}
 
-  float FloatSlotFloatValueFloatValue( float p1, float p2 )
-  {
-    mFloatParam1 = p1;
-    mFloatParam2 = p2;
-    mHandled = true;
-    ++mHandledCount;
-    return mFloatReturn;
-  }
 
-  void VoidSlotFloatValue3( float p1, float p2, float p3 )
-  {
-    mFloatParam1 = p1;
-    mFloatParam2 = p2;
-    mFloatParam3 = p3;
-    mHandled = true;
-    ++mHandledCount;
-  }
+int UtcDaliSignalConnectP03(void)
+{
+  TestApplication app; // Create core for debug logging
 
-  float FloatSlotFloatValue3( float p1, float p2, float p3 )
-  {
-    mFloatParam1 = p1;
-    mFloatParam2 = p2;
-    mFloatParam3 = p3;
-    mHandled = true;
-    ++mHandledCount;
-    return mFloatReturn;
-  }
+  // test slot delegate: Connect( SlotDelegate<X>& delegate, void (X::*func)() )
+  TestSignals::VoidRetNoParamSignal signal;
+  TestSlotDelegateHandler handler;
+  signal.Connect( handler.mSlotDelegate, &TestSlotDelegateHandler::VoidSlotVoid );
+  DALI_TEST_CHECK( ! signal.Empty() );
+  signal.Emit();
+  DALI_TEST_CHECK( handler.mHandled == true );
 
-  SlotDelegate<TestSlotDelegateHandler> mSlotDelegate;
+  END_TEST;
+}
 
-  int mIntParam1, mIntParam2, mIntParam3;
-  float mFloatParam1, mFloatParam2, mFloatParam3;
-  bool mBoolReturn;
-  int mIntReturn;
-  float mFloatReturn;
-  bool mHandled;
-  int mHandledCount;
-};
+int UtcDaliSignalConnectN03(void)
+{
+  TestApplication app; // Create core for debug logging
+  // the delegate is passed by reference, so you can't pass null.
+  tet_result( TET_PASS );
+  END_TEST;
+}
 
-/**
- * Test that reimplmenting ConnectionTrackerInterface actually works.
- * This basic connection tracker only allows one callback to be connected.
- */
-class TestBasicConnectionTrackerInterface : public ConnectionTrackerInterface
+int UtcDaliSignalConnectP04(void)
 {
-public:
+  TestApplication app; // Create core for debug logging
 
-  TestBasicConnectionTrackerInterface()
-  : mCallbackHandled( false ),
-    mCallback( NULL ),
-    mSlotObserver( NULL )
+  //  test function object: Connect( ConnectionTrackerInterface* connectionTracker, const X& func )
+  TestSlotHandler handler;
+  TestSignals::VoidRetNoParamSignal signal;
+  bool functorCalled(false);
+  TestFunctor functor( functorCalled );
+  signal.Connect( &handler, functor );
+  DALI_TEST_CHECK( ! signal.Empty() );
+  signal.Emit();
+  DALI_TEST_CHECK( functorCalled == true );
+
+  END_TEST;
+}
+
+int UtcDaliSignalConnectN04(void)
+{
+  // for negative test we try to connect a null connection tracker to the signal
+  TestSignals::VoidRetNoParamSignal signal;
+  TestSlotHandler *nullHandler( NULL );
+  try
   {
+    signal.Connect( nullHandler , &TestSlotHandler::VoidSlotVoid  );
   }
-
-  ~TestBasicConnectionTrackerInterface()
+  catch (Dali::DaliException& e)
   {
-    if( mSlotObserver && mCallback )
-    {
-      // Notify signal since the slot has been destroyed
-      mSlotObserver->SlotDisconnected( mCallback );
-      // mCallback and mSlotObserver are not owned
-    }
+    // Tests that a negative test of an assertion succeeds
+    DALI_TEST_PRINT_ASSERT( e );
+    tet_result( TET_PASS );
   }
 
-  /**
-   * An example slot
-   */
-  void VoidSlotVoid()
+  END_TEST;
+
+}
+
+int UtcDaliSignalConnectP05(void)
+{
+  TestApplication app; // Create core for debug logging
+
+  // test function object using FunctorDelegate.
+  // :Connect( ConnectionTrackerInterface* connectionTracker, FunctorDelegate* delegate )
   {
-    mCallbackHandled = true;
+    TestSlotHandler handler;
+    TestSignals::VoidRetNoParamSignal signal;
+    bool functorDelegateCalled(false);
+    signal.Connect( &handler, FunctorDelegate::New( VoidFunctorVoid(functorDelegateCalled) ));
+    DALI_TEST_CHECK( ! signal.Empty() );
+    signal.Emit();
+    DALI_TEST_CHECK( functorDelegateCalled == true );
   }
-
-  /**
-   * @copydoc ConnectionTrackerInterface::GetConnectionCount
-   */
-  virtual std::size_t GetConnectionCount() const
   {
-    if( mCallback )
-    {
-      return 1u;
-    }
-
-    return 0u;
+    TestSlotHandler handler;
+    TestSignals::VoidRet1ValueParamSignal signal;
+    bool functorDelegateCalled(false);
+    signal.Connect( &handler, FunctorDelegate::New( VoidFunctorVoid(functorDelegateCalled) ));
+    DALI_TEST_CHECK( ! signal.Empty() );
+    signal.Emit(1);
   }
+  END_TEST;
+}
 
-  /**
-   * @copydoc ConnectionTrackerInterface::SignalConnected
-   */
-  virtual void SignalConnected( SlotObserver* slotObserver, CallbackBase* callback )
-  {
-    DALI_ASSERT_ALWAYS( NULL == mCallback && "Only one connection supported!" );
+int UtcDaliSignalConnectN05(void)
+{
+  TestApplication app; // Create core for debug logging
 
-    mCallback = callback;
-    mSlotObserver = slotObserver;
+  // for negative test we try to connect a null connection tracker to the signal
+  // :Connect( ConnectionTrackerInterface == NULL, FunctorDelegate* delegate )
+  TestSlotHandler *nullHandler( NULL );
+  TestSignals::VoidRetNoParamSignal signal;
+  bool functorDelegateCalled(false);
+  try
+  {
+    signal.Connect( nullHandler, FunctorDelegate::New( VoidFunctorVoid(functorDelegateCalled) ));
   }
-
-  /**
-   * @copydoc ConnectionTrackerInterface::SignalDisconnected
-   */
-  virtual void SignalDisconnected( SlotObserver* slotObserver, CallbackBase* callback )
+  catch (Dali::DaliException& e)
   {
-    if( mSlotObserver == slotObserver )
-    {
-      mSlotObserver = NULL;
-      mCallback = NULL;
-      // mCallback and mSlotObserver are not owned
-    }
+    DALI_TEST_PRINT_ASSERT( e );
+    tet_result( TET_PASS );
   }
+  END_TEST;
+}
 
-private:
-
-  TestBasicConnectionTrackerInterface( const TestBasicConnectionTrackerInterface& );            ///< undefined copy constructor
-  TestBasicConnectionTrackerInterface& operator=( const TestBasicConnectionTrackerInterface& ); ///< undefined assignment operator
 
-public:
+/**
+ * there 3 different disconnect functions
+ *  we go through them here in order of definition in dali-signal.h
+ */
+int UtcDaliSignalDisconnectP01(void)
+{
+  TestApplication app; // Create core for debug logging
 
-  bool mCallbackHandled;
+  // test static function:  Disconnect( void (*func)( Arg0 arg0 ) )
 
-private:
+  TestSignals::VoidRetNoParamSignal signal;
+  signal.Connect( StaticVoidCallbackVoid );
+  DALI_TEST_CHECK( ! signal.Empty() );
+  signal.Disconnect( StaticVoidCallbackVoid );
+  DALI_TEST_CHECK( signal.Empty() );
 
-  CallbackBase* mCallback;     ///< callback, has ownership
-  SlotObserver* mSlotObserver; ///< a pointer to the slot observer (not owned)
-};
+  END_TEST;
 
+ }
+int UtcDaliSignalDisconnectN01(void)
+{
+  TestApplication app; // Create core for debug logging
 
-bool wasStaticVoidCallbackVoidCalled  = false;
-bool wasStaticFloatCallbackVoidCalled = false;
-bool wasStaticVoidCallbackIntValueCalled = false;
-int staticIntValue = 0;
-bool wasStaticFloatCallbackFloatValueFloatValueCalled = false;
-float staticFloatValue1 = 0.0f;
-float staticFloatValue2 = 0.0f;
+  // 1. Disconnect using the function
+  TestSignals::VoidRetNoParamSignal signal;
+  signal.Connect( StaticVoidCallbackVoid );
+  DALI_TEST_CHECK( ! signal.Empty() );
 
-static void StaticVoidCallbackVoid()
-{
-  wasStaticVoidCallbackVoidCalled = true;
-}
+  signal.Disconnect( AlternativeVoidCallbackVoid );
 
-static float StaticFloatCallbackVoid()
-{
-  wasStaticFloatCallbackVoidCalled = true;
-  return 7.0f;
-}
+  DALI_TEST_CHECK( ! signal.Empty() );
 
-static void StaticVoidCallbackIntValue( int value )
-{
-  wasStaticVoidCallbackIntValueCalled = true;
-  staticIntValue = value;
+  END_TEST;
 }
 
-static float StaticFloatCallbackFloatValueFloatValue( float value1, float value2 )
+int UtcDaliSignalDisconnectP02(void)
 {
-  wasStaticFloatCallbackFloatValueFloatValueCalled = true;
-  staticFloatValue1 = value1;
-  staticFloatValue2 = value2;
-  return value1 + value2;
-}
+  TestApplication app; // Create core for debug logging
 
-} // anon namespace
+  // test member function: Disconnect( X* obj, void (X::*func)( Arg0 arg0 ) )
+  TestSignals::VoidRetNoParamSignal signal;
+  TestSlotHandler handler;
+  signal.Connect( &handler, &TestSlotHandler::VoidSlotVoid );
+  DALI_TEST_CHECK( ! signal.Empty() );
+  signal.Disconnect( &handler, &TestSlotHandler::VoidSlotVoid  );
+  DALI_TEST_CHECK( signal.Empty() );
 
+  END_TEST;
 
-int UtcDaliSignalEmptyCheck(void)
+}
+int UtcDaliSignalDisconnectN02(void)
 {
-  // Test that Empty() check works before & after signal connection
+  TestApplication app; // Create core for debug logging
 
-  {
-    TestSignals::VoidRetNoParamSignal signal;
-    DALI_TEST_CHECK( signal.Empty() );
-    TestSlotHandler handler;
-    signal.Connect( &handler, &TestSlotHandler::VoidSlotVoid );
-    DALI_TEST_CHECK( ! signal.Empty() );
-  }
+  // 1. Disconnect using a null connection tracker
+  TestSignals::VoidRetNoParamSignal signal;
+  TestSlotHandler handler;
 
-  {
-    TestSignals::VoidRet1ValueParamSignal signal;
-    DALI_TEST_CHECK( signal.Empty() );
-    TestSlotHandler handler;
-    signal.Connect( &handler, &TestSlotHandler::VoidSlotIntValue );
-    DALI_TEST_CHECK( ! signal.Empty() );
-  }
+  signal.Connect( &handler , &TestSlotHandler::VoidSlotVoid  );
+  DALI_TEST_CHECK( !signal.Empty() );
 
+  try
   {
-    TestSignals::VoidRet1RefParamSignal signal;
-    DALI_TEST_CHECK( signal.Empty() );
-    TestSlotHandler handler;
-    signal.Connect( &handler, &TestSlotHandler::VoidSlotIntRef );
-    DALI_TEST_CHECK( ! signal.Empty() );
+    TestSlotHandler* nullHandler( NULL );
+    signal.Disconnect( nullHandler , &TestSlotHandler::VoidSlotVoid  );
   }
-
+  catch(Dali::DaliException& e)
   {
-    TestSignals::VoidRet2ValueParamSignal signal;
-    DALI_TEST_CHECK( signal.Empty() );
-    TestSlotHandler handler;
-    signal.Connect( &handler, &TestSlotHandler::VoidSlotIntValueIntValue );
-    DALI_TEST_CHECK( ! signal.Empty() );
+    // Tests that a negative test of an assertion succeeds
+    DALI_TEST_PRINT_ASSERT( e );
+    DALI_TEST_CHECK( !signal.Empty() );
   }
+  END_TEST;
+}
 
-  {
-    TestSignals::BoolRet1ValueParamSignal signal;
-    DALI_TEST_CHECK( signal.Empty() );
-    TestSlotHandler handler;
-    signal.Connect( &handler, &TestSlotHandler::BoolSlotFloatValue );
-    DALI_TEST_CHECK( ! signal.Empty() );
-  }
+int UtcDaliSignalDisconnectP03(void)
+{
+  TestApplication app; // Create core for debug logging
 
-  {
-    TestSignals::BoolRet2ValueParamSignal signal;
-    DALI_TEST_CHECK( signal.Empty() );
-    TestSlotHandler handler;
-    signal.Connect( &handler, &TestSlotHandler::BoolSlotFloatValueIntValue );
-    DALI_TEST_CHECK( ! signal.Empty() );
-  }
+  // test slot delegate: Disconnect( SlotDelegate<X>& delegate, void (X::*func)( Arg0 arg0 ) )
+  TestSignals::VoidRetNoParamSignal signal;
+  TestSlotDelegateHandler handler;
+  signal.Connect( handler.mSlotDelegate, &TestSlotDelegateHandler::VoidSlotVoid );
+  DALI_TEST_CHECK( ! signal.Empty() );
+  signal.Disconnect( handler.mSlotDelegate, &TestSlotDelegateHandler::VoidSlotVoid );
+  DALI_TEST_CHECK( signal.Empty() );
 
-  {
-    TestSignals::IntRet2ValueParamSignal signal;
-    DALI_TEST_CHECK( signal.Empty() );
-    TestSlotHandler handler;
-    signal.Connect( &handler, &TestSlotHandler::IntSlotFloatValueIntValue );
-    DALI_TEST_CHECK( ! signal.Empty() );
-  }
+  END_TEST;
+}
 
-  {
-    TestSignals::FloatRet0ParamSignal signal;
-    DALI_TEST_CHECK( signal.Empty() );
-    TestSlotHandler handler;
-    signal.Connect( &handler, &TestSlotHandler::FloatSlotVoid );
-    DALI_TEST_CHECK( ! signal.Empty() );
-  }
+int UtcDaliSignalDisconnectN03(void)
+{
+  TestApplication app; // Create core for debug logging
+
+   // try to disconnect from the wrong signal
+  TestSignals::VoidRetNoParamSignal signal;
+  TestSlotDelegateHandler handler;
+  signal.Connect( handler.mSlotDelegate, &TestSlotDelegateHandler::VoidSlotVoid );
+
+  // use different signal
+  signal.Disconnect( handler.mSlotDelegate , &TestSlotDelegateHandler::AlternativeVoidSlotVoid  );
+
+  DALI_TEST_CHECK( !signal.Empty() );
 
-  {
-    TestSignals::FloatRet2ValueParamSignal signal;
-    DALI_TEST_CHECK( signal.Empty() );
-    TestSlotHandler handler;
-    signal.Connect(&handler, &TestSlotHandler::FloatSlotFloatValueFloatValue);
-    DALI_TEST_CHECK( ! signal.Empty() );
-  }
   END_TEST;
+
 }
 
+/*******************************************
+ *
+ * End of Utc test cases for the individual API's of Signals
+ * The following testing Signals functionality as a whole
+ *
+ *
+ */
+
 int UtcDaliSignalEmptyCheckSlotDestruction(void)
 {
   // Test that signal disconnect works when slot is destroyed (goes out of scope)
-
   {
     TestSignals::VoidRetNoParamSignal signal;
     {
@@ -1154,7 +595,7 @@ int UtcDaliSignalEmptyCheckSlotDestruction(void)
 }
 
 // Positive test case for a method
-int UtcDaliSignalConnectAndEmit(void)
+int UtcDaliSignalConnectAndEmit01P(void)
 {
   // Test basic signal emission for each slot type
 
@@ -1189,7 +630,7 @@ int UtcDaliSignalConnectAndEmit(void)
     TestSlotHandler handlers;
     signals.SignalVoid1Value().Connect(&handlers, &TestSlotHandler::VoidSlotIntValue);
     DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
-    signals.EmitVoidSignalIntValue(5);
+    signals.EmitVoidSignal1IntValue(5);
     DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
     DALI_TEST_EQUALS( handlers.mIntParam1, 5, TEST_LOCATION );
   }
@@ -1199,7 +640,7 @@ int UtcDaliSignalConnectAndEmit(void)
     TestSlotHandler handlers;
     signals.SignalVoid2Value().Connect(&handlers, &TestSlotHandler::VoidSlotIntValueIntValue);
     DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
-    signals.EmitVoidSignalIntValueIntValue(6, 7);
+    signals.EmitVoidSignal2IntValue(6, 7);
     DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
     DALI_TEST_EQUALS( handlers.mIntParam1, 6, TEST_LOCATION );
     DALI_TEST_EQUALS( handlers.mIntParam2, 7, TEST_LOCATION );
@@ -1290,10 +731,10 @@ int UtcDaliSignalConnectAndEmit(void)
 
   {
     TestSlotHandler handlers;
-    signals.FloatSignalFloatValue3().Connect(&handlers, &TestSlotHandler::FloatSlotFloatValue3);
+    signals.SignalFloat3Value().Connect(&handlers, &TestSlotHandler::FloatSlotFloatValue3);
     DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
     handlers.mFloatReturn = 27.0f;
-    float returnValue = signals.EmitFloatSignalFloatValue3(5, 33.0f, 100.0f);
+    float returnValue = signals.EmitFloat3VSignal(5, 33.0f, 100.0f);
     DALI_TEST_EQUALS( returnValue, 27.0f, TEST_LOCATION );
     DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
     DALI_TEST_EQUALS( handlers.mFloatParam1, 5.0f, TEST_LOCATION );
@@ -1304,6 +745,75 @@ int UtcDaliSignalConnectAndEmit(void)
   END_TEST;
 }
 
+int UtcDaliSignalConnectAndEmit02P(void)
+{
+  // testing connection of static functions
+  TestSignals signals;
+  StaticFunctionHandlers handlers;
+
+  // void ( void )
+  signals.SignalVoidNone().Connect( &StaticFunctionHandlers::VoidSlotVoid );
+  DALI_TEST_EQUALS( handlers.staticFunctionHandled, false, TEST_LOCATION );
+  signals.EmitVoidSignalVoid();
+  DALI_TEST_EQUALS( handlers.staticFunctionHandled, true, TEST_LOCATION );
+
+
+  // void ( p1 )
+  handlers.Reset();
+  signals.SignalVoid1Value().Connect( &StaticFunctionHandlers::VoidSlot1Param );
+  DALI_TEST_EQUALS( handlers.staticFunctionHandled, false, TEST_LOCATION );
+  signals.EmitVoidSignal1IntValue( 1 );
+  DALI_TEST_EQUALS( handlers.staticFunctionHandled, true, TEST_LOCATION );
+
+  // void ( p1, p2 )
+  handlers.Reset();
+  signals.SignalVoid2Value().Connect( &StaticFunctionHandlers::VoidSlot2Param );
+  DALI_TEST_EQUALS( handlers.staticFunctionHandled, false, TEST_LOCATION );
+  signals.EmitVoidSignal2IntValue( 1, 2 );
+  DALI_TEST_EQUALS( handlers.staticFunctionHandled, true, TEST_LOCATION );
+
+
+  // void ( p1, p2, p3 )
+  handlers.Reset();
+  signals.SignalVoid3Value().Connect( &StaticFunctionHandlers::VoidSlot3Param );
+  DALI_TEST_EQUALS( handlers.staticFunctionHandled, false, TEST_LOCATION );
+  signals.EmitVoidSignal3IntValue( 1, 2, 3 );
+  DALI_TEST_EQUALS( handlers.staticFunctionHandled, true, TEST_LOCATION );
+
+  // ret ( )
+  handlers.Reset();
+  signals.SignalFloat0().Connect( &StaticFunctionHandlers::RetSlot0Param );
+  DALI_TEST_EQUALS( handlers.staticFunctionHandled, false, TEST_LOCATION );
+  signals.EmitFloat0Signal();
+  DALI_TEST_EQUALS( handlers.staticFunctionHandled, true, TEST_LOCATION );
+
+  // ret ( p1 )
+  handlers.Reset();
+  signals.SignalFloat1Value().Connect( &StaticFunctionHandlers::RetSlot1Param );
+  DALI_TEST_EQUALS( handlers.staticFunctionHandled, false, TEST_LOCATION );
+  signals.EmitFloat1VSignal( 1.f );
+  DALI_TEST_EQUALS( handlers.staticFunctionHandled, true, TEST_LOCATION );
+
+  // ret ( p1, p2 )
+  handlers.Reset();
+  signals.SignalFloat2Value().Connect( &StaticFunctionHandlers::RetSlot2Param );
+  DALI_TEST_EQUALS( handlers.staticFunctionHandled, false, TEST_LOCATION );
+  signals.EmitFloat2VSignal( 1.f, 2.f );
+  DALI_TEST_EQUALS( handlers.staticFunctionHandled, true, TEST_LOCATION );
+
+
+  // ret ( p1, p2, p3 )
+  handlers.Reset();
+  signals.SignalFloat3Value().Connect( &StaticFunctionHandlers::RetSlot3Param );
+  DALI_TEST_EQUALS( handlers.staticFunctionHandled, false, TEST_LOCATION );
+  signals.EmitFloat3VSignal( 1.f, 2.f, 3.f );
+  DALI_TEST_EQUALS( handlers.staticFunctionHandled, true, TEST_LOCATION );
+
+  END_TEST;
+
+}
+
+
 int UtcDaliSignalDisconnect(void)
 {
   // Test that callbacks don't occur if a signal is disconnected before emission
@@ -1337,7 +847,7 @@ int UtcDaliSignalDisconnect(void)
     signals.SignalVoid1Value().Connect(&handlers, &TestSlotHandler::VoidSlotIntValue);
     DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
     signals.SignalVoid1Value().Disconnect(&handlers, &TestSlotHandler::VoidSlotIntValue);
-    signals.EmitVoidSignalIntValue(5);
+    signals.EmitVoidSignal1IntValue(5);
     DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
     DALI_TEST_EQUALS( handlers.mIntParam1, 0, TEST_LOCATION );
   }
@@ -1347,7 +857,7 @@ int UtcDaliSignalDisconnect(void)
     signals.SignalVoid2Value().Connect(&handlers, &TestSlotHandler::VoidSlotIntValueIntValue);
     DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
     signals.SignalVoid2Value().Disconnect(&handlers, &TestSlotHandler::VoidSlotIntValueIntValue);
-    signals.EmitVoidSignalIntValueIntValue(5, 10);
+    signals.EmitVoidSignal2IntValue(5, 10);
     DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
     DALI_TEST_EQUALS( handlers.mIntParam1, 0, TEST_LOCATION );
     DALI_TEST_EQUALS( handlers.mIntParam2, 0, TEST_LOCATION );
@@ -1439,7 +949,7 @@ int UtcDaliSignalDisconnect2(void)
   {
     TestSlotHandler handlers;
     signals.SignalVoid1Value().Disconnect(&handlers, &TestSlotHandler::VoidSlotIntValue);
-    signals.EmitVoidSignalIntValue(5);
+    signals.EmitVoidSignal1IntValue(5);
     DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
     DALI_TEST_EQUALS( handlers.mIntParam1, 0, TEST_LOCATION );
   }
@@ -1447,7 +957,7 @@ int UtcDaliSignalDisconnect2(void)
   {
     TestSlotHandler handlers;
     signals.SignalVoid2Value().Disconnect(&handlers, &TestSlotHandler::VoidSlotIntValueIntValue);
-    signals.EmitVoidSignalIntValueIntValue(5, 10);
+    signals.EmitVoidSignal2IntValue(5, 10);
     DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
     DALI_TEST_EQUALS( handlers.mIntParam1, 0, TEST_LOCATION );
     DALI_TEST_EQUALS( handlers.mIntParam2, 0, TEST_LOCATION );
@@ -1584,6 +1094,30 @@ int UtcDaliSignalCustomConnectionTracker(void)
     DALI_TEST_EQUALS( customTracker2.mCallbackHandled, true, TEST_LOCATION );
   }
   DALI_TEST_EQUALS( 0u, customTracker2.GetConnectionCount(), TEST_LOCATION );
+
+  // Test for removing a null callback
+  {
+     TestBasicConnectionTrackerInterface customTracker3;
+
+     TestSignals::VoidRetNoParamSignal signal;
+     DALI_TEST_CHECK( signal.Empty() );
+     DALI_TEST_EQUALS( 0u, customTracker3.GetConnectionCount(), TEST_LOCATION );
+
+     signal.Connect( &customTracker3, &TestBasicConnectionTrackerInterface::VoidSlotVoid );
+     DALI_TEST_CHECK( ! signal.Empty() );
+     DALI_TEST_EQUALS( 1u, customTracker3.GetConnectionCount(), TEST_LOCATION );
+     try
+     {
+       // should assert
+       customTracker3.RemoveNullCallback();
+       tet_result( TET_FAIL );
+     }
+     catch (Dali::DaliException& e)
+     {
+       tet_result( TET_PASS );
+     }
+   }
+
   END_TEST;
 }
 
@@ -1658,7 +1192,7 @@ int UtcDaliSignalMultipleConnections(void)
     signals.SignalVoid1Value().Connect( &handler3, &TestSlotHandler::VoidSlotIntValue );
     DALI_TEST_EQUALS( handler3.mHandled, false, TEST_LOCATION );
 
-    signals.EmitVoidSignalIntValue( 5 );
+    signals.EmitVoidSignal1IntValue( 5 );
     DALI_TEST_EQUALS( handler1.mHandled, true, TEST_LOCATION );
     DALI_TEST_EQUALS( handler1.mIntParam1, 5, TEST_LOCATION );
     DALI_TEST_EQUALS( handler2.mHandled, true, TEST_LOCATION );
@@ -1672,7 +1206,7 @@ int UtcDaliSignalMultipleConnections(void)
     handler3.Reset();
     signals.SignalVoid1Value().Disconnect( &handler2, &TestSlotHandler::VoidSlotIntValue );
 
-    signals.EmitVoidSignalIntValue( 6 );
+    signals.EmitVoidSignal1IntValue( 6 );
     DALI_TEST_EQUALS( handler1.mHandled, true, TEST_LOCATION );
     DALI_TEST_EQUALS( handler1.mIntParam1, 6, TEST_LOCATION );
     DALI_TEST_EQUALS( handler2.mHandled, false, TEST_LOCATION );
@@ -1723,7 +1257,7 @@ int UtcDaliSignalMultipleConnections2(void)
     signals.SignalVoid1Value().Connect( &handler1, &TestSlotHandler::VoidSlotIntValue );
     DALI_TEST_EQUALS( handler1.mHandledCount, 0, TEST_LOCATION );
 
-    signals.EmitVoidSignalIntValue( 6 );
+    signals.EmitVoidSignal1IntValue( 6 );
     DALI_TEST_EQUALS( handler1.mHandledCount, 1, TEST_LOCATION );
     DALI_TEST_EQUALS( handler1.mIntParam1, 6, TEST_LOCATION );
 
@@ -1732,7 +1266,7 @@ int UtcDaliSignalMultipleConnections2(void)
     DALI_TEST_CHECK( signals.SignalVoid1Value().Empty() );
     handler1.mIntParam1 = 0;
 
-    signals.EmitVoidSignalIntValue( 7 );
+    signals.EmitVoidSignal1IntValue( 7 );
     DALI_TEST_EQUALS( handler1.mHandledCount, 1/*not incremented since last check*/, TEST_LOCATION );
     DALI_TEST_EQUALS( handler1.mIntParam1, 0, TEST_LOCATION );
   }
@@ -1756,7 +1290,7 @@ int UtcDaliSignalMultipleConnections2(void)
   DALI_TEST_CHECK( signals.SignalBool1Value().Empty() );
 
   // Should be NOOP
-  signals.EmitVoidSignalIntValue( 1 );
+  signals.EmitVoidSignal1IntValue( 1 );
   signals.EmitBoolSignalFloatValue( 1.0f );
 
   // Test that connecting the same callback 10 times is a NOOP
@@ -2044,14 +1578,81 @@ int UtcDaliSignalEmitDuringCallback(void)
 {
   TestApplication app; // Create core for debug logging
 
-  TestSignals::VoidRetNoParamSignal signal;
-  DALI_TEST_CHECK( signal.Empty() );
+  // for coverage purposes we test the emit guard for each signal type (0,1,2,3 params) void / return value
+  {
+    TestSignals::VoidRetNoParamSignal signal;
+    DALI_TEST_CHECK( signal.Empty() );
+
+    TestEmitDuringCallback handler1;
+    handler1.VoidConnectVoid( signal );
+
+    // Test that this does not result in an infinite loop!
+    signal.Emit();
+  }
+  {
+    TestSignals::FloatRet0ParamSignal signal;
+
+    DALI_TEST_CHECK( signal.Empty() );
+
+    TestEmitDuringCallback handler1;
+    handler1.FloatRet0ParamConnect( signal );
+
+    // Test that this does not result in an infinite loop!
+    signal.Emit();
+  }
+  {
+    TestSignals::FloatRet1ParamSignal signal;
+
+    DALI_TEST_CHECK( signal.Empty() );
+
+    TestEmitDuringCallback handler1;
+    handler1.FloatRet1ParamConnect( signal );
+
+    // Test that this does not result in an infinite loop!
+    signal.Emit( 1.f );
+  }
+  {
+    TestSignals::FloatRet2ValueParamSignal signal;
+
+    DALI_TEST_CHECK( signal.Empty() );
+
+    TestEmitDuringCallback handler1;
+    handler1.FloatRet2ParamConnect( signal );
+
+    // Test that this does not result in an infinite loop!
+    signal.Emit( 1.f, 1.f );
+  }
+  {
+    TestSignals::FloatRet3ValueParamSignal signal;
+
+    DALI_TEST_CHECK( signal.Empty() );
+
+    TestEmitDuringCallback handler1;
+    handler1.FloatRet3ParamConnect( signal );
+
+    // Test that this does not result in an infinite loop!
+    signal.Emit( 1.f,1.f,1.f );
+  }
+  END_TEST;
+}
+
+int UtcDaliSignalDeleteDuringEmit(void)
+{
+  // testing a signal deletion during an emit
+  // need to dynamically allocate the signal for this to work
+
+  TestApplication app; // Create core for debug logging
+
+  TestSignals::VoidRetNoParamSignal* signal = new TestSignals::VoidRetNoParamSignal;
 
   TestEmitDuringCallback handler1;
-  handler1.VoidConnectVoid( signal );
+  handler1.DeleteDuringEmitConnect( *signal );
+
+  // should just log an error
+  signal->Emit();
+
+  tet_result( TET_PASS );
 
-  // Test that this does not result in an infinite loop!
-  signal.Emit();
   END_TEST;
 }
 
@@ -2245,7 +1846,7 @@ int UtcDaliSlotDelegateConnection(void)
     TestSlotDelegateHandler handlers;
     signals.SignalVoid1Value().Connect( handlers.mSlotDelegate, &TestSlotDelegateHandler::VoidSlotIntValue );
     DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
-    signals.EmitVoidSignalIntValue(5);
+    signals.EmitVoidSignal1IntValue(5);
     DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
     DALI_TEST_EQUALS( handlers.mIntParam1, 5, TEST_LOCATION );
   }
@@ -2255,7 +1856,7 @@ int UtcDaliSlotDelegateConnection(void)
     TestSlotDelegateHandler handlers;
     signals.SignalVoid2Value().Connect( handlers.mSlotDelegate, &TestSlotDelegateHandler::VoidSlotIntValueIntValue );
     DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
-    signals.EmitVoidSignalIntValueIntValue(6, 7);
+    signals.EmitVoidSignal2IntValue(6, 7);
     DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
     DALI_TEST_EQUALS( handlers.mIntParam1, 6, TEST_LOCATION );
     DALI_TEST_EQUALS( handlers.mIntParam2, 7, TEST_LOCATION );
@@ -2346,10 +1947,10 @@ int UtcDaliSlotDelegateConnection(void)
 
   {
     TestSlotDelegateHandler handlers;
-    signals.FloatSignalFloatValue3().Connect( handlers.mSlotDelegate, &TestSlotDelegateHandler::FloatSlotFloatValue3 );
+    signals.SignalFloat3Value().Connect( handlers.mSlotDelegate, &TestSlotDelegateHandler::FloatSlotFloatValue3 );
     DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
     handlers.mFloatReturn = 27.0f;
-    float returnValue = signals.EmitFloatSignalFloatValue3(5, 33.0f, 100.0f);
+    float returnValue = signals.EmitFloat3VSignal(5, 33.0f, 100.0f);
     DALI_TEST_EQUALS( returnValue, 27.0f, TEST_LOCATION );
     DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
     DALI_TEST_EQUALS( handlers.mFloatParam1, 5.0f, TEST_LOCATION );
@@ -2540,7 +2141,7 @@ int UtcDaliSlotHandlerDisconnect(void)
     signals.SignalVoid1Value().Connect(handlers.mSlotDelegate, &TestSlotDelegateHandler::VoidSlotIntValue);
     DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
     signals.SignalVoid1Value().Disconnect(handlers.mSlotDelegate, &TestSlotDelegateHandler::VoidSlotIntValue);
-    signals.EmitVoidSignalIntValue(5);
+    signals.EmitVoidSignal1IntValue(5);
     DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
     DALI_TEST_EQUALS( handlers.mIntParam1, 0, TEST_LOCATION );
   }
@@ -2550,7 +2151,7 @@ int UtcDaliSlotHandlerDisconnect(void)
     signals.SignalVoid2Value().Connect(handlers.mSlotDelegate, &TestSlotDelegateHandler::VoidSlotIntValueIntValue);
     DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
     signals.SignalVoid2Value().Disconnect(handlers.mSlotDelegate, &TestSlotDelegateHandler::VoidSlotIntValueIntValue);
-    signals.EmitVoidSignalIntValueIntValue(5, 10);
+    signals.EmitVoidSignal2IntValue(5, 10);
     DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
     DALI_TEST_EQUALS( handlers.mIntParam1, 0, TEST_LOCATION );
     DALI_TEST_EQUALS( handlers.mIntParam2, 0, TEST_LOCATION );
@@ -2616,3 +2217,29 @@ int UtcDaliSlotHandlerDisconnect(void)
   }
   END_TEST;
 }
+
+
+int UtcDaliCallbackBase(void)
+{
+  // simple constructor for coverage
+  CallbackBase base;
+  tet_result( TET_PASS );
+  END_TEST;
+}
+
+int UtcDaliSlotDelegateMethods(void)
+{
+  TestSignals signals;
+
+  TestSlotDelegateHandler handlers;
+  DALI_TEST_EQUALS( 0, handlers.mSlotDelegate.GetConnectionCount(), TEST_LOCATION );
+  signals.SignalFloat2Value().Connect(handlers.mSlotDelegate, &TestSlotDelegateHandler::FloatSlotFloatValueFloatValue);
+  DALI_TEST_EQUALS( 1, handlers.mSlotDelegate.GetConnectionCount(), TEST_LOCATION );
+  signals.SignalBool1Value().Connect(handlers.mSlotDelegate, &TestSlotDelegateHandler::BoolSlotFloatValue);
+  DALI_TEST_EQUALS( 2, handlers.mSlotDelegate.GetConnectionCount(), TEST_LOCATION );
+
+  handlers.mSlotDelegate.DisconnectAll();
+  DALI_TEST_EQUALS( 0, handlers.mSlotDelegate.GetConnectionCount(), TEST_LOCATION );
+
+  END_TEST;
+}