NativeImageSource with tbm_surface for tizen 3.0 wayland
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-ImageView.cpp
index 8e9f8fe..32d987f 100644 (file)
 #include <dali-toolkit-test-suite-utils.h>
 
 #include <dali-toolkit/dali-toolkit.h>
+#include <dali/devel-api/scripting/scripting.h>
+#include <dali/devel-api/rendering/material.h>
+#include <dali/devel-api/rendering/renderer.h>
+
+#include <test-native-image.h>
+#include <sstream>
 
 using namespace Dali;
 using namespace Toolkit;
@@ -36,7 +42,103 @@ void utc_dali_toolkit_image_view_cleanup(void)
 
 namespace
 {
+
+const char* VERTEX_SHADER = DALI_COMPOSE_SHADER(
+  attribute mediump vec2 aPosition;\n
+  varying mediump vec2 vTexCoord;\n
+  uniform mediump mat4 uMvpMatrix;\n
+  uniform mediump vec3 uSize;\n
+  \n
+  void main()\n
+  {\n
+    mediump vec4 vertexPosition = vec4(aPosition, 0.0, 1.0);\n
+    vertexPosition.xyz *= uSize;\n
+    vertexPosition = uMvpMatrix * vertexPosition;\n
+    \n
+    vTexCoord = aPosition + vec2(0.5);\n
+    gl_Position = vertexPosition;\n
+  }\n
+);
+
+const char* FRAGMENT_SHADER = DALI_COMPOSE_SHADER(
+  varying mediump vec2 vTexCoord;\n
+  uniform sampler2D sTexture;\n
+  uniform lowp vec4 uColor;\n
+  \n
+  void main()\n
+  {\n
+    gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor;\n
+  }\n
+);
+
 const char* TEST_IMAGE_FILE_NAME =  "gallery_image_01.jpg";
+const char* TEST_IMAGE_FILE_NAME2 =  "gallery_image_02.jpg";
+
+void TestImage( ImageView imageView, BufferImage image )
+{
+  Property::Value value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
+
+  Property::Map map;
+  DALI_TEST_CHECK( value.Get( map ) );
+
+  DALI_TEST_CHECK( map.Find( "width" ) );
+  DALI_TEST_CHECK( map.Find( "height" ) );
+  DALI_TEST_CHECK( map.Find( "type" ) );
+
+  int width = 0;
+  DALI_TEST_CHECK( map[ "width" ].Get( width ) );
+  DALI_TEST_EQUALS( (unsigned int)width, image.GetWidth(), TEST_LOCATION );
+
+  int height = 0;
+  DALI_TEST_CHECK( map[ "height" ].Get( height ) );
+  DALI_TEST_EQUALS( (unsigned int)height, image.GetHeight(), TEST_LOCATION );
+
+  std::string type;
+  DALI_TEST_CHECK( map[ "type" ].Get( type ) );
+  DALI_TEST_EQUALS( type, "BufferImage", TEST_LOCATION );
+}
+
+void TestImage( ImageView imageView, ResourceImage image )
+{
+  Property::Value value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
+
+  Property::Map map;
+  DALI_TEST_CHECK( value.Get( map ) );
+
+  if( map.Find( "width" ) )
+  {
+    int width = 0;
+    DALI_TEST_CHECK( map[ "width" ].Get( width ) );
+    DALI_TEST_EQUALS( (unsigned int)width, image.GetWidth(), TEST_LOCATION );
+  }
+
+  if( map.Find( "height" ) )
+  {
+    int height = 0;
+    DALI_TEST_CHECK( map[ "height" ].Get( height ) );
+    DALI_TEST_EQUALS( (unsigned int)height, image.GetHeight(), TEST_LOCATION );
+  }
+
+  DALI_TEST_CHECK( map.Find( "type" ) );
+
+  std::string type;
+  DALI_TEST_CHECK( map[ "type" ].Get( type ) );
+  DALI_TEST_EQUALS( type, "ResourceImage", TEST_LOCATION );
+
+  std::string filename;
+  DALI_TEST_CHECK( map[ "filename" ].Get( filename ) );
+  DALI_TEST_EQUALS( filename, image.GetUrl(), TEST_LOCATION );
+}
+
+void TestUrl( ImageView imageView, const std::string url )
+{
+  Property::Value value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
+
+  std::string urlActual;
+  DALI_TEST_CHECK( value.Get( urlActual ) );
+  DALI_TEST_EQUALS( urlActual, url, TEST_LOCATION );
+}
+
 } // namespace
 
 int UtcDaliImageViewNewP(void)
