2 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
20 #include <dali/devel-api/rendering/renderer.h>
21 #include <dali/integration-api/events/key-event-integ.h>
22 #include <dali/integration-api/events/tap-gesture-event.h>
23 #include <dali-toolkit-test-suite-utils.h>
24 #include <dali-toolkit/dali-toolkit.h>
27 using namespace Toolkit;
29 void dali_textfield_startup(void)
31 test_return_value = TET_UNDEF;
34 void dali_textfield_cleanup(void)
36 test_return_value = TET_PASS;
42 const char* const PROPERTY_NAME_RENDERING_BACKEND = "renderingBackend";
43 const char* const PROPERTY_NAME_TEXT = "text";
44 const char* const PROPERTY_NAME_PLACEHOLDER_TEXT = "placeholderText";
45 const char* const PROPERTY_NAME_PLACEHOLDER_TEXT_FOCUSED = "placeholderTextFocused";
46 const char* const PROPERTY_NAME_FONT_FAMILY = "fontFamily";
47 const char* const PROPERTY_NAME_FONT_STYLE = "fontStyle";
48 const char* const PROPERTY_NAME_POINT_SIZE = "pointSize";
49 const char* const PROPERTY_NAME_MAX_LENGTH = "maxLength";
50 const char* const PROPERTY_NAME_EXCEED_POLICY = "exceedPolicy";
51 const char* const PROPERTY_NAME_HORIZONTAL_ALIGNMENT = "horizontalAlignment";
52 const char* const PROPERTY_NAME_VERTICAL_ALIGNMENT = "verticalAlignment";
53 const char* const PROPERTY_NAME_TEXT_COLOR = "textColor";
54 const char* const PROPERTY_NAME_PLACEHOLDER_TEXT_COLOR = "placeholderTextColor";
55 const char* const PROPERTY_NAME_SHADOW_OFFSET = "shadowOffset";
56 const char* const PROPERTY_NAME_SHADOW_COLOR = "shadowColor";
57 const char* const PROPERTY_NAME_PRIMARY_CURSOR_COLOR = "primaryCursorColor";
58 const char* const PROPERTY_NAME_SECONDARY_CURSOR_COLOR = "secondaryCursorColor";
59 const char* const PROPERTY_NAME_ENABLE_CURSOR_BLINK = "enableCursorBlink";
60 const char* const PROPERTY_NAME_CURSOR_BLINK_INTERVAL = "cursorBlinkInterval";
61 const char* const PROPERTY_NAME_CURSOR_BLINK_DURATION = "cursorBlinkDuration";
62 const char* const PROPERTY_NAME_CURSOR_WIDTH = "cursorWidth";
63 const char* const PROPERTY_NAME_GRAB_HANDLE_IMAGE = "grabHandleImage";
64 const char* const PROPERTY_NAME_GRAB_HANDLE_PRESSED_IMAGE = "grabHandlePressedImage";
65 const char* const PROPERTY_NAME_SCROLL_THRESHOLD = "scrollThreshold";
66 const char* const PROPERTY_NAME_SCROLL_SPEED = "scrollSpeed";
67 const char* const PROPERTY_NAME_SELECTION_HANDLE_IMAGE_LEFT = "selectionHandleImageLeft";
68 const char* const PROPERTY_NAME_SELECTION_HANDLE_IMAGE_RIGHT = "selectionHandleImageRight";
69 const char* const PROPERTY_NAME_SELECTION_HANDLE_PRESSED_IMAGE_LEFT = "selectionHandlePressedImageLeft";
70 const char* const PROPERTY_NAME_SELECTION_HANDLE_PRESSED_IMAGE_RIGHT = "selectionHandlePressedImageRight";
71 const char* const PROPERTY_NAME_SELECTION_HANDLE_MARKER_IMAGE_LEFT = "selectionHandleMarkerImageLeft";
72 const char* const PROPERTY_NAME_SELECTION_HANDLE_MARKER_IMAGE_RIGHT = "selectionHandleMarkerImageRight";
73 const char* const PROPERTY_NAME_SELECTION_HIGHLIGHT_COLOR = "selectionHighlightColor";
74 const char* const PROPERTY_NAME_DECORATION_BOUNDING_BOX = "decorationBoundingBox";
75 const char* const PROPERTY_NAME_INPUT_METHOD_SETTINGS = "inputMethodSettings";
76 const char* const PROPERTY_NAME_INPUT_COLOR = "inputColor";
77 const char* const PROPERTY_NAME_ENABLE_MARKUP = "enableMarkup";
78 const char* const PROPERTY_NAME_INPUT_FONT_FAMILY = "inputFontFamily";
79 const char* const PROPERTY_NAME_INPUT_FONT_STYLE = "inputFontStyle";
80 const char* const PROPERTY_NAME_INPUT_POINT_SIZE = "inputPointSize";
82 const int DEFAULT_RENDERING_BACKEND = Dali::Toolkit::Text::DEFAULT_RENDERING_BACKEND;
84 const Vector4 PLACEHOLDER_TEXT_COLOR( 0.8f, 0.8f, 0.8f, 0.8f );
85 const Dali::Vector4 LIGHT_BLUE( 0.75f, 0.96f, 1.f, 1.f ); // The text highlight color.
87 const unsigned int CURSOR_BLINK_INTERVAL = 500u; // Cursor blink interval
88 const float TO_MILLISECONDS = 1000.f;
89 const float TO_SECONDS = 1.f / TO_MILLISECONDS;
91 const float SCROLL_THRESHOLD = 10.f;
92 const float SCROLL_SPEED = 300.f;
94 static bool gTextChangedCallBackCalled;
95 static bool gMaxCharactersCallBackCalled;
97 static void TestTextChangedCallback( TextField control )
99 tet_infoline(" TestTextChangedCallback");
101 gTextChangedCallBackCalled = true;
104 static void TestMaxLengthReachedCallback( TextField control )
106 tet_infoline(" TestMaxLengthReachedCallback");
108 gMaxCharactersCallBackCalled = true;
111 // Generate a TapGestureEvent to send to Core.
112 Integration::TapGestureEvent GenerateTap(
113 Gesture::State state,
114 unsigned int numberOfTaps,
115 unsigned int numberOfTouches,
118 Integration::TapGestureEvent tap( state );
120 tap.numberOfTaps = numberOfTaps;
121 tap.numberOfTouches = numberOfTouches;
127 // Generate a KeyEvent to send to Core.
128 Integration::KeyEvent GenerateKey( const std::string& keyName,
129 const std::string& keyString,
132 unsigned long timeStamp,
133 const Integration::KeyEvent::State& keyState )
135 return Integration::KeyEvent( keyName,
145 int UtcDaliToolkitTextFieldConstructorP(void)
147 ToolkitTestApplication application;
148 tet_infoline(" UtcDaliToolkitTextFieldConstructorP");
150 DALI_TEST_CHECK( !textField );
154 int UtcDaliToolkitTextFieldNewP(void)
156 ToolkitTestApplication application;
157 tet_infoline(" UtcDaliToolkitTextFieldNewP");
158 TextField textField = TextField::New();
159 DALI_TEST_CHECK( textField );
163 int UtcDaliToolkitTextFieldDownCastP(void)
165 ToolkitTestApplication application;
166 tet_infoline(" UtcDaliToolkitTextFieldDownCastP");
167 TextField textField1 = TextField::New();
168 BaseHandle object( textField1 );
170 TextField textField2 = TextField::DownCast( object );
171 DALI_TEST_CHECK( textField2 );
173 TextField textField3 = DownCast< TextField >( object );
174 DALI_TEST_CHECK( textField3 );
178 int UtcDaliToolkitTextFieldDownCastN(void)
180 ToolkitTestApplication application;
181 tet_infoline(" UtcDaliToolkitTextFieldDownCastN");
182 BaseHandle uninitializedObject;
183 TextField textField1 = TextField::DownCast( uninitializedObject );
184 DALI_TEST_CHECK( !textField1 );
186 TextField textField2 = DownCast< TextField >( uninitializedObject );
187 DALI_TEST_CHECK( !textField2 );
191 int UtcDaliToolkitTextFieldCopyConstructorP(void)
193 ToolkitTestApplication application;
194 tet_infoline(" UtcDaliToolkitTextFieldCopyConstructorP");
195 TextField textField = TextField::New();
196 textField.SetProperty( TextField::Property::TEXT, "Test" );
198 TextField copy( textField );
199 DALI_TEST_CHECK( copy );
200 DALI_TEST_CHECK( copy.GetProperty<std::string>( TextLabel::Property::TEXT ) == textField.GetProperty<std::string>( TextLabel::Property::TEXT ) );
204 int UtcDaliToolkitTextFieldAssignmentOperatorP(void)
206 ToolkitTestApplication application;
207 tet_infoline(" UtcDaliToolkitTextFieldAssignmentOperatorP");
208 TextField textField = TextField::New();
209 textField.SetProperty( TextField::Property::TEXT, "Test" );
211 TextField copy = textField;
212 DALI_TEST_CHECK( copy );
213 DALI_TEST_CHECK( copy.GetProperty<std::string>( TextField::Property::TEXT ) == textField.GetProperty<std::string>( TextField::Property::TEXT ) );
217 int UtcDaliTextFieldNewP(void)
219 ToolkitTestApplication application;
220 tet_infoline(" UtcDaliToolkitTextFieldNewP");
221 TextField textField = TextField::New();
222 DALI_TEST_CHECK( textField );
226 // Positive test case for a method
227 int UtcDaliTextFieldGetPropertyP(void)
229 ToolkitTestApplication application;
230 tet_infoline(" UtcDaliToolkitTextFieldGetPropertyP");
231 TextField field = TextField::New();
232 DALI_TEST_CHECK( field );
234 // Check Property Indices are correct
235 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_RENDERING_BACKEND ) == TextField::Property::RENDERING_BACKEND );
236 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_TEXT ) == TextField::Property::TEXT );
237 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_PLACEHOLDER_TEXT ) == TextField::Property::PLACEHOLDER_TEXT );
238 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_PLACEHOLDER_TEXT_FOCUSED ) == TextField::Property::PLACEHOLDER_TEXT_FOCUSED );
239 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_FONT_FAMILY ) == TextField::Property::FONT_FAMILY );
240 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_FONT_STYLE ) == TextField::Property::FONT_STYLE );
241 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_POINT_SIZE ) == TextField::Property::POINT_SIZE );
242 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_MAX_LENGTH ) == TextField::Property::MAX_LENGTH );
243 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_EXCEED_POLICY ) == TextField::Property::EXCEED_POLICY );
244 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_HORIZONTAL_ALIGNMENT ) == TextField::Property::HORIZONTAL_ALIGNMENT );
245 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_VERTICAL_ALIGNMENT ) == TextField::Property::VERTICAL_ALIGNMENT );
246 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_TEXT_COLOR ) == TextField::Property::TEXT_COLOR );
247 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_PLACEHOLDER_TEXT_COLOR ) == TextField::Property::PLACEHOLDER_TEXT_COLOR );
248 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SHADOW_OFFSET ) == TextField::Property::SHADOW_OFFSET );
249 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SHADOW_COLOR ) == TextField::Property::SHADOW_COLOR );
250 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_PRIMARY_CURSOR_COLOR ) == TextField::Property::PRIMARY_CURSOR_COLOR );
251 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SECONDARY_CURSOR_COLOR ) == TextField::Property::SECONDARY_CURSOR_COLOR );
252 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_ENABLE_CURSOR_BLINK ) == TextField::Property::ENABLE_CURSOR_BLINK );
253 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_CURSOR_BLINK_INTERVAL ) == TextField::Property::CURSOR_BLINK_INTERVAL );
254 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_CURSOR_BLINK_DURATION ) == TextField::Property::CURSOR_BLINK_DURATION );
255 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_CURSOR_WIDTH ) == TextField::Property::CURSOR_WIDTH );
256 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_GRAB_HANDLE_IMAGE ) == TextField::Property::GRAB_HANDLE_IMAGE );
257 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_GRAB_HANDLE_PRESSED_IMAGE ) == TextField::Property::GRAB_HANDLE_PRESSED_IMAGE );
258 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SCROLL_THRESHOLD ) == TextField::Property::SCROLL_THRESHOLD );
259 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SCROLL_SPEED ) == TextField::Property::SCROLL_SPEED );
260 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HANDLE_IMAGE_LEFT ) == TextField::Property::SELECTION_HANDLE_IMAGE_LEFT );
261 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HANDLE_IMAGE_RIGHT ) == TextField::Property::SELECTION_HANDLE_IMAGE_RIGHT );
262 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HANDLE_PRESSED_IMAGE_LEFT ) == TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_LEFT );
263 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HANDLE_PRESSED_IMAGE_RIGHT ) == TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_RIGHT );
264 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HANDLE_MARKER_IMAGE_LEFT ) == TextField::Property::SELECTION_HANDLE_MARKER_IMAGE_LEFT );
265 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HANDLE_MARKER_IMAGE_RIGHT ) == TextField::Property::SELECTION_HANDLE_MARKER_IMAGE_RIGHT );
266 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HIGHLIGHT_COLOR ) == TextField::Property::SELECTION_HIGHLIGHT_COLOR );
267 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_DECORATION_BOUNDING_BOX ) == TextField::Property::DECORATION_BOUNDING_BOX );
268 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_INPUT_METHOD_SETTINGS ) == TextField::Property::INPUT_METHOD_SETTINGS );
269 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_INPUT_COLOR ) == TextField::Property::INPUT_COLOR );
270 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_ENABLE_MARKUP ) == TextField::Property::ENABLE_MARKUP );
271 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_INPUT_FONT_FAMILY ) == TextField::Property::INPUT_FONT_FAMILY );
272 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_INPUT_FONT_STYLE ) == TextField::Property::INPUT_FONT_STYLE );
273 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_INPUT_POINT_SIZE ) == TextField::Property::INPUT_POINT_SIZE );
277 bool SetPropertyMapRetrieved( TextField& field, const Property::Index property, const std::string mapKey, const std::string mapValue )
280 Property::Map imageMap;
281 imageMap[mapKey] =mapValue;
283 field.SetProperty( property , imageMap );
284 Property::Value propValue = field.GetProperty( property );
285 Property::Map* resultMap = propValue.GetMap();
287 if ( resultMap->Find( mapKey )->Get< std::string>() == mapValue )
295 // Positive test case for a method
296 int UtcDaliTextFieldSetPropertyP(void)
298 ToolkitTestApplication application;
299 tet_infoline(" UtcDaliToolkitTextFieldSetPropertyP");
300 TextField field = TextField::New();
301 DALI_TEST_CHECK( field );
302 Stage::GetCurrent().Add( field );
304 // Note - we can't check the defaults since the stylesheets are platform-specific
306 // Check the render backend property.
307 field.SetProperty( TextField::Property::RENDERING_BACKEND, Text::RENDERING_SHARED_ATLAS );
308 DALI_TEST_EQUALS( (Text::RenderingType)field.GetProperty<int>( TextField::Property::RENDERING_BACKEND ), Text::RENDERING_SHARED_ATLAS, TEST_LOCATION );
310 // Check text property.
311 field.SetProperty( TextField::Property::TEXT, "Setting Text" );
312 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::TEXT ), std::string("Setting Text"), TEST_LOCATION );
314 // Check placeholder text properties.
315 field.SetProperty( TextField::Property::PLACEHOLDER_TEXT, "Setting Placeholder Text" );
316 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::PLACEHOLDER_TEXT ), std::string("Setting Placeholder Text"), TEST_LOCATION );
318 field.SetProperty( TextField::Property::PLACEHOLDER_TEXT_FOCUSED, "Setting Placeholder Text Focused" );
319 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::PLACEHOLDER_TEXT_FOCUSED ), std::string("Setting Placeholder Text Focused"), TEST_LOCATION );
321 // Check font properties.
322 field.SetProperty( TextField::Property::FONT_FAMILY, "Setting font family" );
323 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::FONT_FAMILY ), std::string("Setting font family"), TEST_LOCATION );
324 field.SetProperty( TextField::Property::FONT_STYLE, "Setting font style" );
325 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::FONT_STYLE ), std::string("Setting font style"), TEST_LOCATION );
326 field.SetProperty( TextField::Property::POINT_SIZE, 10.f );
327 DALI_TEST_EQUALS( field.GetProperty<float>( TextField::Property::POINT_SIZE ), 10.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
329 // Check that the MAX_LENGTH property can be correctly set
330 const int maxNumberOfCharacters = 20;
331 field.SetProperty( TextField::Property::MAX_LENGTH, maxNumberOfCharacters );
332 DALI_TEST_EQUALS( field.GetProperty<int>( TextField::Property::MAX_LENGTH ), maxNumberOfCharacters, TEST_LOCATION );
334 // Check exceed policy
335 // Set a different exceed policy is not implemented.
337 // Check that the Alignment properties can be correctly set
338 field.SetProperty( TextField::Property::HORIZONTAL_ALIGNMENT, "END" );
339 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::HORIZONTAL_ALIGNMENT ), "END", TEST_LOCATION );
340 field.SetProperty( TextField::Property::VERTICAL_ALIGNMENT, "CENTER" );
341 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::VERTICAL_ALIGNMENT ), "CENTER", TEST_LOCATION );
343 // Check text's color property
344 field.SetProperty( TextField::Property::TEXT_COLOR, Color::WHITE );
345 DALI_TEST_EQUALS( field.GetProperty<Vector4>( TextField::Property::TEXT_COLOR ), Color::WHITE, TEST_LOCATION );
347 // Check placeholder text's color property.
348 field.SetProperty( TextField::Property::PLACEHOLDER_TEXT_COLOR, Color::RED );
349 DALI_TEST_EQUALS( field.GetProperty<Vector4>( TextField::Property::PLACEHOLDER_TEXT_COLOR ), Color::RED, TEST_LOCATION );
351 // Check shadow properties.
352 field.SetProperty( TextField::Property::SHADOW_OFFSET, Vector2( 1.f, 1.f ) );
353 DALI_TEST_EQUALS( field.GetProperty<Vector2>( TextField::Property::SHADOW_OFFSET ), Vector2( 1.f, 1.f ), TEST_LOCATION );
354 field.SetProperty( TextField::Property::SHADOW_COLOR, Color::GREEN );
355 DALI_TEST_EQUALS( field.GetProperty<Vector4>( TextField::Property::SHADOW_COLOR ), Color::GREEN, TEST_LOCATION );
357 // Check cursor properties
358 field.SetProperty( TextField::Property::PRIMARY_CURSOR_COLOR, Color::RED );
359 DALI_TEST_EQUALS( field.GetProperty<Vector4>( TextField::Property::PRIMARY_CURSOR_COLOR ), Color::RED, TEST_LOCATION );
360 field.SetProperty( TextField::Property::SECONDARY_CURSOR_COLOR, Color::BLUE );
361 DALI_TEST_EQUALS( field.GetProperty<Vector4>( TextField::Property::SECONDARY_CURSOR_COLOR ), Color::BLUE, TEST_LOCATION );
363 field.SetProperty( TextField::Property::ENABLE_CURSOR_BLINK, false );
364 DALI_TEST_EQUALS( field.GetProperty<bool>( TextField::Property::ENABLE_CURSOR_BLINK ), false, TEST_LOCATION );
365 field.SetProperty( TextField::Property::CURSOR_BLINK_INTERVAL, 1.f );
366 DALI_TEST_EQUALS( field.GetProperty<float>( TextField::Property::CURSOR_BLINK_INTERVAL ), 1.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
367 field.SetProperty( TextField::Property::CURSOR_BLINK_DURATION, 10.f );
368 DALI_TEST_EQUALS( field.GetProperty<float>( TextField::Property::CURSOR_BLINK_DURATION ), 10.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
369 field.SetProperty( TextField::Property::CURSOR_WIDTH, 1 );
370 DALI_TEST_EQUALS( field.GetProperty<int>( TextField::Property::CURSOR_WIDTH ), 1, TEST_LOCATION );
372 // Check scroll properties.
373 field.SetProperty( TextField::Property::SCROLL_THRESHOLD, 1.f );
374 DALI_TEST_EQUALS( field.GetProperty<float>( TextField::Property::SCROLL_THRESHOLD ), 1.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
375 field.SetProperty( TextField::Property::SCROLL_SPEED, 100.f );
376 DALI_TEST_EQUALS( field.GetProperty<float>( TextField::Property::SCROLL_SPEED ), 100.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
378 // Check handle images
379 field.SetProperty( TextField::Property::GRAB_HANDLE_IMAGE, "image1" );
380 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::GRAB_HANDLE_IMAGE ), "image1", TEST_LOCATION );
381 field.SetProperty( TextField::Property::GRAB_HANDLE_PRESSED_IMAGE, "image2" );
382 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::GRAB_HANDLE_PRESSED_IMAGE ), "image2", TEST_LOCATION );
383 field.SetProperty( TextField::Property::SELECTION_HANDLE_IMAGE_LEFT, "image3" );
385 // Check handle images
386 DALI_TEST_CHECK( SetPropertyMapRetrieved( field, TextField::Property::SELECTION_HANDLE_IMAGE_LEFT, "filename", "leftHandleImage" ) );
387 DALI_TEST_CHECK( SetPropertyMapRetrieved( field, TextField::Property::SELECTION_HANDLE_IMAGE_RIGHT, "filename", "rightHandleImage" ) );
388 DALI_TEST_CHECK( SetPropertyMapRetrieved( field, TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_LEFT, "filename", "leftHandleImagePressed" ) );
389 DALI_TEST_CHECK( SetPropertyMapRetrieved( field, TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_RIGHT, "filename", "rightHandleImagePressed" ) );
390 DALI_TEST_CHECK( SetPropertyMapRetrieved( field, TextField::Property::SELECTION_HANDLE_MARKER_IMAGE_LEFT, "filename", "leftHandleMarkerImage" ) );
391 DALI_TEST_CHECK( SetPropertyMapRetrieved( field, TextField::Property::SELECTION_HANDLE_MARKER_IMAGE_RIGHT, "filename", "rightHandleMarkerImage" ) );
393 // Check the highlight color
394 field.SetProperty( TextField::Property::SELECTION_HIGHLIGHT_COLOR, Color::GREEN );
395 DALI_TEST_EQUALS( field.GetProperty<Vector4>( TextField::Property::SELECTION_HIGHLIGHT_COLOR ), Color::GREEN, TEST_LOCATION );
397 // Decoration bounding box
398 field.SetProperty( TextField::Property::DECORATION_BOUNDING_BOX, Rect<int>( 0, 0, 1, 1 ) );
399 DALI_TEST_EQUALS( field.GetProperty<Rect <int > >( TextField::Property::DECORATION_BOUNDING_BOX ), Rect<int>( 0, 0, 1, 1 ), TEST_LOCATION );
401 // Check input color property.
402 field.SetProperty( TextField::Property::INPUT_COLOR, Color::YELLOW );
403 DALI_TEST_EQUALS( field.GetProperty<Vector4>( TextField::Property::INPUT_COLOR ), Color::YELLOW, TEST_LOCATION );
405 // Check the enable markup property.
406 DALI_TEST_CHECK( !field.GetProperty<bool>( TextField::Property::ENABLE_MARKUP ) );
407 field.SetProperty( TextField::Property::ENABLE_MARKUP, true );
408 DALI_TEST_CHECK( field.GetProperty<bool>( TextField::Property::ENABLE_MARKUP ) );
410 // Check input font properties.
411 field.SetProperty( TextField::Property::INPUT_FONT_FAMILY, "Setting input font family" );
412 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::INPUT_FONT_FAMILY ), "Setting input font family", TEST_LOCATION );
413 field.SetProperty( TextField::Property::INPUT_FONT_STYLE, "Setting input font style" );
414 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::INPUT_FONT_STYLE ), "Setting input font style", TEST_LOCATION );
415 field.SetProperty( TextField::Property::INPUT_POINT_SIZE, 12.f );
416 DALI_TEST_EQUALS( field.GetProperty<float>( TextField::Property::INPUT_POINT_SIZE ), 12.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
421 // Positive Atlas Text Renderer test
422 int utcDaliTextFieldAtlasRenderP(void)
424 ToolkitTestApplication application;
425 tet_infoline(" UtcDaliToolkitTextFieldAtlasRenderP");
426 StyleManager styleManager = StyleManager::Get();
427 styleManager.ApplyDefaultTheme();
428 TextField field = TextField::New();
429 DALI_TEST_CHECK( field );
431 field.SetProperty( TextField::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
433 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
435 Stage::GetCurrent().Add( field );
439 // Render some text with the shared atlas backend
440 field.SetProperty( TextField::Property::RENDERING_BACKEND, Text::RENDERING_SHARED_ATLAS );
441 application.SendNotification();
442 application.Render();
446 tet_result(TET_FAIL);
451 // Positive test for the textChanged signal.
452 int utcDaliTextFieldTextChangedP(void)
454 ToolkitTestApplication application;
455 tet_infoline(" utcDaliTextFieldTextChangedP");
456 TextField field = TextField::New();
457 DALI_TEST_CHECK( field );
459 Stage::GetCurrent().Add( field );
461 field.TextChangedSignal().Connect(&TestTextChangedCallback);
463 gTextChangedCallBackCalled = false;
464 field.SetProperty( TextField::Property::TEXT, "ABC" );
465 DALI_TEST_CHECK( gTextChangedCallBackCalled );
467 application.SendNotification();
469 field.SetKeyInputFocus();
471 gTextChangedCallBackCalled = false;
472 application.ProcessEvent( GenerateKey( "D", "D", 0, 0, 0, Integration::KeyEvent::Down ) );
473 DALI_TEST_CHECK( gTextChangedCallBackCalled );
478 // Negative test for the textChanged signal.
479 int utcDaliTextFieldTextChangedN(void)
481 ToolkitTestApplication application;
482 tet_infoline(" utcDaliTextFieldTextChangedN");
483 TextField field = TextField::New();
484 DALI_TEST_CHECK( field );
486 Stage::GetCurrent().Add( field );
488 field.TextChangedSignal().Connect(&TestTextChangedCallback);
490 gTextChangedCallBackCalled = false;
491 field.SetProperty( TextField::Property::PLACEHOLDER_TEXT, "ABC" ); // Setting placeholder, not TEXT
492 DALI_TEST_CHECK( !gTextChangedCallBackCalled );
497 // Positive test for Max Characters reached signal.
498 int utcDaliTextFieldMaxCharactersReachedP(void)
500 ToolkitTestApplication application;
501 tet_infoline(" utcDaliTextFieldMaxCharactersReachedP");
502 TextField field = TextField::New();
503 DALI_TEST_CHECK( field );
505 Stage::GetCurrent().Add( field );
507 const int maxNumberOfCharacters = 1;
508 field.SetProperty( TextField::Property::MAX_LENGTH, maxNumberOfCharacters );
510 field.SetKeyInputFocus();
512 gMaxCharactersCallBackCalled = false;
513 field.MaxLengthReachedSignal().Connect(&TestMaxLengthReachedCallback);
515 application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
516 application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
518 DALI_TEST_CHECK( gMaxCharactersCallBackCalled );
523 // Negative test for Max Characters reached signal.
524 int utcDaliTextFieldMaxCharactersReachedN(void)
526 ToolkitTestApplication application;
527 tet_infoline(" utcDaliTextFieldMaxCharactersReachedN");
528 TextField field = TextField::New();
529 DALI_TEST_CHECK( field );
531 Stage::GetCurrent().Add( field );
533 const int maxNumberOfCharacters = 3;
534 field.SetProperty( TextField::Property::MAX_LENGTH, maxNumberOfCharacters );
536 field.SetKeyInputFocus();
538 gMaxCharactersCallBackCalled = false;
539 field.MaxLengthReachedSignal().Connect(&TestMaxLengthReachedCallback);
541 application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
542 application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
544 DALI_TEST_CHECK( !gMaxCharactersCallBackCalled );
549 int utcDaliTextFieldEvent01(void)
551 ToolkitTestApplication application;
552 tet_infoline(" utcDaliTextFieldEvent01");
554 // Creates a tap event. After creating a tap event the text field should
555 // have the focus and add text with key events should be possible.
557 TextField field = TextField::New();
558 DALI_TEST_CHECK( field );
560 Stage::GetCurrent().Add( field );
562 field.SetSize( 300.f, 50.f );
563 field.SetParentOrigin( ParentOrigin::TOP_LEFT );
564 field.SetAnchorPoint( AnchorPoint::TOP_LEFT );
566 // Avoid a crash when core load gl resources.
567 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
570 application.SendNotification();
571 application.Render();
573 // Add a key event but as the text field has not the focus it should do nothing.
574 application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
577 application.SendNotification();
578 application.Render();
580 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::TEXT ), std::string(""), TEST_LOCATION );
582 // Create a tap event to touch the text field.
583 application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 150.0f, 25.0f ) ) );
584 application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 150.0f, 25.0f ) ) );
587 application.SendNotification();
588 application.Render();
590 // Now the text field has the focus, so it can handle the key events.
591 application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
592 application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
595 application.SendNotification();
596 application.Render();
598 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::TEXT ), std::string("aa"), TEST_LOCATION );
600 // Create a second text field and send key events to it.
601 TextField field2 = TextField::New();
603 field2.SetParentOrigin( ParentOrigin::TOP_LEFT );
604 field2.SetAnchorPoint( AnchorPoint::TOP_LEFT );
605 field2.SetSize( 100.f, 100.f );
606 field2.SetPosition( 100.f, 100.f );
608 Stage::GetCurrent().Add( field2 );
611 application.SendNotification();
612 application.Render();
614 // Create a tap event on the second text field.
615 application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 150.0f, 125.0f ) ) );
616 application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 150.0f, 125.0f ) ) );
619 application.SendNotification();
620 application.Render();
622 // The second text field has the focus. It should handle the key events.
623 application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
624 application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
627 application.SendNotification();
628 application.Render();
630 // Check the text has been added to the second text field.
631 DALI_TEST_EQUALS( field2.GetProperty<std::string>( TextField::Property::TEXT ), std::string("aa"), TEST_LOCATION );
636 int utcDaliTextFieldEvent02(void)
638 ToolkitTestApplication application;
639 tet_infoline(" utcDaliTextFieldEvent02");
641 // Checks if the right number of actors are created.
643 TextField field = TextField::New();
644 field.SetProperty( TextField::Property::POINT_SIZE, 10.f );
645 DALI_TEST_CHECK( field );
647 Stage::GetCurrent().Add( field );
649 field.SetSize( 300.f, 50.f );
650 field.SetParentOrigin( ParentOrigin::TOP_LEFT );
651 field.SetAnchorPoint( AnchorPoint::TOP_LEFT );
653 // Avoid a crash when core load gl resources.
654 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
657 application.SendNotification();
658 application.Render();
660 // Check there are the expected number of children ( active layer, offscreen root actor, and the offscreen image actor
661 DALI_TEST_EQUALS( field.GetChildCount(), 3u, TEST_LOCATION );
663 Actor layer = field.GetChildAt( 0u );
664 DALI_TEST_CHECK( layer.IsLayer() );
666 Actor offscreenRoot = field.GetChildAt( 1u );
667 DALI_TEST_CHECK( offscreenRoot.IsLayer() );
668 DALI_TEST_EQUALS( offscreenRoot.GetChildCount(), 1u, TEST_LOCATION ); // The camera actor.
670 Actor offscreenImage = field.GetChildAt( 2u );
671 DALI_TEST_CHECK( offscreenImage );
673 // Create a tap event to touch the text field.
674 application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 150.0f, 25.0f ) ) );
675 application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 150.0f, 25.0f ) ) );
678 application.SendNotification();
679 application.Render();
681 DALI_TEST_EQUALS( layer.GetChildCount(), 1u, TEST_LOCATION ); // The cursor.
682 DALI_TEST_EQUALS( offscreenRoot.GetChildCount(), 1u, TEST_LOCATION ); // The camera actor.
684 // Now the text field has the focus, so it can handle the key events.
685 application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
686 application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
689 application.SendNotification();
690 application.Render();
692 // Checks the cursor and the renderer have been created.
693 DALI_TEST_EQUALS( layer.GetChildCount(), 1u, TEST_LOCATION ); // The cursor.
694 DALI_TEST_EQUALS( offscreenRoot.GetChildCount(), 2u, TEST_LOCATION ); // The camera actor and the renderer
696 Control cursor = Control::DownCast( layer.GetChildAt( 0u ) );
697 DALI_TEST_CHECK( cursor );
699 CameraActor camera = CameraActor::DownCast( offscreenRoot.GetChildAt( 0u ) );
700 DALI_TEST_CHECK( camera );
702 Renderer renderer = offscreenRoot.GetChildAt( 1u ).GetRendererAt( 0u );
703 DALI_TEST_CHECK( renderer );
705 // Move the cursor and check the position changes.
706 Vector3 position1 = cursor.GetCurrentPosition();
708 application.ProcessEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Integration::KeyEvent::Down ) );
709 application.ProcessEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Integration::KeyEvent::Down ) );
712 application.SendNotification();
713 application.Render();
715 Vector3 position2 = cursor.GetCurrentPosition();
717 DALI_TEST_CHECK( position2.x < position1.x );
719 application.ProcessEvent( GenerateKey( "", "", DALI_KEY_CURSOR_RIGHT, 0, 0, Integration::KeyEvent::Down ) );
720 application.ProcessEvent( GenerateKey( "", "", DALI_KEY_CURSOR_RIGHT, 0, 0, Integration::KeyEvent::Down ) );
723 application.SendNotification();
724 application.Render();
726 Vector3 position3 = cursor.GetCurrentPosition();
728 DALI_TEST_EQUALS( position1, position3, TEST_LOCATION ); // Should be in the same position1.
730 // Send some taps and check the cursor positions.
732 // Try to tap at the beginning.
733 application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 1.f, 25.0f ) ) );
734 application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 1.f, 25.0f ) ) );
737 application.SendNotification();
738 application.Render();
740 // Cursor position should be the same than position1.
741 Vector3 position4 = cursor.GetCurrentPosition();
743 DALI_TEST_EQUALS( position2, position4, TEST_LOCATION ); // Should be in the same position2.
745 // Tap away from the start position.
746 application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 16.f, 25.0f ) ) );
747 application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 16.0f, 25.0f ) ) );
750 application.SendNotification();
751 application.Render();
753 Vector3 position5 = cursor.GetCurrentPosition();
755 DALI_TEST_CHECK( position5.x > position4.x );
757 // Remove all the text.
758 application.ProcessEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::Down ) );
759 application.ProcessEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::Down ) );
760 field.SetProperty( TextField::Property::TEXT, "" );
763 application.SendNotification();
764 application.Render();
766 // Cursor position should be the same than position2.
767 Vector3 position6 = cursor.GetCurrentPosition();
769 DALI_TEST_EQUALS( position2, position6, TEST_LOCATION );// Should be in the same position2.
771 // Should not be a renderer.
772 DALI_TEST_EQUALS( offscreenRoot.GetChildCount(), 1u, TEST_LOCATION ); // The camera actor only.
777 int utcDaliTextFieldEvent03(void)
779 ToolkitTestApplication application;
780 tet_infoline(" utcDaliTextFieldEvent03");
782 // Checks if the highlight actor is created.
784 TextField field = TextField::New();
785 DALI_TEST_CHECK( field );
787 Stage::GetCurrent().Add( field );
789 field.SetProperty( TextField::Property::TEXT, "This is a long text for the size of the text-field." );
790 field.SetProperty( TextField::Property::POINT_SIZE, 10.f );
791 field.SetSize( 30.f, 50.f );
792 field.SetParentOrigin( ParentOrigin::TOP_LEFT );
793 field.SetAnchorPoint( AnchorPoint::TOP_LEFT );
795 // Avoid a crash when core load gl resources.
796 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
799 application.SendNotification();
800 application.Render();
802 // Tap first to get the focus.
803 application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 3.f, 25.0f ) ) );
804 application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 3.f, 25.0f ) ) );
807 application.SendNotification();
808 application.Render();
810 // Double tap to select a word.
811 application.ProcessEvent( GenerateTap( Gesture::Possible, 2u, 1u, Vector2( 3.f, 25.0f ) ) );
812 application.ProcessEvent( GenerateTap( Gesture::Started, 2u, 1u, Vector2( 3.f, 25.0f ) ) );
815 application.SendNotification();
816 application.Render();
818 // The offscreen root actor should have three actors: the camera, a renderer and the highlight actor.
819 Actor offscreenRoot = field.GetChildAt( 1u );
820 DALI_TEST_CHECK( offscreenRoot.IsLayer() );
822 CameraActor camera = CameraActor::DownCast( offscreenRoot.GetChildAt( 0u ) );
823 DALI_TEST_CHECK( camera );
825 Renderer renderer = offscreenRoot.GetChildAt( 1u ).GetRendererAt( 0u );
826 DALI_TEST_CHECK( renderer );
828 Renderer highlight = offscreenRoot.GetChildAt( 2u ).GetRendererAt( 0u );
829 DALI_TEST_CHECK( highlight );