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/integration-api/events/key-event-integ.h>
21 #include <dali/integration-api/events/tap-gesture-event.h>
22 #include <dali-toolkit-test-suite-utils.h>
23 #include <dali-toolkit/dali-toolkit.h>
24 #include <dali-toolkit/devel-api/styling/style-manager.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 = "rendering-backend";
43 const char* const PROPERTY_NAME_TEXT = "text";
44 const char* const PROPERTY_NAME_PLACEHOLDER_TEXT = "placeholder-text";
45 const char* const PROPERTY_NAME_PLACEHOLDER_TEXT_FOCUSED = "placeholder-text-focused";
46 const char* const PROPERTY_NAME_FONT_FAMILY = "font-family";
47 const char* const PROPERTY_NAME_FONT_STYLE = "font-style";
48 const char* const PROPERTY_NAME_POINT_SIZE = "point-size";
49 const char* const PROPERTY_NAME_MAX_LENGTH = "max-length";
50 const char* const PROPERTY_NAME_EXCEED_POLICY = "exceed-policy";
51 const char* const PROPERTY_NAME_HORIZONTAL_ALIGNMENT = "horizontal-alignment";
52 const char* const PROPERTY_NAME_VERTICAL_ALIGNMENT = "vertical-alignment";
53 const char* const PROPERTY_NAME_TEXT_COLOR = "text-color";
54 const char* const PROPERTY_NAME_PLACEHOLDER_TEXT_COLOR = "placeholder-text-color";
55 const char* const PROPERTY_NAME_SHADOW_OFFSET = "shadow-offset";
56 const char* const PROPERTY_NAME_SHADOW_COLOR = "shadow-color";
57 const char* const PROPERTY_NAME_PRIMARY_CURSOR_COLOR = "primary-cursor-color";
58 const char* const PROPERTY_NAME_SECONDARY_CURSOR_COLOR = "secondary-cursor-color";
59 const char* const PROPERTY_NAME_ENABLE_CURSOR_BLINK = "enable-cursor-blink";
60 const char* const PROPERTY_NAME_CURSOR_BLINK_INTERVAL = "cursor-blink-interval";
61 const char* const PROPERTY_NAME_CURSOR_BLINK_DURATION = "cursor-blink-duration";
62 const char* const PROPERTY_NAME_GRAB_HANDLE_IMAGE = "grab-handle-image";
63 const char* const PROPERTY_NAME_GRAB_HANDLE_PRESSED_IMAGE = "grab-handle-pressed-image";
64 const char* const PROPERTY_NAME_SCROLL_THRESHOLD = "scroll-threshold";
65 const char* const PROPERTY_NAME_SCROLL_SPEED = "scroll-speed";
66 const char* const PROPERTY_NAME_SELECTION_HANDLE_IMAGE_LEFT = "selection-handle-image-left";
67 const char* const PROPERTY_NAME_SELECTION_HANDLE_IMAGE_RIGHT = "selection-handle-image-right";
68 const char* const PROPERTY_NAME_SELECTION_HANDLE_PRESSED_IMAGE_LEFT = "selection-handle-pressed-image-left";
69 const char* const PROPERTY_NAME_SELECTION_HANDLE_PRESSED_IMAGE_RIGHT = "selection-handle-pressed-image-right";
70 const char* const PROPERTY_NAME_SELECTION_HIGHLIGHT_COLOR = "selection-highlight-color";
71 const char* const PROPERTY_NAME_DECORATION_BOUNDING_BOX = "decoration-bounding-box";
72 const char* const PROPERTY_NAME_INPUT_METHOD_SETTINGS = "input-method-settings";
74 const unsigned int DEFAULT_RENDERING_BACKEND = Dali::Toolkit::Text::DEFAULT_RENDERING_BACKEND;
76 const Vector4 PLACEHOLDER_TEXT_COLOR( 0.8f, 0.8f, 0.8f, 0.8f );
77 const Dali::Vector4 LIGHT_BLUE( (0xb2 / 255.0f), (0xeb / 255.0f), (0xf2 / 255.0f), 0.5f ); // The text highlight color.
79 const unsigned int CURSOR_BLINK_INTERVAL = 500u; // Cursor blink interval
80 const float TO_MILLISECONDS = 1000.f;
81 const float TO_SECONDS = 1.f / TO_MILLISECONDS;
83 const float SCROLL_THRESHOLD = 10.f;
84 const float SCROLL_SPEED = 300.f;
86 static bool gTextChangedCallBackCalled;
87 static bool gMaxCharactersCallBackCalled;
89 static void TestTextChangedCallback( TextField control )
91 tet_infoline(" TestTextChangedCallback");
93 gTextChangedCallBackCalled = true;
96 static void TestMaxLengthReachedCallback( TextField control )
98 tet_infoline(" TestMaxLengthReachedCallback");
100 gMaxCharactersCallBackCalled = true;
103 // Generate a TapGestureEvent to send to Core.
104 Integration::TapGestureEvent GenerateTap(
105 Gesture::State state,
106 unsigned int numberOfTaps,
107 unsigned int numberOfTouches,
110 Integration::TapGestureEvent tap( state );
112 tap.numberOfTaps = numberOfTaps;
113 tap.numberOfTouches = numberOfTouches;
119 // Generate a KeyEvent to send to Core.
120 Integration::KeyEvent GenerateKey( const std::string& keyName,
121 const std::string& keyString,
124 unsigned long timeStamp,
125 const Integration::KeyEvent::State& keyState )
127 return Integration::KeyEvent( keyName,
137 int UtcDaliToolkitTextFieldConstructorP(void)
139 ToolkitTestApplication application;
140 tet_infoline(" UtcDaliToolkitTextFieldConstructorP");
142 DALI_TEST_CHECK( !textField );
146 int UtcDaliToolkitTextFieldNewP(void)
148 ToolkitTestApplication application;
149 tet_infoline(" UtcDaliToolkitTextFieldNewP");
150 TextField textField = TextField::New();
151 DALI_TEST_CHECK( textField );
155 int UtcDaliToolkitTextFieldDownCastP(void)
157 ToolkitTestApplication application;
158 tet_infoline(" UtcDaliToolkitTextFieldDownCastP");
159 TextField textField1 = TextField::New();
160 BaseHandle object( textField1 );
162 TextField textField2 = TextField::DownCast( object );
163 DALI_TEST_CHECK( textField2 );
165 TextField textField3 = DownCast< TextField >( object );
166 DALI_TEST_CHECK( textField3 );
170 int UtcDaliToolkitTextFieldDownCastN(void)
172 ToolkitTestApplication application;
173 tet_infoline(" UtcDaliToolkitTextFieldDownCastN");
174 BaseHandle uninitializedObject;
175 TextField textField1 = TextField::DownCast( uninitializedObject );
176 DALI_TEST_CHECK( !textField1 );
178 TextField textField2 = DownCast< TextField >( uninitializedObject );
179 DALI_TEST_CHECK( !textField2 );
183 int UtcDaliToolkitTextFieldCopyConstructorP(void)
185 ToolkitTestApplication application;
186 tet_infoline(" UtcDaliToolkitTextFieldCopyConstructorP");
187 TextField textField = TextField::New();
188 textField.SetProperty( TextField::Property::TEXT, "Test" );
190 TextField copy( textField );
191 DALI_TEST_CHECK( copy );
192 DALI_TEST_CHECK( copy.GetProperty<std::string>( TextLabel::Property::TEXT ) == textField.GetProperty<std::string>( TextLabel::Property::TEXT ) );
196 int UtcDaliToolkitTextFieldAssignmentOperatorP(void)
198 ToolkitTestApplication application;
199 tet_infoline(" UtcDaliToolkitTextFieldAssignmentOperatorP");
200 TextField textField = TextField::New();
201 textField.SetProperty( TextField::Property::TEXT, "Test" );
203 TextField copy = textField;
204 DALI_TEST_CHECK( copy );
205 DALI_TEST_CHECK( copy.GetProperty<std::string>( TextField::Property::TEXT ) == textField.GetProperty<std::string>( TextField::Property::TEXT ) );
209 int UtcDaliTextFieldNewP(void)
211 ToolkitTestApplication application;
212 tet_infoline(" UtcDaliToolkitTextFieldNewP");
213 TextField textField = TextField::New();
214 DALI_TEST_CHECK( textField );
218 // Positive test case for a method
219 int UtcDaliTextFieldGetPropertyP(void)
221 ToolkitTestApplication application;
222 tet_infoline(" UtcDaliToolkitTextFieldGetPropertyP");
223 TextField field = TextField::New();
224 DALI_TEST_CHECK( field );
226 // Check Property Indices are correct
227 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_RENDERING_BACKEND ) == TextField::Property::RENDERING_BACKEND );
228 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_TEXT ) == TextField::Property::TEXT );
229 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_PLACEHOLDER_TEXT ) == TextField::Property::PLACEHOLDER_TEXT );
230 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_PLACEHOLDER_TEXT_FOCUSED ) == TextField::Property::PLACEHOLDER_TEXT_FOCUSED );
231 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_FONT_FAMILY ) == TextField::Property::FONT_FAMILY );
232 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_FONT_STYLE ) == TextField::Property::FONT_STYLE );
233 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_POINT_SIZE ) == TextField::Property::POINT_SIZE );
234 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_MAX_LENGTH ) == TextField::Property::MAX_LENGTH );
235 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_EXCEED_POLICY ) == TextField::Property::EXCEED_POLICY );
236 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_HORIZONTAL_ALIGNMENT ) == TextField::Property::HORIZONTAL_ALIGNMENT );
237 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_VERTICAL_ALIGNMENT ) == TextField::Property::VERTICAL_ALIGNMENT );
238 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_TEXT_COLOR ) == TextField::Property::TEXT_COLOR );
239 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_PLACEHOLDER_TEXT_COLOR ) == TextField::Property::PLACEHOLDER_TEXT_COLOR );
240 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SHADOW_OFFSET ) == TextField::Property::SHADOW_OFFSET );
241 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SHADOW_COLOR ) == TextField::Property::SHADOW_COLOR );
242 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_PRIMARY_CURSOR_COLOR ) == TextField::Property::PRIMARY_CURSOR_COLOR );
243 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SECONDARY_CURSOR_COLOR ) == TextField::Property::SECONDARY_CURSOR_COLOR );
244 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_ENABLE_CURSOR_BLINK ) == TextField::Property::ENABLE_CURSOR_BLINK );
245 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_CURSOR_BLINK_INTERVAL ) == TextField::Property::CURSOR_BLINK_INTERVAL );
246 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_CURSOR_BLINK_DURATION ) == TextField::Property::CURSOR_BLINK_DURATION );
247 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_GRAB_HANDLE_IMAGE ) == TextField::Property::GRAB_HANDLE_IMAGE );
248 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_GRAB_HANDLE_PRESSED_IMAGE ) == TextField::Property::GRAB_HANDLE_PRESSED_IMAGE );
249 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SCROLL_THRESHOLD ) == TextField::Property::SCROLL_THRESHOLD );
250 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SCROLL_SPEED ) == TextField::Property::SCROLL_SPEED );
251 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HANDLE_IMAGE_LEFT ) == TextField::Property::SELECTION_HANDLE_IMAGE_LEFT );
252 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HANDLE_IMAGE_RIGHT ) == TextField::Property::SELECTION_HANDLE_IMAGE_RIGHT );
253 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HANDLE_PRESSED_IMAGE_LEFT ) == TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_LEFT );
254 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HANDLE_PRESSED_IMAGE_RIGHT ) == TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_RIGHT );
255 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HIGHLIGHT_COLOR ) == TextField::Property::SELECTION_HIGHLIGHT_COLOR );
256 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_DECORATION_BOUNDING_BOX ) == TextField::Property::DECORATION_BOUNDING_BOX );
257 DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_INPUT_METHOD_SETTINGS ) == TextField::Property::INPUT_METHOD_SETTINGS );
261 // Positive test case for a method
262 int UtcDaliTextFieldSetPropertyP(void)
264 ToolkitTestApplication application;
265 tet_infoline(" UtcDaliToolkitTextFieldSetPropertyP");
266 TextField field = TextField::New();
267 DALI_TEST_CHECK( field );
270 DALI_TEST_EQUALS( field.GetProperty<unsigned int>( TextField::Property::RENDERING_BACKEND ), DEFAULT_RENDERING_BACKEND, TEST_LOCATION );
271 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::TEXT ), std::string(""), TEST_LOCATION );
272 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::PLACEHOLDER_TEXT ), std::string(""), TEST_LOCATION );
273 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::PLACEHOLDER_TEXT_FOCUSED ), std::string(""), TEST_LOCATION );
274 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::FONT_FAMILY ), std::string(""), TEST_LOCATION );
275 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::FONT_STYLE ), std::string(""), TEST_LOCATION );
276 DALI_TEST_EQUALS( field.GetProperty<float>( TextField::Property::POINT_SIZE ), 0.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
277 DALI_TEST_EQUALS( field.GetProperty<int>( TextField::Property::MAX_LENGTH ), 50u, TEST_LOCATION );
278 DALI_TEST_EQUALS( field.GetProperty<int>( TextField::Property::EXCEED_POLICY ), TextField::EXCEED_POLICY_CLIP, TEST_LOCATION );
279 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::HORIZONTAL_ALIGNMENT ), "BEGIN", TEST_LOCATION );
280 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::VERTICAL_ALIGNMENT ), "TOP", TEST_LOCATION );
281 DALI_TEST_EQUALS( field.GetProperty<Vector4>( TextField::Property::TEXT_COLOR ), Color::BLACK, TEST_LOCATION );
282 DALI_TEST_EQUALS( field.GetProperty<Vector2>( TextField::Property::SHADOW_OFFSET ), Vector2::ZERO, TEST_LOCATION );
283 DALI_TEST_EQUALS( field.GetProperty<Vector4>( TextField::Property::PLACEHOLDER_TEXT_COLOR ), PLACEHOLDER_TEXT_COLOR, TEST_LOCATION );
284 DALI_TEST_EQUALS( field.GetProperty<Vector4>( TextField::Property::SHADOW_COLOR ), Color::BLACK, TEST_LOCATION );
285 DALI_TEST_EQUALS( field.GetProperty<Vector4>( TextField::Property::PRIMARY_CURSOR_COLOR ), Color::BLACK, TEST_LOCATION );
286 DALI_TEST_EQUALS( field.GetProperty<Vector4>( TextField::Property::SECONDARY_CURSOR_COLOR ), Color::BLACK, TEST_LOCATION );
287 DALI_TEST_EQUALS( field.GetProperty<bool>( TextField::Property::ENABLE_CURSOR_BLINK ), true, TEST_LOCATION );
288 DALI_TEST_EQUALS( field.GetProperty<float>( TextField::Property::CURSOR_BLINK_INTERVAL ), CURSOR_BLINK_INTERVAL * TO_SECONDS, TEST_LOCATION );
289 DALI_TEST_EQUALS( field.GetProperty<float>( TextField::Property::CURSOR_BLINK_DURATION ), 0.f, TEST_LOCATION );
290 DALI_TEST_EQUALS( field.GetProperty<float>( TextField::Property::SCROLL_THRESHOLD ), SCROLL_THRESHOLD, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
291 DALI_TEST_EQUALS( field.GetProperty<float>( TextField::Property::SCROLL_SPEED ), SCROLL_SPEED, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
292 DALI_TEST_EQUALS( field.GetProperty<Vector4>( TextField::Property::SELECTION_HIGHLIGHT_COLOR ), LIGHT_BLUE, TEST_LOCATION );
294 // Check the render backend property.
295 field.SetProperty( TextField::Property::RENDERING_BACKEND, Text::RENDERING_BASIC );
296 DALI_TEST_EQUALS( field.GetProperty<unsigned int>( TextField::Property::RENDERING_BACKEND ), Text::RENDERING_BASIC, TEST_LOCATION );
298 // Check text property.
299 field.SetProperty( TextField::Property::TEXT, "Setting Text" );
300 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::TEXT ), std::string("Setting Text"), TEST_LOCATION );
302 // Check placeholder text properties.
303 field.SetProperty( TextField::Property::PLACEHOLDER_TEXT, "Setting Placeholder Text" );
304 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::PLACEHOLDER_TEXT ), std::string("Setting Placeholder Text"), TEST_LOCATION );
306 field.SetProperty( TextField::Property::PLACEHOLDER_TEXT_FOCUSED, "Setting Placeholder Text Focused" );
307 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::PLACEHOLDER_TEXT_FOCUSED ), std::string("Setting Placeholder Text Focused"), TEST_LOCATION );
309 // Check font properties.
310 field.SetProperty( TextField::Property::FONT_FAMILY, "Setting font family" );
311 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::FONT_FAMILY ), std::string("Setting font family"), TEST_LOCATION );
312 field.SetProperty( TextField::Property::FONT_STYLE, "Setting font style" );
313 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::FONT_STYLE ), std::string("Setting font style"), TEST_LOCATION );
314 field.SetProperty( TextField::Property::POINT_SIZE, 10.f );
315 DALI_TEST_EQUALS( field.GetProperty<float>( TextField::Property::POINT_SIZE ), 10.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
317 // Check that the MAX_LENGTH property can be correctly set
318 const int maxNumberOfCharacters = 20;
319 field.SetProperty( TextField::Property::MAX_LENGTH, maxNumberOfCharacters );
320 DALI_TEST_EQUALS( field.GetProperty<int>( TextField::Property::MAX_LENGTH ), maxNumberOfCharacters, TEST_LOCATION );
322 // Check exceed policy
323 // Set a different exceed policy is not implemented.
325 // Check that the Alignment properties can be correctly set
326 field.SetProperty( TextField::Property::HORIZONTAL_ALIGNMENT, "END" );
327 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::HORIZONTAL_ALIGNMENT ), "END", TEST_LOCATION );
328 field.SetProperty( TextField::Property::VERTICAL_ALIGNMENT, "CENTER" );
329 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::VERTICAL_ALIGNMENT ), "CENTER", TEST_LOCATION );
331 // Check text's color property
332 field.SetProperty( TextField::Property::TEXT_COLOR, Color::WHITE );
333 DALI_TEST_EQUALS( field.GetProperty<Vector4>( TextField::Property::TEXT_COLOR ), Color::WHITE, TEST_LOCATION );
335 // Check placeholder text's color property.
336 field.SetProperty( TextField::Property::PLACEHOLDER_TEXT_COLOR, Color::RED );
337 DALI_TEST_EQUALS( field.GetProperty<Vector4>( TextField::Property::PLACEHOLDER_TEXT_COLOR ), Color::RED, TEST_LOCATION );
339 // Check shadow properties.
340 field.SetProperty( TextField::Property::SHADOW_OFFSET, Vector2( 1.f, 1.f ) );
341 DALI_TEST_EQUALS( field.GetProperty<Vector2>( TextField::Property::SHADOW_OFFSET ), Vector2( 1.f, 1.f ), TEST_LOCATION );
342 field.SetProperty( TextField::Property::SHADOW_COLOR, Color::GREEN );
343 DALI_TEST_EQUALS( field.GetProperty<Vector4>( TextField::Property::SHADOW_COLOR ), Color::GREEN, TEST_LOCATION );
345 // Check cursor properties
346 field.SetProperty( TextField::Property::PRIMARY_CURSOR_COLOR, Color::RED );
347 DALI_TEST_EQUALS( field.GetProperty<Vector4>( TextField::Property::PRIMARY_CURSOR_COLOR ), Color::RED, TEST_LOCATION );
348 field.SetProperty( TextField::Property::SECONDARY_CURSOR_COLOR, Color::BLUE );
349 DALI_TEST_EQUALS( field.GetProperty<Vector4>( TextField::Property::SECONDARY_CURSOR_COLOR ), Color::BLUE, TEST_LOCATION );
351 field.SetProperty( TextField::Property::ENABLE_CURSOR_BLINK, false );
352 DALI_TEST_EQUALS( field.GetProperty<bool>( TextField::Property::ENABLE_CURSOR_BLINK ), false, TEST_LOCATION );
353 field.SetProperty( TextField::Property::CURSOR_BLINK_INTERVAL, 1.f );
354 DALI_TEST_EQUALS( field.GetProperty<float>( TextField::Property::CURSOR_BLINK_INTERVAL ), 1.f, TEST_LOCATION );
355 field.SetProperty( TextField::Property::CURSOR_BLINK_DURATION, 10.f );
356 DALI_TEST_EQUALS( field.GetProperty<float>( TextField::Property::CURSOR_BLINK_DURATION ), 10.f, TEST_LOCATION );
358 // Check scroll properties.
359 field.SetProperty( TextField::Property::SCROLL_THRESHOLD, 1.f );
360 DALI_TEST_EQUALS( field.GetProperty<float>( TextField::Property::SCROLL_THRESHOLD ), 1.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
361 field.SetProperty( TextField::Property::SCROLL_SPEED, 100.f );
362 DALI_TEST_EQUALS( field.GetProperty<float>( TextField::Property::SCROLL_SPEED ), 100.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
364 // Check handle images
365 field.SetProperty( TextField::Property::GRAB_HANDLE_IMAGE, "image1" );
366 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::GRAB_HANDLE_IMAGE ), "image1", TEST_LOCATION );
367 field.SetProperty( TextField::Property::GRAB_HANDLE_PRESSED_IMAGE, "image2" );
368 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::GRAB_HANDLE_PRESSED_IMAGE ), "image2", TEST_LOCATION );
369 field.SetProperty( TextField::Property::SELECTION_HANDLE_IMAGE_LEFT, "image3" );
370 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::SELECTION_HANDLE_IMAGE_LEFT ), "image3", TEST_LOCATION );
371 field.SetProperty( TextField::Property::SELECTION_HANDLE_IMAGE_RIGHT, "image4" );
372 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::SELECTION_HANDLE_IMAGE_RIGHT ), "image4", TEST_LOCATION );
373 field.SetProperty( TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_LEFT, "image5" );
374 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_LEFT ), "image5", TEST_LOCATION );
375 field.SetProperty( TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_RIGHT, "image6" );
376 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_RIGHT ), "image6", TEST_LOCATION );
378 // Check the highlight color
379 field.SetProperty( TextField::Property::SELECTION_HIGHLIGHT_COLOR, Color::GREEN );
380 DALI_TEST_EQUALS( field.GetProperty<Vector4>( TextField::Property::SELECTION_HIGHLIGHT_COLOR ), Color::GREEN, TEST_LOCATION );
382 // Decoration bounding box
383 field.SetProperty( TextField::Property::DECORATION_BOUNDING_BOX, Rect<int>( 0, 0, 1, 1 ) );
384 DALI_TEST_EQUALS( field.GetProperty<Rect <int > >( TextField::Property::DECORATION_BOUNDING_BOX ), Rect<int>( 0, 0, 1, 1 ), TEST_LOCATION );
389 // Positive Basic Text Renderer test
390 int utcDaliTextFieldBasicRenderP(void)
392 ToolkitTestApplication application;
393 tet_infoline("UtcDaliToolkitTextFieldBasicRenderP");
394 TextField field = TextField::New();
395 DALI_TEST_CHECK( field );
397 field.SetProperty( TextField::Property::HORIZONTAL_ALIGNMENT, "BEGIN" );
399 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
401 Stage::GetCurrent().Add( field );
405 // Render some text with the basic backend
406 field.SetProperty( TextField::Property::RENDERING_BACKEND, Text::RENDERING_BASIC );
407 application.SendNotification();
408 application.Render();
412 tet_result(TET_FAIL);
417 // Positive Atlas Text Renderer test
418 int utcDaliTextFieldAtlasRenderP(void)
420 ToolkitTestApplication application;
421 tet_infoline(" UtcDaliToolkitTextFieldAtlasRenderP");
422 StyleManager styleManager = StyleManager::Get();
423 styleManager.RequestDefaultTheme();
424 TextField field = TextField::New();
425 DALI_TEST_CHECK( field );
427 field.SetProperty( TextField::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
429 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
431 Stage::GetCurrent().Add( field );
435 // Render some text with the shared atlas backend
436 field.SetProperty( TextField::Property::RENDERING_BACKEND, Text::RENDERING_SHARED_ATLAS );
437 application.SendNotification();
438 application.Render();
442 tet_result(TET_FAIL);
447 // Positive test for the text-changed signal.
448 int utcDaliTextFieldTextChangedP(void)
450 ToolkitTestApplication application;
451 tet_infoline(" utcDaliTextFieldTextChangedP");
452 TextField field = TextField::New();
453 DALI_TEST_CHECK( field );
455 Stage::GetCurrent().Add( field );
457 field.TextChangedSignal().Connect(&TestTextChangedCallback);
459 gTextChangedCallBackCalled = false;
460 field.SetProperty( TextField::Property::TEXT, "ABC" );
461 DALI_TEST_CHECK( gTextChangedCallBackCalled );
463 application.SendNotification();
465 field.SetKeyInputFocus();
467 gTextChangedCallBackCalled = false;
468 application.ProcessEvent( GenerateKey( "D", "D", 0, 0, 0, Integration::KeyEvent::Down ) );
469 DALI_TEST_CHECK( gTextChangedCallBackCalled );
474 // Negative test for the text-changed signal.
475 int utcDaliTextFieldTextChangedN(void)
477 ToolkitTestApplication application;
478 tet_infoline(" utcDaliTextFieldTextChangedN");
479 TextField field = TextField::New();
480 DALI_TEST_CHECK( field );
482 Stage::GetCurrent().Add( field );
484 field.TextChangedSignal().Connect(&TestTextChangedCallback);
486 gTextChangedCallBackCalled = false;
487 field.SetProperty( TextField::Property::PLACEHOLDER_TEXT, "ABC" ); // Setting placeholder, not TEXT
488 DALI_TEST_CHECK( !gTextChangedCallBackCalled );
493 // Positive test for Max Characters reached signal.
494 int utcDaliTextFieldMaxCharactersReachedP(void)
496 ToolkitTestApplication application;
497 tet_infoline(" utcDaliTextFieldMaxCharactersReachedP");
498 TextField field = TextField::New();
499 DALI_TEST_CHECK( field );
501 Stage::GetCurrent().Add( field );
503 const int maxNumberOfCharacters = 1;
504 field.SetProperty( TextField::Property::MAX_LENGTH, maxNumberOfCharacters );
506 field.SetKeyInputFocus();
508 gMaxCharactersCallBackCalled = false;
509 field.MaxLengthReachedSignal().Connect(&TestMaxLengthReachedCallback);
511 application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
512 application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
514 DALI_TEST_CHECK( gMaxCharactersCallBackCalled );
519 // Negative test for Max Characters reached signal.
520 int utcDaliTextFieldMaxCharactersReachedN(void)
522 ToolkitTestApplication application;
523 tet_infoline(" utcDaliTextFieldMaxCharactersReachedN");
524 TextField field = TextField::New();
525 DALI_TEST_CHECK( field );
527 Stage::GetCurrent().Add( field );
529 const int maxNumberOfCharacters = 3;
530 field.SetProperty( TextField::Property::MAX_LENGTH, maxNumberOfCharacters );
532 field.SetKeyInputFocus();
534 gMaxCharactersCallBackCalled = false;
535 field.MaxLengthReachedSignal().Connect(&TestMaxLengthReachedCallback);
537 application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
538 application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
540 DALI_TEST_CHECK( !gMaxCharactersCallBackCalled );
545 int utcDaliTextFieldEvent01(void)
547 ToolkitTestApplication application;
548 tet_infoline(" utcDaliTextFieldEvent01");
550 // Creates a tap event. After creating a tap event the text field should
551 // have the focus and add text with key events should be possible.
553 TextField field = TextField::New();
554 DALI_TEST_CHECK( field );
556 Stage::GetCurrent().Add( field );
558 field.SetSize( 300.f, 50.f );
559 field.SetParentOrigin( ParentOrigin::TOP_LEFT );
560 field.SetAnchorPoint( AnchorPoint::TOP_LEFT );
562 // Avoid a crash when core load gl resources.
563 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
566 application.SendNotification();
567 application.Render();
569 // Add a key event but as the text field has not the focus it should do nothing.
570 application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
573 application.SendNotification();
574 application.Render();
576 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::TEXT ), std::string(""), TEST_LOCATION );
578 // Create a tap event to touch the text field.
579 application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 150.0f, 25.0f ) ) );
580 application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 150.0f, 25.0f ) ) );
583 application.SendNotification();
584 application.Render();
586 // Now the text field has the focus, so it can handle the key events.
587 application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
588 application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
591 application.SendNotification();
592 application.Render();
594 DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::TEXT ), std::string("aa"), TEST_LOCATION );
596 // Create a second text field and send key events to it.
597 TextField field2 = TextField::New();
599 field2.SetParentOrigin( ParentOrigin::TOP_LEFT );
600 field2.SetAnchorPoint( AnchorPoint::TOP_LEFT );
601 field2.SetSize( 100.f, 100.f );
602 field2.SetPosition( 100.f, 100.f );
604 Stage::GetCurrent().Add( field2 );
607 application.SendNotification();
608 application.Render();
610 // Create a tap event on the second text field.
611 application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 150.0f, 125.0f ) ) );
612 application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 150.0f, 125.0f ) ) );
615 application.SendNotification();
616 application.Render();
618 // The second text field has the focus. It should handle the key events.
619 application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
620 application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
623 application.SendNotification();
624 application.Render();
626 // Check the text has been added to the second text field.
627 DALI_TEST_EQUALS( field2.GetProperty<std::string>( TextField::Property::TEXT ), std::string("aa"), TEST_LOCATION );
632 int utcDaliTextFieldEvent02(void)
634 ToolkitTestApplication application;
635 tet_infoline(" utcDaliTextFieldEvent02");
637 // Checks if the right number of actors are created.
639 TextField field = TextField::New();
640 DALI_TEST_CHECK( field );
642 Stage::GetCurrent().Add( field );
644 field.SetSize( 300.f, 50.f );
645 field.SetParentOrigin( ParentOrigin::TOP_LEFT );
646 field.SetAnchorPoint( AnchorPoint::TOP_LEFT );
648 // Avoid a crash when core load gl resources.
649 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
652 application.SendNotification();
653 application.Render();
655 // Check there are the expected number of children ( active layer, offscreen root actor, and the offscreen image actor
656 DALI_TEST_EQUALS( field.GetChildCount(), 3u, TEST_LOCATION );
658 Actor layer = field.GetChildAt( 0u );
659 DALI_TEST_CHECK( layer.IsLayer() );
661 Actor offscreenRoot = field.GetChildAt( 1u );
662 DALI_TEST_CHECK( offscreenRoot.IsLayer() );
663 DALI_TEST_EQUALS( offscreenRoot.GetChildCount(), 1u, TEST_LOCATION ); // The camera actor.
665 Actor offscreenImage = field.GetChildAt( 2u );
666 ImageActor imageActor = ImageActor::DownCast( offscreenImage );
667 DALI_TEST_CHECK( imageActor );
669 // Create a tap event to touch the text field.
670 application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 150.0f, 25.0f ) ) );
671 application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 150.0f, 25.0f ) ) );
674 application.SendNotification();
675 application.Render();
677 DALI_TEST_EQUALS( layer.GetChildCount(), 1u, TEST_LOCATION ); // The cursor.
678 DALI_TEST_EQUALS( offscreenRoot.GetChildCount(), 1u, TEST_LOCATION ); // The camera actor.
680 // Now the text field has the focus, so it can handle the key events.
681 application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
682 application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
685 application.SendNotification();
686 application.Render();
688 // Checks the cursor and the renderer have been created.
689 DALI_TEST_EQUALS( layer.GetChildCount(), 1u, TEST_LOCATION ); // The cursor.
690 DALI_TEST_EQUALS( offscreenRoot.GetChildCount(), 2u, TEST_LOCATION ); // The camera actor and the renderer
692 ImageActor cursor = ImageActor::DownCast( layer.GetChildAt( 0u ) );
693 DALI_TEST_CHECK( cursor );
695 CameraActor camera = CameraActor::DownCast( offscreenRoot.GetChildAt( 0u ) );
696 DALI_TEST_CHECK( camera );
698 RenderableActor renderer = RenderableActor::DownCast( offscreenRoot.GetChildAt( 1u ) );
699 DALI_TEST_CHECK( renderer );
701 // Move the cursor and check the position changes.
702 Vector3 position1 = cursor.GetCurrentPosition();
704 application.ProcessEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Integration::KeyEvent::Down ) );
705 application.ProcessEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Integration::KeyEvent::Down ) );
708 application.SendNotification();
709 application.Render();
711 Vector3 position2 = cursor.GetCurrentPosition();
713 DALI_TEST_CHECK( position2.x < position1.x );
715 application.ProcessEvent( GenerateKey( "", "", DALI_KEY_CURSOR_RIGHT, 0, 0, Integration::KeyEvent::Down ) );
716 application.ProcessEvent( GenerateKey( "", "", DALI_KEY_CURSOR_RIGHT, 0, 0, Integration::KeyEvent::Down ) );
719 application.SendNotification();
720 application.Render();
722 Vector3 position3 = cursor.GetCurrentPosition();
724 DALI_TEST_EQUALS( position1, position3, TEST_LOCATION ); // Should be in the same position1.
726 // Send some taps and check the cursor positions.
728 // Try to tap at the beginning.
729 application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 3.f, 25.0f ) ) );
730 application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 3.f, 25.0f ) ) );
733 application.SendNotification();
734 application.Render();
736 // Cursor position should be the same than position1.
737 Vector3 position4 = cursor.GetCurrentPosition();
739 DALI_TEST_EQUALS( position2, position4, TEST_LOCATION ); // Should be in the same position2.
741 // Try to tap at the end.
742 application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 13.f, 25.0f ) ) );
743 application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 13.0f, 25.0f ) ) );
746 application.SendNotification();
747 application.Render();
749 // Cursor position should be the same than position1.
750 Vector3 position5 = cursor.GetCurrentPosition();
752 DALI_TEST_EQUALS( position1, position5, TEST_LOCATION ); // Should be in the same position1.
755 application.ProcessEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::Down ) );
756 application.ProcessEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::Down ) );
759 application.SendNotification();
760 application.Render();
762 // Cursor position should be the same than position2.
763 Vector3 position6 = cursor.GetCurrentPosition();
765 DALI_TEST_EQUALS( Vector3( 0.f, position2.y, position2.z ), position6, TEST_LOCATION ); // TODO Should be in the same position2.
767 // Should not be renderer.
768 DALI_TEST_EQUALS( offscreenRoot.GetChildCount(), 1u, TEST_LOCATION ); // The camera actor only.
773 int utcDaliTextFieldEvent03(void)
775 ToolkitTestApplication application;
776 tet_infoline(" utcDaliTextFieldEvent03");
778 // Checks if the highlight actor is created.
780 TextField field = TextField::New();
781 DALI_TEST_CHECK( field );
783 Stage::GetCurrent().Add( field );
785 field.SetProperty( TextField::Property::TEXT, "This is a long text for the size of the text-field." );
786 field.SetSize( 30.f, 50.f );
787 field.SetParentOrigin( ParentOrigin::TOP_LEFT );
788 field.SetAnchorPoint( AnchorPoint::TOP_LEFT );
790 // Avoid a crash when core load gl resources.
791 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
794 application.SendNotification();
795 application.Render();
797 // Tap first to get the focus.
798 application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 3.f, 25.0f ) ) );
799 application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 3.f, 25.0f ) ) );
802 application.SendNotification();
803 application.Render();
805 // Double tap to select a word.
806 application.ProcessEvent( GenerateTap( Gesture::Possible, 2u, 1u, Vector2( 3.f, 25.0f ) ) );
807 application.ProcessEvent( GenerateTap( Gesture::Started, 2u, 1u, Vector2( 3.f, 25.0f ) ) );
810 application.SendNotification();
811 application.Render();
813 // The offscreen root actor should have three actors: the camera, a renderer and the highlight actor.
814 Actor offscreenRoot = field.GetChildAt( 1u );
815 DALI_TEST_CHECK( offscreenRoot.IsLayer() );
817 CameraActor camera = CameraActor::DownCast( offscreenRoot.GetChildAt( 0u ) );
818 DALI_TEST_CHECK( camera );
820 RenderableActor renderer = RenderableActor::DownCast( offscreenRoot.GetChildAt( 1u ) );
821 DALI_TEST_CHECK( renderer );
823 MeshActor highlight = MeshActor::DownCast( offscreenRoot.GetChildAt( 2u ) );
824 DALI_TEST_CHECK( highlight );