@@ -54,11 +156,11 @@ int UtcDaliImageViewNewImageP(void)
 {
   TestApplication application;
 
-  Image image = CreateBufferImage( 100, 200, Vector4( 1.f, 1.f, 1.f, 1.f ) );
+  BufferImage image = CreateBufferImage( 100, 200, Vector4( 1.f, 1.f, 1.f, 1.f ) );
   ImageView imageView = ImageView::New( image );
 
   DALI_TEST_CHECK( imageView );
-  DALI_TEST_EQUALS( image, imageView.GetImage(), TEST_LOCATION );
+  TestImage( imageView, image );
 
   END_TEST;
 }
@@ -69,19 +171,8 @@ int UtcDaliImageViewNewUrlP(void)
 
   ImageView imageView = ImageView::New( TEST_IMAGE_FILE_NAME );
   DALI_TEST_CHECK( imageView );
-  DALI_TEST_CHECK( imageView.GetImage() );
-
-  Property::Value val = imageView.GetProperty( imageView.GetPropertyIndex( "resource-url" ) );
-  std::string resource_url;
-  DALI_TEST_CHECK( val.Get( resource_url ) );
-  DALI_TEST_EQUALS( resource_url, TEST_IMAGE_FILE_NAME, TEST_LOCATION );
-
-  Image image = imageView.GetImage();
-  DALI_TEST_CHECK( image );
 
-  ResourceImage resourceImage = ResourceImage::DownCast( image );
-  DALI_TEST_CHECK( resourceImage );
-  DALI_TEST_EQUALS( resourceImage.GetUrl(), TEST_IMAGE_FILE_NAME, TEST_LOCATION );
+  TestUrl( imageView, TEST_IMAGE_FILE_NAME );
 
   END_TEST;
 }
@@ -174,27 +265,101 @@ int UtcDaliImageViewTypeRegistry(void)
   END_TEST;
 }
 
