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=0335e4ed8cfb3ec934d41153fab5f0e418e4e875;hp=521c1914ae4ac4b9c59b62ccdbd9a8987d042408;hb=cc7bb8e3f22f9ef519c46444ca0ada0f2c5cf5f9;hpb=ddd49830fa29f0710b037d3b648a9bb3b995b643 diff --git a/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp b/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp index 521c191..0335e4e 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * Copyright (c) 2016 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,12 +17,17 @@ #include #include -#include +#include + +#include #include #include +#include +#include +#include #include #include -#include +#include "toolkit-clipboard.h" using namespace Dali; using namespace Toolkit; @@ -40,40 +45,54 @@ void dali_textfield_cleanup(void) namespace { -const char* const PROPERTY_NAME_RENDERING_BACKEND = "rendering-backend"; +const char* const PROPERTY_NAME_RENDERING_BACKEND = "renderingBackend"; const char* const PROPERTY_NAME_TEXT = "text"; -const char* const PROPERTY_NAME_PLACEHOLDER_TEXT = "placeholder-text"; -const char* const PROPERTY_NAME_PLACEHOLDER_TEXT_FOCUSED = "placeholder-text-focused"; -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_MAX_LENGTH = "max-length"; -const char* const PROPERTY_NAME_EXCEED_POLICY = "exceed-policy"; -const char* const PROPERTY_NAME_HORIZONTAL_ALIGNMENT = "horizontal-alignment"; -const char* const PROPERTY_NAME_VERTICAL_ALIGNMENT = "vertical-alignment"; -const char* const PROPERTY_NAME_TEXT_COLOR = "text-color"; -const char* const PROPERTY_NAME_PLACEHOLDER_TEXT_COLOR = "placeholder-text-color"; -const char* const PROPERTY_NAME_SHADOW_OFFSET = "shadow-offset"; -const char* const PROPERTY_NAME_SHADOW_COLOR = "shadow-color"; -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_CURSOR_WIDTH = "cursor-width"; -const char* const PROPERTY_NAME_GRAB_HANDLE_IMAGE = "grab-handle-image"; -const char* const PROPERTY_NAME_GRAB_HANDLE_PRESSED_IMAGE = "grab-handle-pressed-image"; -const char* const PROPERTY_NAME_SCROLL_THRESHOLD = "scroll-threshold"; -const char* const PROPERTY_NAME_SCROLL_SPEED = "scroll-speed"; -const char* const PROPERTY_NAME_SELECTION_HANDLE_IMAGE_LEFT = "selection-handle-image-left"; -const char* const PROPERTY_NAME_SELECTION_HANDLE_IMAGE_RIGHT = "selection-handle-image-right"; -const char* const PROPERTY_NAME_SELECTION_HANDLE_PRESSED_IMAGE_LEFT = "selection-handle-pressed-image-left"; -const char* const PROPERTY_NAME_SELECTION_HANDLE_PRESSED_IMAGE_RIGHT = "selection-handle-pressed-image-right"; -const char* const PROPERTY_NAME_SELECTION_HANDLE_MARKER_IMAGE_LEFT = "selection-handle-marker-image-left"; -const char* const PROPERTY_NAME_SELECTION_HANDLE_MARKER_IMAGE_RIGHT = "selection-handle-marker-image-right"; -const char* const PROPERTY_NAME_SELECTION_HIGHLIGHT_COLOR = "selection-highlight-color"; -const char* const PROPERTY_NAME_DECORATION_BOUNDING_BOX = "decoration-bounding-box"; -const char* const PROPERTY_NAME_INPUT_METHOD_SETTINGS = "input-method-settings"; +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 char* const PROPERTY_NAME_INPUT_COLOR = "inputColor"; +const char* const PROPERTY_NAME_ENABLE_MARKUP = "enableMarkup"; +const char* const PROPERTY_NAME_INPUT_FONT_FAMILY = "inputFontFamily"; +const char* const PROPERTY_NAME_INPUT_FONT_STYLE = "inputFontStyle"; +const char* const PROPERTY_NAME_INPUT_POINT_SIZE = "inputPointSize"; + +const char* const PROPERTY_NAME_UNDERLINE = "underline"; +const char* const PROPERTY_NAME_INPUT_UNDERLINE = "inputUnderline"; +const char* const PROPERTY_NAME_SHADOW = "shadow"; +const char* const PROPERTY_NAME_INPUT_SHADOW = "inputShadow"; +const char* const PROPERTY_NAME_EMBOSS = "emboss"; +const char* const PROPERTY_NAME_INPUT_EMBOSS = "inputEmboss"; +const char* const PROPERTY_NAME_OUTLINE = "outline"; +const char* const PROPERTY_NAME_INPUT_OUTLINE = "inputOutline"; const int DEFAULT_RENDERING_BACKEND = Dali::Toolkit::Text::DEFAULT_RENDERING_BACKEND; @@ -81,14 +100,149 @@ 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 RENDER_FRAME_INTERVAL = 16.66f; + 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; +const unsigned int DEFAULT_FONT_SIZE = 1152u; +const std::string DEFAULT_FONT_DIR( "/resources/fonts" ); + static bool gTextChangedCallBackCalled; static bool gMaxCharactersCallBackCalled; +static bool gInputStyleChangedCallbackCalled; +static Dali::Toolkit::TextField::InputStyle::Mask gInputStyleMask; + +static void LoadBitmapResource(TestPlatformAbstraction& platform, int width, int height) +{ + Integration::ResourceRequest* request = platform.GetRequest(); + Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_DISCARD ); + Integration::ResourcePointer resource(bitmap); + bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, width, height, width, height); + + if(request) + { + platform.SetResourceLoaded(request->GetId(), request->GetType()->id, resource); + } +} + +static void LoadMarkerImages(ToolkitTestApplication& app, TextField textField) +{ + int width(40); + int height(40); + LoadBitmapResource( app.GetPlatform(), width, height ); + + Property::Map propertyMap; + propertyMap["filename"] = "image.png"; + propertyMap["width"] = width; + propertyMap["height"] = height; + textField.SetProperty( Toolkit::TextField::Property::SELECTION_HANDLE_IMAGE_LEFT, propertyMap ); + textField.SetProperty( Toolkit::TextField::Property::SELECTION_HANDLE_IMAGE_RIGHT, propertyMap ); + textField.SetProperty( Toolkit::TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_LEFT, propertyMap ); + textField.SetProperty( Toolkit::TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_RIGHT, propertyMap ); + textField.SetProperty( Toolkit::TextField::Property::SELECTION_HANDLE_MARKER_IMAGE_LEFT, propertyMap ); + textField.SetProperty( Toolkit::TextField::Property::SELECTION_HANDLE_MARKER_IMAGE_RIGHT, propertyMap ); + textField.SetProperty( Toolkit::TextField::Property::GRAB_HANDLE_IMAGE, propertyMap ); + textField.SetProperty( Toolkit::TextField::Property::GRAB_HANDLE_PRESSED_IMAGE, propertyMap ); +} + +// Generate a PanGestureEvent to send to Core +static Integration::PanGestureEvent GeneratePan( + Gesture::State state, + const Vector2& previousPosition, + const Vector2& currentPosition, + unsigned long timeDelta, + unsigned int numberOfTouches = 1) +{ + Integration::PanGestureEvent pan(state); + + pan.previousPosition = previousPosition; + pan.currentPosition = currentPosition; + pan.timeDelta = timeDelta; + pan.numberOfTouches = numberOfTouches; + + return pan; +} + +/** + * Helper to generate PanGestureEvent + * + * @param[in] application Application instance + * @param[in] state The Gesture State + * @param[in] pos The current position of touch. + */ +static void SendPan(ToolkitTestApplication& application, Gesture::State state, const Vector2& pos) +{ + static Vector2 last; + + if( (state == Gesture::Started) || + (state == Gesture::Possible) ) + { + last.x = pos.x; + last.y = pos.y; + } + + application.ProcessEvent(GeneratePan(state, last, pos, 16)); + + last.x = pos.x; + last.y = pos.y; +} + +/* + * Simulate time passed by. + * + * @note this will always process at least 1 frame (1/60 sec) + * + * @param application Test application instance + * @param duration Time to pass in milliseconds. + * @return The actual time passed in milliseconds + */ +static int Wait(ToolkitTestApplication& application, int duration = 0) +{ + int time = 0; + + for(int i = 0; i <= ( duration / RENDER_FRAME_INTERVAL); i++) + { + application.SendNotification(); + application.Render(RENDER_FRAME_INTERVAL); + time += RENDER_FRAME_INTERVAL; + } + + return time; +} + +Dali::Integration::Point GetPointDownInside( Vector2& pos ) +{ + Dali::Integration::Point point; + point.SetState( PointState::DOWN ); + point.SetScreenPosition( pos ); + return point; +} + +Dali::Integration::Point GetPointUpInside( Vector2& pos ) +{ + Dali::Integration::Point point; + point.SetState( PointState::UP ); + point.SetScreenPosition( pos ); + return point; +} + +struct CallbackFunctor +{ + CallbackFunctor(bool* callbackFlag) + : mCallbackFlag( callbackFlag ) + { + } + + void operator()() + { + *mCallbackFlag = true; + } + bool* mCallbackFlag; +}; static void TestTextChangedCallback( TextField control ) { @@ -104,6 +258,14 @@ static void TestMaxLengthReachedCallback( TextField control ) gMaxCharactersCallBackCalled = true; } +static void TestInputStyleChangedCallback( TextField control, TextField::InputStyle::Mask mask ) +{ + tet_infoline(" TestInputStyleChangedCallback"); + + gInputStyleChangedCallbackCalled = true; + gInputStyleMask = mask; +} + // Generate a TapGestureEvent to send to Core. Integration::TapGestureEvent GenerateTap( Gesture::State state, @@ -120,6 +282,19 @@ Integration::TapGestureEvent GenerateTap( return tap; } + +Integration::LongPressGestureEvent GenerateLongPress( + Gesture::State state, + unsigned int numberOfTouches, + Vector2 point) +{ + Integration::LongPressGestureEvent longPress( state ); + + longPress.numberOfTouches = numberOfTouches; + longPress.point = point; + return longPress; +} + // Generate a KeyEvent to send to Core. Integration::KeyEvent GenerateKey( const std::string& keyName, const std::string& keyString, @@ -262,6 +437,20 @@ int UtcDaliTextFieldGetPropertyP(void) 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_INPUT_METHOD_SETTINGS ) == TextField::Property::INPUT_METHOD_SETTINGS ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_INPUT_COLOR ) == TextField::Property::INPUT_COLOR ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_ENABLE_MARKUP ) == TextField::Property::ENABLE_MARKUP ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_INPUT_FONT_FAMILY ) == TextField::Property::INPUT_FONT_FAMILY ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_INPUT_FONT_STYLE ) == TextField::Property::INPUT_FONT_STYLE ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_INPUT_POINT_SIZE ) == TextField::Property::INPUT_POINT_SIZE ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_UNDERLINE ) == TextField::Property::UNDERLINE ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_INPUT_UNDERLINE ) == TextField::Property::INPUT_UNDERLINE ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SHADOW ) == TextField::Property::SHADOW ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_INPUT_SHADOW ) == TextField::Property::INPUT_SHADOW ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_EMBOSS ) == TextField::Property::EMBOSS ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_INPUT_EMBOSS ) == TextField::Property::INPUT_EMBOSS ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_OUTLINE ) == TextField::Property::OUTLINE ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_INPUT_OUTLINE ) == TextField::Property::INPUT_OUTLINE ); + END_TEST; } @@ -296,7 +485,7 @@ int UtcDaliTextFieldSetPropertyP(void) // 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 ); + DALI_TEST_EQUALS( (Text::RenderingType)field.GetProperty( TextField::Property::RENDERING_BACKEND ), Text::RENDERING_SHARED_ATLAS, TEST_LOCATION ); // Check text property. field.SetProperty( TextField::Property::TEXT, "Setting Text" ); @@ -312,11 +501,19 @@ int UtcDaliTextFieldSetPropertyP(void) // 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::FONT_STYLE, "{\"weight\":\"bold\",\"width\":\"condensed\",\"slant\":\"italic\"}" ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::FONT_STYLE ), std::string("{\"weight\":\"bold\",\"width\":\"condensed\",\"slant\":\"italic\"}"), 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 ); + // Reset font style. + field.SetProperty( TextField::Property::FONT_STYLE, "{\"weight\":\"normal\",\"slant\":\"oblique\"}" ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::FONT_STYLE ), std::string("{\"weight\":\"normal\",\"slant\":\"oblique\"}"), TEST_LOCATION ); + field.SetProperty( TextField::Property::FONT_STYLE, "{\"slant\":\"roman\"}" ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::FONT_STYLE ), std::string("{\"slant\":\"normal\"}"), TEST_LOCATION ); + field.SetProperty( TextField::Property::FONT_STYLE, "" ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::FONT_STYLE ), std::string(""), TEST_LOCATION ); + // Check that the MAX_LENGTH property can be correctly set const int maxNumberOfCharacters = 20; field.SetProperty( TextField::Property::MAX_LENGTH, maxNumberOfCharacters ); @@ -389,6 +586,63 @@ int UtcDaliTextFieldSetPropertyP(void) 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 input color property. + field.SetProperty( TextField::Property::INPUT_COLOR, Color::YELLOW ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::INPUT_COLOR ), Color::YELLOW, TEST_LOCATION ); + + // Check the enable markup property. + DALI_TEST_CHECK( !field.GetProperty( TextField::Property::ENABLE_MARKUP ) ); + field.SetProperty( TextField::Property::ENABLE_MARKUP, true ); + DALI_TEST_CHECK( field.GetProperty( TextField::Property::ENABLE_MARKUP ) ); + + // Check input font properties. + field.SetProperty( TextField::Property::INPUT_FONT_FAMILY, "Setting input font family" ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::INPUT_FONT_FAMILY ), "Setting input font family", TEST_LOCATION ); + field.SetProperty( TextField::Property::INPUT_FONT_STYLE, "{\"weight\":\"bold\",\"width\":\"condensed\",\"slant\":\"italic\"}" ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::INPUT_FONT_STYLE ), "{\"weight\":\"bold\",\"width\":\"condensed\",\"slant\":\"italic\"}", TEST_LOCATION ); + field.SetProperty( TextField::Property::INPUT_POINT_SIZE, 12.f ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::INPUT_POINT_SIZE ), 12.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION ); + + // Reset input font style. + field.SetProperty( TextField::Property::INPUT_FONT_STYLE, "{\"weight\":\"normal\",\"slant\":\"oblique\"}" ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::INPUT_FONT_STYLE ), std::string("{\"weight\":\"normal\",\"slant\":\"oblique\"}"), TEST_LOCATION ); + field.SetProperty( TextField::Property::INPUT_FONT_STYLE, "{\"slant\":\"roman\"}" ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::INPUT_FONT_STYLE ), std::string("{\"slant\":\"normal\"}"), TEST_LOCATION ); + field.SetProperty( TextField::Property::INPUT_FONT_STYLE, "" ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::INPUT_FONT_STYLE ), std::string(""), TEST_LOCATION ); + + // Check the underline property + field.SetProperty( TextField::Property::UNDERLINE, "Underline properties" ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::UNDERLINE ), std::string("Underline properties"), TEST_LOCATION ); + + // Check the input underline property + field.SetProperty( TextField::Property::INPUT_UNDERLINE, "Underline input properties" ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::INPUT_UNDERLINE ), std::string("Underline input properties"), TEST_LOCATION ); + + // Check the shadow property + field.SetProperty( TextField::Property::SHADOW, "Shadow properties" ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::SHADOW ), std::string("Shadow properties"), TEST_LOCATION ); + + // Check the input shadow property + field.SetProperty( TextField::Property::INPUT_SHADOW, "Shadow input properties" ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::INPUT_SHADOW ), std::string("Shadow input properties"), TEST_LOCATION ); + + // Check the emboss property + field.SetProperty( TextField::Property::EMBOSS, "Emboss properties" ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::EMBOSS ), std::string("Emboss properties"), TEST_LOCATION ); + + // Check the input emboss property + field.SetProperty( TextField::Property::INPUT_EMBOSS, "Emboss input properties" ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::INPUT_EMBOSS ), std::string("Emboss input properties"), TEST_LOCATION ); + + // Check the outline property + field.SetProperty( TextField::Property::OUTLINE, "Outline properties" ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::OUTLINE ), std::string("Outline properties"), TEST_LOCATION ); + + // Check the input outline property + field.SetProperty( TextField::Property::INPUT_OUTLINE, "Outline input properties" ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::INPUT_OUTLINE ), std::string("Outline input properties"), TEST_LOCATION ); + END_TEST; } @@ -398,7 +652,7 @@ int utcDaliTextFieldAtlasRenderP(void) ToolkitTestApplication application; tet_infoline(" UtcDaliToolkitTextFieldAtlasRenderP"); StyleManager styleManager = StyleManager::Get(); - styleManager.RequestDefaultTheme(); + styleManager.ApplyDefaultTheme(); TextField field = TextField::New(); DALI_TEST_CHECK( field ); @@ -422,7 +676,7 @@ int utcDaliTextFieldAtlasRenderP(void) END_TEST; } -// Positive test for the text-changed signal. +// Positive test for the textChanged signal. int utcDaliTextFieldTextChangedP(void) { ToolkitTestApplication application; @@ -432,11 +686,16 @@ int utcDaliTextFieldTextChangedP(void) Stage::GetCurrent().Add( field ); + // connect to the text changed signal. + ConnectionTracker* testTracker = new ConnectionTracker(); field.TextChangedSignal().Connect(&TestTextChangedCallback); + bool textChangedSignal = false; + field.ConnectSignal( testTracker, "textChanged", CallbackFunctor(&textChangedSignal) ); gTextChangedCallBackCalled = false; field.SetProperty( TextField::Property::TEXT, "ABC" ); DALI_TEST_CHECK( gTextChangedCallBackCalled ); + DALI_TEST_CHECK( textChangedSignal ); application.SendNotification(); @@ -449,7 +708,7 @@ int utcDaliTextFieldTextChangedP(void) END_TEST; } -// Negative test for the text-changed signal. +// Negative test for the textChanged signal. int utcDaliTextFieldTextChangedN(void) { ToolkitTestApplication application; @@ -459,11 +718,16 @@ int utcDaliTextFieldTextChangedN(void) Stage::GetCurrent().Add( field ); + // connect to the text changed signal. + ConnectionTracker* testTracker = new ConnectionTracker(); field.TextChangedSignal().Connect(&TestTextChangedCallback); + bool textChangedSignal = false; + field.ConnectSignal( testTracker, "textChanged", CallbackFunctor(&textChangedSignal) ); gTextChangedCallBackCalled = false; field.SetProperty( TextField::Property::PLACEHOLDER_TEXT, "ABC" ); // Setting placeholder, not TEXT DALI_TEST_CHECK( !gTextChangedCallBackCalled ); + DALI_TEST_CHECK( !textChangedSignal ); END_TEST; } @@ -483,13 +747,19 @@ int utcDaliTextFieldMaxCharactersReachedP(void) field.SetKeyInputFocus(); - gMaxCharactersCallBackCalled = false; + // connect to the text changed signal. + ConnectionTracker* testTracker = new ConnectionTracker(); field.MaxLengthReachedSignal().Connect(&TestMaxLengthReachedCallback); + bool maxLengthReachedSignal = false; + field.ConnectSignal( testTracker, "maxLengthReached", CallbackFunctor(&maxLengthReachedSignal) ); + + gMaxCharactersCallBackCalled = false; 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 ); + DALI_TEST_CHECK( maxLengthReachedSignal ); END_TEST; } @@ -509,256 +779,459 @@ int utcDaliTextFieldMaxCharactersReachedN(void) field.SetKeyInputFocus(); - gMaxCharactersCallBackCalled = false; + // connect to the text changed signal. + ConnectionTracker* testTracker = new ConnectionTracker(); field.MaxLengthReachedSignal().Connect(&TestMaxLengthReachedCallback); + bool maxLengthReachedSignal = false; + field.ConnectSignal( testTracker, "maxLengthReached", CallbackFunctor(&maxLengthReachedSignal) ); + + gMaxCharactersCallBackCalled = false; 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 ); + DALI_TEST_CHECK( !maxLengthReachedSignal ); END_TEST; } -int utcDaliTextFieldEvent01(void) +int utcDaliTextFieldInputStyleChanged01(void) { ToolkitTestApplication application; - tet_infoline(" utcDaliTextFieldEvent01"); + tet_infoline(" utcDaliTextFieldInputStyleChanged01"); - // 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. + // The text-field emits signals when the input style changes. These changes of style are + // detected during the relayout process (size negotiation), i.e after the cursor has been moved. Signals + // can't be emitted during the size negotiation as the callbacks may update the UI. + // The text-field adds an idle callback to the adaptor to emit the signals after the size negotiation. + // This creates an implementation of the adaptor stub and a queue of idle callbacks. + application.CreateAdaptor(); + + // Load some fonts. + + char* pathNamePtr = get_current_dir_name(); + const std::string pathName( pathNamePtr ); + free( pathNamePtr ); + + TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get(); + fontClient.SetDpi( 93u, 93u ); + + fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/dejavu/DejaVuSerif.ttf", DEFAULT_FONT_SIZE ); + fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/dejavu/DejaVuSerif-Bold.ttf", DEFAULT_FONT_SIZE ); 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 ); + field.SetProperty( TextField::Property::ENABLE_MARKUP, true ); + field.SetProperty( TextField::Property::TEXT, "Hello world demo" ); + + // connect to the text changed signal. + ConnectionTracker* testTracker = new ConnectionTracker(); + field.InputStyleChangedSignal().Connect( &TestInputStyleChangedCallback ); + bool inputStyleChangedSignal = false; + field.ConnectSignal( testTracker, "inputStyleChanged", CallbackFunctor(&inputStyleChangedSignal) ); + + Stage::GetCurrent().Add( field ); // 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 ) ); + // Executes the idle callbacks added by the text control on the change of input style. + application.RunIdles(); + + gInputStyleChangedCallbackCalled = false; + gInputStyleMask = TextField::InputStyle::NONE; + inputStyleChangedSignal = false; + + // Create a tap event to touch the text field. + application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 18.f, 25.f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 18.f, 25.f ) ) ); // Render and notify application.SendNotification(); application.Render(); - DALI_TEST_EQUALS( field.GetProperty( TextField::Property::TEXT ), std::string(""), TEST_LOCATION ); + // Executes the idle callbacks added by the text control on the change of input style. + application.RunIdles(); + + DALI_TEST_CHECK( gInputStyleChangedCallbackCalled ); + if( gInputStyleChangedCallbackCalled ) + { + DALI_TEST_EQUALS( static_cast( gInputStyleMask ), static_cast( TextField::InputStyle::FONT_FAMILY | TextField::InputStyle::POINT_SIZE ), TEST_LOCATION ); + + const std::string fontFamily = field.GetProperty( TextField::Property::INPUT_FONT_FAMILY ).Get(); + DALI_TEST_EQUALS( fontFamily, "DejaVuSerif", TEST_LOCATION ); + + const float pointSize = field.GetProperty( TextField::Property::INPUT_POINT_SIZE ).Get(); + DALI_TEST_EQUALS( pointSize, 18.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION ); + } + DALI_TEST_CHECK( inputStyleChangedSignal ); + + gInputStyleChangedCallbackCalled = false; + gInputStyleMask = TextField::InputStyle::NONE; + inputStyleChangedSignal = false; // 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 ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 30.f, 25.f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 30.f, 25.f ) ) ); // 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 ) ); + // Executes the idle callbacks added by the text control on the change of input style. + application.RunIdles(); + + DALI_TEST_CHECK( !gInputStyleChangedCallbackCalled ); + DALI_TEST_CHECK( !inputStyleChangedSignal ); + + gInputStyleChangedCallbackCalled = false; + gInputStyleMask = TextField::InputStyle::NONE; + inputStyleChangedSignal = false; + + // Create a tap event to touch the text field. + application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 43.f, 25.f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 43.f, 25.f ) ) ); // Render and notify application.SendNotification(); application.Render(); - DALI_TEST_EQUALS( field.GetProperty( TextField::Property::TEXT ), std::string("aa"), TEST_LOCATION ); + // Executes the idle callbacks added by the text control on the change of input style. + application.RunIdles(); - // Create a second text field and send key events to it. - TextField field2 = TextField::New(); + DALI_TEST_CHECK( gInputStyleChangedCallbackCalled ); + if( gInputStyleChangedCallbackCalled ) + { + DALI_TEST_EQUALS( static_cast( gInputStyleMask ), static_cast( TextField::InputStyle::COLOR ), TEST_LOCATION ); - field2.SetParentOrigin( ParentOrigin::TOP_LEFT ); - field2.SetAnchorPoint( AnchorPoint::TOP_LEFT ); - field2.SetSize( 100.f, 100.f ); - field2.SetPosition( 100.f, 100.f ); + const Vector4 color = field.GetProperty( TextField::Property::INPUT_COLOR ).Get(); + DALI_TEST_EQUALS( color, Color::GREEN, TEST_LOCATION ); + } + DALI_TEST_CHECK( inputStyleChangedSignal ); - Stage::GetCurrent().Add( field2 ); + gInputStyleChangedCallbackCalled = false; + gInputStyleMask = TextField::InputStyle::NONE; + inputStyleChangedSignal = false; + + // Create a tap event to touch the text field. + application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 88.f, 25.f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 88.f, 25.f ) ) ); // 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 ) ) ); + // Executes the idle callbacks added by the text control on the change of input style. + application.RunIdles(); + + DALI_TEST_CHECK( gInputStyleChangedCallbackCalled ); + if( gInputStyleChangedCallbackCalled ) + { + DALI_TEST_EQUALS( static_cast( gInputStyleMask ), static_cast( TextField::InputStyle::COLOR | TextField::InputStyle::FONT_STYLE ), TEST_LOCATION ); + + const Vector4 color = field.GetProperty( TextField::Property::INPUT_COLOR ).Get(); + DALI_TEST_EQUALS( color, Color::BLACK, TEST_LOCATION ); + + const std::string style = field.GetProperty( TextField::Property::INPUT_FONT_STYLE ).Get(); + DALI_TEST_EQUALS( style, "{\"weight\":\"bold\"}", TEST_LOCATION ); + } + DALI_TEST_CHECK( inputStyleChangedSignal ); + + gInputStyleChangedCallbackCalled = false; + gInputStyleMask = TextField::InputStyle::NONE; + inputStyleChangedSignal = false; + + // Create a tap event to touch the text field. + application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 115.f, 25.f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 115.f, 25.f ) ) ); // 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 ) ); + // Executes the idle callbacks added by the text control on the change of input style. + application.RunIdles(); + + DALI_TEST_CHECK( !gInputStyleChangedCallbackCalled ); + DALI_TEST_CHECK( !inputStyleChangedSignal ); + + gInputStyleChangedCallbackCalled = false; + gInputStyleMask = TextField::InputStyle::NONE; + inputStyleChangedSignal = false; + + // Create a tap event to touch the text field. + application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 164.f, 25.f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 164.f, 25.f ) ) ); // 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 ); + // Executes the idle callbacks added by the text control on the change of input style. + application.RunIdles(); + + DALI_TEST_CHECK( gInputStyleChangedCallbackCalled ); + if( gInputStyleChangedCallbackCalled ) + { + DALI_TEST_EQUALS( static_cast( gInputStyleMask ), static_cast( TextField::InputStyle::FONT_STYLE ), TEST_LOCATION ); + + const std::string style = field.GetProperty( TextField::Property::INPUT_FONT_STYLE ).Get(); + DALI_TEST_CHECK( style.empty() ); + } + DALI_TEST_CHECK( inputStyleChangedSignal ); + + gInputStyleChangedCallbackCalled = false; + gInputStyleMask = TextField::InputStyle::NONE; + inputStyleChangedSignal = false; + + // Create a tap event to touch the text field. + application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 191.f, 25.f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 191.f, 25.f ) ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Executes the idle callbacks added by the text control on the change of input style. + application.RunIdles(); + + DALI_TEST_CHECK( !gInputStyleChangedCallbackCalled ); + DALI_TEST_CHECK( !inputStyleChangedSignal ); END_TEST; } -int utcDaliTextFieldEvent02(void) +int utcDaliTextFieldInputStyleChanged02(void) { ToolkitTestApplication application; - tet_infoline(" utcDaliTextFieldEvent02"); + tet_infoline(" utcDaliTextFieldInputStyleChanged02"); - // Checks if the right number of actors are created. + // The text-field emits signals when the input style changes. These changes of style are + // detected during the relayout process (size negotiation), i.e after the cursor has been moved. Signals + // can't be emitted during the size negotiation as the callbacks may update the UI. + // The text-field adds an idle callback to the adaptor to emit the signals after the size negotiation. + // This creates an implementation of the adaptor stub and a queue of idle callbacks. + application.CreateAdaptor(); + + // Load some fonts. + + char* pathNamePtr = get_current_dir_name(); + const std::string pathName( pathNamePtr ); + free( pathNamePtr ); + + TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get(); + fontClient.SetDpi( 93u, 93u ); + + fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/dejavu/DejaVuSerif.ttf", DEFAULT_FONT_SIZE ); + fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/dejavu/DejaVuSerif-Bold.ttf", DEFAULT_FONT_SIZE ); 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 ); + field.SetProperty( TextField::Property::ENABLE_MARKUP, true ); + field.SetProperty( TextField::Property::TEXT, "He llo world demo" ); + + // connect to the text changed signal. + ConnectionTracker* testTracker = new ConnectionTracker(); + field.InputStyleChangedSignal().Connect( &TestInputStyleChangedCallback ); + bool inputStyleChangedSignal = false; + field.ConnectSignal( testTracker, "inputStyleChanged", CallbackFunctor(&inputStyleChangedSignal) ); + + Stage::GetCurrent().Add( field ); // 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 ); + // Executes the idle callbacks added by the text control on the change of input style. + application.RunIdles(); - 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 ); + gInputStyleChangedCallbackCalled = false; + gInputStyleMask = TextField::InputStyle::NONE; + inputStyleChangedSignal = false; // 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 ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 53.f, 25.f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 53.f, 25.f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Possible, 2u, 1u, Vector2( 53.f, 25.f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 2u, 1u, Vector2( 53.f, 25.f ) ) ); // 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(); + // Executes the idle callbacks added by the text control on the change of input style. + application.RunIdles(); - // 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 + DALI_TEST_CHECK( gInputStyleChangedCallbackCalled ); + if( gInputStyleChangedCallbackCalled ) + { + DALI_TEST_EQUALS( static_cast( gInputStyleMask ), + static_cast( TextField::InputStyle::FONT_FAMILY | + TextField::InputStyle::POINT_SIZE | + TextField::InputStyle::COLOR ), + TEST_LOCATION ); - ImageActor cursor = ImageActor::DownCast( layer.GetChildAt( 0u ) ); - DALI_TEST_CHECK( cursor ); + const Vector4 color = field.GetProperty( TextField::Property::INPUT_COLOR ).Get(); + DALI_TEST_EQUALS( color, Color::GREEN, TEST_LOCATION ); - CameraActor camera = CameraActor::DownCast( offscreenRoot.GetChildAt( 0u ) ); - DALI_TEST_CHECK( camera ); + const std::string fontFamily = field.GetProperty( TextField::Property::INPUT_FONT_FAMILY ).Get(); + DALI_TEST_EQUALS( fontFamily, "DejaVuSerif", TEST_LOCATION ); - Renderer renderer = offscreenRoot.GetChildAt( 1u ).GetRendererAt( 0u ); - DALI_TEST_CHECK( renderer ); + const float pointSize = field.GetProperty( TextField::Property::INPUT_POINT_SIZE ).Get(); + DALI_TEST_EQUALS( pointSize, 18.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION ); + } + DALI_TEST_CHECK( inputStyleChangedSignal ); - // Move the cursor and check the position changes. - Vector3 position1 = cursor.GetCurrentPosition(); + gInputStyleChangedCallbackCalled = false; + gInputStyleMask = TextField::InputStyle::NONE; + inputStyleChangedSignal = false; - application.ProcessEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Integration::KeyEvent::Down ) ); - application.ProcessEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Integration::KeyEvent::Down ) ); + application.ProcessEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::Down ) ); // Render and notify application.SendNotification(); application.Render(); - Vector3 position2 = cursor.GetCurrentPosition(); + // Executes the idle callbacks added by the text control on the change of input style. + application.RunIdles(); - DALI_TEST_CHECK( position2.x < position1.x ); + DALI_TEST_CHECK( gInputStyleChangedCallbackCalled ); + if( gInputStyleChangedCallbackCalled ) + { + DALI_TEST_EQUALS( static_cast( gInputStyleMask ), + static_cast( TextField::InputStyle::COLOR ), + TEST_LOCATION ); - application.ProcessEvent( GenerateKey( "", "", DALI_KEY_CURSOR_RIGHT, 0, 0, Integration::KeyEvent::Down ) ); - application.ProcessEvent( GenerateKey( "", "", DALI_KEY_CURSOR_RIGHT, 0, 0, Integration::KeyEvent::Down ) ); + const Vector4 color = field.GetProperty( TextField::Property::INPUT_COLOR ).Get(); + DALI_TEST_EQUALS( color, Color::BLUE, TEST_LOCATION ); + } + DALI_TEST_CHECK( inputStyleChangedSignal ); + + gInputStyleChangedCallbackCalled = false; + gInputStyleMask = TextField::InputStyle::NONE; + inputStyleChangedSignal = false; + + application.ProcessEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::Down ) ); // Render and notify application.SendNotification(); application.Render(); - Vector3 position3 = cursor.GetCurrentPosition(); + // Executes the idle callbacks added by the text control on the change of input style. + application.RunIdles(); - DALI_TEST_EQUALS( position1, position3, TEST_LOCATION ); // Should be in the same position1. + DALI_TEST_CHECK( !gInputStyleChangedCallbackCalled ); + DALI_TEST_CHECK( !inputStyleChangedSignal ); - // Send some taps and check the cursor positions. + gInputStyleChangedCallbackCalled = false; + gInputStyleMask = TextField::InputStyle::NONE; + inputStyleChangedSignal = false; - // Try to tap at the beginning. - application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 3.f, 25.0f ) ) ); - application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 3.f, 25.0f ) ) ); + application.ProcessEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::Down ) ); // Render and notify application.SendNotification(); application.Render(); - // Cursor position should be the same than position1. - Vector3 position4 = cursor.GetCurrentPosition(); + // Executes the idle callbacks added by the text control on the change of input style. + application.RunIdles(); - DALI_TEST_EQUALS( position2, position4, TEST_LOCATION ); // Should be in the same position2. + DALI_TEST_CHECK( gInputStyleChangedCallbackCalled ); + if( gInputStyleChangedCallbackCalled ) + { + DALI_TEST_EQUALS( static_cast( gInputStyleMask ), + static_cast( TextField::InputStyle::COLOR ), + TEST_LOCATION ); - // Tap away from the start position. - application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 13.f, 25.0f ) ) ); - application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 13.0f, 25.0f ) ) ); + const Vector4 color = field.GetProperty( TextField::Property::INPUT_COLOR ).Get(); + DALI_TEST_EQUALS( color, Color::BLACK, TEST_LOCATION ); + } + DALI_TEST_CHECK( inputStyleChangedSignal ); + + gInputStyleChangedCallbackCalled = false; + gInputStyleMask = TextField::InputStyle::NONE; + inputStyleChangedSignal = false; + + field.SetProperty( TextField::Property::INPUT_COLOR, Color::YELLOW ); + + field.SetProperty( TextField::Property::INPUT_FONT_STYLE, "{\"weight\":\"thin\",\"width\":\"condensed\",\"slant\":\"italic\"}" ); + field.SetProperty( TextField::Property::INPUT_POINT_SIZE, 20.f ); + + field.SetProperty( TextField::Property::INPUT_UNDERLINE, "underline" ); + field.SetProperty( TextField::Property::INPUT_SHADOW, "shadow" ); + field.SetProperty( TextField::Property::INPUT_EMBOSS, "emboss" ); + field.SetProperty( TextField::Property::INPUT_OUTLINE, "outline" ); // Render and notify application.SendNotification(); application.Render(); - Vector3 position5 = cursor.GetCurrentPosition(); + // Executes the idle callbacks added by the text control on the change of input style. + application.RunIdles(); - DALI_TEST_CHECK( position5.x > position4.x ); + DALI_TEST_CHECK( !gInputStyleChangedCallbackCalled ); + DALI_TEST_CHECK( !inputStyleChangedSignal ); - // 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, "" ); + // Create a tap event to touch the text field. + application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 63.f, 25.f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 63.f, 25.f ) ) ); // Render and notify application.SendNotification(); application.Render(); - // Should not be renderer. - DALI_TEST_EQUALS( offscreenRoot.GetChildCount(), 1u, TEST_LOCATION ); // The camera actor only. + // Executes the idle callbacks added by the text control on the change of input style. + application.RunIdles(); + + DALI_TEST_CHECK( gInputStyleChangedCallbackCalled ); + if( gInputStyleChangedCallbackCalled ) + { + DALI_TEST_EQUALS( static_cast( gInputStyleMask ), + static_cast( TextField::InputStyle::COLOR | + TextField::InputStyle::POINT_SIZE | + TextField::InputStyle::FONT_STYLE | + TextField::InputStyle::UNDERLINE | + TextField::InputStyle::SHADOW | + TextField::InputStyle::EMBOSS | + TextField::InputStyle::OUTLINE ), + TEST_LOCATION ); + + const Vector4 color = field.GetProperty( TextField::Property::INPUT_COLOR ).Get(); + DALI_TEST_EQUALS( color, Color::BLACK, TEST_LOCATION ); + } + DALI_TEST_CHECK( inputStyleChangedSignal ); END_TEST; } -int utcDaliTextFieldEvent03(void) +int utcDaliTextFieldEvent01(void) { ToolkitTestApplication application; - tet_infoline(" utcDaliTextFieldEvent03"); + tet_infoline(" utcDaliTextFieldEvent01"); - // Checks if the highlight actor is created. + // 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.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.SetSize( 300.f, 50.f ); field.SetParentOrigin( ParentOrigin::TOP_LEFT ); field.SetAnchorPoint( AnchorPoint::TOP_LEFT ); @@ -769,17 +1242,253 @@ int utcDaliTextFieldEvent03(void) 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 ) ) ); + // 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(); - // 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 ) ) ); + 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 ); + LoadMarkerImages(application, 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 ( offscreen root actor, and the offscreen image view + DALI_TEST_EQUALS( field.GetChildCount(), 2u, TEST_LOCATION ); + + Actor offscreenRoot = field.GetChildAt( 0u ); + DALI_TEST_CHECK( offscreenRoot.IsLayer() ); + DALI_TEST_EQUALS( offscreenRoot.GetChildCount(), 1u, TEST_LOCATION ); // The camera actor. + + Actor offscreenImage = field.GetChildAt( 1u ); + DALI_TEST_CHECK( offscreenImage ); + + // 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(); + + Actor layer = field.GetChildAt( 2u ); + DALI_TEST_CHECK( layer.IsLayer() ); + + 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 + + Control cursor = Control::DownCast( layer.GetChildAt( 0u ) ); + DALI_TEST_CHECK( cursor ); + + CameraActor camera = CameraActor::DownCast( offscreenRoot.GetChildAt( 0u ) ); + DALI_TEST_CHECK( camera ); + + // The offscreen root actor has a container with all the actors which contain the text renderers. + Actor container = offscreenRoot.GetChildAt( 1u ); + for( unsigned int index = 0; index < container.GetChildCount(); ++index ) + { + Renderer renderer = container.GetChildAt( index ).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 ); + LoadMarkerImages(application, field); + + // 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(); @@ -792,11 +1501,375 @@ int utcDaliTextFieldEvent03(void) CameraActor camera = CameraActor::DownCast( offscreenRoot.GetChildAt( 0u ) ); DALI_TEST_CHECK( camera ); - Renderer renderer = offscreenRoot.GetChildAt( 1u ).GetRendererAt( 0u ); - DALI_TEST_CHECK( renderer ); + // The offscreen root actor has a container with all the actors which contain the text renderers. + Actor container = offscreenRoot.GetChildAt( 1u ); + for( unsigned int index = 0; index < container.GetChildCount(); ++index ) + { + Renderer renderer = container.GetChildAt( index ).GetRendererAt( 0u ); + DALI_TEST_CHECK( renderer ); + } Renderer highlight = offscreenRoot.GetChildAt( 2u ).GetRendererAt( 0u ); DALI_TEST_CHECK( highlight ); END_TEST; } + +int utcDaliTextFieldEvent04(void) +{ + ToolkitTestApplication application; + tet_infoline(" utcDaliTextFieldEvent04"); + + // Checks if the highlight actor is created. + + TextField field = TextField::New(); + DALI_TEST_CHECK( field ); + Stage::GetCurrent().Add( field ); + LoadMarkerImages(application, field); + // Render and notify + application.SendNotification(); + application.Render(); + + 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( 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(); + + // 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(); + + + // Tap first to get the focus. + 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(); + + // Double tap to select a word. + application.ProcessEvent( GenerateTap( Gesture::Possible, 2u, 1u, Vector2( 1.f, 25.0f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 2u, 1u, Vector2( 1.f, 25.0f ) ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Tap grab handle + application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 0.f, 40.0f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 0.f, 40.0f ) ) ); + END_TEST; +} + +int utcDaliTextFieldEvent05(void) +{ + ToolkitTestApplication application; + tet_infoline(" utcDaliTextFieldEvent05"); + + // Checks dragging of cursor/grab handle + + TextField field = TextField::New(); + DALI_TEST_CHECK( field ); + Stage::GetCurrent().Add( field ); + LoadMarkerImages(application, field); + // Render and notify + application.SendNotification(); + application.Render(); + + 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( 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(); + + // 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(); + + + // Tap first to get the focus. + 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(); + + // Double tap to select a word. + application.ProcessEvent( GenerateTap( Gesture::Possible, 2u, 1u, Vector2( 1.f, 25.0f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 2u, 1u, Vector2( 1.f, 25.0f ) ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // drag grab handle right + Vector2 pos(0.0f, 40.0f); + SendPan(application, Gesture::Possible, pos); + SendPan(application, Gesture::Started, pos); + pos.x += 5.0f; + Wait(application, 100); + + for(int i = 0;i<20;i++) + { + SendPan(application, Gesture::Continuing, pos); + pos.x += 5.0f; + Wait(application); + } + + SendPan(application, Gesture::Finished, pos); + Wait(application, RENDER_FRAME_INTERVAL); + + Actor offscreenRoot = field.GetChildAt( 1u ); + END_TEST; +} + +int utcDaliTextFieldEvent06(void) +{ + ToolkitTestApplication application; + tet_infoline(" utcDaliTextFieldEvent06"); + + // Checks Longpress when in edit mode + + TextField field = TextField::New(); + DALI_TEST_CHECK( field ); + Stage::GetCurrent().Add( field ); + LoadMarkerImages(application, field); + // Render and notify + application.SendNotification(); + application.Render(); + + field.SetProperty( TextField::Property::TEXT, "Thisisalongtextforthesizeofthetextfield." ); + field.SetProperty( TextField::Property::POINT_SIZE, 10.f ); + 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(); + + // 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(); + + + // Tap first to get the focus. + 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(); + + // Long Press + application.ProcessEvent( GenerateLongPress( Gesture::Possible, 1u, Vector2( 1.f, 25.0f ) ) ); + application.ProcessEvent( GenerateLongPress( Gesture::Started, 1u, Vector2( 1.f, 25.0f ) ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + END_TEST; +} + +int utcDaliTextFieldEvent07(void) +{ + ToolkitTestApplication application; + tet_infoline(" utcDaliTextFieldEvent07"); + + // Checks Longpress to start edit mode + + TextField field = TextField::New(); + DALI_TEST_CHECK( field ); + Stage::GetCurrent().Add( field ); + LoadMarkerImages(application, field); + // Render and notify + application.SendNotification(); + application.Render(); + + field.SetProperty( TextField::Property::TEXT, "Thisisalongtextforthesizeofthetextfield." ); + field.SetProperty( TextField::Property::POINT_SIZE, 10.f ); + 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(); + + // Long Press + application.ProcessEvent( GenerateLongPress( Gesture::Possible, 1u, Vector2( 1.f, 25.0f ) ) ); + application.ProcessEvent( GenerateLongPress( Gesture::Started, 1u, Vector2( 1.f, 25.0f ) ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + END_TEST; +} + +int utcDaliTextFieldEvent08(void) +{ + ToolkitTestApplication application; + tet_infoline(" utcDaliTextFieldEvent08"); + + Dali::Clipboard clipboard = Clipboard::Get(); + clipboard.SetItem("testTextFieldEvent"); + + // Checks Longpress when only place holder text + + TextField field = TextField::New(); + DALI_TEST_CHECK( field ); + Stage::GetCurrent().Add( field ); + LoadMarkerImages(application, field); + // Render and notify + application.SendNotification(); + application.Render(); + + field.SetProperty( TextField::Property::PLACEHOLDER_TEXT, "Setting Placeholder Text" ); + field.SetProperty( TextField::Property::POINT_SIZE, 10.f ); + 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(); + + // Long Press + application.ProcessEvent( GenerateLongPress( Gesture::Possible, 1u, Vector2( 1.f, 25.0f ) ) ); + application.ProcessEvent( GenerateLongPress( Gesture::Started, 1u, Vector2( 1.f, 25.0f ) ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + Wait(application, 500); + + Stage stage = Stage::GetCurrent(); + Layer layer = stage.GetRootLayer(); + Actor actor = layer.FindChildByName("optionPaste"); + + if (actor) + { + Vector3 worldPosition = actor.GetCurrentWorldPosition(); + Vector2 halfStageSize = stage.GetSize() / 2.0f; + Vector2 position(worldPosition.x + halfStageSize.width, worldPosition.y + halfStageSize.height); + + Dali::Integration::TouchEvent event; + event = Dali::Integration::TouchEvent(); + event.AddPoint( GetPointDownInside( position ) ); + application.ProcessEvent( event ); + + event = Dali::Integration::TouchEvent(); + event.AddPoint( GetPointUpInside( position ) ); + application.ProcessEvent( event ); + } + DALI_TEST_EQUALS( field.GetProperty( TextEditor::Property::TEXT ), std::string("testTextFieldEvent"), TEST_LOCATION ); + END_TEST; +} + +int utcDaliTextFieldStyleWhilstSelected(void) +{ + ToolkitTestApplication application; + tet_infoline(" utcDaliTextFieldStyleWhilstSelected"); + + // Change font and styles whilst text is selected whilst word selected + + TextField field = TextField::New(); + DALI_TEST_CHECK( field ); + Stage::GetCurrent().Add( field ); + LoadMarkerImages(application, field); + // Render and notify + application.SendNotification(); + application.Render(); + + 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( 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(); + + // 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(); + + + // Tap first to get the focus. + 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(); + + // Double tap to select a word. + application.ProcessEvent( GenerateTap( Gesture::Possible, 2u, 1u, Vector2( 1.f, 25.0f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 2u, 1u, Vector2( 1.f, 25.0f ) ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + field.SetProperty( TextField::Property::INPUT_FONT_FAMILY, "Setting input font family" ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::INPUT_FONT_FAMILY ), "Setting input font family", TEST_LOCATION ); + + field.SetProperty( TextField::Property::INPUT_FONT_STYLE, "{\"weight\":\"bold\",\"slant\":\"italic\"}" ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::INPUT_FONT_STYLE ), "{\"weight\":\"bold\",\"slant\":\"italic\"}", TEST_LOCATION ); + + field.SetProperty( TextField::Property::INPUT_FONT_STYLE, "{\"width\":\"expanded\",\"slant\":\"italic\"}" ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::INPUT_FONT_STYLE ), "{\"width\":\"expanded\",\"slant\":\"italic\"}", TEST_LOCATION ); + + field.SetProperty( TextField::Property::INPUT_POINT_SIZE, 12.f ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::INPUT_POINT_SIZE ), 12.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION ); + + field.SetProperty( TextField::Property::TEXT_COLOR, Color::RED ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::TEXT_COLOR ), Color::RED, TEST_LOCATION ); + + field.SetProperty( TextField::Property::FONT_STYLE, "{\"weight\":\"bold\",\"slant\":\"italic\"}" ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::FONT_STYLE ), "{\"weight\":\"bold\",\"slant\":\"italic\"}", TEST_LOCATION ); + + field.SetProperty( TextField::Property::FONT_STYLE, "{\"width\":\"expanded\"}" ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::FONT_STYLE ), "{\"width\":\"expanded\"}", TEST_LOCATION ); + + END_TEST; +}