Merge "Added TextChanged signal to TextField" into tizen
[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/integration-api/events/key-event-integ.h>
21 #include <dali-toolkit-test-suite-utils.h>
22 #include <dali-toolkit/dali-toolkit.h>
23 #include <dali-toolkit/devel-api/styling/style-manager.h>
24
25 using namespace Dali;
26 using namespace Toolkit;
27
28 void dali_textfield_startup(void)
29 {
30   test_return_value = TET_UNDEF;
31 }
32
33 void dali_textfield_cleanup(void)
34 {
35   test_return_value = TET_PASS;
36 }
37
38 namespace
39 {
40
41 const char* const PROPERTY_NAME_RENDERING_BACKEND       = "rendering-backend";
42 const char* const PROPERTY_NAME_PLACEHOLDER_TEXT        = "placeholder-text";
43 const char* const PROPERTY_NAME_TEXT                    = "text";
44 const char* const PROPERTY_NAME_FONT_FAMILY             = "font-family";
45 const char* const PROPERTY_NAME_FONT_STYLE              = "font-style";
46 const char* const PROPERTY_NAME_POINT_SIZE              = "point-size";
47 const char* const PROPERTY_NAME_EXCEED_POLICY           = "exceed-policy";
48 const char* const PROPERTY_NAME_PRIMARY_CURSOR_COLOR    = "primary-cursor-color";
49 const char* const PROPERTY_NAME_SECONDARY_CURSOR_COLOR  = "secondary-cursor-color";
50 const char* const PROPERTY_NAME_ENABLE_CURSOR_BLINK     = "enable-cursor-blink";
51 const char* const PROPERTY_NAME_CURSOR_BLINK_INTERVAL   = "cursor-blink-interval";
52 const char* const PROPERTY_NAME_CURSOR_BLINK_DURATION   = "cursor-blink-duration";
53 const char* const PROPERTY_NAME_GRAB_HANDLE_IMAGE       = "grab-handle-image";
54 const char* const PROPERTY_NAME_DECORATION_BOUNDING_BOX = "decoration-bounding-box";
55 const char* const PROPERTY_NAME_HORIZONTAL_ALIGNMENT    = "horizontal-alignment";
56 const char* const PROPERTY_NAME_VERTICAL_ALIGNMENT      = "vertical-alignment";
57
58 static bool gTextChangedCallBackCalled;
59 static bool gMaxCharactersCallBackCalled;
60
61 static void TestTextChangedCallback( TextField control )
62 {
63   tet_infoline(" TestTextChangedCallback");
64
65   gTextChangedCallBackCalled = true;
66 }
67
68 static void TestMaxLengthReachedCallback( TextField control )
69 {
70   tet_infoline(" TestMaxLengthReachedCallback");
71
72   gMaxCharactersCallBackCalled = true;
73 }
74
75 } // namespace
76
77 int UtcDaliToolkitTextFieldConstructorP(void)
78 {
79   ToolkitTestApplication application;
80   tet_infoline(" UtcDaliToolkitTextFieldConstructorP");
81   TextField textField;
82   DALI_TEST_CHECK( !textField );
83   END_TEST;
84 }
85
86 int UtcDaliToolkitTextFieldNewP(void)
87 {
88   ToolkitTestApplication application;
89   tet_infoline(" UtcDaliToolkitTextFieldNewP");
90   TextField textField = TextField::New();
91   DALI_TEST_CHECK( textField );
92   END_TEST;
93 }
94
95 int UtcDaliToolkitTextFieldDownCastP(void)
96 {
97   ToolkitTestApplication application;
98   tet_infoline(" UtcDaliToolkitTextFieldDownCastP");
99   TextField textField1 = TextField::New();
100   BaseHandle object( textField1 );
101
102   TextField textField2 = TextField::DownCast( object );
103   DALI_TEST_CHECK( textField2 );
104
105   TextField textField3 = DownCast< TextField >( object );
106   DALI_TEST_CHECK( textField3 );
107   END_TEST;
108 }
109
110 int UtcDaliToolkitTextFieldDownCastN(void)
111 {
112   ToolkitTestApplication application;
113   tet_infoline(" UtcDaliToolkitTextFieldDownCastN");
114   BaseHandle uninitializedObject;
115   TextField textField1 = TextField::DownCast( uninitializedObject );
116   DALI_TEST_CHECK( !textField1 );
117
118   TextField textField2 = DownCast< TextField >( uninitializedObject );
119   DALI_TEST_CHECK( !textField2 );
120   END_TEST;
121 }
122
123 int UtcDaliToolkitTextFieldCopyConstructorP(void)
124 {
125   ToolkitTestApplication application;
126   tet_infoline(" UtcDaliToolkitTextFieldCopyConstructorP");
127   TextField textField = TextField::New();
128   textField.SetProperty( TextField::Property::TEXT, "Test" );
129
130   TextField copy( textField );
131   DALI_TEST_CHECK( copy );
132   DALI_TEST_CHECK( copy.GetProperty<std::string>( TextLabel::Property::TEXT ) == textField.GetProperty<std::string>( TextLabel::Property::TEXT ) );
133   END_TEST;
134 }
135
136 int UtcDaliToolkitTextFieldAssignmentOperatorP(void)
137 {
138   ToolkitTestApplication application;
139   tet_infoline(" UtcDaliToolkitTextFieldAssignmentOperatorP");
140   TextField textField = TextField::New();
141   textField.SetProperty( TextField::Property::TEXT, "Test" );
142
143   TextField copy = textField;
144   DALI_TEST_CHECK( copy );
145   DALI_TEST_CHECK( copy.GetProperty<std::string>( TextField::Property::TEXT ) == textField.GetProperty<std::string>( TextField::Property::TEXT ) );
146   END_TEST;
147 }
148
149 int UtcDaliTextFieldNewP(void)
150 {
151   ToolkitTestApplication application;
152   tet_infoline(" UtcDaliToolkitTextFieldNewP");
153   TextField textField = TextField::New();
154   DALI_TEST_CHECK( textField );
155   END_TEST;
156 }
157
158 int UtcDaliTextFieldGetPropertyN(void)
159 {
160   ToolkitTestApplication application;
161   tet_infoline(" UtcDaliToolkitTextFieldGetPropertyN");
162   TextField field = TextField::New();
163   DALI_TEST_CHECK( field );
164
165   bool assert = false;
166   try
167   {
168     Property::Value value = field.GetProperty<bool>( 0 );
169   }
170   catch ( ... )
171   {
172     assert = true;
173   }
174   if ( assert )
175   {
176     tet_result(TET_PASS);
177   }
178   else
179   {
180     tet_result(TET_FAIL);
181   }
182   END_TEST;
183 }
184
185 // Positive test case for a method
186 int UtcDaliTextFieldGetPropertyP(void)
187 {
188   ToolkitTestApplication application;
189   tet_infoline(" UtcDaliToolkitTextFieldGetPropertyP");
190   TextField field = TextField::New();
191   DALI_TEST_CHECK( field );
192
193   // Check Property Indices are correct
194   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_RENDERING_BACKEND ) == TextField::Property::RENDERING_BACKEND );
195   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_PLACEHOLDER_TEXT ) == TextField::Property::PLACEHOLDER_TEXT );
196   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_TEXT ) == TextField::Property::TEXT );
197   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_FONT_FAMILY ) == TextField::Property::FONT_FAMILY );
198   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_FONT_STYLE ) == TextField::Property::FONT_STYLE );
199   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_POINT_SIZE ) == TextField::Property::POINT_SIZE );
200   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_EXCEED_POLICY ) == TextField::Property::EXCEED_POLICY );
201   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_PRIMARY_CURSOR_COLOR ) == TextField::Property::PRIMARY_CURSOR_COLOR );
202   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SECONDARY_CURSOR_COLOR ) == TextField::Property::SECONDARY_CURSOR_COLOR );
203   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_ENABLE_CURSOR_BLINK ) == TextField::Property::ENABLE_CURSOR_BLINK );
204   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_CURSOR_BLINK_INTERVAL ) == TextField::Property::CURSOR_BLINK_INTERVAL );
205   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_CURSOR_BLINK_DURATION ) == TextField::Property::CURSOR_BLINK_DURATION );
206   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_GRAB_HANDLE_IMAGE ) == TextField::Property::GRAB_HANDLE_IMAGE );
207   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_DECORATION_BOUNDING_BOX ) == TextField::Property::DECORATION_BOUNDING_BOX );
208   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_HORIZONTAL_ALIGNMENT ) == TextField::Property::HORIZONTAL_ALIGNMENT );
209   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_VERTICAL_ALIGNMENT ) == TextField::Property::VERTICAL_ALIGNMENT );
210   END_TEST;
211 }
212
213 // Positive test case for a method
214 int UtcDaliTextFieldSetPropertyP(void)
215 {
216   ToolkitTestApplication application;
217   tet_infoline(" UtcDaliToolkitTextFieldSetPropertyP");
218   TextField field = TextField::New();
219   DALI_TEST_CHECK( field );
220
221   // Check exceed policy
222   field.SetProperty( TextField::Property::EXCEED_POLICY, TextField::EXCEED_POLICY_CLIP );
223   DALI_TEST_EQUALS( field.GetProperty<int>( TextField::Property::EXCEED_POLICY ), TextField::EXCEED_POLICY_CLIP, TEST_LOCATION );
224
225   // Check cursor properties
226   field.SetProperty( TextField::Property::ENABLE_CURSOR_BLINK, true );
227   DALI_TEST_EQUALS( field.GetProperty<bool>( TextField::Property::ENABLE_CURSOR_BLINK ), true, TEST_LOCATION );
228   field.SetProperty( TextField::Property::PRIMARY_CURSOR_COLOR, Color::RED );
229   DALI_TEST_EQUALS( field.GetProperty<Vector4>( TextField::Property::PRIMARY_CURSOR_COLOR ), Color::RED, TEST_LOCATION );
230   field.SetProperty( TextField::Property::SECONDARY_CURSOR_COLOR, Color::BLUE );
231   DALI_TEST_EQUALS( field.GetProperty<Vector4>( TextField::Property::SECONDARY_CURSOR_COLOR ), Color::BLUE, TEST_LOCATION );
232   field.SetProperty( TextField::Property::CURSOR_BLINK_DURATION, 10.0f );
233   DALI_TEST_EQUALS( field.GetProperty<float>( TextField::Property::CURSOR_BLINK_DURATION ), 10.0f, TEST_LOCATION );
234
235   // Blink interval
236   field.SetProperty( TextField::Property::CURSOR_BLINK_INTERVAL, 1.0f );
237   DALI_TEST_EQUALS( field.GetProperty<float>( TextField::Property::CURSOR_BLINK_INTERVAL ), 1.0f, TEST_LOCATION );
238
239   // Decoration bounding box
240   field.SetProperty( TextField::Property::DECORATION_BOUNDING_BOX, Rect<int>( 0, 0, 1, 1 ) );
241   DALI_TEST_EQUALS( field.GetProperty<Rect <int > >( TextField::Property::DECORATION_BOUNDING_BOX ), Rect<int>( 0, 0, 1, 1 ), TEST_LOCATION );
242
243   // Check that the Alignment properties can be correctly set
244   field.SetProperty( TextField::Property::HORIZONTAL_ALIGNMENT, "BEGIN" );
245   DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::HORIZONTAL_ALIGNMENT ), "BEGIN", TEST_LOCATION );
246   field.SetProperty( TextField::Property::VERTICAL_ALIGNMENT, "CENTER" );
247   DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::VERTICAL_ALIGNMENT ), "CENTER", TEST_LOCATION );
248
249   // Set text
250   field.SetProperty( TextField::Property::TEXT, "Setting Text" );
251
252   // Set placeholder text (currently not implemented)
253   field.SetProperty( TextField::Property::PLACEHOLDER_TEXT, "Setting Text" );
254
255   // Set Grab Handle image
256   field.SetProperty( TextField::Property::GRAB_HANDLE_IMAGE, "" );
257
258   // Check that the MAX_LENGTH property can be correctly set
259   const int maxNumberOfCharacters = 20;
260   field.SetProperty( TextField::Property::MAX_LENGTH, maxNumberOfCharacters );
261   DALI_TEST_EQUALS( field.GetProperty<int>( TextField::Property::MAX_LENGTH ), maxNumberOfCharacters, TEST_LOCATION );
262
263   END_TEST;
264 }
265
266 // Negative test case for a method
267 int UtcDaliTextFieldSetPropertyN(void)
268 {
269   ToolkitTestApplication application;
270   tet_infoline(" UtcDaliToolkitTextFieldSetPropertyN");
271   TextField field = TextField::New();
272   DALI_TEST_CHECK( field );
273
274   bool assert = false;
275   try
276   {
277     field.SetProperty( 0, true );
278   }
279   catch ( ... )
280   {
281     assert = true;
282   }
283   if ( assert )
284   {
285     tet_result(TET_PASS);
286   }
287   else
288   {
289     tet_result(TET_FAIL);
290   }
291   END_TEST;
292 }
293
294 // Positive Basic Text Renderer test
295 int utcDaliTextFieldBasicRenderP(void)
296 {
297   ToolkitTestApplication application;
298   tet_infoline("UtcDaliToolkitTextFieldBasicRenderP");
299   TextField field = TextField::New();
300   DALI_TEST_CHECK( field );
301
302   field.SetProperty( TextField::Property::HORIZONTAL_ALIGNMENT, "BEGIN" );
303
304   try
305   {
306     // Render some text with the basic backend
307     field.SetProperty( TextField::Property::RENDERING_BACKEND, Text::RENDERING_BASIC );
308     application.SendNotification();
309     application.Render();
310   }
311   catch( ... )
312   {
313     tet_result(TET_FAIL);
314   }
315   END_TEST;
316 }
317
318 // Positive Atlas Text Renderer test
319 int utcDaliTextFieldAtlasRenderP(void)
320 {
321   ToolkitTestApplication application;
322   tet_infoline(" UtcDaliToolkitTextFieldAtlasRenderP");
323   StyleManager styleManager = StyleManager::Get();
324   styleManager.RequestDefaultTheme();
325   TextField field = TextField::New();
326   DALI_TEST_CHECK( field );
327
328   field.SetProperty( TextField::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
329   try
330   {
331     // Render some text with the shared atlas backend
332     field.SetProperty( TextField::Property::RENDERING_BACKEND, Text::RENDERING_SHARED_ATLAS );
333     application.SendNotification();
334     application.Render();
335   }
336   catch( ... )
337   {
338     tet_result(TET_FAIL);
339   }
340   END_TEST;
341 }
342
343 // Positive test for the text-changed signal.
344 int utcDaliTextFieldTextChangedP(void)
345 {
346   ToolkitTestApplication application;
347   tet_infoline(" utcDaliTextFieldTextChangedP");
348   TextField field = TextField::New();
349   DALI_TEST_CHECK( field );
350
351   Stage::GetCurrent().Add(field);
352
353   field.TextChangedSignal().Connect(&TestTextChangedCallback);
354
355   gTextChangedCallBackCalled = false;
356   field.SetProperty( TextField::Property::TEXT, "ABC" );
357   DALI_TEST_CHECK( gTextChangedCallBackCalled );
358
359   application.SendNotification();
360
361   field.SetKeyInputFocus();
362
363   Dali::Integration::KeyEvent keyevent;
364   keyevent.keyName = "D";
365   keyevent.keyString = "D";
366   keyevent.keyCode = 0;
367   keyevent.keyModifier = 0;
368   keyevent.time = 0;
369   keyevent.state = Integration::KeyEvent::Down;
370
371   gTextChangedCallBackCalled = false;
372   application.ProcessEvent( keyevent );
373   DALI_TEST_CHECK( gTextChangedCallBackCalled );
374
375   END_TEST;
376 }
377
378 // Negative test for the text-changed signal.
379 int utcDaliTextFieldTextChangedN(void)
380 {
381   ToolkitTestApplication application;
382   tet_infoline(" utcDaliTextFieldTextChangedN");
383   TextField field = TextField::New();
384   DALI_TEST_CHECK( field );
385
386   Stage::GetCurrent().Add(field);
387
388   field.TextChangedSignal().Connect(&TestTextChangedCallback);
389
390   gTextChangedCallBackCalled = false;
391   field.SetProperty( TextField::Property::PLACEHOLDER_TEXT, "ABC" ); // Setting placeholder, not TEXT
392   DALI_TEST_CHECK( ! gTextChangedCallBackCalled );
393
394   END_TEST;
395 }
396
397 // Positive test for Max Characters reached signal.
398 int utcDaliTextFieldMaxCharactersReachedP(void)
399 {
400   ToolkitTestApplication application;
401   tet_infoline(" utcDaliTextFieldMaxCharactersReachedP");
402   TextField field = TextField::New();
403   DALI_TEST_CHECK( field );
404
405   Stage::GetCurrent().Add(field);
406
407   const int maxNumberOfCharacters = 1;
408   field.SetProperty( TextField::Property::MAX_LENGTH, maxNumberOfCharacters );
409
410   field.SetKeyInputFocus();
411
412   gMaxCharactersCallBackCalled = false;
413   field.MaxLengthReachedSignal().Connect(&TestMaxLengthReachedCallback);
414
415   Dali::Integration::KeyEvent keyevent;
416   keyevent.keyName = "a";
417   keyevent.keyString = "a";
418   keyevent.keyCode = 0;
419   keyevent.keyModifier = 0;
420   keyevent.time = 0;
421   keyevent.state = Integration::KeyEvent::Down;
422
423   application.ProcessEvent( keyevent );
424
425   application.ProcessEvent( keyevent );
426
427   DALI_TEST_CHECK( gMaxCharactersCallBackCalled );
428
429   END_TEST;
430 }
431
432 // Negative test for Max Characters reached signal.
433 int utcDaliTextFieldMaxCharactersReachedN(void)
434 {
435   ToolkitTestApplication application;
436   tet_infoline(" utcDaliTextFieldMaxCharactersReachedN");
437   TextField field = TextField::New();
438   DALI_TEST_CHECK( field );
439
440   Stage::GetCurrent().Add(field);
441
442   const int maxNumberOfCharacters = 3;
443   field.SetProperty( TextField::Property::MAX_LENGTH, maxNumberOfCharacters );
444
445   field.SetKeyInputFocus();
446
447   gMaxCharactersCallBackCalled = false;
448   field.MaxLengthReachedSignal().Connect(&TestMaxLengthReachedCallback);
449
450   Dali::Integration::KeyEvent keyevent;
451   keyevent.keyName = "a";
452   keyevent.keyString = "a";
453   keyevent.keyCode = 0;
454   keyevent.keyModifier = 0;
455   keyevent.time = 0;
456   keyevent.state = Integration::KeyEvent::Down;
457
458   application.ProcessEvent( keyevent );
459   application.ProcessEvent( keyevent );
460
461   DALI_TEST_CHECK( !gMaxCharactersCallBackCalled );
462
463   END_TEST;
464 }