-int UtcDaliImageViewSetGetProperty(void)
+int UtcDaliImageViewSetGetProperty01(void)
 {
   ToolkitTestApplication application;
 
   ImageView imageView = ImageView::New();
 
-  Property::Index idx = imageView.GetPropertyIndex( "resource-url" );
-  DALI_TEST_EQUALS( idx, ImageView::Property::RESOURCE_URL, TEST_LOCATION );
+  Property::Index idx = imageView.GetPropertyIndex( "image" );
+  DALI_TEST_EQUALS( idx, (Property::Index)ImageView::Property::IMAGE, TEST_LOCATION );
 
   imageView.SetProperty( idx, TEST_IMAGE_FILE_NAME );
-  Property::Value val = imageView.GetProperty( idx );
-  std::string resource_url;
-  DALI_TEST_CHECK( val.Get( resource_url ) );
-  DALI_TEST_EQUALS( resource_url, TEST_IMAGE_FILE_NAME, TEST_LOCATION );
+  TestUrl( imageView, TEST_IMAGE_FILE_NAME );
+
+  END_TEST;
+}
+
+int UtcDaliImageViewSetGetProperty02(void)
+{
+  ToolkitTestApplication application;
 
-  Image image = imageView.GetImage();
-  DALI_TEST_CHECK( image );
+  Image image = CreateBufferImage( 10, 10, Color::WHITE );
+  ImageView imageView = ImageView::New(image);
+  Vector4 fullImageRect( 0.f, 0.f, 1.f, 1.f );
 
-  ResourceImage resourceImage = ResourceImage::DownCast( image );
-  DALI_TEST_CHECK( resourceImage );
-  DALI_TEST_EQUALS( resourceImage.GetUrl(), TEST_IMAGE_FILE_NAME, TEST_LOCATION );
+  Stage::GetCurrent().Add( imageView );
+
+  application.SendNotification();
+  application.Render();
+  TestGlAbstraction& gl = application.GetGlAbstraction();
+
+  Vector4 pixelAreaUniform;
+  DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "pixelArea", pixelAreaUniform ) );
+  DALI_TEST_EQUALS( pixelAreaUniform, fullImageRect, TEST_LOCATION );
+
+  Property::Value value = imageView.GetProperty( ImageView::Property::PIXEL_AREA );
+  Vector4 pixelAreaValue;
+  DALI_TEST_CHECK( value.Get(pixelAreaValue) );
+  DALI_TEST_EQUALS( pixelAreaValue, fullImageRect, TEST_LOCATION );
+
+  Vector4 pixelAreaSet( 0.2f, 0.2f, 0.3f, 0.3f );
+  imageView.SetProperty( ImageView::Property::PIXEL_AREA, pixelAreaSet);
+
+  application.SendNotification();
+  application.Render();
+
+  value = imageView.GetProperty( ImageView::Property::PIXEL_AREA );
+  value.Get(pixelAreaValue);
+  DALI_TEST_EQUALS( pixelAreaValue, pixelAreaSet, TEST_LOCATION );
+
+  DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "pixelArea", pixelAreaUniform ) );
+  DALI_TEST_EQUALS( pixelAreaUniform, pixelAreaSet, TEST_LOCATION );
+
+  END_TEST;
+}
+
+int UtcDaliImageViewSetGetProperty03(void)
+{
+  ToolkitTestApplication application;
+
+  Image image = CreateBufferImage( 10, 10, Color::WHITE );
+  ImageView imageView = ImageView::New(image);
+  Stage::GetCurrent().Add( imageView );
+  application.SendNotification();
+  application.Render();
+
+ // conventional alpha blending
+  Material material = imageView.GetRendererAt( 0 ).GetMaterial();
+  BlendingFactor::Type srcFactorRgb;
+  BlendingFactor::Type destFactorRgb;
+  BlendingFactor::Type srcFactorAlpha;
+  BlendingFactor::Type destFactorAlpha;
+  material.GetBlendFunc(srcFactorRgb, destFactorRgb, srcFactorAlpha, destFactorAlpha);
+  DALI_TEST_CHECK( srcFactorRgb == BlendingFactor::SRC_ALPHA );
+  DALI_TEST_CHECK( destFactorRgb == BlendingFactor::ONE_MINUS_SRC_ALPHA );
+  DALI_TEST_CHECK( srcFactorAlpha == BlendingFactor::ONE );
+  DALI_TEST_CHECK( destFactorAlpha == BlendingFactor::ONE_MINUS_SRC_ALPHA );
+
+  TestGlAbstraction& gl = application.GetGlAbstraction();
+
+  float alphaBlendingUniform;
+  DALI_TEST_CHECK( gl.GetUniformValue<float>( "uAlphaBlending", alphaBlendingUniform ) );
+  DALI_TEST_EQUALS( alphaBlendingUniform, 1.f, TEST_LOCATION );
+
+  // pre-multiplied alpha blending
+  imageView.SetProperty( Toolkit::ImageView::Property::PRE_MULTIPLIED_ALPHA, true );
+  application.SendNotification();
+  application.Render();
+
+  material.GetBlendFunc(srcFactorRgb, destFactorRgb, srcFactorAlpha, destFactorAlpha);
+  DALI_TEST_CHECK( srcFactorRgb == BlendingFactor::ONE );
+  DALI_TEST_CHECK( destFactorRgb == BlendingFactor::ONE_MINUS_SRC_ALPHA );
+  DALI_TEST_CHECK( srcFactorAlpha == BlendingFactor::ONE );
+  DALI_TEST_CHECK( destFactorAlpha == BlendingFactor::ONE );
+
+  DALI_TEST_CHECK( gl.GetUniformValue<float>( "uAlphaBlending", alphaBlendingUniform ) );
+  DALI_TEST_EQUALS( alphaBlendingUniform, 0.f, TEST_LOCATION );
 
   END_TEST;
 }
@@ -213,8 +378,8 @@ int UtcDaliImageViewSizeWithBackground(void)
   application.SendNotification();
   application.Render();
 
-  DALI_TEST_EQUALS( imageView.GetCurrentSize().width, width, TEST_LOCATION );
-  DALI_TEST_EQUALS( imageView.GetCurrentSize().height, height, TEST_LOCATION );
+  DALI_TEST_EQUALS( imageView.GetCurrentSize().width, (float)width, TEST_LOCATION );
+  DALI_TEST_EQUALS( imageView.GetCurrentSize().height, (float)height, TEST_LOCATION );
 
   END_TEST;
 }
@@ -238,8 +403,8 @@ int UtcDaliImageViewSizeWithBackgroundAndImage(void)
   application.SendNotification();
   application.Render();
 
