Remove RenderableActor
[platform/core/uifw/dali-core.git] / automated-tests / src / dali / utc-Dali-ImageActor.cpp
index 3174a2a..ad80792 100644 (file)
@@ -1087,3 +1087,567 @@ int UtcDaliImageActorGetNaturalSize(void)
 
   END_TEST;
 }
+
+int UtcDaliImageActorGetSortModifier(void)
+{
+  TestApplication application;
+
+  tet_infoline("Testing Dali::ImageActor::GetSortModifier()");
+
+  ImageActor actor = ImageActor::New();
+  Stage::GetCurrent().Add(actor);
+
+  DALI_TEST_EQUALS(actor.GetSortModifier(), 0.0f, TEST_LOCATION);
+
+  Stage::GetCurrent().Remove(actor);
+  END_TEST;
+}
+
+int UtcDaliImageActorSetGetBlendMode(void)
+{
+  TestApplication application;
+
+  tet_infoline("Testing Dali::ImageActor::SetBlendMode() / Dali::ImageActor::GetBlendMode()");
+
+  ImageActor actor = ImageActor::New();
+
+  actor.SetBlendMode( BlendingMode::OFF );
+  DALI_TEST_CHECK( BlendingMode::OFF == actor.GetBlendMode() );
+
+  actor.SetBlendMode( BlendingMode::AUTO );
+  DALI_TEST_CHECK( BlendingMode::AUTO == actor.GetBlendMode() );
+
+  actor.SetBlendMode( BlendingMode::ON );
+  DALI_TEST_CHECK( BlendingMode::ON == actor.GetBlendMode() );
+  END_TEST;
+}
+
+int UtcDaliImageActorSetGetBlendFunc(void)
+{
+  TestApplication application;
+  TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
+
+  tet_infoline("Testing Dali::ImageActor::UtcDaliImageActorSetGetBlendFunc()");
+
+  BufferImage img = BufferImage::New( 1,1 );
+  ImageActor actor = ImageActor::New( img );
+  Stage::GetCurrent().Add( actor );
+  application.SendNotification();
+  application.Render();
+
+  // Test the defaults as documented int blending.h
+  {
+    BlendingFactor::Type srcFactorRgb( BlendingFactor::ZERO );
+    BlendingFactor::Type destFactorRgb( BlendingFactor::ZERO );
+    BlendingFactor::Type srcFactorAlpha( BlendingFactor::ZERO );
+    BlendingFactor::Type destFactorAlpha( BlendingFactor::ZERO );
+    actor.GetBlendFunc( srcFactorRgb, destFactorRgb, srcFactorAlpha, destFactorAlpha );
+    DALI_TEST_EQUALS( BlendingFactor::SRC_ALPHA,           srcFactorRgb,    TEST_LOCATION );
+    DALI_TEST_EQUALS( BlendingFactor::ONE_MINUS_SRC_ALPHA, destFactorRgb,   TEST_LOCATION );
+    DALI_TEST_EQUALS( BlendingFactor::ONE,                 srcFactorAlpha,  TEST_LOCATION );
+    DALI_TEST_EQUALS( BlendingFactor::ONE_MINUS_SRC_ALPHA, destFactorAlpha, TEST_LOCATION );
+  }
+
+  // Set to non-default values
+  actor.SetBlendFunc( BlendingFactor::ONE_MINUS_SRC_COLOR, BlendingFactor::SRC_ALPHA_SATURATE, BlendingFactor::ONE_MINUS_SRC_COLOR, BlendingFactor::SRC_ALPHA_SATURATE );
+
+  // Test that Set was successful
+  {
+    BlendingFactor::Type srcFactorRgb( BlendingFactor::ZERO );
+    BlendingFactor::Type destFactorRgb( BlendingFactor::ZERO );
+    BlendingFactor::Type srcFactorAlpha( BlendingFactor::ZERO );
+    BlendingFactor::Type destFactorAlpha( BlendingFactor::ZERO );
+    actor.GetBlendFunc( srcFactorRgb, destFactorRgb, srcFactorAlpha, destFactorAlpha );
+    DALI_TEST_EQUALS( BlendingFactor::ONE_MINUS_SRC_COLOR, srcFactorRgb,    TEST_LOCATION );
+    DALI_TEST_EQUALS( BlendingFactor::SRC_ALPHA_SATURATE,  destFactorRgb,   TEST_LOCATION );
+    DALI_TEST_EQUALS( BlendingFactor::ONE_MINUS_SRC_COLOR, srcFactorAlpha,  TEST_LOCATION );
+    DALI_TEST_EQUALS( BlendingFactor::SRC_ALPHA_SATURATE,  destFactorAlpha, TEST_LOCATION );
+  }
+
+  // Render & check GL commands
+  application.SendNotification();
+  application.Render();
+  DALI_TEST_EQUALS( (GLenum)GL_ONE_MINUS_SRC_COLOR, glAbstraction.GetLastBlendFuncSrcRgb(),   TEST_LOCATION );
+  DALI_TEST_EQUALS( (GLenum)GL_SRC_ALPHA_SATURATE,  glAbstraction.GetLastBlendFuncDstRgb(),   TEST_LOCATION );
+  DALI_TEST_EQUALS( (GLenum)GL_ONE_MINUS_SRC_COLOR, glAbstraction.GetLastBlendFuncSrcAlpha(), TEST_LOCATION );
+  DALI_TEST_EQUALS( (GLenum)GL_SRC_ALPHA_SATURATE,  glAbstraction.GetLastBlendFuncDstAlpha(), TEST_LOCATION );
+
+  // Set using separate alpha settings
+  actor.SetBlendFunc( BlendingFactor::CONSTANT_COLOR, BlendingFactor::ONE_MINUS_CONSTANT_COLOR,
+                      BlendingFactor::CONSTANT_ALPHA, BlendingFactor::ONE_MINUS_CONSTANT_ALPHA );
+
+  // Test that Set was successful
+  {
+    BlendingFactor::Type srcFactorRgb( BlendingFactor::ZERO );
+    BlendingFactor::Type destFactorRgb( BlendingFactor::ZERO );
+    BlendingFactor::Type srcFactorAlpha( BlendingFactor::ZERO );
+    BlendingFactor::Type destFactorAlpha( BlendingFactor::ZERO );
+    actor.GetBlendFunc( srcFactorRgb, destFactorRgb, srcFactorAlpha, destFactorAlpha );
+    DALI_TEST_EQUALS( BlendingFactor::CONSTANT_COLOR,            srcFactorRgb,    TEST_LOCATION );
+    DALI_TEST_EQUALS( BlendingFactor::ONE_MINUS_CONSTANT_COLOR,  destFactorRgb,   TEST_LOCATION );
+    DALI_TEST_EQUALS( BlendingFactor::CONSTANT_ALPHA,            srcFactorAlpha,  TEST_LOCATION );
+    DALI_TEST_EQUALS( BlendingFactor::ONE_MINUS_CONSTANT_ALPHA,  destFactorAlpha, TEST_LOCATION );
+  }
+
+  // Render & check GL commands
+  application.SendNotification();
+  application.Render();
+  DALI_TEST_EQUALS( (GLenum)GL_CONSTANT_COLOR,           glAbstraction.GetLastBlendFuncSrcRgb(),   TEST_LOCATION );
+  DALI_TEST_EQUALS( (GLenum)GL_ONE_MINUS_CONSTANT_COLOR, glAbstraction.GetLastBlendFuncDstRgb(),   TEST_LOCATION );
+  DALI_TEST_EQUALS( (GLenum)GL_CONSTANT_ALPHA,           glAbstraction.GetLastBlendFuncSrcAlpha(), TEST_LOCATION );
+  DALI_TEST_EQUALS( (GLenum)GL_ONE_MINUS_CONSTANT_ALPHA, glAbstraction.GetLastBlendFuncDstAlpha(), TEST_LOCATION );
+  END_TEST;
+}
+
+int UtcDaliImageActorSetGetAlpha(void)
+{
+  TestApplication application;
+
+  tet_infoline("Testing Dali::ImageActor::SetGetAlpha()");
+
+  BufferImage img = BufferImage::New( 1,1 );
+  ImageActor actor = ImageActor::New( img );
+  Stage::GetCurrent().Add( actor );
+  application.SendNotification();
+  application.Render();
+
+  // use the image alpha on actor
+  actor.SetBlendMode(BlendingMode::ON);
+
+  // Test that Set was successful
+  DALI_TEST_EQUALS( BlendingMode::ON, actor.GetBlendMode(), TEST_LOCATION );
+
+  // Now test that it can be set to false
+  actor.SetBlendMode(BlendingMode::OFF);
+  DALI_TEST_EQUALS(BlendingMode::OFF, actor.GetBlendMode(), TEST_LOCATION );
+  END_TEST;
+}
+
+int UtcDaliImageActorSetGetFilterModes(void)
+{
+  TestApplication application;
+
+  tet_infoline("Testing Dali::ImageActor::SetFilterMode() / Dali::ImageActor::GetFilterMode()");
+
+  ImageActor actor = ImageActor::New();
+
+  FilterMode::Type minifyFilter = FilterMode::NEAREST;
+  FilterMode::Type magnifyFilter = FilterMode::NEAREST;
+
+  // Default test
+  actor.GetFilterMode( minifyFilter, magnifyFilter );
+  DALI_TEST_CHECK( FilterMode::DEFAULT == minifyFilter );
+  DALI_TEST_CHECK( FilterMode::DEFAULT == magnifyFilter );
+
+  // Default/Default
+  actor.SetFilterMode( FilterMode::DEFAULT, FilterMode::DEFAULT );
+  actor.GetFilterMode( minifyFilter, magnifyFilter );
+  DALI_TEST_CHECK( FilterMode::DEFAULT == minifyFilter );
+  DALI_TEST_CHECK( FilterMode::DEFAULT == magnifyFilter );
+
+  // Nearest/Nearest
+  actor.SetFilterMode( FilterMode::NEAREST, FilterMode::NEAREST );
+  actor.GetFilterMode( minifyFilter, magnifyFilter );
+  DALI_TEST_CHECK( FilterMode::NEAREST == minifyFilter );
+  DALI_TEST_CHECK( FilterMode::NEAREST == magnifyFilter );
+
+  // Linear/Linear
+  actor.SetFilterMode( FilterMode::LINEAR, FilterMode::LINEAR );
+  actor.GetFilterMode( minifyFilter, magnifyFilter );
+  DALI_TEST_CHECK( FilterMode::LINEAR == minifyFilter );
+  DALI_TEST_CHECK( FilterMode::LINEAR == magnifyFilter );
+
+  // Nearest/Linear
+  actor.SetFilterMode( FilterMode::NEAREST, FilterMode::LINEAR );
+  actor.GetFilterMode( minifyFilter, magnifyFilter );
+  DALI_TEST_CHECK( FilterMode::NEAREST == minifyFilter );
+  DALI_TEST_CHECK( FilterMode::LINEAR == magnifyFilter );
+
+  // Linear/Nearest
+  actor.SetFilterMode( FilterMode::LINEAR, FilterMode::NEAREST );
+  actor.GetFilterMode( minifyFilter, magnifyFilter );
+  DALI_TEST_CHECK( FilterMode::LINEAR == minifyFilter );
+  DALI_TEST_CHECK( FilterMode::NEAREST == magnifyFilter );
+
+  END_TEST;
+}
+
+int UtcDaliImageActorSetFilterMode(void)
+{
+  TestApplication application;
+
+  tet_infoline("Testing Dali::ImageActor::SetFilterMode()");
+
+  BufferImage img = BufferImage::New( 1,1 );
+  ImageActor actor = ImageActor::New( img );
+
+  actor.SetSize(100.0f, 100.0f);
+  actor.SetParentOrigin(ParentOrigin::CENTER);
+  actor.SetAnchorPoint(AnchorPoint::CENTER);
+
+  Stage::GetCurrent().Add(actor);
+
+  /**************************************************************/
+
+  // Default/Default
+  TraceCallStack& texParameterTrace = application.GetGlAbstraction().GetTexParameterTrace();
+  texParameterTrace.Reset();
+  texParameterTrace.Enable( true );
+
+  actor.SetFilterMode( FilterMode::DEFAULT, FilterMode::DEFAULT );
+
+  // Flush the queue and render once
+  application.SendNotification();
+  application.Render();
+
+  texParameterTrace.Enable( false );
+
+  std::stringstream out;
+
+  // Verify actor gl state
+
+  // There are two calls to TexParameteri when the texture is first created
+  // Texture mag filter is not called as the first time set it uses the system default
+  DALI_TEST_EQUALS( texParameterTrace.CountMethod( "TexParameteri" ), 3, TEST_LOCATION);
+
+  out.str("");
+  out << GL_TEXTURE_2D << ", " << GL_TEXTURE_MIN_FILTER << ", " << GL_LINEAR;
+  DALI_TEST_EQUALS( texParameterTrace.TestMethodAndParams(2, "TexParameteri", out.str()), true, TEST_LOCATION);
+
+  /**************************************************************/
+
+  // Default/Default
+  texParameterTrace = application.GetGlAbstraction().GetTexParameterTrace();
+  texParameterTrace.Reset();
+  texParameterTrace.Enable( true );
+
+  actor.SetFilterMode( FilterMode::DEFAULT, FilterMode::DEFAULT );
+
+  // Flush the queue and render once
+  application.SendNotification();
+  application.Render();
+
+  texParameterTrace.Enable( false );
+
+  // Verify actor gl state
+
+  // Should not make any calls when settings are the same
+  DALI_TEST_EQUALS( texParameterTrace.CountMethod( "TexParameteri" ), 0, TEST_LOCATION);
+
+  /**************************************************************/
+
+  // Nearest/Nearest
+  texParameterTrace.Reset();
+  texParameterTrace.Enable( true );
+
+  actor.SetFilterMode( FilterMode::NEAREST, FilterMode::NEAREST );
+
+  // Flush the queue and render once
+  application.SendNotification();
+  application.Render();
+
+  texParameterTrace.Enable( false );
+
+  // Verify actor gl state
+  DALI_TEST_EQUALS( texParameterTrace.CountMethod( "TexParameteri" ), 2, TEST_LOCATION);
+
+  out.str("");
+  out << GL_TEXTURE_2D << ", " << GL_TEXTURE_MIN_FILTER << ", " << GL_NEAREST;
+  DALI_TEST_EQUALS( texParameterTrace.TestMethodAndParams(0, "TexParameteri", out.str()), true, TEST_LOCATION);
+
+  out.str("");
+  out << GL_TEXTURE_2D << ", " << GL_TEXTURE_MAG_FILTER << ", " << GL_NEAREST;
+  DALI_TEST_EQUALS( texParameterTrace.TestMethodAndParams(1, "TexParameteri", out.str()), true, TEST_LOCATION);
+
+  /**************************************************************/
+
+  // Linear/Linear
+  texParameterTrace.Reset();
+  texParameterTrace.Enable( true );
+
+  actor.SetFilterMode( FilterMode::LINEAR, FilterMode::LINEAR );
+
+  // Flush the queue and render once
+  application.SendNotification();
+  application.Render();
+
+  texParameterTrace.Enable( false );
+
+  // Verify actor gl state
+  DALI_TEST_EQUALS( texParameterTrace.CountMethod( "TexParameteri" ), 2, TEST_LOCATION);
+
+  out.str("");
+  out << GL_TEXTURE_2D << ", " << GL_TEXTURE_MIN_FILTER << ", " << GL_LINEAR;
+  DALI_TEST_EQUALS( texParameterTrace.TestMethodAndParams(0, "TexParameteri", out.str()), true, TEST_LOCATION);
+
+  out.str("");
+  out << GL_TEXTURE_2D << ", " << GL_TEXTURE_MAG_FILTER << ", " << GL_LINEAR;
+  DALI_TEST_EQUALS( texParameterTrace.TestMethodAndParams(1, "TexParameteri", out.str()), true, TEST_LOCATION);
+
+
+  /**************************************************************/
+
+  // Nearest/Linear
+  texParameterTrace.Reset();
+  texParameterTrace.Enable( true );
+
+  actor.SetFilterMode( FilterMode::NEAREST, FilterMode::LINEAR );
+
+  // Flush the queue and render once
+  application.SendNotification();
+  application.Render();
+
+  texParameterTrace.Enable( false );
+
+  // Verify actor gl state
+  DALI_TEST_EQUALS( texParameterTrace.CountMethod( "TexParameteri" ), 1, TEST_LOCATION);
+
+  out.str("");
+  out << GL_TEXTURE_2D << ", " << GL_TEXTURE_MIN_FILTER << ", " << GL_NEAREST;
+  DALI_TEST_EQUALS( texParameterTrace.TestMethodAndParams(0, "TexParameteri", out.str()), true, TEST_LOCATION);
+
+  /**************************************************************/
+
+  // Default/Default
+  texParameterTrace.Reset();
+  texParameterTrace.Enable( true );
+
+  actor.SetFilterMode( FilterMode::DEFAULT, FilterMode::DEFAULT );
+
+  // Flush the queue and render once
+  application.SendNotification();
+  application.Render();
+
+  texParameterTrace.Enable( false );
+
+  // Verify actor gl state
+  DALI_TEST_EQUALS( texParameterTrace.CountMethod( "TexParameteri" ), 1, TEST_LOCATION);
+
+  out.str("");
+  out << GL_TEXTURE_2D << ", " << GL_TEXTURE_MIN_FILTER << ", " << GL_LINEAR;
+  DALI_TEST_EQUALS( texParameterTrace.TestMethodAndParams(0, "TexParameteri", out.str()), true, TEST_LOCATION);
+
+  /**************************************************************/
+
+  // None/None
+  texParameterTrace.Reset();
+  texParameterTrace.Enable( true );
+
+  actor.SetFilterMode( FilterMode::NONE, FilterMode::NONE );
+
+  // Flush the queue and render once
+  application.SendNotification();
+  application.Render();
+
+  texParameterTrace.Enable( false );
+
+  // Verify actor gl state
+  DALI_TEST_EQUALS( texParameterTrace.CountMethod( "TexParameteri" ), 1, TEST_LOCATION);
+
+  out.str("");
+  out << GL_TEXTURE_2D << ", " << GL_TEXTURE_MIN_FILTER << ", " << GL_NEAREST_MIPMAP_LINEAR;
+  DALI_TEST_EQUALS( texParameterTrace.TestMethodAndParams(0, "TexParameteri", out.str()), true, TEST_LOCATION);
+
+  /**************************************************************/
+
+  Stage::GetCurrent().Remove(actor);
+
+  END_TEST;
+}
+
+int UtcDaliImageActorSetShaderEffect(void)
+{
+  TestApplication application;
+  BufferImage img = BufferImage::New( 1,1 );
+  ImageActor actor = ImageActor::New( img );
+  Stage::GetCurrent().Add( actor );
+
+  // flush the queue and render once
+  application.SendNotification();
+  application.Render();
+  GLuint lastShaderCompiledBefore = application.GetGlAbstraction().GetLastShaderCompiled();
+
+  application.GetGlAbstraction().EnableShaderCallTrace( true );
+
+  const std::string vertexShader = "UtcDaliImageActorSetShaderEffect-VertexSource";
+  const std::string fragmentShader = "UtcDaliImageActorSetShaderEffect-FragmentSource";
+  ShaderEffect effect = ShaderEffect::New(vertexShader, fragmentShader );
+  DALI_TEST_CHECK( effect != actor.GetShaderEffect() );
+
+  actor.SetShaderEffect( effect );
+  DALI_TEST_CHECK( effect == actor.GetShaderEffect() );
+
+  // flush the queue and render once
+  application.SendNotification();
+  application.Render();
+
+  GLuint lastShaderCompiledAfter = application.GetGlAbstraction().GetLastShaderCompiled();
+  DALI_TEST_EQUALS( lastShaderCompiledAfter, lastShaderCompiledBefore + 2, TEST_LOCATION );
+
+  std::string actualVertexShader = application.GetGlAbstraction().GetShaderSource( lastShaderCompiledBefore + 1 );
+  DALI_TEST_EQUALS( vertexShader,
+                    actualVertexShader.substr( actualVertexShader.length() - vertexShader.length() ), TEST_LOCATION );
+  std::string actualFragmentShader = application.GetGlAbstraction().GetShaderSource( lastShaderCompiledBefore + 2 );
+  DALI_TEST_EQUALS( fragmentShader,
+                    actualFragmentShader.substr( actualFragmentShader.length() - fragmentShader.length() ), TEST_LOCATION );
+
+  END_TEST;
+}
+
+int UtcDaliImageActorGetShaderEffect(void)
+{
+  TestApplication application;
+  ImageActor actor = ImageActor::New();
+
+  ShaderEffect effect = ShaderEffect::New("UtcDaliImageActorGetShaderEffect-VertexSource", "UtcDaliImageActorGetShaderEffect-FragmentSource" );
+  actor.SetShaderEffect(effect);
+
+  DALI_TEST_CHECK(effect == actor.GetShaderEffect());
+  END_TEST;
+}
+
+int UtcDaliImageActorRemoveShaderEffect01(void)
+{
+  TestApplication application;
+  ImageActor actor = ImageActor::New();
+
+  ShaderEffect defaultEffect = actor.GetShaderEffect();
+
+  ShaderEffect effect = ShaderEffect::New("UtcDaliImageActorRemoveShaderEffect-VertexSource", "UtcDaliImageActorRemoveShaderEffect-FragmentSource" );
+  actor.SetShaderEffect(effect);
+
+  DALI_TEST_CHECK(effect == actor.GetShaderEffect());
+
+  actor.RemoveShaderEffect();
+
+  DALI_TEST_CHECK(defaultEffect == actor.GetShaderEffect());
+  END_TEST;
+}
+
+int UtcDaliImageActorRemoveShaderEffect02(void)
+{
+  TestApplication application;
+  ImageActor actor = ImageActor::New();
+
+  ShaderEffect defaultEffect = actor.GetShaderEffect();
+
+  actor.RemoveShaderEffect();
+
+  DALI_TEST_CHECK(defaultEffect == actor.GetShaderEffect());
+  END_TEST;
+}
+
+int UtcDaliSetShaderEffectRecursively(void)
+{
+  TestApplication application;
+  /**
+   * create a tree
+   *                 actor1
+   *           actor2       actor4
+   *       actor3 imageactor1
+   * imageactor2
+   */
+  BufferImage img = BufferImage::New( 1,1 );
+  ImageActor actor1 = ImageActor::New( img );
+  Actor actor2 = Actor::New();
+  actor1.Add( actor2 );
+  Actor actor3 = Actor::New();
+  actor2.Add( actor3 );
+  ImageActor imageactor1 = ImageActor::New( img );
+  actor2.Add( imageactor1 );
+  ImageActor imageactor2 = ImageActor::New( img );
+  actor3.Add( imageactor2 );
+  Actor actor4 = Actor::New();
+  actor1.Add( actor4 );
+  Stage::GetCurrent().Add( actor1 );
+
+  // flush the queue and render once
+  application.SendNotification();
+  application.Render();
+  GLuint lastShaderCompiledBefore = application.GetGlAbstraction().GetLastShaderCompiled();
+
+  application.GetGlAbstraction().EnableShaderCallTrace( true );
+
+  const std::string vertexShader = "UtcDaliImageActorSetShaderEffect-VertexSource";
+  const std::string fragmentShader = "UtcDaliImageActorSetShaderEffect-FragmentSource";
+  // test with empty effect
+  ShaderEffect effect;
+  SetShaderEffectRecursively( actor1, effect );
+
+  effect = ShaderEffect::New(vertexShader, fragmentShader );
+
+  DALI_TEST_CHECK( effect != actor1.GetShaderEffect() );
+  DALI_TEST_CHECK( effect != imageactor1.GetShaderEffect() );
+  DALI_TEST_CHECK( effect != imageactor2.GetShaderEffect() );
+
+  SetShaderEffectRecursively( actor1, effect );
+  DALI_TEST_CHECK( effect == imageactor1.GetShaderEffect() );
+  DALI_TEST_CHECK( effect == imageactor2.GetShaderEffect() );
+
+  // flush the queue and render once
+  application.SendNotification();
+  application.Render();
+
+  GLuint lastShaderCompiledAfter = application.GetGlAbstraction().GetLastShaderCompiled();
+  DALI_TEST_EQUALS( lastShaderCompiledAfter, lastShaderCompiledBefore + 2, TEST_LOCATION );
+
+  std::string actualVertexShader = application.GetGlAbstraction().GetShaderSource( lastShaderCompiledBefore + 1 );
+  DALI_TEST_EQUALS( vertexShader,
+                    actualVertexShader.substr( actualVertexShader.length() - vertexShader.length() ), TEST_LOCATION );
+  std::string actualFragmentShader = application.GetGlAbstraction().GetShaderSource( lastShaderCompiledBefore + 2 );
+  DALI_TEST_EQUALS( fragmentShader,
+                    actualFragmentShader.substr( actualFragmentShader.length() - fragmentShader.length() ), TEST_LOCATION );
+
+  // remove from one that does not have shader
+  RemoveShaderEffectRecursively( actor4 );
+
+  // remove partially
+  RemoveShaderEffectRecursively( actor3 );
+  DALI_TEST_CHECK( effect == imageactor1.GetShaderEffect() );
+  DALI_TEST_CHECK( effect != imageactor2.GetShaderEffect() );
+
+  // test with empty actor just to check it does not crash
+  Actor empty;
+  SetShaderEffectRecursively( empty, effect );
+  RemoveShaderEffectRecursively( empty );
+
+  // test with actor with no children just to check it does not crash
+  Actor loner = Actor::New();
+  Stage::GetCurrent().Add( loner );
+  SetShaderEffectRecursively( loner, effect );
+  RemoveShaderEffectRecursively( loner );
+
+  END_TEST;
+}
+
+int UtcDaliImageActorTestClearCache(void)
+{
+  // Testing the framebuffer state caching in frame-buffer-state-caching.cpp
+  TestApplication application;
+
+  tet_infoline("Testing Dali::ImageActor::ClearCache()");
+
+  BufferImage img = BufferImage::New( 1,1 );
+  ImageActor actor = ImageActor::New( img );
+
+  actor.SetParentOrigin(ParentOrigin::CENTER);
+  actor.SetAnchorPoint(AnchorPoint::CENTER);
+
+  Stage::GetCurrent().Add(actor);
+
+  /**************************************************************/
+  // Flush the queue and render once
+  application.SendNotification();
+  application.Render();
+
+  // There should be a single call to Clear
+  DALI_TEST_EQUALS( application.GetGlAbstraction().GetClearCountCalled() , 1u, TEST_LOCATION );
+
+  // the last set clear mask should be COLOR, DEPTH & STENCIL which occurs at the start of each frame
+  GLbitfield mask = application.GetGlAbstraction().GetLastClearMask();
+  DALI_TEST_CHECK( mask & GL_DEPTH_BUFFER_BIT );
+  DALI_TEST_CHECK( mask & GL_STENCIL_BUFFER_BIT );
+  DALI_TEST_CHECK( mask & GL_COLOR_BUFFER_BIT );
+
+  END_TEST;
+}