Merge changes I555b7cf0,I1be28edf,I605de844,I87caee64 into devel/master
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-TextField.cpp
1 /*
2  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17
18 #include <iostream>
19 #include <stdlib.h>
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/integration-api/events/touch-event-integ.h>
24 #include <dali/integration-api/events/pan-gesture-event.h>
25 #include <dali/integration-api/events/long-press-gesture-event.h>
26 #include <dali-toolkit-test-suite-utils.h>
27 #include <dali-toolkit/dali-toolkit.h>
28
29 using namespace Dali;
30 using namespace Toolkit;
31
32 void dali_textfield_startup(void)
33 {
34   test_return_value = TET_UNDEF;
35 }
36
37 void dali_textfield_cleanup(void)
38 {
39   test_return_value = TET_PASS;
40 }
41
42 namespace
43 {
44
45 const char* const PROPERTY_NAME_RENDERING_BACKEND                    = "renderingBackend";
46 const char* const PROPERTY_NAME_TEXT                                 = "text";
47 const char* const PROPERTY_NAME_PLACEHOLDER_TEXT                     = "placeholderText";
48 const char* const PROPERTY_NAME_PLACEHOLDER_TEXT_FOCUSED             = "placeholderTextFocused";
49 const char* const PROPERTY_NAME_FONT_FAMILY                          = "fontFamily";
50 const char* const PROPERTY_NAME_FONT_STYLE                           = "fontStyle";
51 const char* const PROPERTY_NAME_POINT_SIZE                           = "pointSize";
52 const char* const PROPERTY_NAME_MAX_LENGTH                           = "maxLength";
53 const char* const PROPERTY_NAME_EXCEED_POLICY                        = "exceedPolicy";
54 const char* const PROPERTY_NAME_HORIZONTAL_ALIGNMENT                 = "horizontalAlignment";
55 const char* const PROPERTY_NAME_VERTICAL_ALIGNMENT                   = "verticalAlignment";
56 const char* const PROPERTY_NAME_TEXT_COLOR                           = "textColor";
57 const char* const PROPERTY_NAME_PLACEHOLDER_TEXT_COLOR               = "placeholderTextColor";
58 const char* const PROPERTY_NAME_SHADOW_OFFSET                        = "shadowOffset";
59 const char* const PROPERTY_NAME_SHADOW_COLOR                         = "shadowColor";
60 const char* const PROPERTY_NAME_PRIMARY_CURSOR_COLOR                 = "primaryCursorColor";
61 const char* const PROPERTY_NAME_SECONDARY_CURSOR_COLOR               = "secondaryCursorColor";
62 const char* const PROPERTY_NAME_ENABLE_CURSOR_BLINK                  = "enableCursorBlink";
63 const char* const PROPERTY_NAME_CURSOR_BLINK_INTERVAL                = "cursorBlinkInterval";
64 const char* const PROPERTY_NAME_CURSOR_BLINK_DURATION                = "cursorBlinkDuration";
65 const char* const PROPERTY_NAME_CURSOR_WIDTH                         = "cursorWidth";
66 const char* const PROPERTY_NAME_GRAB_HANDLE_IMAGE                    = "grabHandleImage";
67 const char* const PROPERTY_NAME_GRAB_HANDLE_PRESSED_IMAGE            = "grabHandlePressedImage";
68 const char* const PROPERTY_NAME_SCROLL_THRESHOLD                     = "scrollThreshold";
69 const char* const PROPERTY_NAME_SCROLL_SPEED                         = "scrollSpeed";
70 const char* const PROPERTY_NAME_SELECTION_HANDLE_IMAGE_LEFT          = "selectionHandleImageLeft";
71 const char* const PROPERTY_NAME_SELECTION_HANDLE_IMAGE_RIGHT         = "selectionHandleImageRight";
72 const char* const PROPERTY_NAME_SELECTION_HANDLE_PRESSED_IMAGE_LEFT  = "selectionHandlePressedImageLeft";
73 const char* const PROPERTY_NAME_SELECTION_HANDLE_PRESSED_IMAGE_RIGHT = "selectionHandlePressedImageRight";
74 const char* const PROPERTY_NAME_SELECTION_HANDLE_MARKER_IMAGE_LEFT   = "selectionHandleMarkerImageLeft";
75 const char* const PROPERTY_NAME_SELECTION_HANDLE_MARKER_IMAGE_RIGHT  = "selectionHandleMarkerImageRight";
76 const char* const PROPERTY_NAME_SELECTION_HIGHLIGHT_COLOR            = "selectionHighlightColor";
77 const char* const PROPERTY_NAME_DECORATION_BOUNDING_BOX              = "decorationBoundingBox";
78 const char* const PROPERTY_NAME_INPUT_METHOD_SETTINGS                = "inputMethodSettings";
79 const char* const PROPERTY_NAME_INPUT_COLOR                          = "inputColor";
80 const char* const PROPERTY_NAME_ENABLE_MARKUP                        = "enableMarkup";
81 const char* const PROPERTY_NAME_INPUT_FONT_FAMILY                    = "inputFontFamily";
82 const char* const PROPERTY_NAME_INPUT_FONT_STYLE                     = "inputFontStyle";
83 const char* const PROPERTY_NAME_INPUT_POINT_SIZE                     = "inputPointSize";
84
85 const char* const PROPERTY_NAME_UNDERLINE                            = "underline";
86 const char* const PROPERTY_NAME_INPUT_UNDERLINE                      = "inputUnderline";
87 const char* const PROPERTY_NAME_SHADOW                               = "shadow";
88 const char* const PROPERTY_NAME_INPUT_SHADOW                         = "inputShadow";
89 const char* const PROPERTY_NAME_EMBOSS                               = "emboss";
90 const char* const PROPERTY_NAME_INPUT_EMBOSS                         = "inputEmboss";
91 const char* const PROPERTY_NAME_OUTLINE                              = "outline";
92 const char* const PROPERTY_NAME_INPUT_OUTLINE                        = "inputOutline";
93
94 const int DEFAULT_RENDERING_BACKEND = Dali::Toolkit::Text::DEFAULT_RENDERING_BACKEND;
95
96 const Vector4 PLACEHOLDER_TEXT_COLOR( 0.8f, 0.8f, 0.8f, 0.8f );
97 const Dali::Vector4 LIGHT_BLUE( 0.75f, 0.96f, 1.f, 1.f ); // The text highlight color.
98
99 const unsigned int CURSOR_BLINK_INTERVAL = 500u; // Cursor blink interval
100 const float RENDER_FRAME_INTERVAL = 16.66f;
101
102 const float TO_MILLISECONDS = 1000.f;
103 const float TO_SECONDS = 1.f / TO_MILLISECONDS;
104
105 const float SCROLL_THRESHOLD = 10.f;
106 const float SCROLL_SPEED = 300.f;
107
108 static bool gTextChangedCallBackCalled;
109 static bool gMaxCharactersCallBackCalled;
110
111 static void LoadBitmapResource(TestPlatformAbstraction& platform, int width, int height)
112 {
113   Integration::ResourceRequest* request = platform.GetRequest();
114   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_DISCARD );
115   Integration::ResourcePointer resource(bitmap);
116   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, width, height, width, height);
117
118   if(request)
119   {
120     platform.SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
121   }
122 }
123
124 static void LoadMarkerImages(ToolkitTestApplication& app, TextField textField)
125 {
126   int width(40);
127   int height(40);
128   LoadBitmapResource( app.GetPlatform(), width, height );
129
130   Property::Map propertyMap;
131   propertyMap["filename"] = "image.png";
132   propertyMap["width"] = width;
133   propertyMap["height"] = height;
134   textField.SetProperty( Toolkit::TextField::Property::SELECTION_HANDLE_IMAGE_LEFT, propertyMap );
135   textField.SetProperty( Toolkit::TextField::Property::SELECTION_HANDLE_IMAGE_RIGHT, propertyMap );
136   textField.SetProperty( Toolkit::TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_LEFT, propertyMap );
137   textField.SetProperty( Toolkit::TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_RIGHT, propertyMap );
138   textField.SetProperty( Toolkit::TextField::Property::SELECTION_HANDLE_MARKER_IMAGE_LEFT, propertyMap );
139   textField.SetProperty( Toolkit::TextField::Property::SELECTION_HANDLE_MARKER_IMAGE_RIGHT, propertyMap );
140   textField.SetProperty( Toolkit::TextField::Property::GRAB_HANDLE_IMAGE, propertyMap );
141   textField.SetProperty( Toolkit::TextField::Property::GRAB_HANDLE_PRESSED_IMAGE, propertyMap );
142 }
143
144 // Generate a PanGestureEvent to send to Core
145 static Integration::PanGestureEvent GeneratePan(
146     Gesture::State state,
147     const Vector2& previousPosition,
148     const Vector2& currentPosition,
149     unsigned long timeDelta,
150     unsigned int numberOfTouches = 1)
151 {
152   Integration::PanGestureEvent pan(state);
153
154   pan.previousPosition = previousPosition;
155   pan.currentPosition = currentPosition;
156   pan.timeDelta = timeDelta;
157   pan.numberOfTouches = numberOfTouches;
158
159   return pan;
160 }
161
162 /**
163  * Helper to generate PanGestureEvent
164  *
165  * @param[in] application Application instance
166  * @param[in] state The Gesture State
167  * @param[in] pos The current position of touch.
168  */
169 static void SendPan(ToolkitTestApplication& application, Gesture::State state, const Vector2& pos)
170 {
171   static Vector2 last;
172
173   if( (state == Gesture::Started) ||
174       (state == Gesture::Possible) )
175   {
176     last.x = pos.x;
177     last.y = pos.y;
178   }
179
180   application.ProcessEvent(GeneratePan(state, last, pos, 16));
181
182   last.x = pos.x;
183   last.y = pos.y;
184 }
185
186 /*
187  * Simulate time passed by.
188  *
189  * @note this will always process at least 1 frame (1/60 sec)
190  *
191  * @param application Test application instance
192  * @param duration Time to pass in milliseconds.
193  * @return The actual time passed in milliseconds
194  */
195 static int Wait(ToolkitTestApplication& application, int duration = 0)
196 {
197   int time = 0;
198
199   for(int i = 0; i <= ( duration / RENDER_FRAME_INTERVAL); i++)
200   {
201     application.SendNotification();
202     application.Render(RENDER_FRAME_INTERVAL);
203     time += RENDER_FRAME_INTERVAL;
204   }
205
206   return time;
207 }
208
209
210 static void TestTextChangedCallback( TextField control )
211 {
212   tet_infoline(" TestTextChangedCallback");
213
214   gTextChangedCallBackCalled = true;
215 }
216
217 static void TestMaxLengthReachedCallback( TextField control )
218 {
219   tet_infoline(" TestMaxLengthReachedCallback");
220
221   gMaxCharactersCallBackCalled = true;
222 }
223
224 // Generate a TapGestureEvent to send to Core.
225 Integration::TapGestureEvent GenerateTap(
226     Gesture::State state,
227     unsigned int numberOfTaps,
228     unsigned int numberOfTouches,
229     Vector2 point)
230 {
231   Integration::TapGestureEvent tap( state );
232
233   tap.numberOfTaps = numberOfTaps;
234   tap.numberOfTouches = numberOfTouches;
235   tap.point = point;
236
237   return tap;
238 }
239
240
241 Integration::LongPressGestureEvent GenerateLongPress(
242     Gesture::State state,
243     unsigned int numberOfTouches,
244     Vector2 point)
245 {
246   Integration::LongPressGestureEvent longPress( state );
247
248   longPress.numberOfTouches = numberOfTouches;
249   longPress.point = point;
250   return longPress;
251 }
252
253 // Generate a KeyEvent to send to Core.
254 Integration::KeyEvent GenerateKey( const std::string& keyName,
255                                    const std::string& keyString,
256                                    int keyCode,
257                                    int keyModifier,
258                                    unsigned long timeStamp,
259                                    const Integration::KeyEvent::State& keyState )
260 {
261   return Integration::KeyEvent( keyName,
262                                 keyString,
263                                 keyCode,
264                                 keyModifier,
265                                 timeStamp,
266                                 keyState );
267 }
268
269 } // namespace
270
271 int UtcDaliToolkitTextFieldConstructorP(void)
272 {
273   ToolkitTestApplication application;
274   tet_infoline(" UtcDaliToolkitTextFieldConstructorP");
275   TextField textField;
276   DALI_TEST_CHECK( !textField );
277   END_TEST;
278 }
279
280 int UtcDaliToolkitTextFieldNewP(void)
281 {
282   ToolkitTestApplication application;
283   tet_infoline(" UtcDaliToolkitTextFieldNewP");
284   TextField textField = TextField::New();
285   DALI_TEST_CHECK( textField );
286   END_TEST;
287 }
288
289 int UtcDaliToolkitTextFieldDownCastP(void)
290 {
291   ToolkitTestApplication application;
292   tet_infoline(" UtcDaliToolkitTextFieldDownCastP");
293   TextField textField1 = TextField::New();
294   BaseHandle object( textField1 );
295
296   TextField textField2 = TextField::DownCast( object );
297   DALI_TEST_CHECK( textField2 );
298
299   TextField textField3 = DownCast< TextField >( object );
300   DALI_TEST_CHECK( textField3 );
301   END_TEST;
302 }
303
304 int UtcDaliToolkitTextFieldDownCastN(void)
305 {
306   ToolkitTestApplication application;
307   tet_infoline(" UtcDaliToolkitTextFieldDownCastN");
308   BaseHandle uninitializedObject;
309   TextField textField1 = TextField::DownCast( uninitializedObject );
310   DALI_TEST_CHECK( !textField1 );
311
312   TextField textField2 = DownCast< TextField >( uninitializedObject );
313   DALI_TEST_CHECK( !textField2 );
314   END_TEST;
315 }
316
317 int UtcDaliToolkitTextFieldCopyConstructorP(void)
318 {
319   ToolkitTestApplication application;
320   tet_infoline(" UtcDaliToolkitTextFieldCopyConstructorP");
321   TextField textField = TextField::New();
322   textField.SetProperty( TextField::Property::TEXT, "Test" );
323
324   TextField copy( textField );
325   DALI_TEST_CHECK( copy );
326   DALI_TEST_CHECK( copy.GetProperty<std::string>( TextLabel::Property::TEXT ) == textField.GetProperty<std::string>( TextLabel::Property::TEXT ) );
327   END_TEST;
328 }
329
330 int UtcDaliToolkitTextFieldAssignmentOperatorP(void)
331 {
332   ToolkitTestApplication application;
333   tet_infoline(" UtcDaliToolkitTextFieldAssignmentOperatorP");
334   TextField textField = TextField::New();
335   textField.SetProperty( TextField::Property::TEXT, "Test" );
336
337   TextField copy = textField;
338   DALI_TEST_CHECK( copy );
339   DALI_TEST_CHECK( copy.GetProperty<std::string>( TextField::Property::TEXT ) == textField.GetProperty<std::string>( TextField::Property::TEXT ) );
340   END_TEST;
341 }
342
343 int UtcDaliTextFieldNewP(void)
344 {
345   ToolkitTestApplication application;
346   tet_infoline(" UtcDaliToolkitTextFieldNewP");
347   TextField textField = TextField::New();
348   DALI_TEST_CHECK( textField );
349   END_TEST;
350 }
351
352 // Positive test case for a method
353 int UtcDaliTextFieldGetPropertyP(void)
354 {
355   ToolkitTestApplication application;
356   tet_infoline(" UtcDaliToolkitTextFieldGetPropertyP");
357   TextField field = TextField::New();
358   DALI_TEST_CHECK( field );
359
360   // Check Property Indices are correct
361   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_RENDERING_BACKEND ) == TextField::Property::RENDERING_BACKEND );
362   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_TEXT ) == TextField::Property::TEXT );
363   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_PLACEHOLDER_TEXT ) == TextField::Property::PLACEHOLDER_TEXT );
364   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_PLACEHOLDER_TEXT_FOCUSED ) == TextField::Property::PLACEHOLDER_TEXT_FOCUSED );
365   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_FONT_FAMILY ) == TextField::Property::FONT_FAMILY );
366   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_FONT_STYLE ) == TextField::Property::FONT_STYLE );
367   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_POINT_SIZE ) == TextField::Property::POINT_SIZE );
368   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_MAX_LENGTH ) == TextField::Property::MAX_LENGTH );
369   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_EXCEED_POLICY ) == TextField::Property::EXCEED_POLICY );
370   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_HORIZONTAL_ALIGNMENT ) == TextField::Property::HORIZONTAL_ALIGNMENT );
371   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_VERTICAL_ALIGNMENT ) == TextField::Property::VERTICAL_ALIGNMENT );
372   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_TEXT_COLOR ) == TextField::Property::TEXT_COLOR );
373   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_PLACEHOLDER_TEXT_COLOR ) == TextField::Property::PLACEHOLDER_TEXT_COLOR );
374   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SHADOW_OFFSET ) == TextField::Property::SHADOW_OFFSET );
375   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SHADOW_COLOR ) == TextField::Property::SHADOW_COLOR );
376   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_PRIMARY_CURSOR_COLOR ) == TextField::Property::PRIMARY_CURSOR_COLOR );
377   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SECONDARY_CURSOR_COLOR ) == TextField::Property::SECONDARY_CURSOR_COLOR );
378   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_ENABLE_CURSOR_BLINK ) == TextField::Property::ENABLE_CURSOR_BLINK );
379   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_CURSOR_BLINK_INTERVAL ) == TextField::Property::CURSOR_BLINK_INTERVAL );
380   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_CURSOR_BLINK_DURATION ) == TextField::Property::CURSOR_BLINK_DURATION );
381   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_CURSOR_WIDTH ) == TextField::Property::CURSOR_WIDTH );
382   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_GRAB_HANDLE_IMAGE ) == TextField::Property::GRAB_HANDLE_IMAGE );
383   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_GRAB_HANDLE_PRESSED_IMAGE ) == TextField::Property::GRAB_HANDLE_PRESSED_IMAGE );
384   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SCROLL_THRESHOLD ) == TextField::Property::SCROLL_THRESHOLD );
385   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SCROLL_SPEED ) == TextField::Property::SCROLL_SPEED );
386   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HANDLE_IMAGE_LEFT ) == TextField::Property::SELECTION_HANDLE_IMAGE_LEFT );
387   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HANDLE_IMAGE_RIGHT ) == TextField::Property::SELECTION_HANDLE_IMAGE_RIGHT );
388   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HANDLE_PRESSED_IMAGE_LEFT ) == TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_LEFT );
389   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HANDLE_PRESSED_IMAGE_RIGHT ) == TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_RIGHT );
390   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HANDLE_MARKER_IMAGE_LEFT ) == TextField::Property::SELECTION_HANDLE_MARKER_IMAGE_LEFT );
391   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HANDLE_MARKER_IMAGE_RIGHT ) == TextField::Property::SELECTION_HANDLE_MARKER_IMAGE_RIGHT );
392   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SELECTION_HIGHLIGHT_COLOR ) == TextField::Property::SELECTION_HIGHLIGHT_COLOR );
393   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_DECORATION_BOUNDING_BOX ) == TextField::Property::DECORATION_BOUNDING_BOX );
394   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_INPUT_METHOD_SETTINGS ) == TextField::Property::INPUT_METHOD_SETTINGS );
395   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_INPUT_COLOR ) == TextField::Property::INPUT_COLOR );
396   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_ENABLE_MARKUP ) == TextField::Property::ENABLE_MARKUP );
397   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_INPUT_FONT_FAMILY ) == TextField::Property::INPUT_FONT_FAMILY );
398   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_INPUT_FONT_STYLE ) == TextField::Property::INPUT_FONT_STYLE );
399   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_INPUT_POINT_SIZE ) == TextField::Property::INPUT_POINT_SIZE );
400   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_UNDERLINE ) == TextField::Property::UNDERLINE );
401   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_INPUT_UNDERLINE ) == TextField::Property::INPUT_UNDERLINE );
402   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SHADOW ) == TextField::Property::SHADOW );
403   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_INPUT_SHADOW ) == TextField::Property::INPUT_SHADOW );
404   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_EMBOSS ) == TextField::Property::EMBOSS );
405   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_INPUT_EMBOSS ) == TextField::Property::INPUT_EMBOSS );
406   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_OUTLINE ) == TextField::Property::OUTLINE );
407   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_INPUT_OUTLINE ) == TextField::Property::INPUT_OUTLINE );
408
409   END_TEST;
410 }
411
412 bool SetPropertyMapRetrieved( TextField& field, const Property::Index property, const std::string mapKey, const std::string mapValue )
413 {
414   bool result = false;
415   Property::Map imageMap;
416   imageMap[mapKey] =mapValue;
417
418   field.SetProperty( property , imageMap );
419   Property::Value propValue = field.GetProperty( property );
420   Property::Map* resultMap = propValue.GetMap();
421
422   if ( resultMap->Find( mapKey )->Get< std::string>() == mapValue )
423   {
424     result = true;
425   }
426
427   return result;
428 }
429
430 // Positive test case for a method
431 int UtcDaliTextFieldSetPropertyP(void)
432 {
433   ToolkitTestApplication application;
434   tet_infoline(" UtcDaliToolkitTextFieldSetPropertyP");
435   TextField field = TextField::New();
436   DALI_TEST_CHECK( field );
437   Stage::GetCurrent().Add( field );
438
439   // Note - we can't check the defaults since the stylesheets are platform-specific
440
441   // Check the render backend property.
442   field.SetProperty( TextField::Property::RENDERING_BACKEND, Text::RENDERING_SHARED_ATLAS );
443   DALI_TEST_EQUALS( (Text::RenderingType)field.GetProperty<int>( TextField::Property::RENDERING_BACKEND ), Text::RENDERING_SHARED_ATLAS, TEST_LOCATION );
444
445   // Check text property.
446   field.SetProperty( TextField::Property::TEXT, "Setting Text" );
447   DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::TEXT ), std::string("Setting Text"), TEST_LOCATION );
448
449   // Check placeholder text properties.
450   field.SetProperty( TextField::Property::PLACEHOLDER_TEXT, "Setting Placeholder Text" );
451   DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::PLACEHOLDER_TEXT ), std::string("Setting Placeholder Text"), TEST_LOCATION );
452
453   field.SetProperty( TextField::Property::PLACEHOLDER_TEXT_FOCUSED, "Setting Placeholder Text Focused" );
454   DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::PLACEHOLDER_TEXT_FOCUSED ), std::string("Setting Placeholder Text Focused"), TEST_LOCATION );
455
456   // Check font properties.
457   field.SetProperty( TextField::Property::FONT_FAMILY, "Setting font family" );
458   DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::FONT_FAMILY ), std::string("Setting font family"), TEST_LOCATION );
459   field.SetProperty( TextField::Property::FONT_STYLE, "Setting font style" );
460   DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::FONT_STYLE ), std::string("Setting font style"), TEST_LOCATION );
461   field.SetProperty( TextField::Property::POINT_SIZE, 10.f );
462   DALI_TEST_EQUALS( field.GetProperty<float>( TextField::Property::POINT_SIZE ), 10.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
463
464   // Check that the MAX_LENGTH property can be correctly set
465   const int maxNumberOfCharacters = 20;
466   field.SetProperty( TextField::Property::MAX_LENGTH, maxNumberOfCharacters );
467   DALI_TEST_EQUALS( field.GetProperty<int>( TextField::Property::MAX_LENGTH ), maxNumberOfCharacters, TEST_LOCATION );
468
469   // Check exceed policy
470   // Set a different exceed policy is not implemented.
471
472   // Check that the Alignment properties can be correctly set
473   field.SetProperty( TextField::Property::HORIZONTAL_ALIGNMENT, "END" );
474   DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::HORIZONTAL_ALIGNMENT ), "END", TEST_LOCATION );
475   field.SetProperty( TextField::Property::VERTICAL_ALIGNMENT, "CENTER" );
476   DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::VERTICAL_ALIGNMENT ), "CENTER", TEST_LOCATION );
477
478   // Check text's color property
479   field.SetProperty( TextField::Property::TEXT_COLOR, Color::WHITE );
480   DALI_TEST_EQUALS( field.GetProperty<Vector4>( TextField::Property::TEXT_COLOR ), Color::WHITE, TEST_LOCATION );
481
482   // Check placeholder text's color property.
483   field.SetProperty( TextField::Property::PLACEHOLDER_TEXT_COLOR, Color::RED );
484   DALI_TEST_EQUALS( field.GetProperty<Vector4>( TextField::Property::PLACEHOLDER_TEXT_COLOR ), Color::RED, TEST_LOCATION );
485
486   // Check shadow properties.
487   field.SetProperty( TextField::Property::SHADOW_OFFSET, Vector2( 1.f, 1.f ) );
488   DALI_TEST_EQUALS( field.GetProperty<Vector2>( TextField::Property::SHADOW_OFFSET ), Vector2( 1.f, 1.f ), TEST_LOCATION );
489   field.SetProperty( TextField::Property::SHADOW_COLOR, Color::GREEN );
490   DALI_TEST_EQUALS( field.GetProperty<Vector4>( TextField::Property::SHADOW_COLOR ), Color::GREEN, TEST_LOCATION );
491
492   // Check cursor properties
493   field.SetProperty( TextField::Property::PRIMARY_CURSOR_COLOR, Color::RED );
494   DALI_TEST_EQUALS( field.GetProperty<Vector4>( TextField::Property::PRIMARY_CURSOR_COLOR ), Color::RED, TEST_LOCATION );
495   field.SetProperty( TextField::Property::SECONDARY_CURSOR_COLOR, Color::BLUE );
496   DALI_TEST_EQUALS( field.GetProperty<Vector4>( TextField::Property::SECONDARY_CURSOR_COLOR ), Color::BLUE, TEST_LOCATION );
497
498   field.SetProperty( TextField::Property::ENABLE_CURSOR_BLINK, false );
499   DALI_TEST_EQUALS( field.GetProperty<bool>( TextField::Property::ENABLE_CURSOR_BLINK ), false, TEST_LOCATION );
500   field.SetProperty( TextField::Property::CURSOR_BLINK_INTERVAL, 1.f );
501   DALI_TEST_EQUALS( field.GetProperty<float>( TextField::Property::CURSOR_BLINK_INTERVAL ), 1.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
502   field.SetProperty( TextField::Property::CURSOR_BLINK_DURATION, 10.f );
503   DALI_TEST_EQUALS( field.GetProperty<float>( TextField::Property::CURSOR_BLINK_DURATION ), 10.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
504   field.SetProperty( TextField::Property::CURSOR_WIDTH, 1 );
505   DALI_TEST_EQUALS( field.GetProperty<int>( TextField::Property::CURSOR_WIDTH ), 1, TEST_LOCATION );
506
507   // Check scroll properties.
508   field.SetProperty( TextField::Property::SCROLL_THRESHOLD, 1.f );
509   DALI_TEST_EQUALS( field.GetProperty<float>( TextField::Property::SCROLL_THRESHOLD ), 1.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
510   field.SetProperty( TextField::Property::SCROLL_SPEED, 100.f );
511   DALI_TEST_EQUALS( field.GetProperty<float>( TextField::Property::SCROLL_SPEED ), 100.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
512
513   // Check handle images
514   field.SetProperty( TextField::Property::GRAB_HANDLE_IMAGE, "image1" );
515   DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::GRAB_HANDLE_IMAGE ), "image1", TEST_LOCATION );
516   field.SetProperty( TextField::Property::GRAB_HANDLE_PRESSED_IMAGE, "image2" );
517   DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::GRAB_HANDLE_PRESSED_IMAGE ), "image2", TEST_LOCATION );
518   field.SetProperty( TextField::Property::SELECTION_HANDLE_IMAGE_LEFT, "image3" );
519
520   // Check handle images
521   DALI_TEST_CHECK( SetPropertyMapRetrieved( field, TextField::Property::SELECTION_HANDLE_IMAGE_LEFT, "filename", "leftHandleImage" )  );
522   DALI_TEST_CHECK( SetPropertyMapRetrieved( field, TextField::Property::SELECTION_HANDLE_IMAGE_RIGHT, "filename", "rightHandleImage" )  );
523   DALI_TEST_CHECK( SetPropertyMapRetrieved( field, TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_LEFT, "filename", "leftHandleImagePressed" )  );
524   DALI_TEST_CHECK( SetPropertyMapRetrieved( field, TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_RIGHT, "filename", "rightHandleImagePressed" )  );
525   DALI_TEST_CHECK( SetPropertyMapRetrieved( field, TextField::Property::SELECTION_HANDLE_MARKER_IMAGE_LEFT, "filename", "leftHandleMarkerImage" )  );
526   DALI_TEST_CHECK( SetPropertyMapRetrieved( field, TextField::Property::SELECTION_HANDLE_MARKER_IMAGE_RIGHT, "filename", "rightHandleMarkerImage" )  );
527
528   // Check the highlight color
529   field.SetProperty( TextField::Property::SELECTION_HIGHLIGHT_COLOR, Color::GREEN );
530   DALI_TEST_EQUALS( field.GetProperty<Vector4>( TextField::Property::SELECTION_HIGHLIGHT_COLOR ), Color::GREEN, TEST_LOCATION );
531
532   // Decoration bounding box
533   field.SetProperty( TextField::Property::DECORATION_BOUNDING_BOX, Rect<int>( 0, 0, 1, 1 ) );
534   DALI_TEST_EQUALS( field.GetProperty<Rect <int > >( TextField::Property::DECORATION_BOUNDING_BOX ), Rect<int>( 0, 0, 1, 1 ), TEST_LOCATION );
535
536   // Check input color property.
537   field.SetProperty( TextField::Property::INPUT_COLOR, Color::YELLOW );
538   DALI_TEST_EQUALS( field.GetProperty<Vector4>( TextField::Property::INPUT_COLOR ), Color::YELLOW, TEST_LOCATION );
539
540   // Check the enable markup property.
541   DALI_TEST_CHECK( !field.GetProperty<bool>( TextField::Property::ENABLE_MARKUP ) );
542   field.SetProperty( TextField::Property::ENABLE_MARKUP, true );
543   DALI_TEST_CHECK( field.GetProperty<bool>( TextField::Property::ENABLE_MARKUP ) );
544
545   // Check input font properties.
546   field.SetProperty( TextField::Property::INPUT_FONT_FAMILY, "Setting input font family" );
547   DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::INPUT_FONT_FAMILY ), "Setting input font family", TEST_LOCATION );
548   field.SetProperty( TextField::Property::INPUT_FONT_STYLE, "Setting input font style" );
549   DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::INPUT_FONT_STYLE ), "Setting input font style", TEST_LOCATION );
550   field.SetProperty( TextField::Property::INPUT_POINT_SIZE, 12.f );
551   DALI_TEST_EQUALS( field.GetProperty<float>( TextField::Property::INPUT_POINT_SIZE ), 12.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
552
553   // Check the underline property
554   field.SetProperty( TextField::Property::UNDERLINE, "Underline properties" );
555   DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::UNDERLINE ), std::string("Underline properties"), TEST_LOCATION );
556
557   // Check the input underline property
558   field.SetProperty( TextField::Property::INPUT_UNDERLINE, "Underline input properties" );
559   DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::INPUT_UNDERLINE ), std::string("Underline input properties"), TEST_LOCATION );
560
561   // Check the shadow property
562   field.SetProperty( TextField::Property::SHADOW, "Shadow properties" );
563   DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::SHADOW ), std::string("Shadow properties"), TEST_LOCATION );
564
565   // Check the input shadow property
566   field.SetProperty( TextField::Property::INPUT_SHADOW, "Shadow input properties" );
567   DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::INPUT_SHADOW ), std::string("Shadow input properties"), TEST_LOCATION );
568
569   // Check the emboss property
570   field.SetProperty( TextField::Property::EMBOSS, "Emboss properties" );
571   DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::EMBOSS ), std::string("Emboss properties"), TEST_LOCATION );
572
573   // Check the input emboss property
574   field.SetProperty( TextField::Property::INPUT_EMBOSS, "Emboss input properties" );
575   DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::INPUT_EMBOSS ), std::string("Emboss input properties"), TEST_LOCATION );
576
577   // Check the outline property
578   field.SetProperty( TextField::Property::OUTLINE, "Outline properties" );
579   DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::OUTLINE ), std::string("Outline properties"), TEST_LOCATION );
580
581   // Check the input outline property
582   field.SetProperty( TextField::Property::INPUT_OUTLINE, "Outline input properties" );
583   DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::INPUT_OUTLINE ), std::string("Outline input properties"), TEST_LOCATION );
584
585   END_TEST;
586 }
587
588 // Positive Atlas Text Renderer test
589 int utcDaliTextFieldAtlasRenderP(void)
590 {
591   ToolkitTestApplication application;
592   tet_infoline(" UtcDaliToolkitTextFieldAtlasRenderP");
593   StyleManager styleManager = StyleManager::Get();
594   styleManager.ApplyDefaultTheme();
595   TextField field = TextField::New();
596   DALI_TEST_CHECK( field );
597
598   field.SetProperty( TextField::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
599
600   application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
601
602   Stage::GetCurrent().Add( field );
603
604   try
605   {
606     // Render some text with the shared atlas backend
607     field.SetProperty( TextField::Property::RENDERING_BACKEND, Text::RENDERING_SHARED_ATLAS );
608     application.SendNotification();
609     application.Render();
610   }
611   catch( ... )
612   {
613     tet_result(TET_FAIL);
614   }
615   END_TEST;
616 }
617
618 // Positive test for the textChanged signal.
619 int utcDaliTextFieldTextChangedP(void)
620 {
621   ToolkitTestApplication application;
622   tet_infoline(" utcDaliTextFieldTextChangedP");
623   TextField field = TextField::New();
624   DALI_TEST_CHECK( field );
625
626   Stage::GetCurrent().Add( field );
627
628   field.TextChangedSignal().Connect(&TestTextChangedCallback);
629
630   gTextChangedCallBackCalled = false;
631   field.SetProperty( TextField::Property::TEXT, "ABC" );
632   DALI_TEST_CHECK( gTextChangedCallBackCalled );
633
634   application.SendNotification();
635
636   field.SetKeyInputFocus();
637
638   gTextChangedCallBackCalled = false;
639   application.ProcessEvent( GenerateKey( "D", "D", 0, 0, 0, Integration::KeyEvent::Down ) );
640   DALI_TEST_CHECK( gTextChangedCallBackCalled );
641
642   END_TEST;
643 }
644
645 // Negative test for the textChanged signal.
646 int utcDaliTextFieldTextChangedN(void)
647 {
648   ToolkitTestApplication application;
649   tet_infoline(" utcDaliTextFieldTextChangedN");
650   TextField field = TextField::New();
651   DALI_TEST_CHECK( field );
652
653   Stage::GetCurrent().Add( field );
654
655   field.TextChangedSignal().Connect(&TestTextChangedCallback);
656
657   gTextChangedCallBackCalled = false;
658   field.SetProperty( TextField::Property::PLACEHOLDER_TEXT, "ABC" ); // Setting placeholder, not TEXT
659   DALI_TEST_CHECK( !gTextChangedCallBackCalled );
660
661   END_TEST;
662 }
663
664 // Positive test for Max Characters reached signal.
665 int utcDaliTextFieldMaxCharactersReachedP(void)
666 {
667   ToolkitTestApplication application;
668   tet_infoline(" utcDaliTextFieldMaxCharactersReachedP");
669   TextField field = TextField::New();
670   DALI_TEST_CHECK( field );
671
672   Stage::GetCurrent().Add( field );
673
674   const int maxNumberOfCharacters = 1;
675   field.SetProperty( TextField::Property::MAX_LENGTH, maxNumberOfCharacters );
676
677   field.SetKeyInputFocus();
678
679   gMaxCharactersCallBackCalled = false;
680   field.MaxLengthReachedSignal().Connect(&TestMaxLengthReachedCallback);
681
682   application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
683   application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
684
685   DALI_TEST_CHECK( gMaxCharactersCallBackCalled );
686
687   END_TEST;
688 }
689
690 // Negative test for Max Characters reached signal.
691 int utcDaliTextFieldMaxCharactersReachedN(void)
692 {
693   ToolkitTestApplication application;
694   tet_infoline(" utcDaliTextFieldMaxCharactersReachedN");
695   TextField field = TextField::New();
696   DALI_TEST_CHECK( field );
697
698   Stage::GetCurrent().Add( field );
699
700   const int maxNumberOfCharacters = 3;
701   field.SetProperty( TextField::Property::MAX_LENGTH, maxNumberOfCharacters );
702
703   field.SetKeyInputFocus();
704
705   gMaxCharactersCallBackCalled = false;
706   field.MaxLengthReachedSignal().Connect(&TestMaxLengthReachedCallback);
707
708   application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
709   application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
710
711   DALI_TEST_CHECK( !gMaxCharactersCallBackCalled );
712
713   END_TEST;
714 }
715
716 int utcDaliTextFieldEvent01(void)
717 {
718   ToolkitTestApplication application;
719   tet_infoline(" utcDaliTextFieldEvent01");
720
721   // Creates a tap event. After creating a tap event the text field should
722   // have the focus and add text with key events should be possible.
723
724   TextField field = TextField::New();
725   DALI_TEST_CHECK( field );
726
727   Stage::GetCurrent().Add( field );
728
729   field.SetSize( 300.f, 50.f );
730   field.SetParentOrigin( ParentOrigin::TOP_LEFT );
731   field.SetAnchorPoint( AnchorPoint::TOP_LEFT );
732
733   // Avoid a crash when core load gl resources.
734   application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
735
736   // Render and notify
737   application.SendNotification();
738   application.Render();
739
740   // Add a key event but as the text field has not the focus it should do nothing.
741   application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
742
743   // Render and notify
744   application.SendNotification();
745   application.Render();
746
747   DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::TEXT ), std::string(""), TEST_LOCATION );
748
749   // Create a tap event to touch the text field.
750   application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 150.0f, 25.0f ) ) );
751   application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 150.0f, 25.0f ) ) );
752
753   // Render and notify
754   application.SendNotification();
755   application.Render();
756
757   // Now the text field has the focus, so it can handle the key events.
758   application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
759   application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
760
761   // Render and notify
762   application.SendNotification();
763   application.Render();
764
765   DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::TEXT ), std::string("aa"), TEST_LOCATION );
766
767   // Create a second text field and send key events to it.
768   TextField field2 = TextField::New();
769
770   field2.SetParentOrigin( ParentOrigin::TOP_LEFT );
771   field2.SetAnchorPoint( AnchorPoint::TOP_LEFT );
772   field2.SetSize( 100.f, 100.f );
773   field2.SetPosition( 100.f, 100.f );
774
775   Stage::GetCurrent().Add( field2 );
776
777   // Render and notify
778   application.SendNotification();
779   application.Render();
780
781   // Create a tap event on the second text field.
782   application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 150.0f, 125.0f ) ) );
783   application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 150.0f, 125.0f ) ) );
784
785   // Render and notify
786   application.SendNotification();
787   application.Render();
788
789   // The second text field has the focus. It should handle the key events.
790   application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
791   application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
792
793   // Render and notify
794   application.SendNotification();
795   application.Render();
796
797   // Check the text has been added to the second text field.
798   DALI_TEST_EQUALS( field2.GetProperty<std::string>( TextField::Property::TEXT ), std::string("aa"), TEST_LOCATION );
799
800   END_TEST;
801 }
802
803 int utcDaliTextFieldEvent02(void)
804 {
805   ToolkitTestApplication application;
806   tet_infoline(" utcDaliTextFieldEvent02");
807
808   // Checks if the right number of actors are created.
809
810   TextField field = TextField::New();
811   field.SetProperty( TextField::Property::POINT_SIZE, 10.f );
812   DALI_TEST_CHECK( field );
813   LoadMarkerImages(application, field);
814
815   Stage::GetCurrent().Add( field );
816
817   field.SetSize( 300.f, 50.f );
818   field.SetParentOrigin( ParentOrigin::TOP_LEFT );
819   field.SetAnchorPoint( AnchorPoint::TOP_LEFT );
820
821   // Avoid a crash when core load gl resources.
822   application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
823
824   // Render and notify
825   application.SendNotification();
826   application.Render();
827
828   // Check there are the expected number of children ( offscreen root actor, and the offscreen image view
829   DALI_TEST_EQUALS( field.GetChildCount(), 2u, TEST_LOCATION );
830
831   Actor offscreenRoot = field.GetChildAt( 0u );
832   DALI_TEST_CHECK( offscreenRoot.IsLayer() );
833   DALI_TEST_EQUALS( offscreenRoot.GetChildCount(), 1u, TEST_LOCATION ); // The camera actor.
834
835   Actor offscreenImage = field.GetChildAt( 1u );
836   DALI_TEST_CHECK( offscreenImage );
837
838   // Create a tap event to touch the text field.
839   application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 150.0f, 25.0f ) ) );
840   application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 150.0f, 25.0f ) ) );
841
842   // Render and notify
843   application.SendNotification();
844   application.Render();
845
846   Actor layer = field.GetChildAt( 2u );
847   DALI_TEST_CHECK( layer.IsLayer() );
848
849   DALI_TEST_EQUALS( layer.GetChildCount(), 1u, TEST_LOCATION ); // The cursor.
850   DALI_TEST_EQUALS( offscreenRoot.GetChildCount(), 1u, TEST_LOCATION ); // The camera actor.
851
852   // Now the text field has the focus, so it can handle the key events.
853   application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
854   application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) );
855
856   // Render and notify
857   application.SendNotification();
858   application.Render();
859
860   // Checks the cursor and the renderer have been created.
861   DALI_TEST_EQUALS( layer.GetChildCount(), 1u, TEST_LOCATION ); // The cursor.
862   DALI_TEST_EQUALS( offscreenRoot.GetChildCount(), 2u, TEST_LOCATION ); // The camera actor and the renderer
863
864   Control cursor = Control::DownCast( layer.GetChildAt( 0u ) );
865   DALI_TEST_CHECK( cursor );
866
867   CameraActor camera = CameraActor::DownCast( offscreenRoot.GetChildAt( 0u ) );
868   DALI_TEST_CHECK( camera );
869
870   Renderer renderer = offscreenRoot.GetChildAt( 1u ).GetRendererAt( 0u );
871   DALI_TEST_CHECK( renderer );
872
873   // Move the cursor and check the position changes.
874   Vector3 position1 = cursor.GetCurrentPosition();
875
876   application.ProcessEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Integration::KeyEvent::Down ) );
877   application.ProcessEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Integration::KeyEvent::Down ) );
878
879   // Render and notify
880   application.SendNotification();
881   application.Render();
882
883   Vector3 position2 = cursor.GetCurrentPosition();
884
885   DALI_TEST_CHECK( position2.x < position1.x );
886
887   application.ProcessEvent( GenerateKey( "", "", DALI_KEY_CURSOR_RIGHT, 0, 0, Integration::KeyEvent::Down ) );
888   application.ProcessEvent( GenerateKey( "", "", DALI_KEY_CURSOR_RIGHT, 0, 0, Integration::KeyEvent::Down ) );
889
890   // Render and notify
891   application.SendNotification();
892   application.Render();
893
894   Vector3 position3 = cursor.GetCurrentPosition();
895
896   DALI_TEST_EQUALS( position1, position3, TEST_LOCATION ); // Should be in the same position1.
897
898   // Send some taps and check the cursor positions.
899
900   // Try to tap at the beginning.
901   application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 1.f, 25.0f ) ) );
902   application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 1.f, 25.0f ) ) );
903
904   // Render and notify
905   application.SendNotification();
906   application.Render();
907
908   // Cursor position should be the same than position1.
909   Vector3 position4 = cursor.GetCurrentPosition();
910
911   DALI_TEST_EQUALS( position2, position4, TEST_LOCATION ); // Should be in the same position2.
912
913   // Tap away from the start position.
914   application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 16.f, 25.0f ) ) );
915   application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 16.0f, 25.0f ) ) );
916
917   // Render and notify
918   application.SendNotification();
919   application.Render();
920
921   Vector3 position5 = cursor.GetCurrentPosition();
922
923   DALI_TEST_CHECK( position5.x > position4.x );
924
925   // Remove all the text.
926   application.ProcessEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::Down ) );
927   application.ProcessEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::Down ) );
928   field.SetProperty( TextField::Property::TEXT, "" );
929
930   // Render and notify
931   application.SendNotification();
932   application.Render();
933
934   // Cursor position should be the same than position2.
935   Vector3 position6 = cursor.GetCurrentPosition();
936
937   DALI_TEST_EQUALS( position2, position6, TEST_LOCATION );// Should be in the same position2.
938
939   // Should not be a renderer.
940   DALI_TEST_EQUALS( offscreenRoot.GetChildCount(), 1u, TEST_LOCATION ); // The camera actor only.
941
942   END_TEST;
943 }
944
945 int utcDaliTextFieldEvent03(void)
946 {
947   ToolkitTestApplication application;
948   tet_infoline(" utcDaliTextFieldEvent03");
949
950   // Checks if the highlight actor is created.
951
952   TextField field = TextField::New();
953   DALI_TEST_CHECK( field );
954
955   Stage::GetCurrent().Add( field );
956
957   field.SetProperty( TextField::Property::TEXT, "This is a long text for the size of the text-field." );
958   field.SetProperty( TextField::Property::POINT_SIZE, 10.f );
959   field.SetSize( 30.f, 50.f );
960   field.SetParentOrigin( ParentOrigin::TOP_LEFT );
961   field.SetAnchorPoint( AnchorPoint::TOP_LEFT );
962
963   // Avoid a crash when core load gl resources.
964   application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
965   LoadMarkerImages(application, field);
966
967   // Render and notify
968   application.SendNotification();
969   application.Render();
970
971   // Tap first to get the focus.
972   application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 3.f, 25.0f ) ) );
973   application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 3.f, 25.0f ) ) );
974
975   // Render and notify
976   application.SendNotification();
977   application.Render();
978
979   // Double tap to select a word.
980   application.ProcessEvent( GenerateTap( Gesture::Possible, 2u, 1u, Vector2( 3.f, 25.0f ) ) );
981   application.ProcessEvent( GenerateTap( Gesture::Started, 2u, 1u, Vector2( 3.f, 25.0f ) ) );
982
983   // Render and notify
984   application.SendNotification();
985   application.Render();
986
987   // The offscreen root actor should have three actors: the camera, a renderer and the highlight actor.
988   Actor offscreenRoot = field.GetChildAt( 1u );
989   DALI_TEST_CHECK( offscreenRoot.IsLayer() );
990
991   CameraActor camera = CameraActor::DownCast( offscreenRoot.GetChildAt( 0u ) );
992   DALI_TEST_CHECK( camera );
993
994   Renderer renderer = offscreenRoot.GetChildAt( 1u ).GetRendererAt( 0u );
995   DALI_TEST_CHECK( renderer );
996
997   Renderer highlight = offscreenRoot.GetChildAt( 2u ).GetRendererAt( 0u );
998   DALI_TEST_CHECK( highlight );
999
1000   END_TEST;
1001 }
1002
1003 int utcDaliTextFieldEvent04(void)
1004 {
1005   ToolkitTestApplication application;
1006   tet_infoline(" utcDaliTextFieldEvent04");
1007
1008   // Checks if the highlight actor is created.
1009
1010   TextField field = TextField::New();
1011   DALI_TEST_CHECK( field );
1012   Stage::GetCurrent().Add( field );
1013   LoadMarkerImages(application, field);
1014   // Render and notify
1015   application.SendNotification();
1016   application.Render();
1017
1018   field.SetProperty( TextField::Property::TEXT, "This is a long text for the size of the text-field." );
1019   field.SetProperty( TextField::Property::POINT_SIZE, 10.f );
1020   field.SetSize( 300.f, 50.f );
1021   field.SetParentOrigin( ParentOrigin::TOP_LEFT );
1022   field.SetAnchorPoint( AnchorPoint::TOP_LEFT );
1023
1024   // Avoid a crash when core load gl resources.
1025   application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1026   // Render and notify
1027   application.SendNotification();
1028   application.Render();
1029
1030   // Create a tap event to touch the text field.
1031   application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 150.0f, 25.0f ) ) );
1032   application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 150.0f, 25.0f ) ) );
1033   // Render and notify
1034   application.SendNotification();
1035   application.Render();
1036
1037
1038   // Tap first to get the focus.
1039   application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 1.f, 25.0f ) ) );
1040   application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 1.f, 25.0f ) ) );
1041
1042   // Render and notify
1043   application.SendNotification();
1044   application.Render();
1045
1046   // Double tap to select a word.
1047   application.ProcessEvent( GenerateTap( Gesture::Possible, 2u, 1u, Vector2( 1.f, 25.0f ) ) );
1048   application.ProcessEvent( GenerateTap( Gesture::Started, 2u, 1u, Vector2( 1.f, 25.0f ) ) );
1049
1050   // Render and notify
1051   application.SendNotification();
1052   application.Render();
1053
1054   // Tap grab handle
1055   application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 0.f, 40.0f ) ) );
1056   application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 0.f, 40.0f ) ) );
1057   END_TEST;
1058 }
1059
1060 int utcDaliTextFieldEvent05(void)
1061 {
1062   ToolkitTestApplication application;
1063   tet_infoline(" utcDaliTextFieldEvent05");
1064
1065   // Checks dragging of cursor/grab handle
1066
1067   TextField field = TextField::New();
1068   DALI_TEST_CHECK( field );
1069   Stage::GetCurrent().Add( field );
1070   LoadMarkerImages(application, field);
1071   // Render and notify
1072   application.SendNotification();
1073   application.Render();
1074
1075   field.SetProperty( TextField::Property::TEXT, "This is a long text for the size of the text-field." );
1076   field.SetProperty( TextField::Property::POINT_SIZE, 10.f );
1077   field.SetSize( 300.f, 50.f );
1078   field.SetParentOrigin( ParentOrigin::TOP_LEFT );
1079   field.SetAnchorPoint( AnchorPoint::TOP_LEFT );
1080
1081   // Avoid a crash when core load gl resources.
1082   application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1083   // Render and notify
1084   application.SendNotification();
1085   application.Render();
1086
1087   // Create a tap event to touch the text field.
1088   application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 150.0f, 25.0f ) ) );
1089   application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 150.0f, 25.0f ) ) );
1090   // Render and notify
1091   application.SendNotification();
1092   application.Render();
1093
1094
1095   // Tap first to get the focus.
1096   application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 1.f, 25.0f ) ) );
1097   application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 1.f, 25.0f ) ) );
1098
1099   // Render and notify
1100   application.SendNotification();
1101   application.Render();
1102
1103   // Double tap to select a word.
1104   application.ProcessEvent( GenerateTap( Gesture::Possible, 2u, 1u, Vector2( 1.f, 25.0f ) ) );
1105   application.ProcessEvent( GenerateTap( Gesture::Started, 2u, 1u, Vector2( 1.f, 25.0f ) ) );
1106
1107   // Render and notify
1108   application.SendNotification();
1109   application.Render();
1110
1111   // drag grab handle right
1112   Vector2 pos(0.0f, 40.0f);
1113   SendPan(application, Gesture::Possible, pos);
1114   SendPan(application, Gesture::Started, pos);
1115   pos.x += 5.0f;
1116   Wait(application, 100);
1117
1118   for(int i = 0;i<20;i++)
1119   {
1120     SendPan(application, Gesture::Continuing, pos);
1121     pos.x += 5.0f;
1122     Wait(application);
1123   }
1124
1125   SendPan(application, Gesture::Finished, pos);
1126   Wait(application, RENDER_FRAME_INTERVAL);
1127
1128   Actor offscreenRoot = field.GetChildAt( 1u );
1129   END_TEST;
1130 }
1131
1132 int utcDaliTextFieldEvent06(void)
1133 {
1134   ToolkitTestApplication application;
1135   tet_infoline(" utcDaliTextFieldEvent06");
1136
1137   // Checks Longpress when in edit mode
1138
1139   TextField field = TextField::New();
1140   DALI_TEST_CHECK( field );
1141   Stage::GetCurrent().Add( field );
1142   LoadMarkerImages(application, field);
1143   // Render and notify
1144   application.SendNotification();
1145   application.Render();
1146
1147   field.SetProperty( TextField::Property::TEXT, "Thisisalongtextforthesizeofthetextfield." );
1148   field.SetProperty( TextField::Property::POINT_SIZE, 10.f );
1149   field.SetSize( 300.f, 50.f );
1150   field.SetParentOrigin( ParentOrigin::TOP_LEFT );
1151   field.SetAnchorPoint( AnchorPoint::TOP_LEFT );
1152
1153   // Avoid a crash when core load gl resources.
1154   application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1155   // Render and notify
1156   application.SendNotification();
1157   application.Render();
1158
1159   // Create a tap event to touch the text field.
1160   application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 150.0f, 25.0f ) ) );
1161   application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 150.0f, 25.0f ) ) );
1162   // Render and notify
1163   application.SendNotification();
1164   application.Render();
1165
1166
1167   // Tap first to get the focus.
1168   application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 1.f, 25.0f ) ) );
1169   application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 1.f, 25.0f ) ) );
1170
1171   // Render and notify
1172   application.SendNotification();
1173   application.Render();
1174
1175   // Long Press
1176   application.ProcessEvent( GenerateLongPress( Gesture::Possible, 1u, Vector2( 1.f, 25.0f ) ) );
1177   application.ProcessEvent( GenerateLongPress( Gesture::Started,  1u, Vector2( 1.f, 25.0f ) ) );
1178
1179   // Render and notify
1180   application.SendNotification();
1181   application.Render();
1182
1183   END_TEST;
1184 }
1185
1186 int utcDaliTextFieldEvent07(void)
1187 {
1188   ToolkitTestApplication application;
1189   tet_infoline(" utcDaliTextFieldEvent06");
1190
1191   // Checks Longpress to start edit mode
1192
1193   TextField field = TextField::New();
1194   DALI_TEST_CHECK( field );
1195   Stage::GetCurrent().Add( field );
1196   LoadMarkerImages(application, field);
1197   // Render and notify
1198   application.SendNotification();
1199   application.Render();
1200
1201   field.SetProperty( TextField::Property::TEXT, "Thisisalongtextforthesizeofthetextfield." );
1202   field.SetProperty( TextField::Property::POINT_SIZE, 10.f );
1203   field.SetSize( 300.f, 50.f );
1204   field.SetParentOrigin( ParentOrigin::TOP_LEFT );
1205   field.SetAnchorPoint( AnchorPoint::TOP_LEFT );
1206
1207   // Avoid a crash when core load gl resources.
1208   application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1209   // Render and notify
1210   application.SendNotification();
1211   application.Render();
1212
1213   // Long Press
1214   application.ProcessEvent( GenerateLongPress( Gesture::Possible, 1u, Vector2( 1.f, 25.0f ) ) );
1215   application.ProcessEvent( GenerateLongPress( Gesture::Started,  1u, Vector2( 1.f, 25.0f ) ) );
1216
1217   // Render and notify
1218   application.SendNotification();
1219   application.Render();
1220
1221   END_TEST;
1222 }
1223
1224 int utcDaliTextFieldEvent08(void)
1225 {
1226   ToolkitTestApplication application;
1227   tet_infoline(" utcDaliTextFieldEvent06");
1228
1229   // Checks Longpress when only place holder text
1230
1231   TextField field = TextField::New();
1232   DALI_TEST_CHECK( field );
1233   Stage::GetCurrent().Add( field );
1234   LoadMarkerImages(application, field);
1235   // Render and notify
1236   application.SendNotification();
1237   application.Render();
1238
1239   field.SetProperty( TextField::Property::PLACEHOLDER_TEXT, "Setting Placeholder Text" );
1240   field.SetProperty( TextField::Property::POINT_SIZE, 10.f );
1241   field.SetSize( 300.f, 50.f );
1242   field.SetParentOrigin( ParentOrigin::TOP_LEFT );
1243   field.SetAnchorPoint( AnchorPoint::TOP_LEFT );
1244
1245   // Avoid a crash when core load gl resources.
1246   application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1247   // Render and notify
1248   application.SendNotification();
1249   application.Render();
1250
1251   // Long Press
1252   application.ProcessEvent( GenerateLongPress( Gesture::Possible, 1u, Vector2( 1.f, 25.0f ) ) );
1253   application.ProcessEvent( GenerateLongPress( Gesture::Started,  1u, Vector2( 1.f, 25.0f ) ) );
1254
1255   // Render and notify
1256   application.SendNotification();
1257   application.Render();
1258
1259   END_TEST;
1260 }