-  DALI_TEST_EQUALS( imageView.GetCurrentSize().width, width, TEST_LOCATION );
-  DALI_TEST_EQUALS( imageView.GetCurrentSize().height, height, TEST_LOCATION );
+  DALI_TEST_EQUALS( imageView.GetCurrentSize().width, (float)width, TEST_LOCATION );
+  DALI_TEST_EQUALS( imageView.GetCurrentSize().height, (float)height, TEST_LOCATION );
 
   END_TEST;
 }
@@ -286,8 +451,8 @@ int UtcDaliImageViewHeightForWidthBackgroundAndImage(void)
   application.SendNotification();
   application.Render();
 
-  DALI_TEST_EQUALS( imageView.GetHeightForWidth( width ), height, TEST_LOCATION );
-  DALI_TEST_EQUALS( imageView.GetWidthForHeight( height ), width, TEST_LOCATION );
+  DALI_TEST_EQUALS( imageView.GetHeightForWidth( width ), (float)height, TEST_LOCATION );
+  DALI_TEST_EQUALS( imageView.GetWidthForHeight( height ), (float)width, TEST_LOCATION );
 
   END_TEST;
 }
@@ -296,32 +461,35 @@ int UtcDaliImageViewSetBufferImage(void)
 {
   ToolkitTestApplication application;
 
-  int width = 300;
-  int height = 400;
-  Image image = CreateBufferImage( width, height, Vector4( 1.f, 1.f, 1.f, 1.f ) );
+  int width1 = 300;
+  int height1 = 400;
+  BufferImage image1 = CreateBufferImage( width1, height1, Vector4( 1.f, 1.f, 1.f, 1.f ) );
   ImageView imageView = ImageView::New();
-  imageView.SetImage( image );
+  imageView.SetImage( image1 );
 
-  std::string resource_url;
-  Property::Value val = imageView.GetProperty( imageView.GetPropertyIndex( "resource-url" ) );
-  DALI_TEST_CHECK( val.Get( resource_url ) );
-  DALI_TEST_CHECK( resource_url.empty() );
+  TestImage( imageView, image1 );
+
+  int width2 = 600;
+  int height2 = 500;
+  BufferImage image2 = CreateBufferImage( width2, height2, Vector4( 1.f, 1.f, 1.f, 1.f ) );
+  imageView.SetImage( image2 );
+
+  TestImage( imageView, image2 );
 
   END_TEST;
 }
 
-int UtcDaliImageViewSetResourceImage(void)
+int UtcDaliImageViewSetImageUrl(void)
 {
   ToolkitTestApplication application;
 
-  Image image = ResourceImage::New( TEST_IMAGE_FILE_NAME );
   ImageView imageView = ImageView::New();
-  imageView.SetImage( image );
+  imageView.SetImage( TEST_IMAGE_FILE_NAME );
+  TestUrl( imageView, TEST_IMAGE_FILE_NAME );
 
-  std::string resource_url;
-  Property::Value val = imageView.GetProperty( imageView.GetPropertyIndex( "resource-url" ) );
-  DALI_TEST_CHECK( val.Get( resource_url ) );
-  DALI_TEST_EQUALS( resource_url, TEST_IMAGE_FILE_NAME, TEST_LOCATION );
+
+  imageView.SetImage( TEST_IMAGE_FILE_NAME2 );
+  TestUrl( imageView, TEST_IMAGE_FILE_NAME2 );
 
   END_TEST;
 }
@@ -336,19 +504,15 @@ int UtcDaliImageViewSetImageOnstageP(void)
   application.SendNotification();
   application.Render();
 
-  Image image1 = ResourceImage::New( TEST_IMAGE_FILE_NAME );
+  ResourceImage image1 = ResourceImage::New( TEST_IMAGE_FILE_NAME );
   imageView.SetImage( image1 );
-
-  Image image2 = imageView.GetImage();
-  DALI_TEST_EQUALS( image1, image2, TEST_LOCATION );
+  TestImage( imageView, image1 );
 
   int width = 300;
   int height = 400;
-  Image image3 = CreateBufferImage( width, height, Vector4( 1.f, 1.f, 1.f, 1.f ) );
-  imageView.SetImage( image3 );
-
-  Image image4 = imageView.GetImage();
-  DALI_TEST_EQUALS( image3, image4, TEST_LOCATION );
+  BufferImage image2 = CreateBufferImage( width, height, Vector4( 1.f, 1.f, 1.f, 1.f ) );
+  imageView.SetImage( image2 );
+  TestImage( imageView, image2 );
 
   END_TEST;
 }
