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=6cfdf90553de712f27689958ab1a9fb5af50d631;hp=2dd61c2ca4bbaa228e68a9c165025a3d1f26d154;hb=183bdd4e867d8daad0b91a1ea717cc28a53bf28d;hpb=5359a575636e678baf178dab5209b587be1a7551 diff --git a/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp b/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp index 2dd61c2..6cfdf90 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) 2020 Samsung Electronics Co., Ltd. + * Copyright (c) 2021 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. @@ -30,6 +30,7 @@ #include #include #include "toolkit-clipboard.h" +#include using namespace Dali; using namespace Toolkit; @@ -104,6 +105,9 @@ const char* const PROPERTY_NAME_ENABLE_GRAB_HANDLE = "enableGr const char* const PROPERTY_NAME_MATCH_SYSTEM_LANGUAGE_DIRECTION = "matchSystemLanguageDirection"; const char* const PROPERTY_NAME_ENABLE_GRAB_HANDLE_POPUP = "enableGrabHandlePopup"; const char* const PROPERTY_NAME_BACKGROUND = "textBackground"; +const char* const PROPERTY_NAME_FONT_SIZE_SCALE = "fontSizeScale"; +const char* const PROPERTY_NAME_GRAB_HANDLE_COLOR = "grabHandleColor"; +const char* const PROPERTY_NAME_INPUT_FILTER = "inputFilter"; 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. @@ -117,11 +121,23 @@ const int KEY_RETURN_CODE = 36; const int KEY_A_CODE = 38; const int KEY_D_CODE = 40; +const int KEY_SHIFT_MODIFIER = 257; + const std::string DEFAULT_DEVICE_NAME("hwKeyboard"); +static bool gSelectionChangedCallbackCalled; +static uint32_t oldSelectionStart; +static uint32_t oldSelectionEnd; +static bool gSelectionClearedCallbackCalled; +static bool gAnchorClickedCallBackCalled; +static bool gAnchorClickedCallBackNotCalled; static bool gTextChangedCallBackCalled; static bool gMaxCharactersCallBackCalled; +static bool gInputFilteredAcceptedCallbackCalled; +static bool gInputFilteredRejectedCallbackCalled; static bool gInputStyleChangedCallbackCalled; +static bool gCursorPositionChangedCallbackCalled; +static uint32_t oldCursorPos; static Dali::Toolkit::TextField::InputStyle::Mask gInputStyleMask; static void LoadBitmapResource(TestPlatformAbstraction& platform, int width, int height) @@ -204,6 +220,42 @@ struct CallbackFunctor bool* mCallbackFlag; }; +static void TestSelectionClearedCallback(TextField control) +{ + tet_infoline(" TestSelectionClearedCallback"); + + gSelectionClearedCallbackCalled = true; +} + +static void TestSelectionChangedCallback(TextField control, uint32_t oldStart, uint32_t oldEnd) +{ + tet_infoline(" TestSelectionChangedCallback"); + + gSelectionChangedCallbackCalled = true; + oldSelectionStart = oldStart; + oldSelectionEnd = oldEnd; +} + +static void TestAnchorClickedCallback(TextField control, const char* href, unsigned int hrefLength) +{ + tet_infoline(" TestAnchorClickedCallback"); + + gAnchorClickedCallBackNotCalled = false; + + if (!strcmp(href, "https://www.tizen.org") && hrefLength == strlen(href)) + { + gAnchorClickedCallBackCalled = true; + } +} + +static void TestCursorPositionChangedCallback( TextField control, unsigned int oldPos ) +{ + tet_infoline(" TestCursorPositionChangedCallback"); + + gCursorPositionChangedCallbackCalled = true; + oldCursorPos = oldPos; +} + static void TestTextChangedCallback( TextField control ) { tet_infoline(" TestTextChangedCallback"); @@ -218,6 +270,20 @@ static void TestMaxLengthReachedCallback( TextField control ) gMaxCharactersCallBackCalled = true; } +static void TestInputFilteredCallback(TextField control, Toolkit::InputFilter::Property::Type type) +{ + tet_infoline(" TestInputFilteredCallback"); + + if(type == Toolkit::InputFilter::Property::ACCEPTED) + { + gInputFilteredAcceptedCallbackCalled = true; + } + else if(type == Toolkit::InputFilter::Property::REJECTED) + { + gInputFilteredRejectedCallbackCalled = true; + } +} + static void TestInputStyleChangedCallback( TextField control, TextField::InputStyle::Mask mask ) { tet_infoline(" TestInputStyleChangedCallback"); @@ -503,11 +569,14 @@ int UtcDaliTextFieldGetPropertyP(void) DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_ENABLE_SELECTION ) == TextField::Property::ENABLE_SELECTION ); DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_PLACEHOLDER ) == TextField::Property::PLACEHOLDER ); DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_ELLIPSIS ) == TextField::Property::ELLIPSIS ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_FONT_SIZE_SCALE ) == DevelTextField::Property::FONT_SIZE_SCALE ); DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_ENABLE_SHIFT_SELECTION ) == DevelTextField::Property::ENABLE_SHIFT_SELECTION ); DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_ENABLE_GRAB_HANDLE ) == DevelTextField::Property::ENABLE_GRAB_HANDLE ); DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_MATCH_SYSTEM_LANGUAGE_DIRECTION ) == DevelTextField::Property::MATCH_SYSTEM_LANGUAGE_DIRECTION ); DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_ENABLE_GRAB_HANDLE_POPUP ) == DevelTextField::Property::ENABLE_GRAB_HANDLE_POPUP ); DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_BACKGROUND ) == DevelTextField::Property::BACKGROUND ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_GRAB_HANDLE_COLOR ) == DevelTextField::Property::GRAB_HANDLE_COLOR ); + DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_INPUT_FILTER ) == DevelTextField::Property::INPUT_FILTER ); END_TEST; } @@ -579,6 +648,10 @@ int UtcDaliTextFieldSetPropertyP(void) 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 ); + field.SetProperty( DevelTextField::Property::FONT_SIZE_SCALE, 2.5f ); + DALI_TEST_EQUALS( field.GetProperty( DevelTextField::Property::FONT_SIZE_SCALE ), 2.5f, Math::MACHINE_EPSILON_1000, TEST_LOCATION ); + field.SetProperty( DevelTextField::Property::FONT_SIZE_SCALE, 1.0f ); + // Reset font style. fontStyleMapSet.Clear(); fontStyleMapSet.Insert( "weight", "normal" ); @@ -974,6 +1047,25 @@ int UtcDaliTextFieldSetPropertyP(void) field.SetProperty( DevelTextField::Property::BACKGROUND, Color::RED ); DALI_TEST_EQUALS( field.GetProperty( DevelTextField::Property::BACKGROUND ), Color::RED, TEST_LOCATION ); + //Check handle color + field.SetProperty( DevelTextField::Property::GRAB_HANDLE_COLOR, Color::GREEN ); + DALI_TEST_EQUALS( field.GetProperty( DevelTextField::Property::GRAB_HANDLE_COLOR ), Color::GREEN, TEST_LOCATION ); + + // Check the input filter property + Property::Map inputFilterMapSet; + Property::Map inputFilterMapGet; + inputFilterMapSet[InputFilter::Property::ACCEPTED] = "[\\w]"; + inputFilterMapSet[InputFilter::Property::REJECTED] = "[\\d]"; + + field.SetProperty(DevelTextField::Property::INPUT_FILTER, inputFilterMapSet); + + inputFilterMapGet = field.GetProperty(DevelTextField::Property::INPUT_FILTER); + DALI_TEST_EQUALS(inputFilterMapGet.Count(), inputFilterMapSet.Count(), TEST_LOCATION); + + // Clear + inputFilterMapSet.Clear(); + field.SetProperty(DevelTextField::Property::INPUT_FILTER, inputFilterMapSet); + application.SendNotification(); application.Render(); @@ -1010,654 +1102,1833 @@ int utcDaliTextFieldAtlasRenderP(void) END_TEST; } -// Positive test for the textChanged signal. -int utcDaliTextFieldTextChangedP(void) +// Positive test for the anchorClicked signal. +int utcDaliTextFieldAnchorClicked01(void) { ToolkitTestApplication application; - tet_infoline(" utcDaliTextFieldTextChangedP"); + tet_infoline(" utcDaliTextFieldAnchorClicked01"); TextField field = TextField::New(); - DALI_TEST_CHECK( field ); + DALI_TEST_CHECK(field); - application.GetScene().Add( field ); + application.GetScene().Add(field); - // connect to the text changed signal. + // connect to the anchor clicked signal. ConnectionTracker* testTracker = new ConnectionTracker(); - field.TextChangedSignal().Connect(&TestTextChangedCallback); - bool textChangedSignal = false; - field.ConnectSignal( testTracker, "textChanged", CallbackFunctor(&textChangedSignal) ); + DevelTextField::AnchorClickedSignal(field).Connect(&TestAnchorClickedCallback); + bool anchorClickedSignal = false; + field.ConnectSignal(testTracker, "anchorClicked", CallbackFunctor(&anchorClickedSignal)); - gTextChangedCallBackCalled = false; - field.SetProperty( TextField::Property::TEXT, "ABC" ); - DALI_TEST_CHECK( gTextChangedCallBackCalled ); - DALI_TEST_CHECK( textChangedSignal ); + gAnchorClickedCallBackCalled = false; + field.SetProperty(TextField::Property::TEXT, "TIZEN"); + field.SetProperty(TextField::Property::ENABLE_MARKUP, true); + field.SetProperty(Actor::Property::SIZE, Vector2(100.f, 50.f)); + field.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT); + field.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT); application.SendNotification(); - + application.Render(); field.SetKeyInputFocus(); - gTextChangedCallBackCalled = false; - application.ProcessEvent( GenerateKey( "D", "", "D", KEY_D_CODE, 0, 0, Integration::KeyEvent::DOWN, "D", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - DALI_TEST_CHECK( gTextChangedCallBackCalled ); - - END_TEST; -} - -// Negative test for the textChanged signal. -int utcDaliTextFieldTextChangedN(void) -{ - ToolkitTestApplication application; - tet_infoline(" utcDaliTextFieldTextChangedN"); - TextField field = TextField::New(); - DALI_TEST_CHECK( field ); + // Create a tap event to touch the text field. + TestGenerateTap(application, 5.0f, 25.0f); + application.SendNotification(); + application.Render(); - application.GetScene().Add( field ); + DALI_TEST_CHECK(gAnchorClickedCallBackCalled); + DALI_TEST_CHECK(anchorClickedSignal); - // connect to the text changed signal. - ConnectionTracker* testTracker = new ConnectionTracker(); - field.TextChangedSignal().Connect(&TestTextChangedCallback); - bool textChangedSignal = false; - field.ConnectSignal( testTracker, "textChanged", CallbackFunctor(&textChangedSignal) ); + gAnchorClickedCallBackNotCalled = true; + // Tap the outside of anchor, callback should not be called. + TestGenerateTap(application, 150.f, 100.f); + application.SendNotification(); + application.Render(); - gTextChangedCallBackCalled = false; - field.SetProperty( TextField::Property::PLACEHOLDER_TEXT, "ABC" ); // Setting placeholder, not TEXT - DALI_TEST_CHECK( !gTextChangedCallBackCalled ); - DALI_TEST_CHECK( !textChangedSignal ); + DALI_TEST_CHECK(gAnchorClickedCallBackNotCalled); END_TEST; } -// Positive test for Max Characters reached signal. -int utcDaliTextFieldMaxCharactersReachedP(void) +// Positive test for the anchorClicked signal. +int utcDaliTextFieldAnchorClicked02(void) { ToolkitTestApplication application; - tet_infoline(" utcDaliTextFieldMaxCharactersReachedP"); + tet_infoline(" utcDaliTextFieldAnchorClicked02"); TextField field = TextField::New(); - DALI_TEST_CHECK( field ); - - application.GetScene().Add( field ); + DALI_TEST_CHECK(field); - const int maxNumberOfCharacters = 1; - field.SetProperty( TextField::Property::MAX_LENGTH, maxNumberOfCharacters ); - - field.SetKeyInputFocus(); + application.GetScene().Add(field); - // connect to the text changed signal. + // connect to the anchor clicked signal. ConnectionTracker* testTracker = new ConnectionTracker(); - field.MaxLengthReachedSignal().Connect(&TestMaxLengthReachedCallback); - bool maxLengthReachedSignal = false; - field.ConnectSignal( testTracker, "maxLengthReached", CallbackFunctor(&maxLengthReachedSignal) ); + DevelTextField::AnchorClickedSignal(field).Connect(&TestAnchorClickedCallback); + bool anchorClickedSignal = false; + field.ConnectSignal(testTracker, "anchorClicked", CallbackFunctor(&anchorClickedSignal)); - gMaxCharactersCallBackCalled = false; + gAnchorClickedCallBackCalled = false; + field.SetProperty(TextField::Property::TEXT, "TIZEN"); + field.SetProperty(TextField::Property::ENABLE_MARKUP, true); + field.SetProperty(Actor::Property::SIZE, Vector2(100.f, 50.f)); + field.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT); + field.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT); - application.ProcessEvent( GenerateKey( "a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - application.ProcessEvent( GenerateKey( "a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.SendNotification(); + application.Render(); + field.SetKeyInputFocus(); - DALI_TEST_CHECK( gMaxCharactersCallBackCalled ); - DALI_TEST_CHECK( maxLengthReachedSignal ); + // Avoid a crash when core load gl resources. + application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE); - END_TEST; -} + // Create a tap event to touch the text field. + TestGenerateTap(application, 30.0f, 25.0f, 100); + application.SendNotification(); + application.Render(); -// Negative test for Max Characters reached signal. -int utcDaliTextFieldMaxCharactersReachedN(void) -{ - ToolkitTestApplication application; - tet_infoline(" utcDaliTextFieldMaxCharactersReachedN"); - TextField field = TextField::New(); - DALI_TEST_CHECK( field ); + DALI_TEST_CHECK(gAnchorClickedCallBackCalled); + DALI_TEST_CHECK(anchorClickedSignal); - application.GetScene().Add( field ); - const int maxNumberOfCharacters = 3; - field.SetProperty( TextField::Property::MAX_LENGTH, maxNumberOfCharacters ); + // For coverage InsertTextAnchor, RemoveTextAnchor + // first index insert + field.SetProperty(TextField::Property::TEXT, "TIZEN"); + field.SetProperty(DevelTextField::Property::PRIMARY_CURSOR_POSITION, 0); + application.SendNotification(); + application.Render(); - field.SetKeyInputFocus(); + application.ProcessEvent( GenerateKey( "D", "", "D", KEY_D_CODE, 0, 0, Integration::KeyEvent::DOWN, "D", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.SendNotification(); + application.Render(); - // connect to the text changed signal. - ConnectionTracker* testTracker = new ConnectionTracker(); - field.MaxLengthReachedSignal().Connect(&TestMaxLengthReachedCallback); - bool maxLengthReachedSignal = false; - field.ConnectSignal( testTracker, "maxLengthReached", CallbackFunctor(&maxLengthReachedSignal) ); + gAnchorClickedCallBackCalled = false; + // Create a tap event to touch the text field. + TestGenerateTap(application, 30.0f, 25.0f, 700); + application.SendNotification(); + field.SetKeyInputFocus(); - gMaxCharactersCallBackCalled = false; + DALI_TEST_CHECK(gAnchorClickedCallBackCalled); - application.ProcessEvent( GenerateKey( "a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - application.ProcessEvent( GenerateKey( "a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + // last index insert + field.SetProperty(TextField::Property::TEXT, "TIZEN"); + field.SetProperty(DevelTextField::Property::PRIMARY_CURSOR_POSITION, 5); + application.SendNotification(); + application.Render(); - DALI_TEST_CHECK( !gMaxCharactersCallBackCalled ); - DALI_TEST_CHECK( !maxLengthReachedSignal ); + application.ProcessEvent( GenerateKey( "D", "", "D", KEY_D_CODE, 0, 0, Integration::KeyEvent::DOWN, "D", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.SendNotification(); + application.Render(); - application.ProcessEvent( GenerateKey( "Return", "", "\r", KEY_RETURN_CODE, 0, 0, Integration::KeyEvent::DOWN, "\r", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + gAnchorClickedCallBackCalled = false; + // Create a tap event to touch the text field. + TestGenerateTap(application, 30.0f, 25.0f, 1300); + application.SendNotification(); + field.SetKeyInputFocus(); - DALI_TEST_CHECK( !gMaxCharactersCallBackCalled ); - DALI_TEST_CHECK( !maxLengthReachedSignal ); + DALI_TEST_CHECK(gAnchorClickedCallBackCalled); - END_TEST; -} + // mid index insert + field.SetProperty(TextField::Property::TEXT, "TIZEN"); + field.SetProperty(DevelTextField::Property::PRIMARY_CURSOR_POSITION, 2); + application.SendNotification(); + application.Render(); -int utcDaliTextFieldInputStyleChanged01(void) -{ - // 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. - // The ToolkitTestApplication creates an implementation of the adaptor stub and a queue of idle callbacks. - ToolkitTestApplication application; - tet_infoline(" utcDaliTextFieldInputStyleChanged01"); + application.ProcessEvent( GenerateKey( "D", "", "D", KEY_D_CODE, 0, 0, Integration::KeyEvent::DOWN, "D", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.SendNotification(); + application.Render(); - // Load some fonts. + gAnchorClickedCallBackCalled = false; + // Create a tap event to touch the text field. + TestGenerateTap(application, 30.0f, 25.0f, 1900); + application.SendNotification(); + field.SetKeyInputFocus(); - char* pathNamePtr = get_current_dir_name(); - const std::string pathName( pathNamePtr ); - free( pathNamePtr ); + DALI_TEST_CHECK(gAnchorClickedCallBackCalled); - TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get(); - fontClient.SetDpi( 93u, 93u ); + // first index remove + field.SetProperty(TextField::Property::TEXT, "TIZEN"); + field.SetProperty(DevelTextField::Property::PRIMARY_CURSOR_POSITION, 0); + application.SendNotification(); + application.Render(); - 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 ); + application.ProcessEvent(GenerateKey("", "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + application.ProcessEvent(GenerateKey("Delete", "", "Delete", Dali::DevelKey::DALI_KEY_DELETE, 0, 0, Integration::KeyEvent::DOWN, "Delete", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + application.SendNotification(); + application.Render(); - TextField field = TextField::New(); - DALI_TEST_CHECK( field ); + gAnchorClickedCallBackCalled = false; + // Create a tap event to touch the text field. + TestGenerateTap(application, 30.0f, 25.0f, 2500); + application.SendNotification(); + field.SetKeyInputFocus(); + DALI_TEST_CHECK(gAnchorClickedCallBackCalled); - field.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); - field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); - field.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); + // last index remove + field.SetProperty(TextField::Property::TEXT, "TIZEN"); + field.SetProperty(DevelTextField::Property::PRIMARY_CURSOR_POSITION, 5); + application.SendNotification(); + application.Render(); - field.SetProperty( TextField::Property::ENABLE_MARKUP, true ); - field.SetProperty( TextField::Property::TEXT, "Hello world demo" ); + application.ProcessEvent(GenerateKey("", "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + application.ProcessEvent(GenerateKey("Delete", "", "Delete", Dali::DevelKey::DALI_KEY_DELETE, 0, 0, Integration::KeyEvent::DOWN, "Delete", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + application.SendNotification(); + application.Render(); - // connect to the text changed signal. - ConnectionTracker* testTracker = new ConnectionTracker(); - field.InputStyleChangedSignal().Connect( &TestInputStyleChangedCallback ); - bool inputStyleChangedSignal = false; - field.ConnectSignal( testTracker, "inputStyleChanged", CallbackFunctor(&inputStyleChangedSignal) ); + gAnchorClickedCallBackCalled = false; + // Create a tap event to touch the text field. + TestGenerateTap(application, 30.0f, 25.0f, 3100); + application.SendNotification(); + application.Render(); - application.GetScene().Add( field ); + DALI_TEST_CHECK(gAnchorClickedCallBackCalled); - // Render and notify + // middle index + field.SetProperty(TextField::Property::TEXT, "TIZEN"); + field.SetProperty(DevelTextField::Property::PRIMARY_CURSOR_POSITION, 2); application.SendNotification(); application.Render(); - // 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; + application.ProcessEvent(GenerateKey("", "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + application.ProcessEvent(GenerateKey("Delete", "", "Delete", Dali::DevelKey::DALI_KEY_DELETE, 0, 0, Integration::KeyEvent::DOWN, "Delete", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + application.SendNotification(); + application.Render(); + gAnchorClickedCallBackCalled = false; // Create a tap event to touch the text field. - TestGenerateTap( application, 18.0f, 25.0f ); + TestGenerateTap(application, 30.0f, 25.0f, 3700); + application.SendNotification(); + application.Render(); - // Render and notify + DALI_TEST_CHECK(gAnchorClickedCallBackCalled); + + // 0 ~ 1 index remove + field.SetProperty(TextField::Property::TEXT, "TIZEN"); + field.SetProperty( DevelTextField::Property::SELECTED_TEXT_START, 0); + field.SetProperty( DevelTextField::Property::SELECTED_TEXT_END, 1); application.SendNotification(); application.Render(); - // Executes the idle callbacks added by the text control on the change of input style. - application.RunIdles(); + application.ProcessEvent(GenerateKey("", "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + application.SendNotification(); + application.Render(); - DALI_TEST_CHECK( gInputStyleChangedCallbackCalled ); - if( gInputStyleChangedCallbackCalled ) - { - DALI_TEST_EQUALS( static_cast( gInputStyleMask ), static_cast( TextField::InputStyle::FONT_FAMILY | TextField::InputStyle::POINT_SIZE ), TEST_LOCATION ); + gAnchorClickedCallBackCalled = false; + // Create a tap event to touch the text field. + TestGenerateTap(application, 30.0f, 25.0f, 4300); + application.SendNotification(); + application.Render(); - const std::string fontFamily = field.GetProperty( TextField::Property::INPUT_FONT_FAMILY ).Get(); - DALI_TEST_EQUALS( fontFamily, "DejaVuSerif", TEST_LOCATION ); + DALI_TEST_CHECK(gAnchorClickedCallBackCalled); - 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 ); + // 1 ~ 3 index remove + field.SetProperty(TextField::Property::TEXT, "TIZEN"); + field.SetProperty( DevelTextField::Property::SELECTED_TEXT_START, 1); + field.SetProperty( DevelTextField::Property::SELECTED_TEXT_END, 3); + application.SendNotification(); + application.Render(); - gInputStyleChangedCallbackCalled = false; - gInputStyleMask = TextField::InputStyle::NONE; - inputStyleChangedSignal = false; + application.ProcessEvent(GenerateKey("", "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + application.SendNotification(); + application.Render(); + gAnchorClickedCallBackCalled = false; // Create a tap event to touch the text field. - TestGenerateTap( application, 30.0f, 25.0f ); - - // Render and notify + TestGenerateTap(application, 30.0f, 25.0f, 4900); application.SendNotification(); application.Render(); - // Executes the idle callbacks added by the text control on the change of input style. - application.RunIdles(); + DALI_TEST_CHECK(gAnchorClickedCallBackCalled); - DALI_TEST_CHECK( !gInputStyleChangedCallbackCalled ); - DALI_TEST_CHECK( !inputStyleChangedSignal ); + // 3 ~ 4 index remove + field.SetProperty(TextField::Property::TEXT, "TIZEN"); + field.SetProperty( DevelTextField::Property::SELECTED_TEXT_START, 3); + field.SetProperty( DevelTextField::Property::SELECTED_TEXT_END, 4); + application.SendNotification(); + application.Render(); - gInputStyleChangedCallbackCalled = false; - gInputStyleMask = TextField::InputStyle::NONE; - inputStyleChangedSignal = false; + application.ProcessEvent(GenerateKey("", "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + application.SendNotification(); + application.Render(); + gAnchorClickedCallBackCalled = false; // Create a tap event to touch the text field. - TestGenerateTap( application, 43.0f, 25.0f ); - - // Render and notify + TestGenerateTap(application, 30.0f, 25.0f, 5500); application.SendNotification(); application.Render(); - // Executes the idle callbacks added by the text control on the change of input style. + DALI_TEST_CHECK(gAnchorClickedCallBackCalled); + + // Remove front of anchor + field.SetProperty(TextField::Property::TEXT, "TIZENTIZEN"); + field.SetProperty(DevelTextField::Property::PRIMARY_CURSOR_POSITION, 3); + application.SendNotification(); + application.Render(); + + application.ProcessEvent(GenerateKey("", "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + application.SendNotification(); + application.Render(); + + // Remove whole text + field.SetProperty(TextField::Property::TEXT, "TIZEN"); + DevelTextField::SelectWholeText(field); + application.SendNotification(); + application.Render(); + + application.ProcessEvent(GenerateKey("", "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + application.SendNotification(); + application.Render(); + + // Remove all with backspace + field.SetProperty(TextField::Property::TEXT, "T"); + field.SetProperty(DevelTextField::Property::PRIMARY_CURSOR_POSITION, 1); + application.SendNotification(); + application.Render(); + + application.ProcessEvent(GenerateKey("", "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + application.SendNotification(); + application.Render(); + + // Remove all with delete + field.SetProperty(TextField::Property::TEXT, "T"); + field.SetProperty(DevelTextField::Property::PRIMARY_CURSOR_POSITION, 0); + application.SendNotification(); + application.Render(); + + application.ProcessEvent(GenerateKey("Delete", "", "Delete", Dali::DevelKey::DALI_KEY_DELETE, 0, 0, Integration::KeyEvent::DOWN, "Delete", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + application.SendNotification(); + application.Render(); + + END_TEST; +} + +// Positive test for the textChanged signal. +int utcDaliTextFieldTextChangedP(void) +{ + ToolkitTestApplication application; + tet_infoline(" utcDaliTextFieldTextChangedP"); + TextField field = TextField::New(); + DALI_TEST_CHECK( field ); + + application.GetScene().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(); + field.SetKeyInputFocus(); + + gTextChangedCallBackCalled = false; + application.ProcessEvent( GenerateKey( "D", "", "D", KEY_D_CODE, 0, 0, Integration::KeyEvent::DOWN, "D", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + DALI_TEST_CHECK( gTextChangedCallBackCalled ); + + // Remove all text + field.SetProperty( TextField::Property::TEXT, "" ); + + // Pressing backspace key: TextChangedCallback should not be called when there is no text in textfield. + gTextChangedCallBackCalled = false; + application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + DALI_TEST_CHECK( !gTextChangedCallBackCalled ); + + // Pressing delete key: TextChangedCallback should not be called when there is no text in textfield. + gTextChangedCallBackCalled = false; + application.ProcessEvent( GenerateKey( "", "", "", Dali::DevelKey::DALI_KEY_DELETE, 0, 0, Integration::KeyEvent::DOWN, "Delete", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + DALI_TEST_CHECK( !gTextChangedCallBackCalled ); + + END_TEST; +} + +int utcDaliTextFieldTextChangedWithInputMethodContext(void) +{ + ToolkitTestApplication application; + tet_infoline(" utcDaliTextFieldTextChangedWithInputMethodContext"); + TextField field = TextField::New(); + DALI_TEST_CHECK( field ); + + + application.GetScene().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) ); + + + // get InputMethodContext + std::string text; + InputMethodContext::EventData imfEvent; + InputMethodContext inputMethodContext = DevelTextField::GetInputMethodContext( field ); + + field.SetKeyInputFocus(); + field.SetProperty( DevelTextField::Property::ENABLE_EDITING, true ); + + // input text + gTextChangedCallBackCalled = false; + imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "ㅎ", 0, 1 ); + inputMethodContext.EventReceivedSignal().Emit(inputMethodContext, imfEvent); + application.SendNotification(); + application.Render(); + DALI_TEST_CHECK( gTextChangedCallBackCalled ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::TEXT ), std::string("ㅎ"), TEST_LOCATION ); + + gTextChangedCallBackCalled = false; + imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "호", 0, 1 ); + inputMethodContext.EventReceivedSignal().Emit(inputMethodContext, imfEvent); + application.SendNotification(); + application.Render(); + DALI_TEST_CHECK( gTextChangedCallBackCalled ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::TEXT ), std::string("호"), TEST_LOCATION ); + + gTextChangedCallBackCalled = false; + imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "혿", 0, 1 ); + inputMethodContext.EventReceivedSignal().Emit(inputMethodContext, imfEvent); + application.SendNotification(); + application.Render(); + DALI_TEST_CHECK( gTextChangedCallBackCalled ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::TEXT ), std::string("혿"), TEST_LOCATION ); + + gTextChangedCallBackCalled = false; + imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "", 0, 1 ); + inputMethodContext.EventReceivedSignal().Emit(inputMethodContext, imfEvent); + DALI_TEST_CHECK( !gTextChangedCallBackCalled ); + + imfEvent = InputMethodContext::EventData( InputMethodContext::COMMIT, "호", 0, 1 ); + inputMethodContext.EventReceivedSignal().Emit(inputMethodContext, imfEvent); + DALI_TEST_CHECK( !gTextChangedCallBackCalled ); + + imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "두", 1, 2 ); + inputMethodContext.EventReceivedSignal().Emit(inputMethodContext, imfEvent); + DALI_TEST_CHECK( !gTextChangedCallBackCalled ); + + application.SendNotification(); + application.Render(); + DALI_TEST_CHECK( gTextChangedCallBackCalled ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::TEXT ), std::string("호두"), TEST_LOCATION ); + + END_TEST; +} + + +// Negative test for the textChanged signal. +int utcDaliTextFieldTextChangedN(void) +{ + ToolkitTestApplication application; + tet_infoline(" utcDaliTextFieldTextChangedN"); + TextField field = TextField::New(); + DALI_TEST_CHECK( field ); + + application.GetScene().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 + application.SendNotification(); + application.Render(); + DALI_TEST_CHECK( !gTextChangedCallBackCalled ); + DALI_TEST_CHECK( !textChangedSignal ); + + 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 ); + + application.GetScene().Add( field ); + + const int maxNumberOfCharacters = 1; + field.SetProperty( TextField::Property::MAX_LENGTH, maxNumberOfCharacters ); + + field.SetKeyInputFocus(); + + // 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", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.ProcessEvent( GenerateKey( "a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + + DALI_TEST_CHECK( gMaxCharactersCallBackCalled ); + DALI_TEST_CHECK( maxLengthReachedSignal ); + + 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 ); + + application.GetScene().Add( field ); + + const int maxNumberOfCharacters = 3; + field.SetProperty( TextField::Property::MAX_LENGTH, maxNumberOfCharacters ); + + field.SetKeyInputFocus(); + + // 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", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.ProcessEvent( GenerateKey( "a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + + DALI_TEST_CHECK( !gMaxCharactersCallBackCalled ); + DALI_TEST_CHECK( !maxLengthReachedSignal ); + + application.ProcessEvent( GenerateKey( "Return", "", "\r", KEY_RETURN_CODE, 0, 0, Integration::KeyEvent::DOWN, "\r", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + + DALI_TEST_CHECK( !gMaxCharactersCallBackCalled ); + DALI_TEST_CHECK( !maxLengthReachedSignal ); + + END_TEST; +} + +// Positive test for Input Filtered signal. +int utcDaliTextFieldInputFilteredP(void) +{ + ToolkitTestApplication application; + tet_infoline(" utcDaliTextFieldInputFilteredP"); + TextField field = TextField::New(); + DALI_TEST_CHECK(field); + + application.GetScene().Add(field); + + Property::Map inputFilter; + + // Only digit is accepted. + inputFilter[InputFilter::Property::ACCEPTED] = "[\\d]"; + + // Set input filter to TextField. + field.SetProperty(DevelTextField::Property::INPUT_FILTER, inputFilter); + + field.SetKeyInputFocus(); + + // connect to the input filtered signal. + ConnectionTracker* testTracker = new ConnectionTracker(); + DevelTextField::InputFilteredSignal(field).Connect(&TestInputFilteredCallback); + bool inputFilteredSignal = false; + field.ConnectSignal(testTracker, "inputFiltered", CallbackFunctor(&inputFilteredSignal)); + + gInputFilteredAcceptedCallbackCalled = false; + + application.ProcessEvent(GenerateKey( "a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE )); + + DALI_TEST_CHECK(gInputFilteredAcceptedCallbackCalled); + DALI_TEST_CHECK(inputFilteredSignal); + + // Word is rejected. + inputFilter[InputFilter::Property::ACCEPTED] = ""; + inputFilter[InputFilter::Property::REJECTED] = "[\\w]"; + + // Set input filter to TextField. + field.SetProperty(DevelTextField::Property::INPUT_FILTER, inputFilter); + + field.SetKeyInputFocus(); + + inputFilteredSignal = false; + gInputFilteredRejectedCallbackCalled = false; + + application.ProcessEvent(GenerateKey( "a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + + DALI_TEST_CHECK(gInputFilteredAcceptedCallbackCalled); + DALI_TEST_CHECK(inputFilteredSignal); + + END_TEST; +} + +// Negative test for Input Filtered signal. +int utcDaliTextFieldInputFilteredN(void) +{ + ToolkitTestApplication application; + tet_infoline(" utcDaliTextFieldInputFilteredP"); + TextField field = TextField::New(); + DALI_TEST_CHECK(field); + + application.GetScene().Add(field); + + Property::Map inputFilter; + + // Only word is accepted. + inputFilter[InputFilter::Property::ACCEPTED] = "[\\w]"; + + // Set input filter to TextField. + field.SetProperty(DevelTextField::Property::INPUT_FILTER, inputFilter); + + field.SetKeyInputFocus(); + + // connect to the input filtered signal. + ConnectionTracker* testTracker = new ConnectionTracker(); + DevelTextField::InputFilteredSignal(field).Connect(&TestInputFilteredCallback); + bool inputFilteredSignal = false; + field.ConnectSignal(testTracker, "inputFiltered", CallbackFunctor(&inputFilteredSignal)); + + gInputFilteredAcceptedCallbackCalled = false; + + // Key a, d should not be filtered. + application.ProcessEvent(GenerateKey("a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + application.ProcessEvent(GenerateKey("a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::UP, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + application.ProcessEvent(GenerateKey("d", "", "d", KEY_D_CODE, 0, 0, Integration::KeyEvent::DOWN, "d", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + application.ProcessEvent(GenerateKey("d", "", "d", KEY_D_CODE, 0, 0, Integration::KeyEvent::UP, "d", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + + // Backspace, Delete should not be filtered. + application.ProcessEvent(GenerateKey( "", "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + application.ProcessEvent(GenerateKey( "Delete", "", "Delete", Dali::DevelKey::DALI_KEY_DELETE, 0, 0, Integration::KeyEvent::DOWN, "Delete", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + + // Render and notify + application.SendNotification(); + application.Render(); + + DALI_TEST_CHECK(!gInputFilteredAcceptedCallbackCalled); + DALI_TEST_CHECK(!inputFilteredSignal); + + // Digit is rejected. + inputFilter[InputFilter::Property::ACCEPTED] = ""; + inputFilter[InputFilter::Property::REJECTED] = "[\\d]"; + + field.SetProperty(DevelTextField::Property::INPUT_FILTER, inputFilter); + + field.SetKeyInputFocus(); + + inputFilteredSignal = false; + gInputFilteredRejectedCallbackCalled = false; + + // Key a, d should not be filtered. + application.ProcessEvent(GenerateKey("a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + application.ProcessEvent(GenerateKey("a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::UP, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + application.ProcessEvent(GenerateKey("d", "", "d", KEY_D_CODE, 0, 0, Integration::KeyEvent::DOWN, "d", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + application.ProcessEvent(GenerateKey("d", "", "d", KEY_D_CODE, 0, 0, Integration::KeyEvent::UP, "d", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + + // Backspace, Delete should not be filtered. + application.ProcessEvent(GenerateKey( "", "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + application.ProcessEvent(GenerateKey( "Delete", "", "Delete", Dali::DevelKey::DALI_KEY_DELETE, 0, 0, Integration::KeyEvent::DOWN, "Delete", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + + // Render and notify + application.SendNotification(); + application.Render(); + + DALI_TEST_CHECK(!gInputFilteredAcceptedCallbackCalled); + DALI_TEST_CHECK(!inputFilteredSignal); + + END_TEST; +} + +int utcDaliTextFieldInputStyleChanged01(void) +{ + // 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. + // The ToolkitTestApplication creates an implementation of the adaptor stub and a queue of idle callbacks. + ToolkitTestApplication application; + tet_infoline(" utcDaliTextFieldInputStyleChanged01"); + + // 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 ); + + + field.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); + field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); + field.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); + + 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) ); + + application.GetScene().Add( field ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // 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. + TestGenerateTap( application, 18.0f, 25.0f ); + + // 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 ); + 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. + TestGenerateTap( application, 30.0f, 25.0f ); + + // 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 ); + + gInputStyleChangedCallbackCalled = false; + gInputStyleMask = TextField::InputStyle::NONE; + inputStyleChangedSignal = false; + + // Create a tap event to touch the text field. + TestGenerateTap( application, 43.0f, 25.0f ); + + // 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 ); + if( gInputStyleChangedCallbackCalled ) + { + DALI_TEST_EQUALS( static_cast( gInputStyleMask ), static_cast( TextField::InputStyle::COLOR ), TEST_LOCATION ); + + const Vector4 color = field.GetProperty( TextField::Property::INPUT_COLOR ).Get(); + DALI_TEST_EQUALS( color, Color::GREEN, TEST_LOCATION ); + } + DALI_TEST_CHECK( inputStyleChangedSignal ); + + gInputStyleChangedCallbackCalled = false; + gInputStyleMask = TextField::InputStyle::NONE; + inputStyleChangedSignal = false; + + // Create a tap event to touch the text field. + TestGenerateTap( application, 88.0f, 25.0f ); + + // 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 ); + 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 Property::Map fontStyleMapGet = field.GetProperty( TextField::Property::INPUT_FONT_STYLE ).Get(); + + Property::Map fontStyleMapSet; + fontStyleMapSet.Insert( "weight", "bold" ); + + DALI_TEST_EQUALS( fontStyleMapGet.Count(), fontStyleMapSet.Count(), TEST_LOCATION ); + DALI_TEST_EQUALS( DaliTestCheckMaps( fontStyleMapGet, fontStyleMapSet ), true, TEST_LOCATION ); + } + DALI_TEST_CHECK( inputStyleChangedSignal ); + + gInputStyleChangedCallbackCalled = false; + gInputStyleMask = TextField::InputStyle::NONE; + inputStyleChangedSignal = false; + + // Create a tap event to touch the text field. + TestGenerateTap( application, 115.0f, 25.0f ); + + // 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 ); + + gInputStyleChangedCallbackCalled = false; + gInputStyleMask = TextField::InputStyle::NONE; + inputStyleChangedSignal = false; + + // Create a tap event to touch the text field. + TestGenerateTap( application, 164.0f, 25.0f ); + + // 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 ); + 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. + TestGenerateTap( application, 191.0f, 25.0f ); + + // 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 utcDaliTextFieldInputStyleChanged02(void) +{ + // 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. + // The ToolkitTestApplication creates an implementation of the adaptor stub and a queue of idle callbacks. + ToolkitTestApplication application; + tet_infoline(" utcDaliTextFieldInputStyleChanged02"); + + // 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 ); + + field.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); + field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); + field.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); + + 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) ); + + application.GetScene().Add( field ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // 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. + TestGenerateTap( application, 53.0f, 25.0f, 100 ); + TestGenerateTap( application, 53.0f, 25.0f, 200 ); + + // 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 ); + if( gInputStyleChangedCallbackCalled ) + { + DALI_TEST_EQUALS( static_cast( gInputStyleMask ), + static_cast( TextField::InputStyle::FONT_FAMILY | + TextField::InputStyle::POINT_SIZE | + TextField::InputStyle::COLOR ), + TEST_LOCATION ); + + const Vector4 color = field.GetProperty( TextField::Property::INPUT_COLOR ).Get(); + DALI_TEST_EQUALS( color, Color::GREEN, 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; + + application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + + // 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 ); + if( gInputStyleChangedCallbackCalled ) + { + DALI_TEST_EQUALS( static_cast( gInputStyleMask ), + static_cast( TextField::InputStyle::COLOR ), + TEST_LOCATION ); + + 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, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + + // 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 ); + + gInputStyleChangedCallbackCalled = false; + gInputStyleMask = TextField::InputStyle::NONE; + inputStyleChangedSignal = false; + + application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + + // 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 ); + if( gInputStyleChangedCallbackCalled ) + { + DALI_TEST_EQUALS( static_cast( gInputStyleMask ), + static_cast( TextField::InputStyle::COLOR ), + TEST_LOCATION ); + + 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 ); + + Property::Map fontStyleMapSet; + fontStyleMapSet.Insert( "weight", "thin" ); + fontStyleMapSet.Insert( "width", "condensed" ); + fontStyleMapSet.Insert( "slant", "italic" ); + + field.SetProperty( TextField::Property::INPUT_FONT_STYLE, fontStyleMapSet ); + 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(); + + // 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 ); + + // Create a tap event to touch the text field. + TestGenerateTap( application, 63.0f, 25.0f, 700 ); + + // 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 ); - if( gInputStyleChangedCallbackCalled ) - { - DALI_TEST_EQUALS( static_cast( gInputStyleMask ), static_cast( TextField::InputStyle::COLOR ), TEST_LOCATION ); + 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 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 ); + + application.GetScene().Add( field ); + + field.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); + field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); + field.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // 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", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + + // 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. + TestGenerateTap( application, 150.0f, 25.0f ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Pressing delete key should be fine even if there is no text in TextField. + application.ProcessEvent( GenerateKey( "Delete", "", "Delete", Dali::DevelKey::DALI_KEY_DELETE, 0, 0, Integration::KeyEvent::DOWN, "Delete", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + // 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", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.ProcessEvent( GenerateKey( "a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + + // 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.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); + field2.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); + field2.SetProperty( Actor::Property::SIZE, Vector2( 100.f, 100.f ) ); + field2.SetProperty( Actor::Property::POSITION, Vector2( 100.0f, 100.0f )); + + application.GetScene().Add( field2 ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Create a tap event on the second text field. + TestGenerateTap( application, 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", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.ProcessEvent( GenerateKey( "a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + + // 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); + + application.GetScene().Add( field ); + + field.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); + field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); + field.SetProperty( Actor::Property::ANCHOR_POINT, 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 ( stencil ). + DALI_TEST_EQUALS( field.GetChildCount(), 1u, TEST_LOCATION ); + + Actor stencil = field.GetChildAt( 0u ); + DALI_TEST_EQUALS( stencil.GetChildCount(), 0u, TEST_LOCATION ); + + // Create a tap event to touch the text field. + TestGenerateTap( application, 150.0f, 25.0f, 300 ); + + // Render and notify + application.SendNotification(); + application.Render(); + + Actor layer = field.GetChildAt( 1u ); + DALI_TEST_EQUALS( layer.GetChildCount(), 1u, TEST_LOCATION ); // The cursor. + DALI_TEST_EQUALS( stencil.GetChildCount(), 0u, TEST_LOCATION ); + + // Now the text field has the focus, so it can handle the key events. + application.ProcessEvent( GenerateKey( "a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.ProcessEvent( GenerateKey( "a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + + // 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( stencil.GetChildCount(), 1u, TEST_LOCATION ); // The renderer + + Control cursor = Control::DownCast( layer.GetChildAt( 0u ) ); + DALI_TEST_CHECK( cursor ); + + // The offscreen root actor has a container with all the actors which contain the text renderers. + Actor container = stencil.GetChildAt( 0u ); + 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.GetCurrentProperty< Vector3 >( Actor::Property::POSITION ); + application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + Vector3 position2 = cursor.GetCurrentProperty< Vector3 >( Actor::Property::POSITION ); + DALI_TEST_CHECK( position2.x < position1.x ); + + application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_CURSOR_RIGHT, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + Vector3 position3 = cursor.GetCurrentProperty< Vector3 >( Actor::Property::POSITION ); + DALI_TEST_EQUALS( position1, position3, TEST_LOCATION ); // Should be in the same position1. + + + // Move the cursor to the first position. + application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + Vector3 position4 = cursor.GetCurrentProperty< Vector3 >( Actor::Property::POSITION ); + + // Send some taps and check the cursor positions. - const Vector4 color = field.GetProperty( TextField::Property::INPUT_COLOR ).Get(); - DALI_TEST_EQUALS( color, Color::GREEN, TEST_LOCATION ); + // Try to tap at the beginning. + TestGenerateTap( application, 1.0f, 25.0f, 900 ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Cursor position should be the same than position1. + Vector3 position5 = cursor.GetCurrentProperty< Vector3 >( Actor::Property::POSITION ); + + DALI_TEST_EQUALS( position4, position5, TEST_LOCATION ); // Should be in the same position2. + + // Tap away from the start position. + TestGenerateTap( application, 16.0f, 25.0f, 1500 ); + + // Render and notify + application.SendNotification(); + application.Render(); + + Vector3 position6 = cursor.GetCurrentProperty< Vector3 >( Actor::Property::POSITION ); + + DALI_TEST_CHECK( position6.x > position5.x ); + + // Remove all the text. + application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + field.SetProperty( TextField::Property::TEXT, "" ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Cursor position should be the same than position2. + Vector3 position7 = cursor.GetCurrentProperty< Vector3 >( Actor::Property::POSITION ); + + DALI_TEST_EQUALS( position4, position7, TEST_LOCATION );// Should be in the same position2. + + // Should not be a renderer. + DALI_TEST_EQUALS( stencil.GetChildCount(), 0u, TEST_LOCATION ); + + // Chanege exceed policy (EXCEED_POLICY_ORIGINAL doesn't use stencil ) + field.SetProperty( TextField::Property::TEXT, "This is a long text for the size of the text-field." ); + field.SetProperty( TextField::Property::EXCEED_POLICY, Dali::Toolkit::TextField::EXCEED_POLICY_ORIGINAL ); + + application.SendNotification(); + application.Render(); + + // There are renderer and decorator layer + DALI_TEST_EQUALS( field.GetChildCount(), 2u, TEST_LOCATION ); + + 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 ); + + application.GetScene().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.SetProperty( Actor::Property::SIZE, Vector2( 30.f, 50.f ) ); + field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); + field.SetProperty( Actor::Property::ANCHOR_POINT, 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. + TestGenerateTap( application, 3.0f, 25.0f ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Double tap to select a word. + TestGenerateTap( application, 3.0f, 25.0f ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // The offscreen root actor should have two actors: the renderer and the highlight actor. + Actor stencil = field.GetChildAt( 0u ); + + // The highlight actor is drawn first, so is the first actor in the list + Renderer highlight = stencil.GetChildAt( 0u ).GetRendererAt( 0u ); + DALI_TEST_CHECK( highlight ); + + // The offscreen root actor has a container with all the actors which contain the text renderers. + Actor container = stencil.GetChildAt( 1u ); + for( unsigned int index = 0; index < container.GetChildCount(); ++index ) + { + Renderer renderer = container.GetChildAt( index ).GetRendererAt( 0u ); + DALI_TEST_CHECK( renderer ); } - DALI_TEST_CHECK( inputStyleChangedSignal ); - gInputStyleChangedCallbackCalled = false; - gInputStyleMask = TextField::InputStyle::NONE; - inputStyleChangedSignal = false; + 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 ); + application.GetScene().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.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); + field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); + field.SetProperty( Actor::Property::ANCHOR_POINT, 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. - TestGenerateTap( application, 88.0f, 25.0f ); + TestGenerateTap( application, 150.0f, 25.0f ); + // Render and notify + application.SendNotification(); + application.Render(); + + + // Tap first to get the focus. + TestGenerateTap( application, 1.0f, 25.0f ); // Render and notify application.SendNotification(); application.Render(); - // Executes the idle callbacks added by the text control on the change of input style. - application.RunIdles(); + // Double tap to select a word. + TestGenerateTap( application, 1.0f, 25.0f ); - DALI_TEST_CHECK( gInputStyleChangedCallbackCalled ); - if( gInputStyleChangedCallbackCalled ) - { - DALI_TEST_EQUALS( static_cast( gInputStyleMask ), static_cast( TextField::InputStyle::COLOR | TextField::InputStyle::FONT_STYLE ), TEST_LOCATION ); + // Render and notify + application.SendNotification(); + application.Render(); - const Vector4 color = field.GetProperty( TextField::Property::INPUT_COLOR ).Get(); - DALI_TEST_EQUALS( color, Color::BLACK, TEST_LOCATION ); + // Tap grab handle + TestGenerateTap( application, 0.0f, 40.0f ); + END_TEST; +} - const Property::Map fontStyleMapGet = field.GetProperty( TextField::Property::INPUT_FONT_STYLE ).Get(); +int utcDaliTextFieldEvent05(void) +{ + ToolkitTestApplication application; + tet_infoline(" utcDaliTextFieldEvent05"); - Property::Map fontStyleMapSet; - fontStyleMapSet.Insert( "weight", "bold" ); + // Checks dragging of cursor/grab handle - DALI_TEST_EQUALS( fontStyleMapGet.Count(), fontStyleMapSet.Count(), TEST_LOCATION ); - DALI_TEST_EQUALS( DaliTestCheckMaps( fontStyleMapGet, fontStyleMapSet ), true, TEST_LOCATION ); - } - DALI_TEST_CHECK( inputStyleChangedSignal ); + TextField field = TextField::New(); + DALI_TEST_CHECK( field ); + application.GetScene().Add( field ); + LoadMarkerImages(application, field); + // Render and notify + application.SendNotification(); + application.Render(); - gInputStyleChangedCallbackCalled = false; - gInputStyleMask = TextField::InputStyle::NONE; - inputStyleChangedSignal = false; + 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.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); + field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); + field.SetProperty( Actor::Property::ANCHOR_POINT, 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. - TestGenerateTap( application, 115.0f, 25.0f ); + TestGenerateTap( application, 150.0f, 25.0f ); + // Render and notify + application.SendNotification(); + application.Render(); + + // Tap first to get the focus. + TestGenerateTap( application, 1.0f, 25.0f ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Double tap to select a word. + TestGenerateTap( application, 1.0f, 25.0f ); + + // Render and notify + application.SendNotification(); + application.Render(); + + Actor stencil = 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 ); + application.GetScene().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.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); + field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); + field.SetProperty( Actor::Property::ANCHOR_POINT, 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. + TestGenerateTap( application, 150.0f, 25.0f ); // 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 ); + // Tap first to get the focus. + TestGenerateTap( application, 1.0f, 25.0f ); - gInputStyleChangedCallbackCalled = false; - gInputStyleMask = TextField::InputStyle::NONE; - inputStyleChangedSignal = false; + // Render and notify + application.SendNotification(); + application.Render(); - // Create a tap event to touch the text field. - TestGenerateTap( application, 164.0f, 25.0f ); + // Long Press + TestGenerateLongPress(application, 1.0f, 25.0f); // Render and notify application.SendNotification(); application.Render(); - // Executes the idle callbacks added by the text control on the change of input style. - application.RunIdles(); + END_TEST; +} - DALI_TEST_CHECK( gInputStyleChangedCallbackCalled ); - if( gInputStyleChangedCallbackCalled ) - { - DALI_TEST_EQUALS( static_cast( gInputStyleMask ), static_cast( TextField::InputStyle::FONT_STYLE ), TEST_LOCATION ); +int utcDaliTextFieldEvent07(void) +{ + ToolkitTestApplication application; + tet_infoline(" utcDaliTextFieldEvent07"); - const std::string style = field.GetProperty( TextField::Property::INPUT_FONT_STYLE ).Get(); - DALI_TEST_CHECK( style.empty() ); - } - DALI_TEST_CHECK( inputStyleChangedSignal ); + // Checks Longpress to start edit mode - gInputStyleChangedCallbackCalled = false; - gInputStyleMask = TextField::InputStyle::NONE; - inputStyleChangedSignal = false; + TextField field = TextField::New(); + DALI_TEST_CHECK( field ); + application.GetScene().Add( field ); + LoadMarkerImages(application, field); + // Render and notify + application.SendNotification(); + application.Render(); - // Create a tap event to touch the text field. - TestGenerateTap( application, 191.0f, 25.0f ); + field.SetProperty( TextField::Property::TEXT, "Thisisalongtextforthesizeofthetextfield." ); + field.SetProperty( TextField::Property::POINT_SIZE, 10.f ); + field.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); + field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); + field.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); + Property::Map propertyMap; + propertyMap["PANEL_LAYOUT"] = InputMethod::PanelLayout::PASSWORD; + field.SetProperty( TextField::Property::INPUT_METHOD_SETTINGS, propertyMap ); + // Avoid a crash when core load gl resources. + application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); // Render and notify application.SendNotification(); application.Render(); - // Executes the idle callbacks added by the text control on the change of input style. - application.RunIdles(); + // Long Press + TestGenerateLongPress(application, 1.0f, 25.0f); - DALI_TEST_CHECK( !gInputStyleChangedCallbackCalled ); - DALI_TEST_CHECK( !inputStyleChangedSignal ); + // Render and notify + application.SendNotification(); + application.Render(); END_TEST; } -int utcDaliTextFieldInputStyleChanged02(void) +int utcDaliTextFieldEvent08(void) { - // 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. - // The ToolkitTestApplication creates an implementation of the adaptor stub and a queue of idle callbacks. ToolkitTestApplication application; - tet_infoline(" utcDaliTextFieldInputStyleChanged02"); - - // Load some fonts. - - char* pathNamePtr = get_current_dir_name(); - const std::string pathName( pathNamePtr ); - free( pathNamePtr ); + tet_infoline(" utcDaliTextFieldEvent08"); - TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get(); - fontClient.SetDpi( 93u, 93u ); + Dali::Clipboard clipboard = Clipboard::Get(); + clipboard.SetItem("testTextFieldEvent"); - 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 ); + // Checks Longpress when only place holder text TextField field = TextField::New(); DALI_TEST_CHECK( field ); + application.GetScene().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.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); field.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); - 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) ); - - application.GetScene().Add( field ); - + // Avoid a crash when core load gl resources. + application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); // Render and notify application.SendNotification(); application.Render(); - // 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. - TestGenerateTap( application, 53.0f, 25.0f, 100 ); - TestGenerateTap( application, 53.0f, 25.0f, 200 ); + // Long Press + TestGenerateLongPress( application, 1.0f, 25.0f, 20 ); // 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 ); - if( gInputStyleChangedCallbackCalled ) - { - DALI_TEST_EQUALS( static_cast( gInputStyleMask ), - static_cast( TextField::InputStyle::FONT_FAMILY | - TextField::InputStyle::POINT_SIZE | - TextField::InputStyle::COLOR ), - TEST_LOCATION ); - - const Vector4 color = field.GetProperty( TextField::Property::INPUT_COLOR ).Get(); - DALI_TEST_EQUALS( color, Color::GREEN, 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 ); + Wait(application, 500); - gInputStyleChangedCallbackCalled = false; - gInputStyleMask = TextField::InputStyle::NONE; - inputStyleChangedSignal = false; + TestEndLongPress( application, 1.0f, 25.0f, 520 ); - application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + // Long Press + TestGenerateLongPress( application, 1.0f, 25.0f, 600 ); // Render and notify - application.SendNotification(); application.Render(); - // Executes the idle callbacks added by the text control on the change of input style. - application.RunIdles(); + Wait(application, 500); - DALI_TEST_CHECK( gInputStyleChangedCallbackCalled ); - if( gInputStyleChangedCallbackCalled ) + Integration::Scene stage = application.GetScene(); + Layer layer = stage.GetRootLayer(); + Actor actor = layer.FindChildByName("optionPaste"); + + if (actor) { - DALI_TEST_EQUALS( static_cast( gInputStyleMask ), - static_cast( TextField::InputStyle::COLOR ), - TEST_LOCATION ); + Vector3 worldPosition = actor.GetCurrentProperty< Vector3 >( Actor::Property::WORLD_POSITION ); + Vector2 halfStageSize = stage.GetSize() / 2.0f; + Vector2 position(worldPosition.x + halfStageSize.width, worldPosition.y + halfStageSize.height); - const Vector4 color = field.GetProperty( TextField::Property::INPUT_COLOR ).Get(); - DALI_TEST_EQUALS( color, Color::BLUE, TEST_LOCATION ); + 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_CHECK( inputStyleChangedSignal ); + DALI_TEST_EQUALS( field.GetProperty( TextEditor::Property::TEXT ), std::string("testTextFieldEvent"), TEST_LOCATION ); - gInputStyleChangedCallbackCalled = false; - gInputStyleMask = TextField::InputStyle::NONE; - inputStyleChangedSignal = false; + END_TEST; +} - application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); +int utcDaliTextFieldEvent09(void) +{ + ToolkitTestApplication application; + tet_infoline(" utcDaliTextFieldEvent09"); + TextField field = TextField::New(); + DALI_TEST_CHECK( field ); + application.GetScene().Add( field ); + LoadMarkerImages(application, field); // 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 ); - - gInputStyleChangedCallbackCalled = false; - gInputStyleMask = TextField::InputStyle::NONE; - inputStyleChangedSignal = false; + field.SetProperty( TextField::Property::TEXT, "Hello" ); + field.SetProperty( TextField::Property::POINT_SIZE, 10.f ); + field.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); + field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); + field.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); - application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + // Avoid a crash when core load gl resources. + application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); - // Render and notify + // Create a tap event to touch the text field. + TestGenerateTap( application, 150.0f, 25.0f ); 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 ); - if( gInputStyleChangedCallbackCalled ) - { - DALI_TEST_EQUALS( static_cast( gInputStyleMask ), - static_cast( TextField::InputStyle::COLOR ), - TEST_LOCATION ); - - 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 ); - - Property::Map fontStyleMapSet; - fontStyleMapSet.Insert( "weight", "thin" ); - fontStyleMapSet.Insert( "width", "condensed" ); - fontStyleMapSet.Insert( "slant", "italic" ); - - field.SetProperty( TextField::Property::INPUT_FONT_STYLE, fontStyleMapSet ); - 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" ); + Property::Map map; + map[ HiddenInput::Property::MODE ] = HiddenInput::Mode::HIDE_NONE; + field.SetProperty( TextField::Property::HIDDEN_INPUT_SETTINGS, map ); + application.ProcessEvent( GenerateKey( "d", "", "d", 0, 0, 0, Integration::KeyEvent::DOWN, "d", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.SendNotification(); + application.Render(); - // Render and notify + map[ HiddenInput::Property::MODE ] = HiddenInput::Mode::HIDE_ALL; + map[ HiddenInput::Property::SUBSTITUTE_CHARACTER ] = 0x23; + field.SetProperty( TextField::Property::HIDDEN_INPUT_SETTINGS, map ); + application.ProcessEvent( GenerateKey( "d", "", "d", 0, 0, 0, Integration::KeyEvent::DOWN, "d", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); 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 ); + map[ HiddenInput::Property::MODE ] = HiddenInput::Mode::HIDE_COUNT; + map[ HiddenInput::Property::SUBSTITUTE_COUNT ] = 2; + field.SetProperty( TextField::Property::HIDDEN_INPUT_SETTINGS, map ); + for( unsigned int index = 0u; index < 5u; ++index ) + { + application.ProcessEvent( GenerateKey( "d", "", "d", 0, 0, 0, Integration::KeyEvent::DOWN, "d", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.SendNotification(); + application.Render(); + } - // Create a tap event to touch the text field. - TestGenerateTap( application, 63.0f, 25.0f, 300 ); + map[ HiddenInput::Property::MODE ] = HiddenInput::Mode::SHOW_COUNT; + map[ HiddenInput::Property::SUBSTITUTE_COUNT ] = 2; + field.SetProperty( TextField::Property::HIDDEN_INPUT_SETTINGS, map ); + for( unsigned int index = 0u; index < 5u; ++index ) + { + application.ProcessEvent( GenerateKey( "d", "", "d", 0, 0, 0, Integration::KeyEvent::DOWN, "d", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.SendNotification(); + application.Render(); + } - // Render and notify + map[ HiddenInput::Property::MODE ] = HiddenInput::Mode::SHOW_LAST_CHARACTER; + map[ HiddenInput::Property::SHOW_LAST_CHARACTER_DURATION ] = 0; + field.SetProperty( TextField::Property::HIDDEN_INPUT_SETTINGS, map ); + application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.SendNotification(); + application.Render(); + application.ProcessEvent( GenerateKey( "d", "", "d", 0, 0, 0, Integration::KeyEvent::DOWN, "d", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); 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 ); - 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 ); + map[ HiddenInput::Property::SHOW_LAST_CHARACTER_DURATION ] = 100; + field.SetProperty( TextField::Property::HIDDEN_INPUT_SETTINGS, map ); + application.ProcessEvent( GenerateKey( "d", "", "d", 0, 0, 0, Integration::KeyEvent::DOWN, "d", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.SendNotification(); + application.Render(); + Property::Map mapGet; + mapGet = field.GetProperty( TextField::Property::HIDDEN_INPUT_SETTINGS ); + DALI_TEST_EQUALS( map.Count(), mapGet.Count(), TEST_LOCATION ); + DALI_TEST_EQUALS( DaliTestCheckMaps( map, mapGet ), true, TEST_LOCATION ); END_TEST; } -int utcDaliTextFieldEvent01(void) + +int utcDaliTextFieldStyleWhilstSelected(void) { ToolkitTestApplication application; - tet_infoline(" utcDaliTextFieldEvent01"); + tet_infoline(" utcDaliTextFieldStyleWhilstSelected"); - // 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. + // Change font and styles whilst text is selected whilst word selected TextField field = TextField::New(); DALI_TEST_CHECK( field ); - application.GetScene().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.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); field.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); - // Render and notify - application.SendNotification(); - application.Render(); - // 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", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - + // Create a tap event to touch the text field. + TestGenerateTap( application, 150.0f, 25.0f ); // 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. - TestGenerateTap( application, 150.0f, 25.0f ); + // Tap first to get the focus. + TestGenerateTap( application, 1.0f, 25.0f ); // Render and notify application.SendNotification(); application.Render(); - // Pressing delete key should be fine even if there is no text in TextField. - application.ProcessEvent( GenerateKey( "Delete", "", "Delete", Dali::DevelKey::DALI_KEY_DELETE, 0, 0, Integration::KeyEvent::DOWN, "Delete", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + // Double tap to select a word. + TestGenerateTap( application, 1.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", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - application.ProcessEvent( GenerateKey( "a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + 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 ); - // Render and notify - application.SendNotification(); - application.Render(); + Property::Map fontStyleMapSet; + Property::Map fontStyleMapGet; - DALI_TEST_EQUALS( field.GetProperty( TextField::Property::TEXT ), std::string("aa"), TEST_LOCATION ); + fontStyleMapSet.Insert( "weight", "bold" ); + fontStyleMapSet.Insert( "slant", "italic" ); + field.SetProperty( TextField::Property::INPUT_FONT_STYLE, fontStyleMapSet ); - // Create a second text field and send key events to it. - TextField field2 = TextField::New(); + fontStyleMapGet = field.GetProperty( TextField::Property::INPUT_FONT_STYLE ); + DALI_TEST_EQUALS( fontStyleMapGet.Count(), fontStyleMapSet.Count(), TEST_LOCATION ); + DALI_TEST_EQUALS( DaliTestCheckMaps( fontStyleMapGet, fontStyleMapSet ), true, TEST_LOCATION ); - field2.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); - field2.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); - field2.SetProperty( Actor::Property::SIZE, Vector2( 100.f, 100.f ) ); - field2.SetProperty( Actor::Property::POSITION, Vector2( 100.0f, 100.0f )); + fontStyleMapSet.Clear(); + fontStyleMapSet.Insert( "width", "expanded" ); + fontStyleMapSet.Insert( "slant", "italic" ); + field.SetProperty( TextField::Property::INPUT_FONT_STYLE, fontStyleMapSet ); - application.GetScene().Add( field2 ); + fontStyleMapGet = field.GetProperty( TextField::Property::INPUT_FONT_STYLE ); + DALI_TEST_EQUALS( fontStyleMapGet.Count(), fontStyleMapSet.Count(), TEST_LOCATION ); + DALI_TEST_EQUALS( DaliTestCheckMaps( fontStyleMapGet, fontStyleMapSet ), true, TEST_LOCATION ); - // Render and notify - application.SendNotification(); - application.Render(); + 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 ); - // Create a tap event on the second text field. - TestGenerateTap( application, 150.0f, 125.0f ); + field.SetProperty( TextField::Property::TEXT_COLOR, Color::RED ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::TEXT_COLOR ), Color::RED, TEST_LOCATION ); - // Render and notify - application.SendNotification(); - application.Render(); + fontStyleMapSet.Clear(); + fontStyleMapSet.Insert( "weight", "bold" ); + fontStyleMapSet.Insert( "slant", "italic" ); - // The second text field has the focus. It should handle the key events. - application.ProcessEvent( GenerateKey( "a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - application.ProcessEvent( GenerateKey( "a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + field.SetProperty( TextField::Property::FONT_STYLE, fontStyleMapSet ); - // Render and notify + fontStyleMapGet = field.GetProperty( TextField::Property::FONT_STYLE ); + DALI_TEST_EQUALS( fontStyleMapGet.Count(), fontStyleMapSet.Count(), TEST_LOCATION ); + DALI_TEST_EQUALS( DaliTestCheckMaps( fontStyleMapGet, fontStyleMapSet ), true, TEST_LOCATION ); + + fontStyleMapSet.Clear(); + fontStyleMapSet.Insert( "width", "expanded" ); + + field.SetProperty( TextField::Property::FONT_STYLE, fontStyleMapSet ); + + fontStyleMapGet = field.GetProperty( TextField::Property::FONT_STYLE ); + DALI_TEST_EQUALS( fontStyleMapGet.Count(), fontStyleMapSet.Count(), TEST_LOCATION ); + DALI_TEST_EQUALS( DaliTestCheckMaps( fontStyleMapGet, fontStyleMapSet ), true, TEST_LOCATION ); + + // Press Escape to increase coverage + application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_ESCAPE, 0, 0, Integration::KeyEvent::UP, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); 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 ); + DALI_TEST_CHECK( !field.HasKeyInputFocus() ); END_TEST; } -int utcDaliTextFieldEvent02(void) +int utcDaliTextFieldEscKeyLoseFocus(void) { ToolkitTestApplication application; - tet_infoline(" utcDaliTextFieldEvent02"); + tet_infoline(" utcDaliTextFieldEscKeyLoseFocus"); - // Checks if the right number of actors are 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(); - field.SetProperty( TextField::Property::POINT_SIZE, 10.f ); DALI_TEST_CHECK( field ); - LoadMarkerImages(application, field); application.GetScene().Add( field ); @@ -1672,473 +2943,509 @@ int utcDaliTextFieldEvent02(void) application.SendNotification(); application.Render(); - // Check there are the expected number of children ( stencil ). - DALI_TEST_EQUALS( field.GetChildCount(), 1u, TEST_LOCATION ); + // Add a key event but as the text field has not the focus it should do nothing. + application.ProcessEvent( GenerateKey( "a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.ProcessEvent( GenerateKey( "a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::UP, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - Actor stencil = field.GetChildAt( 0u ); - DALI_TEST_EQUALS( stencil.GetChildCount(), 0u, TEST_LOCATION ); + // 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. - TestGenerateTap( application, 150.0f, 25.0f, 300 ); + TestGenerateTap( application, 150.0f, 25.0f ); // Render and notify application.SendNotification(); application.Render(); - Actor layer = field.GetChildAt( 1u ); - DALI_TEST_EQUALS( layer.GetChildCount(), 1u, TEST_LOCATION ); // The cursor. - DALI_TEST_EQUALS( stencil.GetChildCount(), 0u, TEST_LOCATION ); - // Now the text field has the focus, so it can handle the key events. application.ProcessEvent( GenerateKey( "a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - application.ProcessEvent( GenerateKey( "a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.ProcessEvent( GenerateKey( "a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::UP, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.ProcessEvent( GenerateKey( "d", "", "d", KEY_D_CODE, 0, 0, Integration::KeyEvent::DOWN, "d", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.ProcessEvent( GenerateKey( "d", "", "d", KEY_D_CODE, 0, 0, Integration::KeyEvent::UP, "d", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); // 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( stencil.GetChildCount(), 1u, TEST_LOCATION ); // The renderer - - Control cursor = Control::DownCast( layer.GetChildAt( 0u ) ); - DALI_TEST_CHECK( cursor ); - - // The offscreen root actor has a container with all the actors which contain the text renderers. - Actor container = stencil.GetChildAt( 0u ); - for( unsigned int index = 0; index < container.GetChildCount(); ++index ) - { - Renderer renderer = container.GetChildAt( index ).GetRendererAt( 0u ); - DALI_TEST_CHECK( renderer ); - } + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::TEXT ), std::string("ad"), TEST_LOCATION ); - // Move the cursor and check the position changes. - Vector3 position1 = cursor.GetCurrentProperty< Vector3 >( Actor::Property::POSITION ); - application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + // Generate a Esc key event. The text field should lose the focus. + application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_ESCAPE, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_ESCAPE, 0, 0, Integration::KeyEvent::UP, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); // Render and notify application.SendNotification(); application.Render(); - Vector3 position2 = cursor.GetCurrentProperty< Vector3 >( Actor::Property::POSITION ); - DALI_TEST_CHECK( position2.x < position1.x ); + DALI_TEST_EQUALS( false, field.HasKeyInputFocus(), TEST_LOCATION ); - application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_CURSOR_RIGHT, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + // No more text should be introduced + application.ProcessEvent( GenerateKey( "a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.ProcessEvent( GenerateKey( "a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::UP, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); // Render and notify application.SendNotification(); application.Render(); - Vector3 position3 = cursor.GetCurrentProperty< Vector3 >( Actor::Property::POSITION ); - DALI_TEST_EQUALS( position1, position3, TEST_LOCATION ); // Should be in the same position1. + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::TEXT ), std::string("ad"), TEST_LOCATION ); + END_TEST; +} - // Move the cursor to the first position. - application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); +int utcDaliTextFieldSomeSpecialKeys(void) +{ + ToolkitTestApplication application; + tet_infoline(" utcDaliTextFieldSomeSpecialKeys"); + + // Checks some special keys when the text is selected. + TextField field = TextField::New(); + DALI_TEST_CHECK( field ); + application.GetScene().Add( field ); + LoadMarkerImages(application, field); // Render and notify application.SendNotification(); application.Render(); - Vector3 position4 = cursor.GetCurrentProperty< Vector3 >( Actor::Property::POSITION ); - - // Send some taps and check the cursor positions. + const std::string longText( "This is a long text for the size of the text-field." ); - // Try to tap at the beginning. - TestGenerateTap( application, 1.0f, 25.0f, 900 ); + field.SetProperty( TextField::Property::TEXT, longText ); + field.SetProperty( TextField::Property::POINT_SIZE, 10.f ); + field.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); + field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); + field.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); + // Avoid a crash when core load gl resources. + application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); // Render and notify application.SendNotification(); application.Render(); - // Cursor position should be the same than position1. - Vector3 position5 = cursor.GetCurrentProperty< Vector3 >( Actor::Property::POSITION ); + // Create a tap event to touch the text field. + TestGenerateTap( application, 150.0f, 25.0f ); - DALI_TEST_EQUALS( position4, position5, TEST_LOCATION ); // Should be in the same position2. + // Render and notify + application.SendNotification(); + application.Render(); - // Tap away from the start position. - TestGenerateTap( application, 16.0f, 25.0f, 1500 ); + // Tap first to get the focus. + TestGenerateTap( application, 1.0f, 25.0f ); // Render and notify application.SendNotification(); application.Render(); - Vector3 position6 = cursor.GetCurrentProperty< Vector3 >( Actor::Property::POSITION ); + // Double tap to select a word. + TestGenerateTap( application, 1.0f, 25.0f ); - DALI_TEST_CHECK( position6.x > position5.x ); + // Render and notify + application.SendNotification(); + application.Render(); - // Remove all the text. - application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - field.SetProperty( TextField::Property::TEXT, "" ); + // Generate a Esc key event. The text field should lose the focus. + application.ProcessEvent( GenerateKey( "XF86PowerOff", "", "XF86PowerOff", DALI_KEY_POWER, 0, 0, Integration::KeyEvent::DOWN, "XF86PowerOff", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.ProcessEvent( GenerateKey( "XF86PowerOff", "", "XF86PowerOff", DALI_KEY_POWER, 0, 0, Integration::KeyEvent::UP, "XF86PowerOff", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); // Render and notify application.SendNotification(); application.Render(); - // Cursor position should be the same than position2. - Vector3 position7 = cursor.GetCurrentProperty< Vector3 >( Actor::Property::POSITION ); - - DALI_TEST_EQUALS( position4, position7, TEST_LOCATION );// Should be in the same position2. + // Generate a Esc key event. The text field should lose the focus. + application.ProcessEvent( GenerateKey( "XF86Menu", "", "XF86Menu", DALI_KEY_MENU, 0, 0, Integration::KeyEvent::DOWN, "XF86Menu", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.ProcessEvent( GenerateKey( "XF86Menu", "", "XF86Menu", DALI_KEY_MENU, 0, 0, Integration::KeyEvent::UP, "XF86Menu", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - // Should not be a renderer. - DALI_TEST_EQUALS( stencil.GetChildCount(), 0u, TEST_LOCATION ); + // Render and notify + application.SendNotification(); + application.Render(); - // Chanege exceed policy (EXCEED_POLICY_ORIGINAL doesn't use stencil ) - field.SetProperty( TextField::Property::TEXT, "This is a long text for the size of the text-field." ); - field.SetProperty( TextField::Property::EXCEED_POLICY, Dali::Toolkit::TextField::EXCEED_POLICY_ORIGINAL ); + // Generate a Esc key event. The text field should lose the focus. + application.ProcessEvent( GenerateKey( "XF86Home", "", "XF86Home", DALI_KEY_HOME, 0, 0, Integration::KeyEvent::DOWN, "XF86Home", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.ProcessEvent( GenerateKey( "XF86Home", "", "XF86Home", DALI_KEY_HOME, 0, 0, Integration::KeyEvent::UP, "XF86Home", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + // Render and notify application.SendNotification(); application.Render(); - // There are renderer and decorator layer - DALI_TEST_EQUALS( field.GetChildCount(), 2u, TEST_LOCATION ); + // The text shouldn't be deleted. + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::TEXT ), longText, TEST_LOCATION ); END_TEST; } -int utcDaliTextFieldEvent03(void) +int utcDaliTextFieldSizeUpdate(void) { ToolkitTestApplication application; - tet_infoline(" utcDaliTextFieldEvent03"); - - // Checks if the highlight actor is created. + tet_infoline("utcDaliTextFieldSizeUpdate"); + // Checks some special keys when the text is selected. TextField field = TextField::New(); DALI_TEST_CHECK( field ); - application.GetScene().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.SetProperty( Actor::Property::SIZE, Vector2( 30.f, 50.f ) ); + float previousHeight = 0.0f; + float currentHeight = 0.0f; + const float fieldWidth = 1920.0f; + + + // "ㅁ" is bigger then "ኢ" + field.SetProperty( Actor::Property::SIZE, Vector2( fieldWidth ,10.0f ) ); + field.SetResizePolicy( ResizePolicy::FIXED , Dimension::WIDTH ); + field.SetResizePolicy( ResizePolicy::DIMENSION_DEPENDENCY , Dimension::HEIGHT ); + + field.SetProperty( TextField::Property::TEXT, "ኢ"); field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); field.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); - // Avoid a crash when core load gl resources. - application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); - LoadMarkerImages(application, field); + field.SetProperty( Actor::Property::KEYBOARD_FOCUSABLE,true); + KeyboardFocusManager::Get().SetCurrentFocusActor( field ); - // Render and notify application.SendNotification(); application.Render(); - // Tap first to get the focus. - TestGenerateTap( application, 3.0f, 25.0f ); + previousHeight = field.GetHeightForWidth( fieldWidth ); + DALI_TEST_EQUALS( previousHeight, field.GetProperty( Actor::Property::SIZE_HEIGHT ) , TEST_LOCATION ); + + // Add another script characters ( glyph height is defferent ) + application.ProcessEvent( GenerateKey( "ㅁ", "", "ㅁ", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "ㅁ", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.ProcessEvent( GenerateKey( "ㅁ", "", "ㅁ", KEY_A_CODE, 0, 0, Integration::KeyEvent::UP, "ㅁ", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - // Render and notify application.SendNotification(); application.Render(); - // Double tap to select a word. - TestGenerateTap( application, 3.0f, 25.0f ); + currentHeight = field.GetHeightForWidth( fieldWidth ); + DALI_TEST_EQUALS( currentHeight, field.GetProperty( Actor::Property::SIZE_HEIGHT ), TEST_LOCATION ); + DALI_TEST_EQUALS( (previousHeight < currentHeight), true , TEST_LOCATION ); - // Render and notify - application.SendNotification(); - application.Render(); + END_TEST; +} - // The offscreen root actor should have two actors: the renderer and the highlight actor. - Actor stencil = field.GetChildAt( 0u ); +int utcDaliTextFieldExtremlyLargePointSize(void) +{ + ToolkitTestApplication application; + tet_infoline(" utcDaliTextFieldExtremlyLargePointSize"); - // The highlight actor is drawn first, so is the first actor in the list - Renderer highlight = stencil.GetChildAt( 0u ).GetRendererAt( 0u ); - DALI_TEST_CHECK( highlight ); + TextField field = TextField::New(); - // The offscreen root actor has a container with all the actors which contain the text renderers. - Actor container = stencil.GetChildAt( 1u ); - for( unsigned int index = 0; index < container.GetChildCount(); ++index ) + field.SetProperty( TextField::Property::TEXT, "Text" ); + field.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); + field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); + field.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); + application.GetScene().Add( field ); + + try { - Renderer renderer = container.GetChildAt( index ).GetRendererAt( 0u ); - DALI_TEST_CHECK( renderer ); + field.SetProperty( TextField::Property::POINT_SIZE, 160.0f ); + application.SendNotification(); + DALI_TEST_CHECK( field ); + } + catch (...) + { + tet_result(TET_FAIL); } - END_TEST; } -int utcDaliTextFieldEvent04(void) +int UtcDaliTextFieldDefaultFontStylePropertyCoverage(void) { ToolkitTestApplication application; - tet_infoline(" utcDaliTextFieldEvent04"); + tet_infoline("UtcDaliTextFieldFontStylePorpertyCoverage"); + TextField field = TextField::New(); + DALI_TEST_CHECK( field ); + application.GetScene().Add( field ); - // Checks if the highlight actor is created. + Property::Map fontStyleMapGet; + + fontStyleMapGet = field.GetProperty( TextField::Property::FONT_STYLE ); + + Property::Value* weightValue = NULL; + Property::Value* widthValue = NULL; + Property::Value* slantValue = NULL; + weightValue = fontStyleMapGet.Find( "weight" ); + widthValue = fontStyleMapGet.Find( "width" ); + slantValue = fontStyleMapGet.Find( "slant" ); + DALI_TEST_CHECK( !weightValue ); + DALI_TEST_CHECK( !widthValue ); + DALI_TEST_CHECK( !slantValue ); + + END_TEST; +} + +int UtcDaliTextFieldSettingPlaceholder(void) +{ + ToolkitTestApplication application; + tet_infoline("UtcDaliTextFieldSettingPlaceholder"); TextField field = TextField::New(); DALI_TEST_CHECK( field ); application.GetScene().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.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); - field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); - field.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); + // Check the placeholder property with pixel size + Property::Map placeholderPixelSizeMapSet; + Property::Map placeholderPixelSizeMapGet; + Property::Map placeholderFontstyleMap; + placeholderPixelSizeMapSet[ Text::PlaceHolder::Property::TEXT ] = "Setting Placeholder Text"; + placeholderPixelSizeMapSet[ Text::PlaceHolder::Property::TEXT_FOCUSED ] = "Setting Placeholder Text Focused"; + placeholderPixelSizeMapSet[ Text::PlaceHolder::Property::COLOR ] = Color::BLUE; + placeholderPixelSizeMapSet[ Text::PlaceHolder::Property::FONT_FAMILY ] = "Arial"; + placeholderPixelSizeMapSet[ Text::PlaceHolder::Property::PIXEL_SIZE ] = 15.0f; + placeholderPixelSizeMapSet[ Text::PlaceHolder::Property::ELLIPSIS ] = true; - // Avoid a crash when core load gl resources. - application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); - // Render and notify - application.SendNotification(); - application.Render(); + placeholderFontstyleMap.Insert( "weight", "bold" ); + placeholderPixelSizeMapSet[ Text::PlaceHolder::Property::FONT_STYLE ] = placeholderFontstyleMap; + field.SetProperty( TextField::Property::PLACEHOLDER, placeholderPixelSizeMapSet ); - // Create a tap event to touch the text field. - TestGenerateTap( application, 150.0f, 25.0f ); - // Render and notify - application.SendNotification(); - application.Render(); + placeholderPixelSizeMapGet = field.GetProperty( TextField::Property::PLACEHOLDER ); + DALI_TEST_EQUALS( placeholderPixelSizeMapGet.Count(), placeholderPixelSizeMapSet.Count(), TEST_LOCATION ); + DALI_TEST_EQUALS( DaliTestCheckMaps( placeholderPixelSizeMapGet, placeholderPixelSizeMapSet ), true, TEST_LOCATION ); + + // Check the placeholder property with point size + Property::Map placeholderMapSet; + Property::Map placeholderMapGet; + placeholderMapSet[ Text::PlaceHolder::Property::TEXT ] = "Setting Placeholder Text"; + placeholderMapSet[ Text::PlaceHolder::Property::TEXT_FOCUSED ] = "Setting Placeholder Text Focused"; + placeholderMapSet[ Text::PlaceHolder::Property::COLOR ] = Color::RED; + placeholderMapSet[ Text::PlaceHolder::Property::FONT_FAMILY ] = "Arial"; + placeholderMapSet[ Text::PlaceHolder::Property::POINT_SIZE ] = 12.0f; + placeholderMapSet[ Text::PlaceHolder::Property::ELLIPSIS ] = false; + // Check the placeholder font style property + placeholderFontstyleMap.Clear(); - // Tap first to get the focus. - TestGenerateTap( application, 1.0f, 25.0f ); + placeholderFontstyleMap.Insert( "weight", "bold" ); + placeholderFontstyleMap.Insert( "width", "condensed" ); + placeholderFontstyleMap.Insert( "slant", "italic" ); + placeholderMapSet[ Text::PlaceHolder::Property::FONT_STYLE ] = placeholderFontstyleMap; + field.SetProperty( TextField::Property::PLACEHOLDER, placeholderMapSet ); - // Render and notify - application.SendNotification(); - application.Render(); + placeholderMapGet = field.GetProperty( TextField::Property::PLACEHOLDER ); + DALI_TEST_EQUALS( placeholderMapGet.Count(), placeholderMapSet.Count(), TEST_LOCATION ); + DALI_TEST_EQUALS( DaliTestCheckMaps( placeholderMapGet, placeholderMapSet ), true, TEST_LOCATION ); - // Double tap to select a word. - TestGenerateTap( application, 1.0f, 25.0f ); + // Reset font style. + placeholderFontstyleMap.Clear(); + placeholderFontstyleMap.Insert( "weight", "normal" ); + placeholderFontstyleMap.Insert( "slant", "oblique" ); + placeholderMapSet[ Text::PlaceHolder::Property::FONT_STYLE ] = placeholderFontstyleMap; + field.SetProperty( TextField::Property::PLACEHOLDER, placeholderMapSet ); - // Render and notify - application.SendNotification(); - application.Render(); + placeholderMapGet = field.GetProperty( TextField::Property::PLACEHOLDER ); + DALI_TEST_EQUALS( placeholderMapGet.Count(), placeholderMapSet.Count(), TEST_LOCATION ); + DALI_TEST_EQUALS( DaliTestCheckMaps( placeholderMapGet, placeholderMapSet ), true, TEST_LOCATION ); + + placeholderFontstyleMap.Clear(); + placeholderFontstyleMap.Insert( "slant", "roman" ); + placeholderMapSet[ Text::PlaceHolder::Property::FONT_STYLE ] = placeholderFontstyleMap; + field.SetProperty( TextField::Property::PLACEHOLDER, placeholderMapSet ); + + placeholderMapGet = field.GetProperty( TextField::Property::PLACEHOLDER ); + + placeholderFontstyleMap.Clear(); + placeholderMapSet[ Text::PlaceHolder::Property::FONT_STYLE ] = placeholderFontstyleMap; + + field.SetProperty( TextField::Property::PLACEHOLDER, placeholderMapSet ); + placeholderMapGet = field.GetProperty( TextField::Property::PLACEHOLDER ); + DALI_TEST_EQUALS( placeholderMapGet.Count(), placeholderMapSet.Count(), TEST_LOCATION ); + DALI_TEST_EQUALS( DaliTestCheckMaps( placeholderMapGet, placeholderMapSet ), true, TEST_LOCATION ); - // Tap grab handle - TestGenerateTap( application, 0.0f, 40.0f ); END_TEST; } -int utcDaliTextFieldEvent05(void) +int UtcDaliTextFieldPlaceholderCoverage(void) { ToolkitTestApplication application; - tet_infoline(" utcDaliTextFieldEvent05"); + tet_infoline("UtcDaliTextFieldPlaceholderCoverage"); + + // mPlaceholderFont is created only once, so create a new control for coverage. + TextField fieldForCoverage = TextField::New(); + DALI_TEST_CHECK(fieldForCoverage); + application.GetScene().Add(fieldForCoverage); + + // for SetPlaceholderFontFamily() coverage. + Property::Map fontFamilyMap; + fontFamilyMap[Text::PlaceHolder::Property::FONT_FAMILY] = "Arial"; + fieldForCoverage.SetProperty(TextField::Property::PLACEHOLDER, fontFamilyMap); + + // mPlaceholderFont is created only once, so create a new control for coverage. + fieldForCoverage = TextField::New(); + DALI_TEST_CHECK(fieldForCoverage); + application.GetScene().Add(fieldForCoverage); + + // for SetPlaceholderTextFontSize coverage. + Property::Map fontSizeMap; + fontSizeMap[Text::PlaceHolder::Property::PIXEL_SIZE] = 15.0f; + fieldForCoverage.SetProperty(TextField::Property::PLACEHOLDER, fontSizeMap); + + // mPlaceholderFont is created only once, so create a new control for coverage. + fieldForCoverage = TextField::New(); + DALI_TEST_CHECK(fieldForCoverage); + application.GetScene().Add(fieldForCoverage); + + // for SetPlaceholderTextFontWeight coverage. + Property::Map fontStyleWeightMap; + Property::Map fontStyleWeightPropertyMap; + fontStyleWeightPropertyMap.Insert("weight", "bold"); + fontStyleWeightMap[Text::PlaceHolder::Property::FONT_STYLE] = fontStyleWeightPropertyMap; + fieldForCoverage.SetProperty(TextField::Property::PLACEHOLDER, fontStyleWeightMap); + + // mPlaceholderFont is created only once, so create a new control for coverage. + fieldForCoverage = TextField::New(); + DALI_TEST_CHECK(fieldForCoverage); + application.GetScene().Add(fieldForCoverage); + + // for SetPlaceholderTextFontWidth coverage. + Property::Map fontStyleWidthMap; + Property::Map fontStyleWidthPropertyMap; + fontStyleWidthPropertyMap.Insert("width", "expanded"); + fontStyleWidthMap[Text::PlaceHolder::Property::FONT_STYLE] = fontStyleWidthPropertyMap; + fieldForCoverage.SetProperty(TextField::Property::PLACEHOLDER, fontStyleWidthMap); + + // mPlaceholderFont is created only once, so create a new control for coverage. + fieldForCoverage = TextField::New(); + DALI_TEST_CHECK(fieldForCoverage); + application.GetScene().Add(fieldForCoverage); + + // for SetPlaceholderTextFontSlant coverage. + Property::Map fontStyleSlantMap; + Property::Map fontStyleSlantPropertyMap; + fontStyleSlantPropertyMap.Insert("slant", "italic"); + fontStyleSlantMap[Text::PlaceHolder::Property::FONT_STYLE] = fontStyleSlantPropertyMap; + fieldForCoverage.SetProperty(TextField::Property::PLACEHOLDER, fontStyleSlantMap); - // Checks dragging of cursor/grab handle + END_TEST; +} + +int UtcDaliTextFieldSetPaddingProperty(void) +{ + ToolkitTestApplication application; + tet_infoline("UtcDaliTextFieldSetPaddingProperty\n"); TextField field = TextField::New(); DALI_TEST_CHECK( field ); - application.GetScene().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.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); field.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); + application.GetScene().Add( field ); - // 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. - TestGenerateTap( application, 150.0f, 25.0f ); - // Render and notify - application.SendNotification(); - application.Render(); + Vector3 originalSize = field.GetNaturalSize(); - // Tap first to get the focus. - TestGenerateTap( application, 1.0f, 25.0f ); + field.SetProperty( Toolkit::Control::Property::PADDING, Extents( 10, 10, 10, 10 ) ); - // Render and notify application.SendNotification(); application.Render(); - // Double tap to select a word. - TestGenerateTap( application, 1.0f, 25.0f ); + DALI_TEST_EQUALS( field.GetProperty( Toolkit::Control::Property::PADDING ), Extents( 10, 10, 10, 10 ), TEST_LOCATION ); - // Render and notify - application.SendNotification(); - application.Render(); + Vector3 paddingAddedSize = field.GetNaturalSize(); + + DALI_TEST_EQUALS( originalSize.width + 10 + 10 , paddingAddedSize.width, Math::MACHINE_EPSILON_1000, TEST_LOCATION ); + + DALI_TEST_EQUALS( originalSize.height + 10 + 10 , paddingAddedSize.height, Math::MACHINE_EPSILON_1000, TEST_LOCATION ); - Actor stencil = field.GetChildAt( 1u ); END_TEST; } -int utcDaliTextFieldEvent06(void) +int UtcDaliTextFieldEnableShiftSelectionProperty(void) { ToolkitTestApplication application; - tet_infoline(" utcDaliTextFieldEvent06"); - - // Checks Longpress when in edit mode + tet_infoline("UtcDaliTextFieldEnableShiftSelectionProperty"); TextField field = TextField::New(); DALI_TEST_CHECK( field ); - application.GetScene().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.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); field.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); + application.GetScene().Add( field ); - // 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. - TestGenerateTap( application, 150.0f, 25.0f ); - // Render and notify application.SendNotification(); application.Render(); + // The default value of ENABLE_SHIFT_SELECTION is 'true'. + DALI_TEST_EQUALS( field.GetProperty( DevelTextField::Property::ENABLE_SHIFT_SELECTION ), true, TEST_LOCATION ); - // Tap first to get the focus. - TestGenerateTap( application, 1.0f, 25.0f ); - - // Render and notify - application.SendNotification(); - application.Render(); - - // Long Press - TestGenerateLongPress(application, 1.0f, 25.0f); + // Check the enable shift selection property + field.SetProperty( DevelTextField::Property::ENABLE_SHIFT_SELECTION, false ); + DALI_TEST_EQUALS( field.GetProperty( DevelTextField::Property::ENABLE_SHIFT_SELECTION ), false, TEST_LOCATION ); - // Render and notify application.SendNotification(); application.Render(); END_TEST; } -int utcDaliTextFieldEvent07(void) +int UtcDaliTextFieldEnableGrabHandleProperty(void) { ToolkitTestApplication application; - tet_infoline(" utcDaliTextFieldEvent07"); - - // Checks Longpress to start edit mode + tet_infoline("UtcDaliTextFieldEnableGrabHandleProperty"); TextField field = TextField::New(); DALI_TEST_CHECK( field ); - application.GetScene().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.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); field.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); - Property::Map propertyMap; - propertyMap["PANEL_LAYOUT"] = InputMethod::PanelLayout::PASSWORD; - field.SetProperty( TextField::Property::INPUT_METHOD_SETTINGS, propertyMap ); + application.GetScene().Add( field ); - // Avoid a crash when core load gl resources. - application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); - // Render and notify application.SendNotification(); application.Render(); - // Long Press - TestGenerateLongPress(application, 1.0f, 25.0f); + // The default value of ENABLE_GRAB_HANDLE is 'true'. + DALI_TEST_EQUALS( field.GetProperty( DevelTextField::Property::ENABLE_GRAB_HANDLE ), true, TEST_LOCATION ); + + // Check the enable grab handle property + field.SetProperty( DevelTextField::Property::ENABLE_GRAB_HANDLE, false ); + DALI_TEST_EQUALS( field.GetProperty( DevelTextField::Property::ENABLE_GRAB_HANDLE ), false, TEST_LOCATION ); - // Render and notify application.SendNotification(); application.Render(); END_TEST; } -int utcDaliTextFieldEvent08(void) +int UtcDaliTextFieldMatchSystemLanguageDirectionProperty(void) { ToolkitTestApplication application; - tet_infoline(" utcDaliTextFieldEvent08"); - - Dali::Clipboard clipboard = Clipboard::Get(); - clipboard.SetItem("testTextFieldEvent"); - - // Checks Longpress when only place holder text + tet_infoline("UtcDaliTextFieldMatchSystemLanguageDirectionProperty"); TextField field = TextField::New(); DALI_TEST_CHECK( field ); - application.GetScene().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.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); field.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); + application.GetScene().Add( field ); - // Avoid a crash when core load gl resources. - application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); - // Render and notify - application.SendNotification(); - application.Render(); - - // Long Press - TestGenerateLongPress( application, 1.0f, 25.0f, 20 ); - - // Render and notify application.SendNotification(); application.Render(); - Wait(application, 500); - - TestEndLongPress( application, 1.0f, 25.0f, 520 ); + // The default value of MATCH_SYSTEM_LANGUAGE_DIRECTION is 'true'. + DALI_TEST_EQUALS( field.GetProperty( DevelTextField::Property::MATCH_SYSTEM_LANGUAGE_DIRECTION ), true, TEST_LOCATION ); - // Long Press - TestGenerateLongPress( application, 1.0f, 25.0f, 600 ); + // Check the match system language direction property + field.SetProperty( DevelTextField::Property::MATCH_SYSTEM_LANGUAGE_DIRECTION, false ); + DALI_TEST_EQUALS( field.GetProperty( DevelTextField::Property::MATCH_SYSTEM_LANGUAGE_DIRECTION ), false, TEST_LOCATION ); - // Render and notify + application.SendNotification(); application.Render(); - Wait(application, 500); - - Integration::Scene stage = application.GetScene(); - Layer layer = stage.GetRootLayer(); - Actor actor = layer.FindChildByName("optionPaste"); - - if (actor) - { - Vector3 worldPosition = actor.GetCurrentProperty< Vector3 >( Actor::Property::WORLD_POSITION ); - 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 utcDaliTextFieldEvent09(void) +int utcDaliTextFieldLayoutDirectionCoverage(void) { ToolkitTestApplication application; - tet_infoline(" utcDaliTextFieldEvent09"); + tet_infoline(" utcDaliTextFieldLayoutDirectionCoverage"); + // 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 ); + application.GetScene().Add( field ); - LoadMarkerImages(application, field); - // Render and notify - application.SendNotification(); - application.Render(); - field.SetProperty( TextField::Property::TEXT, "Hello" ); - field.SetProperty( TextField::Property::POINT_SIZE, 10.f ); field.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); field.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); @@ -2146,639 +3453,582 @@ int utcDaliTextFieldEvent09(void) // Avoid a crash when core load gl resources. application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); - // Create a tap event to touch the text field. - TestGenerateTap( application, 150.0f, 25.0f ); - application.SendNotification(); - application.Render(); - - Property::Map map; - map[ HiddenInput::Property::MODE ] = HiddenInput::Mode::HIDE_NONE; - field.SetProperty( TextField::Property::HIDDEN_INPUT_SETTINGS, map ); - application.ProcessEvent( GenerateKey( "d", "", "d", 0, 0, 0, Integration::KeyEvent::DOWN, "d", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - application.SendNotification(); - application.Render(); - - map[ HiddenInput::Property::MODE ] = HiddenInput::Mode::HIDE_ALL; - map[ HiddenInput::Property::SUBSTITUTE_CHARACTER ] = 0x23; - field.SetProperty( TextField::Property::HIDDEN_INPUT_SETTINGS, map ); - application.ProcessEvent( GenerateKey( "d", "", "d", 0, 0, 0, Integration::KeyEvent::DOWN, "d", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + // Render and notify application.SendNotification(); application.Render(); - map[ HiddenInput::Property::MODE ] = HiddenInput::Mode::HIDE_COUNT; - map[ HiddenInput::Property::SUBSTITUTE_COUNT ] = 2; - field.SetProperty( TextField::Property::HIDDEN_INPUT_SETTINGS, map ); - for( unsigned int index = 0u; index < 5u; ++index ) - { - application.ProcessEvent( GenerateKey( "d", "", "d", 0, 0, 0, Integration::KeyEvent::DOWN, "d", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - application.SendNotification(); - application.Render(); - } - - map[ HiddenInput::Property::MODE ] = HiddenInput::Mode::SHOW_COUNT; - map[ HiddenInput::Property::SUBSTITUTE_COUNT ] = 2; - field.SetProperty( TextField::Property::HIDDEN_INPUT_SETTINGS, map ); - for( unsigned int index = 0u; index < 5u; ++index ) - { - application.ProcessEvent( GenerateKey( "d", "", "d", 0, 0, 0, Integration::KeyEvent::DOWN, "d", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - application.SendNotification(); - application.Render(); - } + // init direction for coverage + // Set horizontal alignment END + field.SetProperty( TextField::Property::HORIZONTAL_ALIGNMENT, "END"); - map[ HiddenInput::Property::MODE ] = HiddenInput::Mode::SHOW_LAST_CHARACTER; - map[ HiddenInput::Property::SHOW_LAST_CHARACTER_DURATION ] = 0; - field.SetProperty( TextField::Property::HIDDEN_INPUT_SETTINGS, map ); - application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - application.SendNotification(); - application.Render(); - application.ProcessEvent( GenerateKey( "d", "", "d", 0, 0, 0, Integration::KeyEvent::DOWN, "d", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - application.SendNotification(); - application.Render(); + // Create a tap event to touch the text field. + TestGenerateTap( application, 150.0f, 25.0f ); - map[ HiddenInput::Property::SHOW_LAST_CHARACTER_DURATION ] = 100; - field.SetProperty( TextField::Property::HIDDEN_INPUT_SETTINGS, map ); - application.ProcessEvent( GenerateKey( "d", "", "d", 0, 0, 0, Integration::KeyEvent::DOWN, "d", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + // Render and notify application.SendNotification(); application.Render(); - Property::Map mapGet; - mapGet = field.GetProperty( TextField::Property::HIDDEN_INPUT_SETTINGS ); - DALI_TEST_EQUALS( map.Count(), mapGet.Count(), TEST_LOCATION ); - DALI_TEST_EQUALS( DaliTestCheckMaps( map, mapGet ), true, TEST_LOCATION ); - END_TEST; -} - - -int utcDaliTextFieldStyleWhilstSelected(void) -{ - ToolkitTestApplication application; - tet_infoline(" utcDaliTextFieldStyleWhilstSelected"); - - // Change font and styles whilst text is selected whilst word selected + // Set MATCH_SYSTEM_LANGUAGE_DIRECTION to true to use the layout direction. + field.SetProperty( DevelTextField::Property::MATCH_SYSTEM_LANGUAGE_DIRECTION, true ); + field.SetProperty( Actor::Property::LAYOUT_DIRECTION, LayoutDirection::RIGHT_TO_LEFT ); - TextField field = TextField::New(); - DALI_TEST_CHECK( field ); - application.GetScene().Add( field ); - LoadMarkerImages(application, field); - // Render and notify - application.SendNotification(); - application.Render(); + // Set horizontal alignment BEGIN + field.SetProperty( TextField::Property::HORIZONTAL_ALIGNMENT, "BEGIN"); - 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.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); - field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); - field.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); + // Create a tap event to touch the text field. + TestGenerateTap( application, 150.0f, 25.0f ); - // Avoid a crash when core load gl resources. - application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); // Render and notify application.SendNotification(); application.Render(); + // Set horizontal alignment CENTER + field.SetProperty( TextField::Property::HORIZONTAL_ALIGNMENT, "CENTER"); + // Create a tap event to touch the text field. TestGenerateTap( application, 150.0f, 25.0f ); + // Render and notify application.SendNotification(); application.Render(); + // Set horizontal alignment END + field.SetProperty( TextField::Property::HORIZONTAL_ALIGNMENT, "END"); - // Tap first to get the focus. - TestGenerateTap( application, 1.0f, 25.0f ); + // Create a tap event to touch the text field. + TestGenerateTap( application, 150.0f, 25.0f ); // Render and notify application.SendNotification(); application.Render(); - // Double tap to select a word. - TestGenerateTap( application, 1.0f, 25.0f ); + // Generate a Esc key event. The text field should lose the focus. + application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_ESCAPE, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_ESCAPE, 0, 0, Integration::KeyEvent::UP, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); // 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 ); + DALI_TEST_EQUALS( false, field.HasKeyInputFocus(), TEST_LOCATION ); - Property::Map fontStyleMapSet; - Property::Map fontStyleMapGet; + END_TEST; +} - fontStyleMapSet.Insert( "weight", "bold" ); - fontStyleMapSet.Insert( "slant", "italic" ); - field.SetProperty( TextField::Property::INPUT_FONT_STYLE, fontStyleMapSet ); +int UtcDaliTextFieldGetInputMethodContext(void) +{ + ToolkitTestApplication application; + tet_infoline("UtcDaliTextFieldGetInputMethodContext"); - fontStyleMapGet = field.GetProperty( TextField::Property::INPUT_FONT_STYLE ); - DALI_TEST_EQUALS( fontStyleMapGet.Count(), fontStyleMapSet.Count(), TEST_LOCATION ); - DALI_TEST_EQUALS( DaliTestCheckMaps( fontStyleMapGet, fontStyleMapSet ), true, TEST_LOCATION ); + TextField field = TextField::New(); + DALI_TEST_CHECK( DevelTextField::GetInputMethodContext( field ) ); - fontStyleMapSet.Clear(); - fontStyleMapSet.Insert( "width", "expanded" ); - fontStyleMapSet.Insert( "slant", "italic" ); - field.SetProperty( TextField::Property::INPUT_FONT_STYLE, fontStyleMapSet ); + END_TEST; +} - fontStyleMapGet = field.GetProperty( TextField::Property::INPUT_FONT_STYLE ); - DALI_TEST_EQUALS( fontStyleMapGet.Count(), fontStyleMapSet.Count(), TEST_LOCATION ); - DALI_TEST_EQUALS( DaliTestCheckMaps( fontStyleMapGet, fontStyleMapSet ), true, TEST_LOCATION ); +int UtcDaliTextFieldSelectWholeText(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliTextFieldSelectWholeText "); - 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 ); + TextField textField = TextField::New(); - field.SetProperty( TextField::Property::TEXT_COLOR, Color::RED ); - DALI_TEST_EQUALS( field.GetProperty( TextField::Property::TEXT_COLOR ), Color::RED, TEST_LOCATION ); + application.GetScene().Add( textField ); - fontStyleMapSet.Clear(); - fontStyleMapSet.Insert( "weight", "bold" ); - fontStyleMapSet.Insert( "slant", "italic" ); + textField.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); + textField.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); + textField.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); - field.SetProperty( TextField::Property::FONT_STYLE, fontStyleMapSet ); + // Avoid a crash when core load gl resources. + application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); - fontStyleMapGet = field.GetProperty( TextField::Property::FONT_STYLE ); - DALI_TEST_EQUALS( fontStyleMapGet.Count(), fontStyleMapSet.Count(), TEST_LOCATION ); - DALI_TEST_EQUALS( DaliTestCheckMaps( fontStyleMapGet, fontStyleMapSet ), true, TEST_LOCATION ); + application.SendNotification(); + application.Render(); - fontStyleMapSet.Clear(); - fontStyleMapSet.Insert( "width", "expanded" ); + DALI_TEST_EQUALS( 1u, textField.GetChildCount(), TEST_LOCATION ); - field.SetProperty( TextField::Property::FONT_STYLE, fontStyleMapSet ); + DevelTextField::SelectWholeText( textField ); - fontStyleMapGet = field.GetProperty( TextField::Property::FONT_STYLE ); - DALI_TEST_EQUALS( fontStyleMapGet.Count(), fontStyleMapSet.Count(), TEST_LOCATION ); - DALI_TEST_EQUALS( DaliTestCheckMaps( fontStyleMapGet, fontStyleMapSet ), true, TEST_LOCATION ); + application.SendNotification(); + application.Render(); + + // Nothing should have been selected. The number of children is still 1 + DALI_TEST_EQUALS( 1u, textField.GetChildCount(), TEST_LOCATION ); + + textField.SetProperty( TextField::Property::TEXT, "Hello world" ); - // Press Escape to increase coverage - application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_ESCAPE, 0, 0, Integration::KeyEvent::UP, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); application.SendNotification(); application.Render(); - DALI_TEST_CHECK( !field.HasKeyInputFocus() ); + DevelTextField::SelectWholeText( textField ); + + application.SendNotification(); + application.Render(); + + // Should be 2 children, the stencil and the layer + DALI_TEST_EQUALS( 2u, textField.GetChildCount(), TEST_LOCATION ); + + // The offscreen root actor should have two actors: the renderer and the highlight actor. + Actor stencil = textField.GetChildAt( 0u ); + + // The highlight actor is drawn first, so is the first actor in the list + Renderer highlight = stencil.GetChildAt( 0u ).GetRendererAt( 0u ); + DALI_TEST_CHECK( highlight ); END_TEST; } -int utcDaliTextFieldEscKeyLoseFocus(void) +int UtcDaliTextFieldSelectText(void) { ToolkitTestApplication application; - tet_infoline(" utcDaliTextFieldEscKeyLoseFocus"); - - // 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. + tet_infoline(" UtcDaliTextFieldSelectText "); - TextField field = TextField::New(); - DALI_TEST_CHECK( field ); + TextField textField = TextField::New(); - application.GetScene().Add( field ); + application.GetScene().Add( textField ); - field.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); - field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); - field.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); + textField.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); + textField.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); + textField.SetProperty( Actor::Property::ANCHOR_POINT, 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", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - application.ProcessEvent( GenerateKey( "a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::UP, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + DevelTextField::SelectText( textField, 0, 5 ); - // Render and notify application.SendNotification(); application.Render(); - DALI_TEST_EQUALS( field.GetProperty( TextField::Property::TEXT ), std::string(""), TEST_LOCATION ); + // Nothing is selected + std::string selectedText = textField.GetProperty( DevelTextField::Property::SELECTED_TEXT ).Get(); + DALI_TEST_EQUALS( "", selectedText, TEST_LOCATION ); - // Create a tap event to touch the text field. - TestGenerateTap( application, 150.0f, 25.0f ); + textField.SetProperty( TextField::Property::TEXT, "Hello world" ); - // 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", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - application.ProcessEvent( GenerateKey( "a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::UP, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - application.ProcessEvent( GenerateKey( "d", "", "d", KEY_D_CODE, 0, 0, Integration::KeyEvent::DOWN, "d", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - application.ProcessEvent( GenerateKey( "d", "", "d", KEY_D_CODE, 0, 0, Integration::KeyEvent::UP, "d", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + // Hello is selected + DevelTextField::SelectText( textField, 0, 5 ); - // Render and notify application.SendNotification(); application.Render(); - DALI_TEST_EQUALS( field.GetProperty( TextField::Property::TEXT ), std::string("ad"), TEST_LOCATION ); - - // Generate a Esc key event. The text field should lose the focus. - application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_ESCAPE, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_ESCAPE, 0, 0, Integration::KeyEvent::UP, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - - // Render and notify - application.SendNotification(); - application.Render(); + selectedText = textField.GetProperty( DevelTextField::Property::SELECTED_TEXT ).Get(); + DALI_TEST_EQUALS( "Hello", selectedText, TEST_LOCATION ); - DALI_TEST_EQUALS( false, field.HasKeyInputFocus(), TEST_LOCATION ); + DALI_TEST_EQUALS( textField.GetProperty( DevelTextField::Property::SELECTED_TEXT_START ).Get(), 0, TEST_LOCATION ); + DALI_TEST_EQUALS( textField.GetProperty( DevelTextField::Property::SELECTED_TEXT_END ).Get(), 5, TEST_LOCATION ); - // No more text should be introduced - application.ProcessEvent( GenerateKey( "a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - application.ProcessEvent( GenerateKey( "a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::UP, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + // world is selected + DevelTextField::SelectText( textField, 6, 11 ); - // Render and notify application.SendNotification(); application.Render(); - DALI_TEST_EQUALS( field.GetProperty( TextField::Property::TEXT ), std::string("ad"), TEST_LOCATION ); + selectedText = textField.GetProperty( DevelTextField::Property::SELECTED_TEXT ).Get(); + DALI_TEST_EQUALS( "world", selectedText, TEST_LOCATION ); + + DALI_TEST_EQUALS( textField.GetProperty( DevelTextField::Property::SELECTED_TEXT_START ).Get(), 6, TEST_LOCATION ); + DALI_TEST_EQUALS( textField.GetProperty( DevelTextField::Property::SELECTED_TEXT_END ).Get(), 11, TEST_LOCATION ); END_TEST; } -int utcDaliTextFieldSomeSpecialKeys(void) +int UtcDaliTextFieldSelectNone(void) { ToolkitTestApplication application; - tet_infoline(" utcDaliTextFieldSomeSpecialKeys"); - - // Checks some special keys when the text is selected. + tet_infoline(" UtcDaliTextFieldSelectWholeText "); - TextField field = TextField::New(); - DALI_TEST_CHECK( field ); - application.GetScene().Add( field ); - LoadMarkerImages(application, field); - // Render and notify - application.SendNotification(); - application.Render(); + TextField textField = TextField::New(); - const std::string longText( "This is a long text for the size of the text-field." ); + application.GetScene().Add( textField ); - field.SetProperty( TextField::Property::TEXT, longText ); - field.SetProperty( TextField::Property::POINT_SIZE, 10.f ); - field.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); - field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); - field.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); + textField.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); + textField.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); + textField.SetProperty( Actor::Property::ANCHOR_POINT, 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. - TestGenerateTap( application, 150.0f, 25.0f ); + textField.SetProperty( TextField::Property::TEXT, "Hello world" ); - // Render and notify application.SendNotification(); application.Render(); - // Tap first to get the focus. - TestGenerateTap( application, 1.0f, 25.0f ); + // Nothing is selected + std::string selectedText = textField.GetProperty( DevelTextField::Property::SELECTED_TEXT ).Get(); + DALI_TEST_EQUALS( "", selectedText, TEST_LOCATION ); + + DevelTextField::SelectWholeText( textField ); - // Render and notify application.SendNotification(); application.Render(); - // Double tap to select a word. - TestGenerateTap( application, 1.0f, 25.0f ); + // whole text is selected + selectedText = textField.GetProperty( DevelTextField::Property::SELECTED_TEXT ).Get(); + DALI_TEST_EQUALS( "Hello world", selectedText, TEST_LOCATION ); + + DevelTextField::SelectNone( textField ); - // Render and notify application.SendNotification(); application.Render(); - // Generate a Esc key event. The text field should lose the focus. - application.ProcessEvent( GenerateKey( "XF86PowerOff", "", "XF86PowerOff", DALI_KEY_POWER, 0, 0, Integration::KeyEvent::DOWN, "XF86PowerOff", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - application.ProcessEvent( GenerateKey( "XF86PowerOff", "", "XF86PowerOff", DALI_KEY_POWER, 0, 0, Integration::KeyEvent::UP, "XF86PowerOff", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + // Nothing is selected + selectedText = textField.GetProperty( DevelTextField::Property::SELECTED_TEXT ).Get(); + DALI_TEST_EQUALS( "", selectedText, TEST_LOCATION ); + + END_TEST; +} + +int UtcDaliTextFieldSelectRange(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliTextFieldSelectRange "); + + TextField textField = TextField::New(); + + application.GetScene().Add( textField ); + + textField.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); + textField.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); + textField.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); + + // Avoid a crash when core load gl resources. + application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); - // Render and notify application.SendNotification(); application.Render(); - // Generate a Esc key event. The text field should lose the focus. - application.ProcessEvent( GenerateKey( "XF86Menu", "", "XF86Menu", DALI_KEY_MENU, 0, 0, Integration::KeyEvent::DOWN, "XF86Menu", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - application.ProcessEvent( GenerateKey( "XF86Menu", "", "XF86Menu", DALI_KEY_MENU, 0, 0, Integration::KeyEvent::UP, "XF86Menu", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + textField.SetProperty( TextField::Property::TEXT, "Hello world" ); + + application.SendNotification(); + application.Render(); + + textField.SetProperty( DevelTextField::Property::SELECTED_TEXT_START , 0); + textField.SetProperty( DevelTextField::Property::SELECTED_TEXT_END , 5); + + // Hello is selected + std::string selectedText = textField.GetProperty( DevelTextField::Property::SELECTED_TEXT ).Get(); + DALI_TEST_EQUALS( "Hello", selectedText, TEST_LOCATION ); - // Render and notify - application.SendNotification(); - application.Render(); + DALI_TEST_EQUALS( textField.GetProperty( DevelTextField::Property::SELECTED_TEXT_START ).Get(), 0, TEST_LOCATION ); + DALI_TEST_EQUALS( textField.GetProperty( DevelTextField::Property::SELECTED_TEXT_END ).Get(), 5, TEST_LOCATION ); - // Generate a Esc key event. The text field should lose the focus. - application.ProcessEvent( GenerateKey( "XF86Home", "", "XF86Home", DALI_KEY_HOME, 0, 0, Integration::KeyEvent::DOWN, "XF86Home", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - application.ProcessEvent( GenerateKey( "XF86Home", "", "XF86Home", DALI_KEY_HOME, 0, 0, Integration::KeyEvent::UP, "XF86Home", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + textField.SetProperty( DevelTextField::Property::SELECTED_TEXT_START , 6); + textField.SetProperty( DevelTextField::Property::SELECTED_TEXT_END , 11); - // Render and notify - application.SendNotification(); - application.Render(); + // world is selected + selectedText = textField.GetProperty( DevelTextField::Property::SELECTED_TEXT ).Get(); + DALI_TEST_EQUALS( "world", selectedText, TEST_LOCATION ); - // The text shouldn't be deleted. - DALI_TEST_EQUALS( field.GetProperty( TextField::Property::TEXT ), longText, TEST_LOCATION ); + DALI_TEST_EQUALS( textField.GetProperty( DevelTextField::Property::SELECTED_TEXT_START ).Get(), 6, TEST_LOCATION ); + DALI_TEST_EQUALS( textField.GetProperty( DevelTextField::Property::SELECTED_TEXT_END ).Get(), 11, TEST_LOCATION ); END_TEST; } -int utcDaliTextFieldSizeUpdate(void) +int UtcDaliTextFieldEnableEditing(void) { ToolkitTestApplication application; - tet_infoline("utcDaliTextFieldSizeUpdate"); + tet_infoline(" UtcDaliTextFieldEnableEditing "); - // Checks some special keys when the text is selected. - TextField field = TextField::New(); - DALI_TEST_CHECK( field ); - application.GetScene().Add( field ); + TextField textField = TextField::New(); - float previousHeight = 0.0f; - float currentHeight = 0.0f; - const float fieldWidth = 1920.0f; + application.GetScene().Add( textField ); + textField.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); + textField.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); + textField.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); - // "ㅁ" is bigger then "ኢ" - field.SetProperty( Actor::Property::SIZE, Vector2( fieldWidth ,10.0f ) ); - field.SetResizePolicy( ResizePolicy::FIXED , Dimension::WIDTH ); - field.SetResizePolicy( ResizePolicy::DIMENSION_DEPENDENCY , Dimension::HEIGHT ); + // Avoid a crash when core load gl resources. + application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); - field.SetProperty( TextField::Property::TEXT, "ኢ"); - field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); - field.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); + application.SendNotification(); + application.Render(); - field.SetProperty( Actor::Property::KEYBOARD_FOCUSABLE,true); - KeyboardFocusManager::Get().SetCurrentFocusActor( field ); + textField.SetKeyInputFocus(); + textField.SetProperty( DevelTextField::Property::ENABLE_EDITING, false ); + application.ProcessEvent( GenerateKey( "D", "", "D", KEY_D_CODE, 0, 0, Integration::KeyEvent::DOWN, "D", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + // Render and notify application.SendNotification(); application.Render(); - previousHeight = field.GetHeightForWidth( fieldWidth ); - DALI_TEST_EQUALS( previousHeight, field.GetProperty( Actor::Property::SIZE_HEIGHT ) , TEST_LOCATION ); + DALI_TEST_EQUALS( textField.GetProperty( TextField::Property::TEXT ).Get(), "", TEST_LOCATION ); + DALI_TEST_EQUALS( textField.GetProperty( DevelTextField::Property::ENABLE_EDITING ).Get(), false, TEST_LOCATION ); - // Add another script characters ( glyph height is defferent ) - application.ProcessEvent( GenerateKey( "ㅁ", "", "ㅁ", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "ㅁ", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - application.ProcessEvent( GenerateKey( "ㅁ", "", "ㅁ", KEY_A_CODE, 0, 0, Integration::KeyEvent::UP, "ㅁ", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + textField.SetKeyInputFocus(); + textField.SetProperty( DevelTextField::Property::ENABLE_EDITING, true ); + application.ProcessEvent( GenerateKey( "D", "", "D", KEY_D_CODE, 0, 0, Integration::KeyEvent::DOWN, "D", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + + // Render and notify application.SendNotification(); application.Render(); - currentHeight = field.GetHeightForWidth( fieldWidth ); - DALI_TEST_EQUALS( currentHeight, field.GetProperty( Actor::Property::SIZE_HEIGHT ), TEST_LOCATION ); - DALI_TEST_EQUALS( (previousHeight < currentHeight), true , TEST_LOCATION ); + DALI_TEST_EQUALS( textField.GetProperty( TextField::Property::TEXT ).Get(), "D", TEST_LOCATION ); + DALI_TEST_EQUALS( textField.GetProperty( DevelTextField::Property::ENABLE_EDITING ).Get(), true, TEST_LOCATION ); END_TEST; } -int utcDaliTextFieldExtremlyLargePointSize(void) +int UtcDaliToolkitTextFieldFontSizeScale(void) { ToolkitTestApplication application; - tet_infoline(" utcDaliTextFieldExtremlyLargePointSize"); + tet_infoline(" UtcDaliToolkitTextFieldFontSizeScale"); - TextField field = TextField::New(); - - field.SetProperty( TextField::Property::TEXT, "Text" ); - field.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); - field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); - field.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); - application.GetScene().Add( field ); + TextField textField = TextField::New(); + textField.SetProperty( TextField::Property::POINT_SIZE, 30.f ); + textField.SetProperty( TextField::Property::TEXT, "Test" ); + Vector3 nonScaledSize = textField.GetNaturalSize(); - try - { - field.SetProperty( TextField::Property::POINT_SIZE, 160.0f ); - application.SendNotification(); - DALI_TEST_CHECK( field ); - } - catch (...) - { - tet_result(TET_FAIL); - } - END_TEST; -} + TextField textFieldScaled = TextField::New(); + textFieldScaled.SetProperty( TextField::Property::POINT_SIZE, 15.f ); + textFieldScaled.SetProperty( Toolkit::DevelTextField::Property::FONT_SIZE_SCALE, 2.f ); + textFieldScaled.SetProperty( TextField::Property::TEXT, "Test" ); + Vector3 scaledSize = textFieldScaled.GetNaturalSize(); -int UtcDaliTextFieldDefaultFontStylePropertyCoverage(void) -{ - ToolkitTestApplication application; - tet_infoline("UtcDaliTextFieldFontStylePorpertyCoverage"); - TextField field = TextField::New(); - DALI_TEST_CHECK( field ); - application.GetScene().Add( field ); + DALI_TEST_EQUALS( nonScaledSize, scaledSize, TEST_LOCATION ); - Property::Map fontStyleMapGet; + textField.SetProperty( TextField::Property::PIXEL_SIZE, 30.f ); + textField.SetProperty( TextField::Property::TEXT, "Test" ); + nonScaledSize = textField.GetNaturalSize(); - fontStyleMapGet = field.GetProperty( TextField::Property::FONT_STYLE ); + textFieldScaled.SetProperty( TextField::Property::PIXEL_SIZE, 15.f ); + textFieldScaled.SetProperty( Toolkit::DevelTextField::Property::FONT_SIZE_SCALE, 2.f ); + textFieldScaled.SetProperty( TextField::Property::TEXT, "Test" ); + scaledSize = textFieldScaled.GetNaturalSize(); - Property::Value* weightValue = NULL; - Property::Value* widthValue = NULL; - Property::Value* slantValue = NULL; - weightValue = fontStyleMapGet.Find( "weight" ); - widthValue = fontStyleMapGet.Find( "width" ); - slantValue = fontStyleMapGet.Find( "slant" ); - DALI_TEST_CHECK( !weightValue ); - DALI_TEST_CHECK( !widthValue ); - DALI_TEST_CHECK( !slantValue ); + DALI_TEST_EQUALS( nonScaledSize, scaledSize, TEST_LOCATION ); END_TEST; } -int UtcDaliTextFieldSettingPlaceholder(void) +int UtcDaliTextFieldPrimaryCursorPosition(void) { ToolkitTestApplication application; - tet_infoline("UtcDaliTextFieldSettingPlaceholder"); - - TextField field = TextField::New(); - DALI_TEST_CHECK( field ); - application.GetScene().Add( field ); - - // Check the placeholder property with pixel size - Property::Map placeholderPixelSizeMapSet; - Property::Map placeholderPixelSizeMapGet; - Property::Map placeholderFontstyleMap; - placeholderPixelSizeMapSet[ Text::PlaceHolder::Property::TEXT ] = "Setting Placeholder Text"; - placeholderPixelSizeMapSet[ Text::PlaceHolder::Property::TEXT_FOCUSED ] = "Setting Placeholder Text Focused"; - placeholderPixelSizeMapSet[ Text::PlaceHolder::Property::COLOR ] = Color::BLUE; - placeholderPixelSizeMapSet[ Text::PlaceHolder::Property::FONT_FAMILY ] = "Arial"; - placeholderPixelSizeMapSet[ Text::PlaceHolder::Property::PIXEL_SIZE ] = 15.0f; - placeholderPixelSizeMapSet[ Text::PlaceHolder::Property::ELLIPSIS ] = true; - - placeholderFontstyleMap.Insert( "weight", "bold" ); - placeholderPixelSizeMapSet[ Text::PlaceHolder::Property::FONT_STYLE ] = placeholderFontstyleMap; - field.SetProperty( TextField::Property::PLACEHOLDER, placeholderPixelSizeMapSet ); - - placeholderPixelSizeMapGet = field.GetProperty( TextField::Property::PLACEHOLDER ); - DALI_TEST_EQUALS( placeholderPixelSizeMapGet.Count(), placeholderPixelSizeMapSet.Count(), TEST_LOCATION ); - DALI_TEST_EQUALS( DaliTestCheckMaps( placeholderPixelSizeMapGet, placeholderPixelSizeMapSet ), true, TEST_LOCATION ); - - // Check the placeholder property with point size - Property::Map placeholderMapSet; - Property::Map placeholderMapGet; - placeholderMapSet[ Text::PlaceHolder::Property::TEXT ] = "Setting Placeholder Text"; - placeholderMapSet[ Text::PlaceHolder::Property::TEXT_FOCUSED ] = "Setting Placeholder Text Focused"; - placeholderMapSet[ Text::PlaceHolder::Property::COLOR ] = Color::RED; - placeholderMapSet[ Text::PlaceHolder::Property::FONT_FAMILY ] = "Arial"; - placeholderMapSet[ Text::PlaceHolder::Property::POINT_SIZE ] = 12.0f; - placeholderMapSet[ Text::PlaceHolder::Property::ELLIPSIS ] = false; - - // Check the placeholder font style property - placeholderFontstyleMap.Clear(); + tet_infoline(" UtcDaliTextFieldPrimaryCursorPosition "); - placeholderFontstyleMap.Insert( "weight", "bold" ); - placeholderFontstyleMap.Insert( "width", "condensed" ); - placeholderFontstyleMap.Insert( "slant", "italic" ); - placeholderMapSet[ Text::PlaceHolder::Property::FONT_STYLE ] = placeholderFontstyleMap; - field.SetProperty( TextField::Property::PLACEHOLDER, placeholderMapSet ); + TextField textField = TextField::New(); - placeholderMapGet = field.GetProperty( TextField::Property::PLACEHOLDER ); - DALI_TEST_EQUALS( placeholderMapGet.Count(), placeholderMapSet.Count(), TEST_LOCATION ); - DALI_TEST_EQUALS( DaliTestCheckMaps( placeholderMapGet, placeholderMapSet ), true, TEST_LOCATION ); + application.GetScene().Add( textField ); - // Reset font style. - placeholderFontstyleMap.Clear(); - placeholderFontstyleMap.Insert( "weight", "normal" ); - placeholderFontstyleMap.Insert( "slant", "oblique" ); - placeholderMapSet[ Text::PlaceHolder::Property::FONT_STYLE ] = placeholderFontstyleMap; - field.SetProperty( TextField::Property::PLACEHOLDER, placeholderMapSet ); + textField.SetProperty( TextField::Property::TEXT, "ABCEF"); + textField.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); + textField.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); + textField.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); - placeholderMapGet = field.GetProperty( TextField::Property::PLACEHOLDER ); - DALI_TEST_EQUALS( placeholderMapGet.Count(), placeholderMapSet.Count(), TEST_LOCATION ); - DALI_TEST_EQUALS( DaliTestCheckMaps( placeholderMapGet, placeholderMapSet ), true, TEST_LOCATION ); + // Avoid a crash when core load gl resources. + application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); - placeholderFontstyleMap.Clear(); - placeholderFontstyleMap.Insert( "slant", "roman" ); - placeholderMapSet[ Text::PlaceHolder::Property::FONT_STYLE ] = placeholderFontstyleMap; - field.SetProperty( TextField::Property::PLACEHOLDER, placeholderMapSet ); + textField.SetProperty( DevelTextField::Property::PRIMARY_CURSOR_POSITION, 3); + application.SendNotification(); + application.Render(); + textField.SetKeyInputFocus(); - placeholderMapGet = field.GetProperty( TextField::Property::PLACEHOLDER ); + application.ProcessEvent( GenerateKey( "D", "", "D", KEY_D_CODE, 0, 0, Integration::KeyEvent::DOWN, "D", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - placeholderFontstyleMap.Clear(); - placeholderMapSet[ Text::PlaceHolder::Property::FONT_STYLE ] = placeholderFontstyleMap; + // Render and notify + application.SendNotification(); + application.Render(); - field.SetProperty( TextField::Property::PLACEHOLDER, placeholderMapSet ); - placeholderMapGet = field.GetProperty( TextField::Property::PLACEHOLDER ); - DALI_TEST_EQUALS( placeholderMapGet.Count(), placeholderMapSet.Count(), TEST_LOCATION ); - DALI_TEST_EQUALS( DaliTestCheckMaps( placeholderMapGet, placeholderMapSet ), true, TEST_LOCATION ); + DALI_TEST_EQUALS( textField.GetProperty( TextField::Property::TEXT ).Get(), "ABCDEF", TEST_LOCATION ); + DALI_TEST_EQUALS( textField.GetProperty( DevelTextField::Property::PRIMARY_CURSOR_POSITION ).Get(), 4, TEST_LOCATION ); END_TEST; } -int UtcDaliTextFieldSetPaddingProperty(void) +// test max length when set after setting long text +int utcDaliTextFieldMaxCharactersReachedAfterSetText(void) { ToolkitTestApplication application; - tet_infoline("UtcDaliTextFieldSetPaddingProperty\n"); - + tet_infoline(" utcDaliTextFieldMaxCharactersReachedAfterSetText"); TextField field = TextField::New(); DALI_TEST_CHECK( field ); - field.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); - field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); - field.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); - application.GetScene().Add( field ); - application.SendNotification(); - application.Render(); + application.GetScene().Add( field ); - Vector3 originalSize = field.GetNaturalSize(); + field.SetProperty(TextField::Property::TEXT, "123456789"); - field.SetProperty( Toolkit::Control::Property::PADDING, Extents( 10, 10, 10, 10 ) ); + const int maxNumberOfCharacters = 3; + field.SetProperty( TextField::Property::MAX_LENGTH, maxNumberOfCharacters ); - application.SendNotification(); - application.Render(); + field.SetKeyInputFocus(); - DALI_TEST_EQUALS( field.GetProperty( Toolkit::Control::Property::PADDING ), Extents( 10, 10, 10, 10 ), TEST_LOCATION ); + // connect to the text max lengh reached signal. + ConnectionTracker* testTracker = new ConnectionTracker(); + bool maxLengthReachedSignal = false; + field.ConnectSignal( testTracker, "maxLengthReached", CallbackFunctor(&maxLengthReachedSignal) ); - Vector3 paddingAddedSize = field.GetNaturalSize(); + application.ProcessEvent( GenerateKey( "a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.ProcessEvent( GenerateKey( "a", "", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - DALI_TEST_EQUALS( originalSize.width + 10 + 10 , paddingAddedSize.width, Math::MACHINE_EPSILON_1000, TEST_LOCATION ); + DALI_TEST_CHECK( maxLengthReachedSignal ); - DALI_TEST_EQUALS( originalSize.height + 10 + 10 , paddingAddedSize.height, Math::MACHINE_EPSILON_1000, TEST_LOCATION ); + DALI_TEST_EQUALS( field.GetProperty( TextField::Property::TEXT ).Get(), "123456789", TEST_LOCATION ); END_TEST; } -int UtcDaliTextFieldEnableShiftSelectionProperty(void) + + +int UtcDaliTextFieldAtlasLimitationIsEnabledForLargeFontPointSize(void) { ToolkitTestApplication application; - tet_infoline("UtcDaliTextFieldEnableShiftSelectionProperty"); + tet_infoline(" UtcDaliTextFieldAtlasLimitationIsEnabledForLargeFontPointSize "); - TextField field = TextField::New(); - DALI_TEST_CHECK( field ); - field.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); - field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); - field.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); - application.GetScene().Add( field ); + // +2: First one to handle the equal case. Second one to handle odd to even case of GetNaturalSize + const uint32_t lessThanWidth = TextAbstraction::FontClient::MAX_TEXT_ATLAS_WIDTH - TextAbstraction::FontClient::PADDING_TEXT_ATLAS_BLOCK + 2; + const uint32_t lessThanHeight = TextAbstraction::FontClient::MAX_TEXT_ATLAS_HEIGHT - TextAbstraction::FontClient::PADDING_TEXT_ATLAS_BLOCK + 2; - application.SendNotification(); - application.Render(); + // Create a text field + TextField textField = TextField::New(); - // The default value of ENABLE_SHIFT_SELECTION is 'true'. - DALI_TEST_EQUALS( field.GetProperty( DevelTextField::Property::ENABLE_SHIFT_SELECTION ), true, TEST_LOCATION ); + //Set size to avoid automatic eliding + textField.SetProperty( Actor::Property::SIZE, Vector2(1025, 1025)); + //Set very large font-size using point-size + textField.SetProperty( TextField::Property::POINT_SIZE, 1000) ; + //Specify font-family + textField.SetProperty( TextField::Property::FONT_FAMILY, "DejaVu Sans"); + //Set text to check if appear or not + textField.SetProperty( TextField::Property::TEXT, "A"); - // Check the enable shift selection property - field.SetProperty( DevelTextField::Property::ENABLE_SHIFT_SELECTION, false ); - DALI_TEST_EQUALS( field.GetProperty( DevelTextField::Property::ENABLE_SHIFT_SELECTION ), false, TEST_LOCATION ); + application.GetScene().Add( textField ); application.SendNotification(); application.Render(); + //Use GetNaturalSize to verify that size of block does not exceed Atlas size + Vector3 naturalSize = textField.GetNaturalSize(); + + DALI_TEST_GREATER( lessThanWidth, static_cast(naturalSize.width), TEST_LOCATION ); + DALI_TEST_GREATER( lessThanHeight, static_cast(naturalSize.height), TEST_LOCATION ); END_TEST; } -int UtcDaliTextFieldEnableGrabHandleProperty(void) +int UtcDaliTextFieldAtlasLimitationIsEnabledPerformanceCases(void) { ToolkitTestApplication application; - tet_infoline("UtcDaliTextFieldEnableGrabHandleProperty"); + tet_infoline(" UtcDaliTextFieldAtlasLimitationIsEnabledPerformanceCases "); - TextField field = TextField::New(); - DALI_TEST_CHECK( field ); - field.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); - field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); - field.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); - application.GetScene().Add( field ); + // +2: First one to handle the equal case. Second one to handle odd to even case of GetNaturalSize + const uint32_t lessThanWidth = TextAbstraction::FontClient::MAX_TEXT_ATLAS_WIDTH - TextAbstraction::FontClient::PADDING_TEXT_ATLAS_BLOCK + 2; + const uint32_t lessThanHeight = TextAbstraction::FontClient::MAX_TEXT_ATLAS_HEIGHT - TextAbstraction::FontClient::PADDING_TEXT_ATLAS_BLOCK + 2; - application.SendNotification(); - application.Render(); + Vector3 naturalSize; //Use GetNaturalSize to verify that size of block does not exceed Atlas size + // Create a text editor + TextField textField = TextField::New(); - // The default value of ENABLE_GRAB_HANDLE is 'true'. - DALI_TEST_EQUALS( field.GetProperty( DevelTextField::Property::ENABLE_GRAB_HANDLE ), true, TEST_LOCATION ); + //Set size to avoid automatic eliding + textField.SetProperty( Actor::Property::SIZE, Vector2(1025, 1025)); + textField.SetProperty( TextField::Property::FONT_FAMILY, "DejaVu Sans"); + textField.SetProperty( TextField::Property::TEXT, "A"); - // Check the enable grab handle property - field.SetProperty( DevelTextField::Property::ENABLE_GRAB_HANDLE, false ); - DALI_TEST_EQUALS( field.GetProperty( DevelTextField::Property::ENABLE_GRAB_HANDLE ), false, TEST_LOCATION ); + const int numberOfCases = 6; + int arrayCases[numberOfCases] = {323, 326, 330, 600, 1630, 2500}; + + for (int index=0; index < numberOfCases; index++) + { + tet_printf(" UtcDaliTextFieldAtlasLimitationIsEnabledPerformanceCases point-size= %d \n", arrayCases[index]); + textField.SetProperty( TextField::Property::POINT_SIZE, arrayCases[index]) ; + application.GetScene().Add( textField ); + application.SendNotification(); + application.Render(); + naturalSize = textField.GetNaturalSize(); + DALI_TEST_GREATER( lessThanWidth, static_cast(naturalSize.width), TEST_LOCATION ); + DALI_TEST_GREATER( lessThanHeight, static_cast(naturalSize.height), TEST_LOCATION ); - application.SendNotification(); - application.Render(); + } END_TEST; } -int UtcDaliTextFieldMatchSystemLanguageDirectionProperty(void) +int UtcDaliToolkitTextFieldEllipsisPositionProperty(void) { ToolkitTestApplication application; - tet_infoline("UtcDaliTextFieldMatchSystemLanguageDirectionProperty"); + tet_infoline(" UtcDaliToolkitTextFieldEllipsisPositionProperty "); + TextField textField = TextField::New(); - TextField field = TextField::New(); - DALI_TEST_CHECK( field ); - field.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); - field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); - field.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); - application.GetScene().Add( field ); + tet_infoline(" UtcDaliToolkitTextFieldEllipsisPositionProperty - Default is END"); + DALI_TEST_EQUALS( textField.GetProperty< int >( DevelTextField::Property::ELLIPSIS_POSITION ), static_cast< int >( Toolkit::DevelText::EllipsisPosition::END ), TEST_LOCATION ); - application.SendNotification(); - application.Render(); + tet_infoline(" UtcDaliToolkitTextFieldEllipsisPositionProperty - Change to START"); + textField.SetProperty(DevelTextField::Property::ELLIPSIS_POSITION, DevelText::EllipsisPosition::START); + DALI_TEST_EQUALS( textField.GetProperty< int >( DevelTextField::Property::ELLIPSIS_POSITION ), static_cast< int >( Toolkit::DevelText::EllipsisPosition::START ), TEST_LOCATION ); - // The default value of MATCH_SYSTEM_LANGUAGE_DIRECTION is 'false'. - DALI_TEST_EQUALS( field.GetProperty( DevelTextField::Property::MATCH_SYSTEM_LANGUAGE_DIRECTION ), false, TEST_LOCATION ); + tet_infoline(" UtcDaliToolkitTextFieldEllipsisPositionProperty - Change to MIDDLE"); + textField.SetProperty(DevelTextField::Property::ELLIPSIS_POSITION, DevelText::EllipsisPosition::MIDDLE); + DALI_TEST_EQUALS( textField.GetProperty< int >( DevelTextField::Property::ELLIPSIS_POSITION ), static_cast< int >( Toolkit::DevelText::EllipsisPosition::MIDDLE ), TEST_LOCATION ); - // Check the match system language direction property - field.SetProperty( DevelTextField::Property::MATCH_SYSTEM_LANGUAGE_DIRECTION, true ); - DALI_TEST_EQUALS( field.GetProperty( DevelTextField::Property::MATCH_SYSTEM_LANGUAGE_DIRECTION ), true, TEST_LOCATION ); + tet_infoline(" UtcDaliToolkitTextFieldEllipsisPositionProperty - Change to END"); + textField.SetProperty(DevelTextField::Property::ELLIPSIS_POSITION, DevelText::EllipsisPosition::END); + DALI_TEST_EQUALS( textField.GetProperty< int >( DevelTextField::Property::ELLIPSIS_POSITION ), static_cast< int >( Toolkit::DevelText::EllipsisPosition::END ), TEST_LOCATION ); - application.SendNotification(); - application.Render(); + tet_infoline(" UtcDaliToolkitTextFieldEllipsisPositionProperty - Change to START using integer"); + textField.SetProperty(DevelTextField::Property::ELLIPSIS_POSITION, 1); + DALI_TEST_EQUALS( textField.GetProperty< int >( DevelTextField::Property::ELLIPSIS_POSITION ), static_cast< int >( Toolkit::DevelText::EllipsisPosition::START ), TEST_LOCATION ); + + tet_infoline(" UtcDaliToolkitTextFieldEllipsisPositionProperty - Change to MIDDLE using integer"); + textField.SetProperty(DevelTextField::Property::ELLIPSIS_POSITION, 2); + DALI_TEST_EQUALS( textField.GetProperty< int >( DevelTextField::Property::ELLIPSIS_POSITION ), static_cast< int >( Toolkit::DevelText::EllipsisPosition::MIDDLE ), TEST_LOCATION ); + + tet_infoline(" UtcDaliToolkitTextFieldEllipsisPositionProperty - Change to END using integer"); + textField.SetProperty(DevelTextField::Property::ELLIPSIS_POSITION, 0); + DALI_TEST_EQUALS( textField.GetProperty< int >( DevelTextField::Property::ELLIPSIS_POSITION ), static_cast< int >( Toolkit::DevelText::EllipsisPosition::END ), TEST_LOCATION ); + + tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Change to START using string - uppercase"); + textField.SetProperty(DevelTextField::Property::ELLIPSIS_POSITION, "START"); + DALI_TEST_EQUALS( textField.GetProperty< int >( DevelTextField::Property::ELLIPSIS_POSITION ), static_cast< int >( Toolkit::DevelText::EllipsisPosition::START ), TEST_LOCATION ); + + tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Change to MIDDLE using string - uppercase"); + textField.SetProperty(DevelTextField::Property::ELLIPSIS_POSITION, "MIDDLE"); + DALI_TEST_EQUALS( textField.GetProperty< int >( DevelTextField::Property::ELLIPSIS_POSITION ), static_cast< int >( Toolkit::DevelText::EllipsisPosition::MIDDLE ), TEST_LOCATION ); + + tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Change to END using string - uppercase"); + textField.SetProperty(DevelTextField::Property::ELLIPSIS_POSITION, "END"); + DALI_TEST_EQUALS( textField.GetProperty< int >( DevelTextField::Property::ELLIPSIS_POSITION ), static_cast< int >( Toolkit::DevelText::EllipsisPosition::END ), TEST_LOCATION ); + + tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Change to START using string - lowercase"); + textField.SetProperty(DevelTextField::Property::ELLIPSIS_POSITION, "start"); + DALI_TEST_EQUALS( textField.GetProperty< int >( DevelTextField::Property::ELLIPSIS_POSITION ), static_cast< int >( Toolkit::DevelText::EllipsisPosition::START ), TEST_LOCATION ); + + tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Change to MIDDLE using string - lowercase"); + textField.SetProperty(DevelTextField::Property::ELLIPSIS_POSITION, "middle"); + DALI_TEST_EQUALS( textField.GetProperty< int >( DevelTextField::Property::ELLIPSIS_POSITION ), static_cast< int >( Toolkit::DevelText::EllipsisPosition::MIDDLE ), TEST_LOCATION ); + + tet_infoline(" UtcDaliToolkitTextlabelEllipsisPositionProperty - Change to END using string - lowercase"); + textField.SetProperty(DevelTextField::Property::ELLIPSIS_POSITION, "end"); + DALI_TEST_EQUALS( textField.GetProperty< int >( DevelTextField::Property::ELLIPSIS_POSITION ), static_cast< int >( Toolkit::DevelText::EllipsisPosition::END ), TEST_LOCATION ); END_TEST; } -int utcDaliTextFieldLayoutDirectionCoverage(void) +int utcDaliTextFieldCursorPositionChangedSignal(void) { ToolkitTestApplication application; - tet_infoline(" utcDaliTextFieldLayoutDirectionCoverage"); + tet_infoline(" utcDaliTextFieldCursorPositionChangedSignal"); - // 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 ); application.GetScene().Add( field ); - field.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); + // connect to the selection changed signal. + ConnectionTracker* testTracker = new ConnectionTracker(); + DevelTextField::CursorPositionChangedSignal(field).Connect(&TestCursorPositionChangedCallback); + bool cursorPositionChangedSignal = false; + field.ConnectSignal( testTracker, "cursorPositionChanged", CallbackFunctor(&cursorPositionChangedSignal) ); + + field.SetProperty( TextField::Property::TEXT, "Hello world Hello world" ); + field.SetProperty( TextField::Property::POINT_SIZE, 10.f ); + field.SetProperty( Actor::Property::SIZE, Vector2( 100.f, 50.f ) ); field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); field.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); @@ -2789,264 +4039,335 @@ int utcDaliTextFieldLayoutDirectionCoverage(void) application.SendNotification(); application.Render(); - // init direction for coverage - // Set horizontal alignment END - field.SetProperty( TextField::Property::HORIZONTAL_ALIGNMENT, "END"); + field.SetKeyInputFocus(); - // Create a tap event to touch the text field. - TestGenerateTap( application, 150.0f, 25.0f ); + // Tap on the text field + TestGenerateTap( application, 3.0f, 25.0f ); // Render and notify application.SendNotification(); application.Render(); - // Set MATCH_SYSTEM_LANGUAGE_DIRECTION to true to use the layout direction. - field.SetProperty( DevelTextField::Property::MATCH_SYSTEM_LANGUAGE_DIRECTION, true ); - field.SetProperty( Actor::Property::LAYOUT_DIRECTION, LayoutDirection::RIGHT_TO_LEFT ); + DALI_TEST_CHECK(gCursorPositionChangedCallbackCalled); + DALI_TEST_EQUALS(oldCursorPos, 23, TEST_LOCATION); - // Set horizontal alignment BEGIN - field.SetProperty( TextField::Property::HORIZONTAL_ALIGNMENT, "BEGIN"); + gCursorPositionChangedCallbackCalled = false; - // Create a tap event to touch the text field. - TestGenerateTap( application, 150.0f, 25.0f ); + // Move to left. + application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); // Render and notify application.SendNotification(); application.Render(); - // Set horizontal alignment CENTER - field.SetProperty( TextField::Property::HORIZONTAL_ALIGNMENT, "CENTER"); + DALI_TEST_CHECK(gCursorPositionChangedCallbackCalled); + DALI_TEST_EQUALS(oldCursorPos, 17, TEST_LOCATION); - // Create a tap event to touch the text field. - TestGenerateTap( application, 150.0f, 25.0f ); + gCursorPositionChangedCallbackCalled = false; + + // Insert D + application.ProcessEvent( GenerateKey( "D", "", "D", KEY_D_CODE, 0, 0, Integration::KeyEvent::DOWN, "D", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); // Render and notify application.SendNotification(); application.Render(); - // Set horizontal alignment END - field.SetProperty( TextField::Property::HORIZONTAL_ALIGNMENT, "END"); + DALI_TEST_CHECK(gCursorPositionChangedCallbackCalled); + DALI_TEST_EQUALS(oldCursorPos, 16, TEST_LOCATION); - // Create a tap event to touch the text field. - TestGenerateTap( application, 150.0f, 25.0f ); + gCursorPositionChangedCallbackCalled = false; + + //delete one character + application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); // Render and notify application.SendNotification(); application.Render(); - // Generate a Esc key event. The text field should lose the focus. - application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_ESCAPE, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_ESCAPE, 0, 0, Integration::KeyEvent::UP, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + DALI_TEST_CHECK(gCursorPositionChangedCallbackCalled); + DALI_TEST_EQUALS(oldCursorPos, 17, TEST_LOCATION); + + gCursorPositionChangedCallbackCalled = false; + + field.SetProperty( TextField::Property::TEXT, "Hello" ); // Render and notify application.SendNotification(); application.Render(); - DALI_TEST_EQUALS( false, field.HasKeyInputFocus(), TEST_LOCATION ); + DALI_TEST_CHECK(gCursorPositionChangedCallbackCalled); + DALI_TEST_EQUALS(oldCursorPos, 16, TEST_LOCATION); - END_TEST; -} + gCursorPositionChangedCallbackCalled = false; -int UtcDaliTextFieldGetInputMethodContext(void) -{ - ToolkitTestApplication application; - tet_infoline("UtcDaliTextFieldGetInputMethodContext"); + field.SetProperty(DevelTextField::Property::PRIMARY_CURSOR_POSITION, 3); - TextField field = TextField::New(); - DALI_TEST_CHECK( DevelTextField::GetInputMethodContext( field ) ); + // Render and notify + application.SendNotification(); + application.Render(); + + DALI_TEST_CHECK(gCursorPositionChangedCallbackCalled); + DALI_TEST_EQUALS(oldCursorPos, 5, TEST_LOCATION); END_TEST; } -int UtcDaliTextFieldSelectWholeText(void) +int utcDaliTextFieldSelectionClearedSignal(void) { ToolkitTestApplication application; - tet_infoline(" UtcDaliTextFieldSelectWholeText "); + tet_infoline(" utcDaliTextFieldSelectionClearedSignal"); - TextField textField = TextField::New(); + TextField field = TextField::New(); + DALI_TEST_CHECK( field ); - application.GetScene().Add( textField ); + application.GetScene().Add( field ); - textField.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); - textField.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); - textField.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); + // connect to the selection changed signal. + ConnectionTracker* testTracker = new ConnectionTracker(); + DevelTextField::SelectionClearedSignal(field).Connect(&TestSelectionClearedCallback); + bool selectionClearedSignal = false; + field.ConnectSignal( testTracker, "selectionCleared", CallbackFunctor(&selectionClearedSignal) ); + + field.SetProperty( TextField::Property::TEXT, "Hello\nworld\nHello world" ); + field.SetProperty( TextField::Property::POINT_SIZE, 10.f ); + field.SetProperty( Actor::Property::SIZE, Vector2( 100.f, 50.f ) ); + field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); + field.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); // Avoid a crash when core load gl resources. application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); + // Render and notify application.SendNotification(); application.Render(); - DALI_TEST_EQUALS( 1u, textField.GetChildCount(), TEST_LOCATION ); - - DevelTextField::SelectWholeText( textField ); + // Tap on the text editor + TestGenerateTap( application, 3.0f, 25.0f ); + // Render and notify application.SendNotification(); application.Render(); - // Nothing should have been selected. The number of children is still 1 - DALI_TEST_EQUALS( 1u, textField.GetChildCount(), TEST_LOCATION ); + // Move to second line of the text & Select some text in the right of the current cursor position + application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_CURSOR_DOWN, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_CURSOR_RIGHT, KEY_SHIFT_MODIFIER, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - textField.SetProperty( TextField::Property::TEXT, "Hello world" ); + // remove selection + application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_ESCAPE, 0, 0, Integration::KeyEvent::UP, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + // Render and notify application.SendNotification(); application.Render(); - DevelTextField::SelectWholeText( textField ); + DALI_TEST_CHECK(gSelectionClearedCallbackCalled); + // Render and notify application.SendNotification(); application.Render(); - // Should be 2 children, the stencil and the layer - DALI_TEST_EQUALS( 2u, textField.GetChildCount(), TEST_LOCATION ); + // Tap on the text editor + TestGenerateTap( application, 3.0f, 25.0f ); - // The offscreen root actor should have two actors: the renderer and the highlight actor. - Actor stencil = textField.GetChildAt( 0u ); + // Render and notify + application.SendNotification(); + application.Render(); - // The highlight actor is drawn first, so is the first actor in the list - Renderer highlight = stencil.GetChildAt( 0u ).GetRendererAt( 0u ); - DALI_TEST_CHECK( highlight ); + gSelectionClearedCallbackCalled = false; - END_TEST; -} + // Move to second line of the text & select. + application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_CURSOR_DOWN, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_CURSOR_RIGHT, KEY_SHIFT_MODIFIER, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); -int UtcDaliTextFieldSelectNone(void) -{ - ToolkitTestApplication application; - tet_infoline(" UtcDaliTextFieldSelectWholeText "); + //remove selection + application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_CURSOR_RIGHT, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - TextField textField = TextField::New(); + // Render and notify + application.SendNotification(); + application.Render(); - application.GetScene().Add( textField ); + DALI_TEST_CHECK(gSelectionClearedCallbackCalled); - textField.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); - textField.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); - textField.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); + gSelectionClearedCallbackCalled = false; - // Avoid a crash when core load gl resources. - application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); + // Render and notify + application.SendNotification(); + application.Render(); + // Move to second line of the text & select. + application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_CURSOR_DOWN, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_CURSOR_RIGHT, KEY_SHIFT_MODIFIER, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + + // replace D with selected text + application.ProcessEvent( GenerateKey( "D", "", "D", KEY_D_CODE, 0, 0, Integration::KeyEvent::DOWN, "D", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + + // Render and notify application.SendNotification(); application.Render(); - textField.SetProperty( TextField::Property::TEXT, "Hello world" ); + DALI_TEST_CHECK(gSelectionClearedCallbackCalled); + + gSelectionClearedCallbackCalled = false; + // Render and notify application.SendNotification(); application.Render(); - // Nothing is selected - std::string selectedText = textField.GetProperty( DevelTextField::Property::SELECTED_TEXT ).Get(); - DALI_TEST_EQUALS( "", selectedText, TEST_LOCATION ); + DevelTextField::SelectText( field ,1, 3 ); - DevelTextField::SelectWholeText( textField ); + // Render and notify + application.SendNotification(); + application.Render(); + field.SetProperty( DevelTextField::Property::PRIMARY_CURSOR_POSITION, 3); + + // Render and notify application.SendNotification(); application.Render(); - // whole text is selected - selectedText = textField.GetProperty( DevelTextField::Property::SELECTED_TEXT ).Get(); - DALI_TEST_EQUALS( "Hello world", selectedText, TEST_LOCATION ); + DALI_TEST_CHECK(gSelectionClearedCallbackCalled); - DevelTextField::SelectNone( textField ); + gSelectionClearedCallbackCalled = false; + DevelTextField::SelectText( field ,1, 3 ); + + // Render and notify application.SendNotification(); application.Render(); - // Nothing is selected - selectedText = textField.GetProperty( DevelTextField::Property::SELECTED_TEXT ).Get(); - DALI_TEST_EQUALS( "", selectedText, TEST_LOCATION ); + // select none + DevelTextField::SelectNone(field); + + // Render and notify + application.SendNotification(); + application.Render(); + + DALI_TEST_CHECK(gSelectionClearedCallbackCalled); END_TEST; } -int UtcDaliTextFieldSelectRange(void) +int utcDaliTextFieldSelectionChangedSignal(void) { ToolkitTestApplication application; - tet_infoline(" UtcDaliTextFieldSelectRange "); + tet_infoline(" utcDaliTextFieldSelectionChangedSignal"); - TextField textField = TextField::New(); + TextField field = TextField::New(); + DALI_TEST_CHECK( field ); - application.GetScene().Add( textField ); + application.GetScene().Add( field ); - textField.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); - textField.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); - textField.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); + // connect to the selection changed signal. + ConnectionTracker* testTracker = new ConnectionTracker(); + DevelTextField::SelectionChangedSignal(field).Connect(&TestSelectionChangedCallback); + bool selectionChangedSignal = false; + field.ConnectSignal( testTracker, "selectionChanged", CallbackFunctor(&selectionChangedSignal) ); + + field.SetProperty( TextField::Property::TEXT, "Hello world Hello world" ); + field.SetProperty( TextField::Property::POINT_SIZE, 10.f ); + field.SetProperty( Actor::Property::SIZE, Vector2( 100.f, 50.f ) ); + field.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); + field.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); // Avoid a crash when core load gl resources. application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); + // Render and notify application.SendNotification(); application.Render(); - textField.SetProperty( TextField::Property::TEXT, "Hello world" ); + // Tap on the text field + TestGenerateTap( application, 3.0f, 25.0f ); + // Render and notify application.SendNotification(); application.Render(); - textField.SetProperty( DevelTextField::Property::SELECTED_TEXT_START , 0); - textField.SetProperty( DevelTextField::Property::SELECTED_TEXT_END , 5); + // Select some text in the right of the current cursor position + application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_SHIFT_LEFT, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_CURSOR_RIGHT, KEY_SHIFT_MODIFIER, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - // Hello is selected - std::string selectedText = textField.GetProperty( DevelTextField::Property::SELECTED_TEXT ).Get(); - DALI_TEST_EQUALS( "Hello", selectedText, TEST_LOCATION ); + // Render and notify + application.SendNotification(); + application.Render(); - DALI_TEST_EQUALS( textField.GetProperty( DevelTextField::Property::SELECTED_TEXT_START ).Get(), 0, TEST_LOCATION ); - DALI_TEST_EQUALS( textField.GetProperty( DevelTextField::Property::SELECTED_TEXT_END ).Get(), 5, TEST_LOCATION ); + DALI_TEST_CHECK(gSelectionChangedCallbackCalled); + DALI_TEST_EQUALS(oldSelectionStart, oldSelectionEnd, TEST_LOCATION); - textField.SetProperty( DevelTextField::Property::SELECTED_TEXT_START , 6); - textField.SetProperty( DevelTextField::Property::SELECTED_TEXT_END , 11); + gSelectionChangedCallbackCalled = false; - // world is selected - selectedText = textField.GetProperty( DevelTextField::Property::SELECTED_TEXT ).Get(); - DALI_TEST_EQUALS( "world", selectedText, TEST_LOCATION ); + application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_CURSOR_RIGHT, KEY_SHIFT_MODIFIER, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - DALI_TEST_EQUALS( textField.GetProperty( DevelTextField::Property::SELECTED_TEXT_START ).Get(), 6, TEST_LOCATION ); - DALI_TEST_EQUALS( textField.GetProperty( DevelTextField::Property::SELECTED_TEXT_END ).Get(), 11, TEST_LOCATION ); + // Render and notify + application.SendNotification(); + application.Render(); - END_TEST; -} + DALI_TEST_CHECK(gSelectionChangedCallbackCalled); + DALI_TEST_EQUALS(oldSelectionStart, 0, TEST_LOCATION); + DALI_TEST_EQUALS(oldSelectionEnd, 1, TEST_LOCATION); -int UtcDaliTextFieldEnableEditing(void) -{ - ToolkitTestApplication application; - tet_infoline(" UtcDaliTextFieldEnableEditing "); + gSelectionChangedCallbackCalled = false; - TextField textField = TextField::New(); + application.ProcessEvent( GenerateKey( "", "", "", DALI_KEY_ESCAPE, 0, 0, Integration::KeyEvent::UP, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); - application.GetScene().Add( textField ); + // Render and notify + application.SendNotification(); + application.Render(); - textField.SetProperty( Actor::Property::SIZE, Vector2( 300.f, 50.f ) ); - textField.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); - textField.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); + DALI_TEST_CHECK(gSelectionChangedCallbackCalled); + DALI_TEST_EQUALS(oldSelectionStart, 0, TEST_LOCATION); + DALI_TEST_EQUALS(oldSelectionEnd, 2, TEST_LOCATION); - // Avoid a crash when core load gl resources. - application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); + gSelectionChangedCallbackCalled = false; + field.SetKeyInputFocus(); + + // Render and notify + application.SendNotification(); + application.Render(); + + DevelTextField::SelectText( field ,0, 5 ); application.SendNotification(); application.Render(); - textField.SetKeyInputFocus(); - textField.SetProperty( DevelTextField::Property::ENABLE_EDITING, false ); - application.ProcessEvent( GenerateKey( "D", "", "D", KEY_D_CODE, 0, 0, Integration::KeyEvent::DOWN, "D", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + DALI_TEST_CHECK(gSelectionChangedCallbackCalled); + DALI_TEST_EQUALS(oldSelectionStart, oldSelectionEnd, TEST_LOCATION); + + gSelectionChangedCallbackCalled = false; + + field.SetProperty( DevelTextField::Property::PRIMARY_CURSOR_POSITION, 3); // Render and notify application.SendNotification(); application.Render(); - DALI_TEST_EQUALS( textField.GetProperty( TextField::Property::TEXT ).Get(), "", TEST_LOCATION ); - DALI_TEST_EQUALS( textField.GetProperty( DevelTextField::Property::ENABLE_EDITING ).Get(), false, TEST_LOCATION ); + DALI_TEST_CHECK(gSelectionChangedCallbackCalled); + DALI_TEST_EQUALS(oldSelectionStart, 0, TEST_LOCATION); + DALI_TEST_EQUALS(oldSelectionEnd, 5, TEST_LOCATION); + gSelectionChangedCallbackCalled = false; - textField.SetKeyInputFocus(); - textField.SetProperty( DevelTextField::Property::ENABLE_EDITING, true ); - application.ProcessEvent( GenerateKey( "D", "", "D", KEY_D_CODE, 0, 0, Integration::KeyEvent::DOWN, "D", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) ); + // select all text + DevelTextField::SelectWholeText(field); // Render and notify application.SendNotification(); application.Render(); - DALI_TEST_EQUALS( textField.GetProperty( TextField::Property::TEXT ).Get(), "D", TEST_LOCATION ); - DALI_TEST_EQUALS( textField.GetProperty( DevelTextField::Property::ENABLE_EDITING ).Get(), true, TEST_LOCATION ); + DALI_TEST_CHECK(gSelectionChangedCallbackCalled); + DALI_TEST_EQUALS(oldSelectionStart, oldSelectionEnd, TEST_LOCATION); + + gSelectionChangedCallbackCalled = false; + + // select none + DevelTextField::SelectNone(field); + + // Render and notify + application.SendNotification(); + application.Render(); + + DALI_TEST_CHECK(gSelectionChangedCallbackCalled); + DALI_TEST_EQUALS(oldSelectionStart, 0, TEST_LOCATION); + DALI_TEST_EQUALS(oldSelectionEnd, 23, TEST_LOCATION); END_TEST; -} +} \ No newline at end of file