X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=automated-tests%2Fsrc%2Fdali-toolkit%2Futc-Dali-TextField.cpp;h=becc47ecefdf886d2ffe286891d7cff16416cd59;hp=da5c59518c7c43b236b333c95f0d634a5d54aabc;hb=f3da11c2818c6d17706fbb2417f21b602b3190f5;hpb=b3aff14cae6b3af637e75171422c16661878ba8e diff --git a/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp b/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp index da5c595..becc47e 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp @@ -17,8 +17,12 @@ #include #include +#include +#include +#include #include #include +#include using namespace Dali; using namespace Toolkit; @@ -36,22 +40,101 @@ void dali_textfield_cleanup(void) namespace { -const char* const PROPERTY_NAME_RENDERING_BACKEND = "rendering-backend"; -const char* const PROPERTY_NAME_PLACEHOLDER_TEXT = "placeholder-text"; -const char* const PROPERTY_NAME_TEXT = "text"; -const char* const PROPERTY_NAME_FONT_FAMILY = "font-family"; -const char* const PROPERTY_NAME_FONT_STYLE = "font-style"; -const char* const PROPERTY_NAME_POINT_SIZE = "point-size"; -const char* const PROPERTY_NAME_EXCEED_POLICY = "exceed-policy"; -const char* const PROPERTY_NAME_PRIMARY_CURSOR_COLOR = "primary-cursor-color"; -const char* const PROPERTY_NAME_SECONDARY_CURSOR_COLOR = "secondary-cursor-color"; -const char* const PROPERTY_NAME_ENABLE_CURSOR_BLINK = "enable-cursor-blink"; -const char* const PROPERTY_NAME_CURSOR_BLINK_INTERVAL = "cursor-blink-interval"; -const char* const PROPERTY_NAME_CURSOR_BLINK_DURATION = "cursor-blink-duration"; -const char* const PROPERTY_NAME_GRAB_HANDLE_IMAGE = "grab-handle-image"; -const char* const PROPERTY_NAME_DECORATION_BOUNDING_BOX = "decoration-bounding-box"; -const char* const PROPERTY_NAME_HORIZONTAL_ALIGNMENT = "horizontal-alignment"; -const char* const PROPERTY_NAME_VERTICAL_ALIGNMENT = "vertical-alignment"; +const char* const PROPERTY_NAME_RENDERING_BACKEND = "renderingBackend"; +const char* const PROPERTY_NAME_TEXT = "text"; +const char* const PROPERTY_NAME_PLACEHOLDER_TEXT = "placeholderText"; +const char* const PROPERTY_NAME_PLACEHOLDER_TEXT_FOCUSED = "placeholderTextFocused"; +const char* const PROPERTY_NAME_FONT_FAMILY = "fontFamily"; +const char* const PROPERTY_NAME_FONT_STYLE = "fontStyle"; +const char* const PROPERTY_NAME_POINT_SIZE = "pointSize"; +const char* const PROPERTY_NAME_MAX_LENGTH = "maxLength"; +const char* const PROPERTY_NAME_EXCEED_POLICY = "exceedPolicy"; +const char* const PROPERTY_NAME_HORIZONTAL_ALIGNMENT = "horizontalAlignment"; +const char* const PROPERTY_NAME_VERTICAL_ALIGNMENT = "verticalAlignment"; +const char* const PROPERTY_NAME_TEXT_COLOR = "textColor"; +const char* const PROPERTY_NAME_PLACEHOLDER_TEXT_COLOR = "placeholderTextColor"; +const char* const PROPERTY_NAME_SHADOW_OFFSET = "shadowOffset"; +const char* const PROPERTY_NAME_SHADOW_COLOR = "shadowColor"; +const char* const PROPERTY_NAME_PRIMARY_CURSOR_COLOR = "primaryCursorColor"; +const char* const PROPERTY_NAME_SECONDARY_CURSOR_COLOR = "secondaryCursorColor"; +const char* const PROPERTY_NAME_ENABLE_CURSOR_BLINK = "enableCursorBlink"; +const char* const PROPERTY_NAME_CURSOR_BLINK_INTERVAL = "cursorBlinkInterval"; +const char* const PROPERTY_NAME_CURSOR_BLINK_DURATION = "cursorBlinkDuration"; +const char* const PROPERTY_NAME_CURSOR_WIDTH = "cursorWidth"; +const char* const PROPERTY_NAME_GRAB_HANDLE_IMAGE = "grabHandleImage"; +const char* const PROPERTY_NAME_GRAB_HANDLE_PRESSED_IMAGE = "grabHandlePressedImage"; +const char* const PROPERTY_NAME_SCROLL_THRESHOLD = "scrollThreshold"; +const char* const PROPERTY_NAME_SCROLL_SPEED = "scrollSpeed"; +const char* const PROPERTY_NAME_SELECTION_HANDLE_IMAGE_LEFT = "selectionHandleImageLeft"; +const char* const PROPERTY_NAME_SELECTION_HANDLE_IMAGE_RIGHT = "selectionHandleImageRight"; +const char* const PROPERTY_NAME_SELECTION_HANDLE_PRESSED_IMAGE_LEFT = "selectionHandlePressedImageLeft"; +const char* const PROPERTY_NAME_SELECTION_HANDLE_PRESSED_IMAGE_RIGHT = "selectionHandlePressedImageRight"; +const char* const PROPERTY_NAME_SELECTION_HANDLE_MARKER_IMAGE_LEFT = "selectionHandleMarkerImageLeft"; +const char* const PROPERTY_NAME_SELECTION_HANDLE_MARKER_IMAGE_RIGHT = "selectionHandleMarkerImageRight"; +const char* const PROPERTY_NAME_SELECTION_HIGHLIGHT_COLOR = "selectionHighlightColor"; +const char* const PROPERTY_NAME_DECORATION_BOUNDING_BOX = "decorationBoundingBox"; +const char* const PROPERTY_NAME_INPUT_METHOD_SETTINGS = "inputMethodSettings"; + +const int DEFAULT_RENDERING_BACKEND = Dali::Toolkit::Text::DEFAULT_RENDERING_BACKEND; + +const Vector4 PLACEHOLDER_TEXT_COLOR( 0.8f, 0.8f, 0.8f, 0.8f ); +const Dali::Vector4 LIGHT_BLUE( 0.75f, 0.96f, 1.f, 1.f ); // The text highlight color. + +const unsigned int CURSOR_BLINK_INTERVAL = 500u; // Cursor blink interval +const float TO_MILLISECONDS = 1000.f; +const float TO_SECONDS = 1.f / TO_MILLISECONDS; + +const float SCROLL_THRESHOLD = 10.f; +const float SCROLL_SPEED = 300.f; + +static bool gTextChangedCallBackCalled; +static bool gMaxCharactersCallBackCalled; + +static void TestTextChangedCallback( TextField control ) +{ + tet_infoline(" TestTextChangedCallback"); + + gTextChangedCallBackCalled = true; +} + +static void TestMaxLengthReachedCallback( TextField control ) +{ + tet_infoline(" TestMaxLengthReachedCallback"); + + gMaxCharactersCallBackCalled = true; +} + +// Generate a TapGestureEvent to send to Core. +Integration::TapGestureEvent GenerateTap( + Gesture::State state, + unsigned int numberOfTaps, + unsigned int numberOfTouches, + Vector2 point) +{ + Integration::TapGestureEvent tap( state ); + + tap.numberOfTaps = numberOfTaps; + tap.numberOfTouches = numberOfTouches; + tap.point = point; + + return tap; +} + +// Generate a KeyEvent to send to Core. +Integration::KeyEvent GenerateKey( const std::string& keyName, + const std::string& keyString, + int keyCode, + int keyModifier, + unsigned long timeStamp, + const Integration::KeyEvent::State& keyState ) +{ + return Integration::KeyEvent( keyName, + keyString, + keyCode, + keyModifier, + timeStamp, + keyState ); +} } // namespace @@ -136,33 +219,6 @@ int UtcDaliTextFieldNewP(void) END_TEST; } -int UtcDaliTextFieldGetPropertyN(void) -{ - ToolkitTestApplication application; - tet_infoline(" UtcDaliToolkitTextFieldGetPropertyN"); - TextField field = TextField::New(); - DALI_TEST_CHECK( field ); - - bool assert = false; - try - { - Property::Value value = field.GetProperty( 0 ); - } - catch ( ... ) - { - assert = true; - } - if ( assert ) - { - tet_result(TET_PASS); - } - else - { - tet_result(TET_FAIL); - } - END_TEST; -} - // Positive test case for a method int UtcDaliTextFieldGetPropertyP(void) { @@ -173,24 +229,60 @@ int UtcDaliTextFieldGetPropertyP(void) // Check Property Indices are correct DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_RENDERING_BACKEND ) == TextField::Property::RENDERING_BACKEND ); - DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_PLACEHOLDER_TEXT ) == TextField::Property::PLACEHOLDER_TEXT ); DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_TEXT ) == TextField::Property::TEXT ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_PLACEHOLDER_TEXT ) == TextField::Property::PLACEHOLDER_TEXT ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_PLACEHOLDER_TEXT_FOCUSED ) == TextField::Property::PLACEHOLDER_TEXT_FOCUSED ); DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_FONT_FAMILY ) == TextField::Property::FONT_FAMILY ); DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_FONT_STYLE ) == TextField::Property::FONT_STYLE ); DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_POINT_SIZE ) == TextField::Property::POINT_SIZE ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_MAX_LENGTH ) == TextField::Property::MAX_LENGTH ); DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_EXCEED_POLICY ) == TextField::Property::EXCEED_POLICY ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_HORIZONTAL_ALIGNMENT ) == TextField::Property::HORIZONTAL_ALIGNMENT ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_VERTICAL_ALIGNMENT ) == TextField::Property::VERTICAL_ALIGNMENT ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_TEXT_COLOR ) == TextField::Property::TEXT_COLOR ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_PLACEHOLDER_TEXT_COLOR ) == TextField::Property::PLACEHOLDER_TEXT_COLOR ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SHADOW_OFFSET ) == TextField::Property::SHADOW_OFFSET ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SHADOW_COLOR ) == TextField::Property::SHADOW_COLOR ); DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_PRIMARY_CURSOR_COLOR ) == TextField::Property::PRIMARY_CURSOR_COLOR ); DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SECONDARY_CURSOR_COLOR ) == TextField::Property::SECONDARY_CURSOR_COLOR ); DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_ENABLE_CURSOR_BLINK ) == TextField::Property::ENABLE_CURSOR_BLINK ); DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_CURSOR_BLINK_INTERVAL ) == TextField::Property::CURSOR_BLINK_INTERVAL ); DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_CURSOR_BLINK_DURATION ) == TextField::Property::CURSOR_BLINK_DURATION ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_CURSOR_WIDTH ) == TextField::Property::CURSOR_WIDTH ); DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_GRAB_HANDLE_IMAGE ) == TextField::Property::GRAB_HANDLE_IMAGE ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_GRAB_HANDLE_PRESSED_IMAGE ) == TextField::Property::GRAB_HANDLE_PRESSED_IMAGE ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SCROLL_THRESHOLD ) == TextField::Property::SCROLL_THRESHOLD ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SCROLL_SPEED ) == TextField::Property::SCROLL_SPEED ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HANDLE_IMAGE_LEFT ) == TextField::Property::SELECTION_HANDLE_IMAGE_LEFT ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HANDLE_IMAGE_RIGHT ) == TextField::Property::SELECTION_HANDLE_IMAGE_RIGHT ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HANDLE_PRESSED_IMAGE_LEFT ) == TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_LEFT ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HANDLE_PRESSED_IMAGE_RIGHT ) == TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_RIGHT ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HANDLE_MARKER_IMAGE_LEFT ) == TextField::Property::SELECTION_HANDLE_MARKER_IMAGE_LEFT ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HANDLE_MARKER_IMAGE_RIGHT ) == TextField::Property::SELECTION_HANDLE_MARKER_IMAGE_RIGHT ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HIGHLIGHT_COLOR ) == TextField::Property::SELECTION_HIGHLIGHT_COLOR ); DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_DECORATION_BOUNDING_BOX ) == TextField::Property::DECORATION_BOUNDING_BOX ); - DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_HORIZONTAL_ALIGNMENT ) == TextField::Property::HORIZONTAL_ALIGNMENT ); - DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_VERTICAL_ALIGNMENT ) == TextField::Property::VERTICAL_ALIGNMENT ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_INPUT_METHOD_SETTINGS ) == TextField::Property::INPUT_METHOD_SETTINGS ); END_TEST; } +bool SetPropertyMapRetrieved( TextField& field, const Property::Index property, const std::string mapKey, const std::string mapValue ) +{ + bool result = false; + Property::Map imageMap; + imageMap[mapKey] =mapValue; + + field.SetProperty( property , imageMap ); + Property::Value propValue = field.GetProperty( property ); + Property::Map* resultMap = propValue.GetMap(); + + if ( resultMap->Find( mapKey )->Get< std::string>() == mapValue ) + { + result = true; + } + + return result; +} + // Positive test case for a method int UtcDaliTextFieldSetPropertyP(void) { @@ -198,121 +290,518 @@ int UtcDaliTextFieldSetPropertyP(void) tet_infoline(" UtcDaliToolkitTextFieldSetPropertyP"); TextField field = TextField::New(); DALI_TEST_CHECK( field ); + Stage::GetCurrent().Add( field ); + + // Note - we can't check the defaults since the stylesheets are platform-specific + + // Check the render backend property. + field.SetProperty( TextField::Property::RENDERING_BACKEND, Text::RENDERING_SHARED_ATLAS ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::RENDERING_BACKEND ), Text::RENDERING_SHARED_ATLAS, TEST_LOCATION ); + + // Check text property. + field.SetProperty( TextField::Property::TEXT, "Setting Text" ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::TEXT ), std::string("Setting Text"), TEST_LOCATION ); + + // Check placeholder text properties. + field.SetProperty( TextField::Property::PLACEHOLDER_TEXT, "Setting Placeholder Text" ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::PLACEHOLDER_TEXT ), std::string("Setting Placeholder Text"), TEST_LOCATION ); + + field.SetProperty( TextField::Property::PLACEHOLDER_TEXT_FOCUSED, "Setting Placeholder Text Focused" ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::PLACEHOLDER_TEXT_FOCUSED ), std::string("Setting Placeholder Text Focused"), TEST_LOCATION ); + + // Check font properties. + field.SetProperty( TextField::Property::FONT_FAMILY, "Setting font family" ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::FONT_FAMILY ), std::string("Setting font family"), TEST_LOCATION ); + field.SetProperty( TextField::Property::FONT_STYLE, "Setting font style" ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::FONT_STYLE ), std::string("Setting font style"), TEST_LOCATION ); + field.SetProperty( TextField::Property::POINT_SIZE, 10.f ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::POINT_SIZE ), 10.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION ); + + // Check that the MAX_LENGTH property can be correctly set + const int maxNumberOfCharacters = 20; + field.SetProperty( TextField::Property::MAX_LENGTH, maxNumberOfCharacters ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::MAX_LENGTH ), maxNumberOfCharacters, TEST_LOCATION ); // Check exceed policy - field.SetProperty( TextField::Property::EXCEED_POLICY, TextField::EXCEED_POLICY_CLIP ); - DALI_TEST_EQUALS( field.GetProperty( TextField::Property::EXCEED_POLICY ), TextField::EXCEED_POLICY_CLIP, TEST_LOCATION ); + // Set a different exceed policy is not implemented. + + // Check that the Alignment properties can be correctly set + field.SetProperty( TextField::Property::HORIZONTAL_ALIGNMENT, "END" ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::HORIZONTAL_ALIGNMENT ), "END", TEST_LOCATION ); + field.SetProperty( TextField::Property::VERTICAL_ALIGNMENT, "CENTER" ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::VERTICAL_ALIGNMENT ), "CENTER", TEST_LOCATION ); + + // Check text's color property + field.SetProperty( TextField::Property::TEXT_COLOR, Color::WHITE ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::TEXT_COLOR ), Color::WHITE, TEST_LOCATION ); + + // Check placeholder text's color property. + field.SetProperty( TextField::Property::PLACEHOLDER_TEXT_COLOR, Color::RED ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::PLACEHOLDER_TEXT_COLOR ), Color::RED, TEST_LOCATION ); + + // Check shadow properties. + field.SetProperty( TextField::Property::SHADOW_OFFSET, Vector2( 1.f, 1.f ) ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::SHADOW_OFFSET ), Vector2( 1.f, 1.f ), TEST_LOCATION ); + field.SetProperty( TextField::Property::SHADOW_COLOR, Color::GREEN ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::SHADOW_COLOR ), Color::GREEN, TEST_LOCATION ); // Check cursor properties - field.SetProperty( TextField::Property::ENABLE_CURSOR_BLINK, true ); - DALI_TEST_EQUALS( field.GetProperty( TextField::Property::ENABLE_CURSOR_BLINK ), true, TEST_LOCATION ); field.SetProperty( TextField::Property::PRIMARY_CURSOR_COLOR, Color::RED ); DALI_TEST_EQUALS( field.GetProperty( TextField::Property::PRIMARY_CURSOR_COLOR ), Color::RED, TEST_LOCATION ); field.SetProperty( TextField::Property::SECONDARY_CURSOR_COLOR, Color::BLUE ); DALI_TEST_EQUALS( field.GetProperty( TextField::Property::SECONDARY_CURSOR_COLOR ), Color::BLUE, TEST_LOCATION ); - field.SetProperty( TextField::Property::CURSOR_BLINK_DURATION, 10.0f ); - DALI_TEST_EQUALS( field.GetProperty( TextField::Property::CURSOR_BLINK_DURATION ), 10.0f, TEST_LOCATION ); - // Blink interval gets converted to milliseconds.... - field.SetProperty( TextField::Property::CURSOR_BLINK_INTERVAL, 1.0f ); - DALI_TEST_EQUALS( field.GetProperty( TextField::Property::CURSOR_BLINK_INTERVAL ), 1000.0f, TEST_LOCATION ); + field.SetProperty( TextField::Property::ENABLE_CURSOR_BLINK, false ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::ENABLE_CURSOR_BLINK ), false, TEST_LOCATION ); + field.SetProperty( TextField::Property::CURSOR_BLINK_INTERVAL, 1.f ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::CURSOR_BLINK_INTERVAL ), 1.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION ); + field.SetProperty( TextField::Property::CURSOR_BLINK_DURATION, 10.f ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::CURSOR_BLINK_DURATION ), 10.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION ); + field.SetProperty( TextField::Property::CURSOR_WIDTH, 1 ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::CURSOR_WIDTH ), 1, TEST_LOCATION ); + + // Check scroll properties. + field.SetProperty( TextField::Property::SCROLL_THRESHOLD, 1.f ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::SCROLL_THRESHOLD ), 1.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION ); + field.SetProperty( TextField::Property::SCROLL_SPEED, 100.f ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::SCROLL_SPEED ), 100.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION ); + + // Check handle images + field.SetProperty( TextField::Property::GRAB_HANDLE_IMAGE, "image1" ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::GRAB_HANDLE_IMAGE ), "image1", TEST_LOCATION ); + field.SetProperty( TextField::Property::GRAB_HANDLE_PRESSED_IMAGE, "image2" ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::GRAB_HANDLE_PRESSED_IMAGE ), "image2", TEST_LOCATION ); + field.SetProperty( TextField::Property::SELECTION_HANDLE_IMAGE_LEFT, "image3" ); + + // Check handle images + DALI_TEST_CHECK( SetPropertyMapRetrieved( field, TextField::Property::SELECTION_HANDLE_IMAGE_LEFT, "filename", "leftHandleImage" ) ); + DALI_TEST_CHECK( SetPropertyMapRetrieved( field, TextField::Property::SELECTION_HANDLE_IMAGE_RIGHT, "filename", "rightHandleImage" ) ); + DALI_TEST_CHECK( SetPropertyMapRetrieved( field, TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_LEFT, "filename", "leftHandleImagePressed" ) ); + DALI_TEST_CHECK( SetPropertyMapRetrieved( field, TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_RIGHT, "filename", "rightHandleImagePressed" ) ); + DALI_TEST_CHECK( SetPropertyMapRetrieved( field, TextField::Property::SELECTION_HANDLE_MARKER_IMAGE_LEFT, "filename", "leftHandleMarkerImage" ) ); + DALI_TEST_CHECK( SetPropertyMapRetrieved( field, TextField::Property::SELECTION_HANDLE_MARKER_IMAGE_RIGHT, "filename", "rightHandleMarkerImage" ) ); + + // Check the highlight color + field.SetProperty( TextField::Property::SELECTION_HIGHLIGHT_COLOR, Color::GREEN ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::SELECTION_HIGHLIGHT_COLOR ), Color::GREEN, TEST_LOCATION ); // Decoration bounding box field.SetProperty( TextField::Property::DECORATION_BOUNDING_BOX, Rect( 0, 0, 1, 1 ) ); DALI_TEST_EQUALS( field.GetProperty >( TextField::Property::DECORATION_BOUNDING_BOX ), Rect( 0, 0, 1, 1 ), TEST_LOCATION ); - // Check that the Alignment properties can be correctly set - field.SetProperty( TextField::Property::HORIZONTAL_ALIGNMENT, "BEGIN" ); - DALI_TEST_EQUALS( field.GetProperty( TextField::Property::HORIZONTAL_ALIGNMENT ), "BEGIN", TEST_LOCATION ); - field.SetProperty( TextField::Property::VERTICAL_ALIGNMENT, "CENTER" ); - DALI_TEST_EQUALS( field.GetProperty( TextField::Property::VERTICAL_ALIGNMENT ), "CENTER", TEST_LOCATION ); - - // Set text - field.SetProperty( TextField::Property::TEXT, "Setting Text" ); - - // Set placeholder text (currently not implemented) - field.SetProperty( TextField::Property::PLACEHOLDER_TEXT, "Setting Text" ); - - // Set Grab Handle image - field.SetProperty( TextField::Property::GRAB_HANDLE_IMAGE, "" ); - END_TEST; } -// Negative test case for a method -int UtcDaliTextFieldSetPropertyN(void) +// Positive Atlas Text Renderer test +int utcDaliTextFieldAtlasRenderP(void) { ToolkitTestApplication application; - tet_infoline(" UtcDaliToolkitTextFieldSetPropertyN"); + tet_infoline(" UtcDaliToolkitTextFieldAtlasRenderP"); + StyleManager styleManager = StyleManager::Get(); + styleManager.RequestDefaultTheme(); TextField field = TextField::New(); DALI_TEST_CHECK( field ); - bool assert = false; + field.SetProperty( TextField::Property::HORIZONTAL_ALIGNMENT, "CENTER" ); + + application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); + + Stage::GetCurrent().Add( field ); + try { - field.SetProperty( 0, true ); - } - catch ( ... ) - { - assert = true; - } - if ( assert ) - { - tet_result(TET_PASS); + // Render some text with the shared atlas backend + field.SetProperty( TextField::Property::RENDERING_BACKEND, Text::RENDERING_SHARED_ATLAS ); + application.SendNotification(); + application.Render(); } - else + catch( ... ) { tet_result(TET_FAIL); } END_TEST; } -// Positive Basic Text Renderer test -int utcDaliTextFieldBasicRenderP(void) +// Positive test for the textChanged signal. +int utcDaliTextFieldTextChangedP(void) { ToolkitTestApplication application; - tet_infoline("UtcDaliToolkitTextFieldBasicRenderP"); + tet_infoline(" utcDaliTextFieldTextChangedP"); TextField field = TextField::New(); DALI_TEST_CHECK( field ); - field.SetProperty( TextField::Property::HORIZONTAL_ALIGNMENT, "BEGIN" ); + Stage::GetCurrent().Add( field ); + + field.TextChangedSignal().Connect(&TestTextChangedCallback); + + gTextChangedCallBackCalled = false; + field.SetProperty( TextField::Property::TEXT, "ABC" ); + DALI_TEST_CHECK( gTextChangedCallBackCalled ); + + application.SendNotification(); + + field.SetKeyInputFocus(); + + gTextChangedCallBackCalled = false; + application.ProcessEvent( GenerateKey( "D", "D", 0, 0, 0, Integration::KeyEvent::Down ) ); + DALI_TEST_CHECK( gTextChangedCallBackCalled ); - try - { - // Render some text with the basic backend - field.SetProperty( TextField::Property::RENDERING_BACKEND, Text::RENDERING_BASIC ); - application.SendNotification(); - application.Render(); - } - catch( ... ) - { - tet_result(TET_FAIL); - } END_TEST; } -// Positive Atlas Text Renderer test -int utcDaliTextFieldAtlasRenderP(void) +// Negative test for the textChanged signal. +int utcDaliTextFieldTextChangedN(void) { ToolkitTestApplication application; - tet_infoline(" UtcDaliToolkitTextFieldAtlasRenderP"); - StyleManager styleManager = StyleManager::Get(); - styleManager.RequestDefaultTheme(); + tet_infoline(" utcDaliTextFieldTextChangedN"); TextField field = TextField::New(); DALI_TEST_CHECK( field ); - field.SetProperty( TextField::Property::HORIZONTAL_ALIGNMENT, "CENTER" ); - try - { - // Render some text with the shared atlas backend - field.SetProperty( TextField::Property::RENDERING_BACKEND, Text::RENDERING_SHARED_ATLAS ); - application.SendNotification(); - application.Render(); - } - catch( ... ) - { - tet_result(TET_FAIL); - } + Stage::GetCurrent().Add( field ); + + field.TextChangedSignal().Connect(&TestTextChangedCallback); + + gTextChangedCallBackCalled = false; + field.SetProperty( TextField::Property::PLACEHOLDER_TEXT, "ABC" ); // Setting placeholder, not TEXT + DALI_TEST_CHECK( !gTextChangedCallBackCalled ); + + END_TEST; +} + +// Positive test for Max Characters reached signal. +int utcDaliTextFieldMaxCharactersReachedP(void) +{ + ToolkitTestApplication application; + tet_infoline(" utcDaliTextFieldMaxCharactersReachedP"); + TextField field = TextField::New(); + DALI_TEST_CHECK( field ); + + Stage::GetCurrent().Add( field ); + + const int maxNumberOfCharacters = 1; + field.SetProperty( TextField::Property::MAX_LENGTH, maxNumberOfCharacters ); + + field.SetKeyInputFocus(); + + gMaxCharactersCallBackCalled = false; + field.MaxLengthReachedSignal().Connect(&TestMaxLengthReachedCallback); + + application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) ); + application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) ); + + DALI_TEST_CHECK( gMaxCharactersCallBackCalled ); + + END_TEST; +} + +// Negative test for Max Characters reached signal. +int utcDaliTextFieldMaxCharactersReachedN(void) +{ + ToolkitTestApplication application; + tet_infoline(" utcDaliTextFieldMaxCharactersReachedN"); + TextField field = TextField::New(); + DALI_TEST_CHECK( field ); + + Stage::GetCurrent().Add( field ); + + const int maxNumberOfCharacters = 3; + field.SetProperty( TextField::Property::MAX_LENGTH, maxNumberOfCharacters ); + + field.SetKeyInputFocus(); + + gMaxCharactersCallBackCalled = false; + field.MaxLengthReachedSignal().Connect(&TestMaxLengthReachedCallback); + + application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) ); + application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) ); + + DALI_TEST_CHECK( !gMaxCharactersCallBackCalled ); + + END_TEST; +} + +int utcDaliTextFieldEvent01(void) +{ + ToolkitTestApplication application; + tet_infoline(" utcDaliTextFieldEvent01"); + + // Creates a tap event. After creating a tap event the text field should + // have the focus and add text with key events should be possible. + + TextField field = TextField::New(); + DALI_TEST_CHECK( field ); + + Stage::GetCurrent().Add( field ); + + field.SetSize( 300.f, 50.f ); + field.SetParentOrigin( ParentOrigin::TOP_LEFT ); + field.SetAnchorPoint( AnchorPoint::TOP_LEFT ); + + // Avoid a crash when core load gl resources. + application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Add a key event but as the text field has not the focus it should do nothing. + application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::TEXT ), std::string(""), TEST_LOCATION ); + + // Create a tap event to touch the text field. + application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 150.0f, 25.0f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 150.0f, 25.0f ) ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Now the text field has the focus, so it can handle the key events. + application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) ); + application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::TEXT ), std::string("aa"), TEST_LOCATION ); + + // Create a second text field and send key events to it. + TextField field2 = TextField::New(); + + field2.SetParentOrigin( ParentOrigin::TOP_LEFT ); + field2.SetAnchorPoint( AnchorPoint::TOP_LEFT ); + field2.SetSize( 100.f, 100.f ); + field2.SetPosition( 100.f, 100.f ); + + Stage::GetCurrent().Add( field2 ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Create a tap event on the second text field. + application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 150.0f, 125.0f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 150.0f, 125.0f ) ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // The second text field has the focus. It should handle the key events. + application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) ); + application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Check the text has been added to the second text field. + DALI_TEST_EQUALS( field2.GetProperty( TextField::Property::TEXT ), std::string("aa"), TEST_LOCATION ); + + END_TEST; +} + +int utcDaliTextFieldEvent02(void) +{ + ToolkitTestApplication application; + tet_infoline(" utcDaliTextFieldEvent02"); + + // Checks if the right number of actors are created. + + TextField field = TextField::New(); + field.SetProperty( TextField::Property::POINT_SIZE, 10.f ); + DALI_TEST_CHECK( field ); + + Stage::GetCurrent().Add( field ); + + field.SetSize( 300.f, 50.f ); + field.SetParentOrigin( ParentOrigin::TOP_LEFT ); + field.SetAnchorPoint( AnchorPoint::TOP_LEFT ); + + // Avoid a crash when core load gl resources. + application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Check there are the expected number of children ( active layer, offscreen root actor, and the offscreen image actor + DALI_TEST_EQUALS( field.GetChildCount(), 3u, TEST_LOCATION ); + + Actor layer = field.GetChildAt( 0u ); + DALI_TEST_CHECK( layer.IsLayer() ); + + Actor offscreenRoot = field.GetChildAt( 1u ); + DALI_TEST_CHECK( offscreenRoot.IsLayer() ); + DALI_TEST_EQUALS( offscreenRoot.GetChildCount(), 1u, TEST_LOCATION ); // The camera actor. + + Actor offscreenImage = field.GetChildAt( 2u ); + ImageActor imageActor = ImageActor::DownCast( offscreenImage ); + DALI_TEST_CHECK( imageActor ); + + // Create a tap event to touch the text field. + application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 150.0f, 25.0f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 150.0f, 25.0f ) ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( layer.GetChildCount(), 1u, TEST_LOCATION ); // The cursor. + DALI_TEST_EQUALS( offscreenRoot.GetChildCount(), 1u, TEST_LOCATION ); // The camera actor. + + // Now the text field has the focus, so it can handle the key events. + application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) ); + application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Checks the cursor and the renderer have been created. + DALI_TEST_EQUALS( layer.GetChildCount(), 1u, TEST_LOCATION ); // The cursor. + DALI_TEST_EQUALS( offscreenRoot.GetChildCount(), 2u, TEST_LOCATION ); // The camera actor and the renderer + + ImageActor cursor = ImageActor::DownCast( layer.GetChildAt( 0u ) ); + DALI_TEST_CHECK( cursor ); + + CameraActor camera = CameraActor::DownCast( offscreenRoot.GetChildAt( 0u ) ); + DALI_TEST_CHECK( camera ); + + Renderer renderer = offscreenRoot.GetChildAt( 1u ).GetRendererAt( 0u ); + DALI_TEST_CHECK( renderer ); + + // Move the cursor and check the position changes. + Vector3 position1 = cursor.GetCurrentPosition(); + + application.ProcessEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Integration::KeyEvent::Down ) ); + application.ProcessEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Integration::KeyEvent::Down ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + Vector3 position2 = cursor.GetCurrentPosition(); + + DALI_TEST_CHECK( position2.x < position1.x ); + + application.ProcessEvent( GenerateKey( "", "", DALI_KEY_CURSOR_RIGHT, 0, 0, Integration::KeyEvent::Down ) ); + application.ProcessEvent( GenerateKey( "", "", DALI_KEY_CURSOR_RIGHT, 0, 0, Integration::KeyEvent::Down ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + Vector3 position3 = cursor.GetCurrentPosition(); + + DALI_TEST_EQUALS( position1, position3, TEST_LOCATION ); // Should be in the same position1. + + // Send some taps and check the cursor positions. + + // Try to tap at the beginning. + application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 1.f, 25.0f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 1.f, 25.0f ) ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Cursor position should be the same than position1. + Vector3 position4 = cursor.GetCurrentPosition(); + + DALI_TEST_EQUALS( position2, position4, TEST_LOCATION ); // Should be in the same position2. + + // Tap away from the start position. + application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 16.f, 25.0f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 16.0f, 25.0f ) ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + Vector3 position5 = cursor.GetCurrentPosition(); + + DALI_TEST_CHECK( position5.x > position4.x ); + + // Remove all the text. + application.ProcessEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::Down ) ); + application.ProcessEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::Down ) ); + field.SetProperty( TextField::Property::TEXT, "" ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Cursor position should be the same than position2. + Vector3 position6 = cursor.GetCurrentPosition(); + + DALI_TEST_EQUALS( position2, position6, TEST_LOCATION );// Should be in the same position2. + + // Should not be a renderer. + DALI_TEST_EQUALS( offscreenRoot.GetChildCount(), 1u, TEST_LOCATION ); // The camera actor only. + END_TEST; } +int utcDaliTextFieldEvent03(void) +{ + ToolkitTestApplication application; + tet_infoline(" utcDaliTextFieldEvent03"); + + // Checks if the highlight actor is created. + + TextField field = TextField::New(); + DALI_TEST_CHECK( field ); + + Stage::GetCurrent().Add( field ); + + field.SetProperty( TextField::Property::TEXT, "This is a long text for the size of the text-field." ); + field.SetProperty( TextField::Property::POINT_SIZE, 10.f ); + field.SetSize( 30.f, 50.f ); + field.SetParentOrigin( ParentOrigin::TOP_LEFT ); + field.SetAnchorPoint( AnchorPoint::TOP_LEFT ); + + // Avoid a crash when core load gl resources. + application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Tap first to get the focus. + application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 3.f, 25.0f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 3.f, 25.0f ) ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Double tap to select a word. + application.ProcessEvent( GenerateTap( Gesture::Possible, 2u, 1u, Vector2( 3.f, 25.0f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 2u, 1u, Vector2( 3.f, 25.0f ) ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // The offscreen root actor should have three actors: the camera, a renderer and the highlight actor. + Actor offscreenRoot = field.GetChildAt( 1u ); + DALI_TEST_CHECK( offscreenRoot.IsLayer() ); + + CameraActor camera = CameraActor::DownCast( offscreenRoot.GetChildAt( 0u ) ); + DALI_TEST_CHECK( camera ); + + Renderer renderer = offscreenRoot.GetChildAt( 1u ).GetRendererAt( 0u ); + DALI_TEST_CHECK( renderer ); + + Renderer highlight = offscreenRoot.GetChildAt( 2u ).GetRendererAt( 0u ); + DALI_TEST_CHECK( highlight ); + + END_TEST; +}