@@ -363,17 +527,21 @@ int UtcDaliImageViewSetImageOnstageN(void)
   application.SendNotification();
   application.Render();
 
-  Image image1 = ResourceImage::New( TEST_IMAGE_FILE_NAME );
+  ResourceImage image1 = ResourceImage::New( TEST_IMAGE_FILE_NAME );
   imageView.SetImage( image1 );
+  TestImage( imageView, image1 );
+
+  Image image2;
+  imageView.SetImage( image2 );
 
-  Image image2 = imageView.GetImage();
-  DALI_TEST_EQUALS( image1, image2, TEST_LOCATION );
+  Property::Value value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
 
-  Image image3;
-  imageView.SetImage( image3 );
+  //the value should be empty
+  std::string url;
+  DALI_TEST_CHECK( !value.Get( url ) );
 
-  Image image4 = imageView.GetImage();
-  DALI_TEST_CHECK( !image4 );
+  Property::Map map;
+  DALI_TEST_CHECK( !value.Get( map ) );
 
   END_TEST;
 }
@@ -389,19 +557,15 @@ int UtcDaliImageViewSetImageOffstageP(void)
   application.Render();
   Stage::GetCurrent().Remove( imageView );
 
-  Image image1 = ResourceImage::New( TEST_IMAGE_FILE_NAME );
+  ResourceImage image1 = ResourceImage::New( TEST_IMAGE_FILE_NAME );
   imageView.SetImage( image1 );
-
-  Image image2 = imageView.GetImage();
-  DALI_TEST_EQUALS( image1, image2, TEST_LOCATION );
+  TestImage( imageView, image1 );
 
   int width = 300;
   int height = 400;
-  Image image3 = CreateBufferImage( width, height, Vector4( 1.f, 1.f, 1.f, 1.f ) );
-  imageView.SetImage( image3 );
-
-  Image image4 = imageView.GetImage();
-  DALI_TEST_EQUALS( image3, image4, TEST_LOCATION );
+  BufferImage image2 = CreateBufferImage( width, height, Vector4( 1.f, 1.f, 1.f, 1.f ) );
+  imageView.SetImage( image2 );
+  TestImage( imageView, image2 );
 
   END_TEST;
 }
@@ -417,17 +581,21 @@ int UtcDaliImageViewSetImageOffstageN(void)
   application.Render();
   Stage::GetCurrent().Remove( imageView );
 
-  Image image1 = ResourceImage::New( TEST_IMAGE_FILE_NAME );
+  ResourceImage image1 = ResourceImage::New( TEST_IMAGE_FILE_NAME );
   imageView.SetImage( image1 );
+  TestImage( imageView, image1 );
 
-  Image image2 = imageView.GetImage();
-  DALI_TEST_EQUALS( image1, image2, TEST_LOCATION );
+  Image image2;
+  imageView.SetImage( image2 );
 
-  Image image3;
-  imageView.SetImage( image3 );
+  Property::Value value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
 
-  Image image4 = imageView.GetImage();
-  DALI_TEST_CHECK( !image4 );
+  //the value should be empty
+  std::string url;
+  DALI_TEST_CHECK( !value.Get( url ) );
+
+  Property::Map map;
+  DALI_TEST_CHECK( !value.Get( map ) );
 
   END_TEST;
 }
@@ -440,13 +608,364 @@ int UtcDaliImageViewSetImageN(void)
   ImageView imageView = ImageView::New();
   imageView.SetImage( image1 );
 
-  Image image2 = imageView.GetImage();
-  DALI_TEST_CHECK( !image2 );
+  Property::Value value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
+
+  //the value should be empty
+  std::string url;
+  DALI_TEST_CHECK( !value.Get( url ) );
+
+  Property::Map map;
+  DALI_TEST_CHECK( !value.Get( map ) );
 
   std::string resource_url;
