Remove dali-any from Property::Value
[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 // Positive test case for a method
159 int UtcDaliTextFieldGetPropertyP(void)
160 {
161   ToolkitTestApplication application;
162   tet_infoline(" UtcDaliToolkitTextFieldGetPropertyP");
163   TextField field = TextField::New();
164   DALI_TEST_CHECK( field );
165
166   // Check Property Indices are correct
167   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_RENDERING_BACKEND ) == TextField::Property::RENDERING_BACKEND );
168   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_PLACEHOLDER_TEXT ) == TextField::Property::PLACEHOLDER_TEXT );
169   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_TEXT ) == TextField::Property::TEXT );
170   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_FONT_FAMILY ) == TextField::Property::FONT_FAMILY );
171   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_FONT_STYLE ) == TextField::Property::FONT_STYLE );
172   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_POINT_SIZE ) == TextField::Property::POINT_SIZE );
173   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_EXCEED_POLICY ) == TextField::Property::EXCEED_POLICY );
174   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_PRIMARY_CURSOR_COLOR ) == TextField::Property::PRIMARY_CURSOR_COLOR );
175   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_SECONDARY_CURSOR_COLOR ) == TextField::Property::SECONDARY_CURSOR_COLOR );
176   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_ENABLE_CURSOR_BLINK ) == TextField::Property::ENABLE_CURSOR_BLINK );
177   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_CURSOR_BLINK_INTERVAL ) == TextField::Property::CURSOR_BLINK_INTERVAL );
178   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_CURSOR_BLINK_DURATION ) == TextField::Property::CURSOR_BLINK_DURATION );
179   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_GRAB_HANDLE_IMAGE ) == TextField::Property::GRAB_HANDLE_IMAGE );
180   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_DECORATION_BOUNDING_BOX ) == TextField::Property::DECORATION_BOUNDING_BOX );
181   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_HORIZONTAL_ALIGNMENT ) == TextField::Property::HORIZONTAL_ALIGNMENT );
182   DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_VERTICAL_ALIGNMENT ) == TextField::Property::VERTICAL_ALIGNMENT );
183   END_TEST;
184 }
185
186 // Positive test case for a method
187 int UtcDaliTextFieldSetPropertyP(void)
188 {
189   ToolkitTestApplication application;
190   tet_infoline(" UtcDaliToolkitTextFieldSetPropertyP");
191   TextField field = TextField::New();
192   DALI_TEST_CHECK( field );
193
194   // Check exceed policy
195   field.SetProperty( TextField::Property::EXCEED_POLICY, TextField::EXCEED_POLICY_CLIP );
196   DALI_TEST_EQUALS( field.GetProperty<int>( TextField::Property::EXCEED_POLICY ), TextField::EXCEED_POLICY_CLIP, TEST_LOCATION );
197
198   // Check cursor properties
199   field.SetProperty( TextField::Property::ENABLE_CURSOR_BLINK, true );
200   DALI_TEST_EQUALS( field.GetProperty<bool>( TextField::Property::ENABLE_CURSOR_BLINK ), true, TEST_LOCATION );
201   field.SetProperty( TextField::Property::PRIMARY_CURSOR_COLOR, Color::RED );
202   DALI_TEST_EQUALS( field.GetProperty<Vector4>( TextField::Property::PRIMARY_CURSOR_COLOR ), Color::RED, TEST_LOCATION );
203   field.SetProperty( TextField::Property::SECONDARY_CURSOR_COLOR, Color::BLUE );
204   DALI_TEST_EQUALS( field.GetProperty<Vector4>( TextField::Property::SECONDARY_CURSOR_COLOR ), Color::BLUE, TEST_LOCATION );
205   field.SetProperty( TextField::Property::CURSOR_BLINK_DURATION, 10.0f );
206   DALI_TEST_EQUALS( field.GetProperty<float>( TextField::Property::CURSOR_BLINK_DURATION ), 10.0f, TEST_LOCATION );
207
208   // Blink interval
209   field.SetProperty( TextField::Property::CURSOR_BLINK_INTERVAL, 1.0f );
210   DALI_TEST_EQUALS( field.GetProperty<float>( TextField::Property::CURSOR_BLINK_INTERVAL ), 1.0f, TEST_LOCATION );
211
212   // Decoration bounding box
213   field.SetProperty( TextField::Property::DECORATION_BOUNDING_BOX, Rect<int>( 0, 0, 1, 1 ) );
214   DALI_TEST_EQUALS( field.GetProperty<Rect <int > >( TextField::Property::DECORATION_BOUNDING_BOX ), Rect<int>( 0, 0, 1, 1 ), TEST_LOCATION );
215
216   // Check that the Alignment properties can be correctly set
217   field.SetProperty( TextField::Property::HORIZONTAL_ALIGNMENT, "BEGIN" );
218   DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::HORIZONTAL_ALIGNMENT ), "BEGIN", TEST_LOCATION );
219   field.SetProperty( TextField::Property::VERTICAL_ALIGNMENT, "CENTER" );
220   DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::VERTICAL_ALIGNMENT ), "CENTER", TEST_LOCATION );
221
222   // Set text
223   field.SetProperty( TextField::Property::TEXT, "Setting Text" );
224
225   // Set placeholder text (currently not implemented)
226   field.SetProperty( TextField::Property::PLACEHOLDER_TEXT, "Setting Text" );
227
228   // Set Grab Handle image
229   field.SetProperty( TextField::Property::GRAB_HANDLE_IMAGE, "" );
230
231   // Check that the MAX_LENGTH property can be correctly set
232   const int maxNumberOfCharacters = 20;
233   field.SetProperty( TextField::Property::MAX_LENGTH, maxNumberOfCharacters );
234   DALI_TEST_EQUALS( field.GetProperty<int>( TextField::Property::MAX_LENGTH ), maxNumberOfCharacters, TEST_LOCATION );
235
236   END_TEST;
237 }
238
239 // Positive Basic Text Renderer test
240 int utcDaliTextFieldBasicRenderP(void)
241 {
242   ToolkitTestApplication application;
243   tet_infoline("UtcDaliToolkitTextFieldBasicRenderP");
244   TextField field = TextField::New();
245   DALI_TEST_CHECK( field );
246
247   field.SetProperty( TextField::Property::HORIZONTAL_ALIGNMENT, "BEGIN" );
248
249   try
250   {
251     // Render some text with the basic backend
252     field.SetProperty( TextField::Property::RENDERING_BACKEND, Text::RENDERING_BASIC );
253     application.SendNotification();
254     application.Render();
255   }
256   catch( ... )
257   {
258     tet_result(TET_FAIL);
259   }
260   END_TEST;
261 }
262
263 // Positive Atlas Text Renderer test
264 int utcDaliTextFieldAtlasRenderP(void)
265 {
266   ToolkitTestApplication application;
267   tet_infoline(" UtcDaliToolkitTextFieldAtlasRenderP");
268   StyleManager styleManager = StyleManager::Get();
269   styleManager.RequestDefaultTheme();
270   TextField field = TextField::New();
271   DALI_TEST_CHECK( field );
272
273   field.SetProperty( TextField::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
274   try
275   {
276     // Render some text with the shared atlas backend
277     field.SetProperty( TextField::Property::RENDERING_BACKEND, Text::RENDERING_SHARED_ATLAS );
278     application.SendNotification();
279     application.Render();
280   }
281   catch( ... )
282   {
283     tet_result(TET_FAIL);
284   }
285   END_TEST;
286 }
287
288 // Positive test for the text-changed signal.
289 int utcDaliTextFieldTextChangedP(void)
290 {
291   ToolkitTestApplication application;
292   tet_infoline(" utcDaliTextFieldTextChangedP");
293   TextField field = TextField::New();
294   DALI_TEST_CHECK( field );
295
296   Stage::GetCurrent().Add(field);
297
298   field.TextChangedSignal().Connect(&TestTextChangedCallback);
299
300   gTextChangedCallBackCalled = false;
301   field.SetProperty( TextField::Property::TEXT, "ABC" );
302   DALI_TEST_CHECK( gTextChangedCallBackCalled );
303
304   application.SendNotification();
305
306   field.SetKeyInputFocus();
307
308   Dali::Integration::KeyEvent keyevent;
309   keyevent.keyName = "D";
310   keyevent.keyString = "D";
311   keyevent.keyCode = 0;
312   keyevent.keyModifier = 0;
313   keyevent.time = 0;
314   keyevent.state = Integration::KeyEvent::Down;
315
316   gTextChangedCallBackCalled = false;
317   application.ProcessEvent( keyevent );
318   DALI_TEST_CHECK( gTextChangedCallBackCalled );
319
320   END_TEST;
321 }
322
323 // Negative test for the text-changed signal.
324 int utcDaliTextFieldTextChangedN(void)
325 {
326   ToolkitTestApplication application;
327   tet_infoline(" utcDaliTextFieldTextChangedN");
328   TextField field = TextField::New();
329   DALI_TEST_CHECK( field );
330
331   Stage::GetCurrent().Add(field);
332
333   field.TextChangedSignal().Connect(&TestTextChangedCallback);
334
335   gTextChangedCallBackCalled = false;
336   field.SetProperty( TextField::Property::PLACEHOLDER_TEXT, "ABC" ); // Setting placeholder, not TEXT
337   DALI_TEST_CHECK( ! gTextChangedCallBackCalled );
338
339   END_TEST;
340 }
341
342 // Positive test for Max Characters reached signal.
343 int utcDaliTextFieldMaxCharactersReachedP(void)
344 {
345   ToolkitTestApplication application;
346   tet_infoline(" utcDaliTextFieldMaxCharactersReachedP");
347   TextField field = TextField::New();
348   DALI_TEST_CHECK( field );
349
350   Stage::GetCurrent().Add(field);
351
352   const int maxNumberOfCharacters = 1;
353   field.SetProperty( TextField::Property::MAX_LENGTH, maxNumberOfCharacters );
354
355   field.SetKeyInputFocus();
356
357   gMaxCharactersCallBackCalled = false;
358   field.MaxLengthReachedSignal().Connect(&TestMaxLengthReachedCallback);
359
360   Dali::Integration::KeyEvent keyevent;
361   keyevent.keyName = "a";
362   keyevent.keyString = "a";
363   keyevent.keyCode = 0;
364   keyevent.keyModifier = 0;
365   keyevent.time = 0;
366   keyevent.state = Integration::KeyEvent::Down;
367
368   application.ProcessEvent( keyevent );
369
370   application.ProcessEvent( keyevent );
371
372   DALI_TEST_CHECK( gMaxCharactersCallBackCalled );
373
374   END_TEST;
375 }
376
377 // Negative test for Max Characters reached signal.
378 int utcDaliTextFieldMaxCharactersReachedN(void)
379 {
380   ToolkitTestApplication application;
381   tet_infoline(" utcDaliTextFieldMaxCharactersReachedN");
382   TextField field = TextField::New();
383   DALI_TEST_CHECK( field );
384
385   Stage::GetCurrent().Add(field);
386
387   const int maxNumberOfCharacters = 3;
388   field.SetProperty( TextField::Property::MAX_LENGTH, maxNumberOfCharacters );
389
390   field.SetKeyInputFocus();
391
392   gMaxCharactersCallBackCalled = false;
393   field.MaxLengthReachedSignal().Connect(&TestMaxLengthReachedCallback);
394
395   Dali::Integration::KeyEvent keyevent;
396   keyevent.keyName = "a";
397   keyevent.keyString = "a";
398   keyevent.keyCode = 0;
399   keyevent.keyModifier = 0;
400   keyevent.time = 0;
401   keyevent.state = Integration::KeyEvent::Down;
402
403   application.ProcessEvent( keyevent );
404   application.ProcessEvent( keyevent );
405
406   DALI_TEST_CHECK( !gMaxCharactersCallBackCalled );
407
408   END_TEST;
409 }