-  Property::Value val = imageView.GetProperty( imageView.GetPropertyIndex( "resource-url" ) );
-  DALI_TEST_CHECK( val.Get( resource_url ) );
-  DALI_TEST_CHECK( resource_url.empty() );
+  Property::Value val = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
+  DALI_TEST_CHECK( !val.Get( resource_url ) );
+
+  END_TEST;
+}
+
+int UtcDaliImageViewSetImageTypeChangesP(void)
+{
+  ToolkitTestApplication application;
+
+  ImageView imageView = ImageView::New();
+
+
+  std::string url;
+  Property::Map map;
+
+  Property::Value value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
+  DALI_TEST_CHECK( ! value.Get( url ) ); // Value should be empty
+  DALI_TEST_CHECK( ! value.Get( map ) ); // Value should be empty
+
+  // Set a URL
+  imageView.SetImage( "TEST_URL" );
+  value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
+
+  DALI_TEST_CHECK( value.Get( url ) );   // Value should NOT be empty
+  DALI_TEST_CHECK( ! value.Get( map ) ); // Value should be empty
+
+  // Set an empty Image
+  imageView.SetImage( Image() );
+  value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
+
+  DALI_TEST_CHECK( ! value.Get( url ) ); // Value should be empty
+  DALI_TEST_CHECK( ! value.Get( map ) ); // Value should be empty
+
+  // Set an Image
+  ResourceImage image1 = ResourceImage::New( TEST_IMAGE_FILE_NAME );
+  imageView.SetImage( image1 );
+  value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
+
+  DALI_TEST_CHECK( ! value.Get( url ) ); // Value should be empty
+  DALI_TEST_CHECK( value.Get( map ) );   // Value should NOT be empty
+
+  // Set an empty URL
+  imageView.SetImage( "" );
+  value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
+
+  DALI_TEST_CHECK( ! value.Get( url ) ); // Value should be empty
+  DALI_TEST_CHECK( ! value.Get( map ) ); // Value should be empty
+
+  END_TEST;
+}
+
+int UtcDaliImageViewResourceUrlP(void)
+{
+  ToolkitTestApplication application;
+
+  ImageView imageView = ImageView::New();
+  DALI_TEST_CHECK( imageView.GetProperty( ImageView::Property::RESOURCE_URL ).Get< std::string >().empty() );
+
+  imageView.SetProperty( ImageView::Property::RESOURCE_URL, "TestString" );
+  DALI_TEST_EQUALS( imageView.GetProperty( ImageView::Property::RESOURCE_URL ).Get< std::string >(), "TestString", TEST_LOCATION );
+
+  END_TEST;
+}
+
+// Scenarios 1: ImageView from regular image
+int UtcDaliImageViewSetImageBufferImage(void)
+{
+  ToolkitTestApplication application;
+
+  ImageView imageView = ImageView::New();
+  Stage::GetCurrent().Add( imageView );
+
+  TestGlAbstraction& gl = application.GetGlAbstraction();
+  gl.EnableTextureCallTrace( true );
+
+  std::vector< GLuint > ids;
+  ids.push_back( 23 );
+  application.GetGlAbstraction().SetNextTextureIds( ids );
+
+  int width = 300;
+  int height = 400;
+  BufferImage image = CreateBufferImage( width, height, Color::WHITE );
+
+  imageView.SetImage( image );
+
+  application.SendNotification();
+  application.Render();
+
+  DALI_TEST_CHECK( gl.GetTextureTrace().FindMethod("BindTexture") );
+
+  std::stringstream params;
+  params << GL_TEXTURE_2D << ", " << 23;
+  DALI_TEST_CHECK( gl.GetTextureTrace().FindMethodAndParams("BindTexture", params.str()) );
+
+  END_TEST;
+}
+
+// Scenarios 2: ImageView from Native image
+int UtcDaliImageViewSetImageNativeImage(void)
+{
+  ToolkitTestApplication application;
+
+  ImageView imageView = ImageView::New();
+  Stage::GetCurrent().Add( imageView );
+
+  TestGlAbstraction& gl = application.GetGlAbstraction();
+  gl.EnableTextureCallTrace( true );
+
+  std::vector< GLuint > ids;
+  ids.push_back( 23 );
+  application.GetGlAbstraction().SetNextTextureIds( ids );
+
+  int width = 200;
+  int height = 500;
+  TestNativeImagePointer nativeImageInterface = TestNativeImage::New( width, height );
+  NativeImage nativeImage = NativeImage::New( *(nativeImageInterface.Get()) );
+
+  imageView.SetImage( nativeImage );
+  application.SendNotification();
+  application.Render();
+
+  DALI_TEST_CHECK( gl.GetTextureTrace().FindMethod("BindTexture") );
+
+  std::stringstream params;
+  params << GL_TEXTURE_2D << ", " << 23;
+  DALI_TEST_CHECK( gl.GetTextureTrace().FindMethodAndParams("BindTexture", params.str()) );
+
+  END_TEST;
+}
+
+// Scenarios 3: ImageView initially from regular image but then SetImage called with Native image
+int UtcDaliImageViewSetImageBufferImageToNativeImage(void)
+{
+  ToolkitTestApplication application;
+
+  int width = 300;
+  int height = 400;
+  BufferImage image = CreateBufferImage( width, height, Color::WHITE );
+
+  ImageView imageView = ImageView::New( image );
+  Stage::GetCurrent().Add( imageView );
+
+  TestGlAbstraction& gl = application.GetGlAbstraction();
+  gl.EnableTextureCallTrace( true );
+
+  std::vector< GLuint > ids;
+  ids.push_back( 23 );
+  application.GetGlAbstraction().SetNextTextureIds( ids );
+
+  application.SendNotification();
+  application.Render();
+
+  DALI_TEST_CHECK( gl.GetTextureTrace().FindMethod("BindTexture") );
+
+  std::stringstream params;
+  params << GL_TEXTURE_2D << ", " << 23;
+  DALI_TEST_CHECK( gl.GetTextureTrace().FindMethodAndParams("BindTexture", params.str()) );
+
+  width = 200;
+  height = 500;
+  TestNativeImagePointer nativeImageInterface = TestNativeImage::New( width, height );
+  NativeImage nativeImage = NativeImage::New( *(nativeImageInterface.Get()) );
+  imageView.SetImage( nativeImage );
+
+  ids.clear();
+  ids.push_back( 24 );
+  application.GetGlAbstraction().SetNextTextureIds( ids );
+
+  application.SendNotification();
+  application.Render();
+
+  DALI_TEST_CHECK( gl.GetTextureTrace().FindMethod("BindTexture") );
+
+  std::stringstream nextTextureParams;
+  nextTextureParams << GL_TEXTURE_2D << ", " << 24;
+  DALI_TEST_CHECK( gl.GetTextureTrace().FindMethodAndParams("BindTexture", nextTextureParams.str()) );
+
+  END_TEST;
+}
+
+// Scenarios 4: ImageView initially from Native image but then SetImage called with regular image
+int UtcDaliImageViewSetImageNativeImageToBufferImage(void)
+{
+  ToolkitTestApplication application;
+
+  int width = 300;
+  int height = 400;
+  TestNativeImagePointer nativeImageInterface = TestNativeImage::New( width, height );
+  NativeImage nativeImage = NativeImage::New( *(nativeImageInterface.Get()) );
+
+  ImageView imageView = ImageView::New( nativeImage );
+  Stage::GetCurrent().Add( imageView );
+
+  TestGlAbstraction& gl = application.GetGlAbstraction();
+  gl.EnableTextureCallTrace( true );
+
+  std::vector< GLuint > ids;
+  ids.push_back( 23 );
+  application.GetGlAbstraction().SetNextTextureIds( ids );
+
+  application.SendNotification();
+  application.Render();
+
+  DALI_TEST_CHECK( gl.GetTextureTrace().FindMethod("BindTexture") );
+
+  std::stringstream params;
+  params << GL_TEXTURE_2D << ", " << 23;
+  DALI_TEST_CHECK( gl.GetTextureTrace().FindMethodAndParams("BindTexture", params.str()) );
+
+  width = 200;
+  height = 500;
+  BufferImage image = CreateBufferImage( width, height, Color::WHITE );
+  imageView.SetImage( image );
+
+  ids.clear();
+  ids.push_back( 24 );
+  application.GetGlAbstraction().SetNextTextureIds( ids );
+
+  application.SendNotification();
+  application.Render();
+
+  DALI_TEST_CHECK( gl.GetTextureTrace().FindMethod("BindTexture") );
+
+  std::stringstream nextTextureParams;
+  nextTextureParams << GL_TEXTURE_2D << ", " << 24;
+  DALI_TEST_CHECK( gl.GetTextureTrace().FindMethodAndParams("BindTexture", nextTextureParams.str()) );
+
+  END_TEST;
+}
+
+// Scenarios 5: ImageView from Native image with custom shader
+int UtcDaliImageViewSetImageNativeImageWithCustomShader(void)
+{
+  ToolkitTestApplication application;
+
+  int width = 300;
+  int height = 400;
+
+  Property::Map customShader;
+  customShader.Insert( "vertexShader", VERTEX_SHADER );
+  customShader.Insert( "fragmentShader", FRAGMENT_SHADER );
+
+  Property::Array shaderHints;
+  shaderHints.PushBack( "requiresSelfDepthTest" );
+  shaderHints.PushBack( "outputIsTransparent" );
+  shaderHints.PushBack( "outputIsOpaque" );
+  shaderHints.PushBack( "modifiesGeometry" );
+
+  customShader.Insert( "hints", shaderHints );
+
+  Property::Map map;
+  map.Insert( "rendererType", "imageRenderer" );
+  map.Insert( "shader", customShader );
+
+  TestNativeImagePointer nativeImageInterface = TestNativeImage::New( width, height );
+  NativeImage nativeImage = NativeImage::New( *(nativeImageInterface.Get()) );
+
+  ImageView imageView = ImageView::New( nativeImage );
+  imageView.SetProperty( ImageView::Property::IMAGE, map );
+  Stage::GetCurrent().Add( imageView );
+
+  imageView.SetProperty( ImageView::Property::IMAGE, map );
+
+  TestGlAbstraction& gl = application.GetGlAbstraction();
+  gl.EnableTextureCallTrace( true );
+
+  std::vector< GLuint > ids;
+  ids.push_back( 23 );
+  application.GetGlAbstraction().SetNextTextureIds( ids );
+
+  application.SendNotification();
+  application.Render();
+
+  DALI_TEST_CHECK( gl.GetTextureTrace().FindMethod("BindTexture") );
+
+  std::stringstream params;
+  params << GL_TEXTURE_2D << ", " << 23;
+  DALI_TEST_CHECK( gl.GetTextureTrace().FindMethodAndParams("BindTexture", params.str()) );
+
+  END_TEST;
+}
+
+// Scenarios 6: ImageView initially from regular image with custom shader but then SetImage called with Native
+int UtcDaliImageViewSetImageBufferImageWithCustomShaderToNativeImage(void)
+{
+  ToolkitTestApplication application;
+
+  int width = 300;
+  int height = 400;
+
+  Property::Map customShader;
+  customShader.Insert( "vertexShader", VERTEX_SHADER );
+  customShader.Insert( "fragmentShader", FRAGMENT_SHADER );
+
+  Property::Array shaderHints;
+  shaderHints.PushBack( "requiresSelfDepthTest" );
+  shaderHints.PushBack( "outputIsTransparent" );
+  shaderHints.PushBack( "outputIsOpaque" );
+  shaderHints.PushBack( "modifiesGeometry" );
+
+  customShader.Insert( "hints", shaderHints );
+
+  Property::Map map;
+  map.Insert( "rendererType", "imageRenderer" );
+  map.Insert( "shader", customShader );
+
+  BufferImage image = CreateBufferImage( width, height, Color::WHITE );
+
+  ImageView imageView = ImageView::New( image );
+  imageView.SetProperty( ImageView::Property::IMAGE, map );
+  Stage::GetCurrent().Add( imageView );
+
+  imageView.SetProperty( ImageView::Property::IMAGE, map );
+
+  TestGlAbstraction& gl = application.GetGlAbstraction();
+  gl.EnableTextureCallTrace( true );
+
+  std::vector< GLuint > ids;
+  ids.push_back( 23 );
+  application.GetGlAbstraction().SetNextTextureIds( ids );
+
+  application.SendNotification();
+  application.Render();
+
+  DALI_TEST_CHECK( gl.GetTextureTrace().FindMethod("BindTexture") );
+
+  std::stringstream params;
+  params << GL_TEXTURE_2D << ", " << 23;
+  DALI_TEST_CHECK( gl.GetTextureTrace().FindMethodAndParams("BindTexture", params.str()) );
+
+  TestNativeImagePointer nativeImageInterface = TestNativeImage::New( width, height );
+  NativeImage nativeImage = NativeImage::New( *(nativeImageInterface.Get()) );
+  imageView.SetImage( nativeImage );
+
+  ids.clear();
+  ids.push_back( 24 );
+  application.GetGlAbstraction().SetNextTextureIds( ids );
+
+  application.SendNotification();
+  application.Render();
+
+  DALI_TEST_CHECK( gl.GetTextureTrace().FindMethod("BindTexture") );
+
+  std::stringstream nativeImageParams;
+  nativeImageParams << GL_TEXTURE_2D << ", " << 24;
+  DALI_TEST_CHECK( gl.GetTextureTrace().FindMethodAndParams("BindTexture", nativeImageParams.str()) );
+
 
   END_TEST;
 }