Merge remote-tracking branch 'origin/tizen' into new_text
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-KeyInputFocusManager.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-toolkit-test-suite-utils.h>
21 #include <dali-toolkit/dali-toolkit.h>
22 #include <dali/integration-api/events/key-event-integ.h>
23
24 #include "dummy-control.h"
25
26 using namespace Dali;
27 using namespace Toolkit;
28
29 namespace
30 {
31
32 /**
33  * Callback class for KeyInputFocusChanged signal.
34  */
35 class KeyInputFocusChangedCallback : public Dali::ConnectionTracker
36 {
37 public:
38   /**
39    * Constructor
40    * @param[in]  gainActor  Ref to the actor that should be set as the one that gains key input focus.
41    * @param[in]  lostActor  Ref to the actor that should be set as the one that loses key input focus.
42    */
43   KeyInputFocusChangedCallback( Control& gainActor, Control& lostActor )
44   : mActorGain( gainActor ),
45     mActorLost( lostActor )
46   {
47   }
48
49   void Callback( Control gainingActor, Control lostActor )
50   {
51     mActorGain = gainingActor;
52     mActorLost = lostActor;
53   }
54
55   Control& mActorGain;
56   Control& mActorLost;
57 };
58
59 // Stores data that is populated in the callback and will be read by the TET cases
60 struct SignalData
61 {
62   SignalData()
63   : functorCalled(false)
64   {}
65
66   void Reset()
67   {
68     functorCalled = false;
69
70     receivedKeyEvent.keyModifier = 0;
71     receivedKeyEvent.keyPressedName.clear();
72     receivedKeyEvent.keyPressed.clear();
73
74   }
75
76   bool functorCalled;
77   KeyEvent receivedKeyEvent;
78 };
79
80 /**
81  * Callback class to test SignalUnhandledKeyEvent signal
82  */
83 class SignalUnhandledKeyEventCallback : public Dali::ConnectionTracker
84 {
85 public:
86   SignalUnhandledKeyEventCallback( SignalData& data ) : mSignalData( data ) { }
87
88   void Callback(const KeyEvent& event)
89   {
90     mSignalData.functorCalled = true;
91     mSignalData.receivedKeyEvent = event;
92   }
93
94   SignalData& mSignalData;
95 };
96
97 } // namespace
98
99 void key_input_focus_manager_startup(void)
100 {
101   test_return_value = TET_UNDEF;
102 }
103
104 void key_input_focus_manager_cleanup(void)
105 {
106   test_return_value = TET_PASS;
107 }
108
109 int UtcDaliKeyInputFocusManagerGet(void)
110 {
111   ToolkitTestApplication application;
112
113   tet_infoline(" UtcDaliKeyInputFocusManagerGet");
114
115   KeyInputFocusManager manager;
116   {
117     manager = KeyInputFocusManager::Get();
118     DALI_TEST_CHECK(manager);
119   }
120
121   KeyInputFocusManager newManager = KeyInputFocusManager::Get();
122   DALI_TEST_CHECK(newManager);
123
124   // Check that focus manager is a singleton
125   DALI_TEST_CHECK(manager == newManager);
126   END_TEST;
127 }
128
129 int UtcDaliKeyInputFocusManagerSetFocus01(void)
130 {
131   ToolkitTestApplication application;
132   Stage stage = Stage::GetCurrent();
133
134   tet_infoline(" Check that there is no focused control. Add a control to the stack. Check it is now the focused actor and receives KeyInputFocusGained signal");
135
136   KeyInputFocusManager manager = KeyInputFocusManager::Get();
137   DALI_TEST_CHECK(manager);
138
139   Control focusedControl = manager.GetCurrentFocusControl();
140   DALI_TEST_CHECK( ! focusedControl );
141
142   DummyControl dummy = DummyControl::New(true);
143   DummyControlImplOverride& dummyImpl = static_cast<DummyControlImplOverride&>(dummy.GetImplementation());
144   dummy.SetSize(100.0f, 100.0f);
145   stage.Add( dummy );
146   DALI_TEST_CHECK( ! dummyImpl.keyInputFocusGained );
147
148   manager.SetFocus( dummy );
149   DALI_TEST_CHECK( dummy.HasKeyInputFocus()); // Also tests IsKeyboardListener() API
150   DALI_TEST_CHECK( dummyImpl.keyInputFocusGained );
151
152   focusedControl = manager.GetCurrentFocusControl();
153   DALI_TEST_CHECK( focusedControl );
154   DALI_TEST_CHECK( focusedControl == dummy );
155
156   END_TEST;
157 }
158
159 int UtcDaliKeyInputFocusManagerSetFocus02(void)
160 {
161   ToolkitTestApplication application;
162   Stage stage = Stage::GetCurrent();
163
164   tet_infoline(" Add a control to the stack. Check it is now the focused actor and receives KeyInputFocusGained signal. Add another control - check that the first control receives KeyInputFocusLost");
165
166   KeyInputFocusManager manager = KeyInputFocusManager::Get();
167   DALI_TEST_CHECK(manager);
168
169   DummyControl dummy1 = DummyControl::New(true);
170   DummyControlImplOverride& dummy1Impl = static_cast<DummyControlImplOverride&>(dummy1.GetImplementation());
171   dummy1.SetSize(100.0f, 100.0f);
172   stage.Add( dummy1 );
173   DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
174   DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
175
176   stage.Add( dummy1 );
177
178   manager.SetFocus( dummy1 );
179   DALI_TEST_CHECK( dummy1.HasKeyInputFocus()); // Also tests IsKeyboardListener() API
180   DALI_TEST_CHECK( dummy1Impl.keyInputFocusGained );
181   dummy1Impl.keyInputFocusGained = false;
182
183   DummyControl dummy2 = DummyControl::New(true);
184   DummyControlImplOverride& dummy2Impl = static_cast<DummyControlImplOverride&>(dummy2.GetImplementation());
185   dummy2.SetSize(100.0f, 100.0f);
186   stage.Add( dummy2 );
187   DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusGained );
188   DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
189
190   stage.Add( dummy2 );
191
192   manager.SetFocus( dummy2 );
193   DALI_TEST_CHECK( dummy2.HasKeyInputFocus()); // Also tests IsKeyboardListener() API
194   DALI_TEST_CHECK( dummy2Impl.keyInputFocusGained );
195   dummy1Impl.keyInputFocusGained = false;
196
197   DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
198   DALI_TEST_CHECK( dummy1Impl.keyInputFocusLost );
199
200
201   END_TEST;
202 }
203
204 int UtcDaliKeyInputFocusManagerGetCurrentFocusControl(void)
205 {
206   ToolkitTestApplication application;
207   Stage stage = Stage::GetCurrent();
208
209   tet_infoline(" Add 2 controls, check they each get focused. Re-focus the first control - ensure it's now got focus (check signals)");
210
211   KeyInputFocusManager manager = KeyInputFocusManager::Get();
212   DALI_TEST_CHECK(manager);
213
214   DummyControl dummy1 = DummyControl::New(true);
215   DummyControlImplOverride& dummy1Impl = static_cast<DummyControlImplOverride&>(dummy1.GetImplementation());
216   dummy1.SetSize(100.0f, 100.0f);
217   stage.Add( dummy1 );
218   DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
219   DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
220
221   DummyControl dummy2 = DummyControl::New(true);
222   DummyControlImplOverride& dummy2Impl = static_cast<DummyControlImplOverride&>(dummy2.GetImplementation());
223   dummy2.SetSize(100.0f, 100.0f);
224   stage.Add( dummy2 );
225   DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusGained );
226   DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusLost );
227
228   manager.SetFocus(dummy1);
229   DALI_TEST_CHECK( dummy1 == manager.GetCurrentFocusControl() );
230   DALI_TEST_CHECK( dummy1Impl.keyInputFocusGained );
231   DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
232   dummy1Impl.keyInputFocusGained = false;
233   dummy1Impl.keyInputFocusLost = false;
234
235   manager.SetFocus(dummy2);
236   DALI_TEST_CHECK( dummy2 == manager.GetCurrentFocusControl() );
237   DALI_TEST_CHECK( dummy1Impl.keyInputFocusLost );
238   DALI_TEST_CHECK( dummy2Impl.keyInputFocusGained );
239   DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
240   DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusLost );
241   // Reset signal received
242   dummy1Impl.keyInputFocusGained = false;
243   dummy1Impl.keyInputFocusLost = false;
244   dummy2Impl.keyInputFocusGained = false;
245   dummy2Impl.keyInputFocusLost = false;
246
247   manager.SetFocus(dummy1);
248   DALI_TEST_CHECK( dummy1 == manager.GetCurrentFocusControl());
249   DALI_TEST_CHECK( dummy1Impl.keyInputFocusGained );
250   DALI_TEST_CHECK( dummy2Impl.keyInputFocusLost );
251   DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
252   DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusGained );
253   END_TEST;
254 }
255
256 int UtcDaliKeyInputFocusManagerRemoveFocus01(void)
257 {
258   ToolkitTestApplication application;
259   Stage stage = Stage::GetCurrent();
260
261   tet_infoline(" Add 3 focus controls. Test that removing the topmost informs the next control that it now has focus, Test that the bottommost control doesn't receive anything. ");
262
263   KeyInputFocusManager manager = KeyInputFocusManager::Get();
264   DALI_TEST_CHECK(manager);
265
266   DummyControl dummy1 = DummyControl::New(true);
267   DummyControlImplOverride& dummy1Impl = static_cast<DummyControlImplOverride&>(dummy1.GetImplementation());
268   dummy1.SetSize(100.0f, 100.0f);
269   stage.Add( dummy1 );
270   DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
271   DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
272
273   DummyControl dummy2 = DummyControl::New(true);
274   DummyControlImplOverride& dummy2Impl = static_cast<DummyControlImplOverride&>(dummy2.GetImplementation());
275   dummy2.SetSize(100.0f, 100.0f);
276   stage.Add( dummy2 );
277   DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusGained );
278   DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusLost );
279
280   manager.SetFocus(dummy1);
281   DALI_TEST_CHECK(dummy1 == manager.GetCurrentFocusControl());
282
283   manager.SetFocus(dummy2);
284   DALI_TEST_CHECK(dummy2 == manager.GetCurrentFocusControl());
285   dummy1Impl.keyInputFocusGained = false;
286   dummy1Impl.keyInputFocusLost = false;
287   dummy2Impl.keyInputFocusGained = false;
288   dummy2Impl.keyInputFocusLost = false;
289
290   manager.RemoveFocus(dummy2);
291   DALI_TEST_CHECK(dummy1 == manager.GetCurrentFocusControl());
292   DALI_TEST_CHECK( dummy1Impl.keyInputFocusGained );
293   DALI_TEST_CHECK( dummy2Impl.keyInputFocusLost );
294   DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
295   DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusGained );
296   dummy1Impl.keyInputFocusGained = false;
297   dummy1Impl.keyInputFocusLost = false;
298   dummy2Impl.keyInputFocusGained = false;
299   dummy2Impl.keyInputFocusLost = false;
300
301   manager.RemoveFocus(dummy1);
302   DALI_TEST_CHECK(Control() == manager.GetCurrentFocusControl());
303   DALI_TEST_CHECK( dummy1Impl.keyInputFocusLost );
304   DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusLost );
305   DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
306   DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusGained );
307
308   END_TEST;
309 }
310
311 int UtcDaliKeyInputFocusManagerRemoveFocus02(void)
312 {
313   ToolkitTestApplication application;
314   Stage stage = Stage::GetCurrent();
315
316   tet_infoline(" Add 3 focus controls. Test that removing the bottommost doesn't change the focused control" );
317
318   KeyInputFocusManager manager = KeyInputFocusManager::Get();
319   DALI_TEST_CHECK(manager);
320
321   DummyControl dummy1 = DummyControl::New(true);
322   DummyControlImplOverride& dummy1Impl = static_cast<DummyControlImplOverride&>(dummy1.GetImplementation());
323   dummy1.SetSize(100.0f, 100.0f);
324   stage.Add( dummy1 );
325   DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
326   DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
327
328   DummyControl dummy2 = DummyControl::New(true);
329   DummyControlImplOverride& dummy2Impl = static_cast<DummyControlImplOverride&>(dummy2.GetImplementation());
330   dummy2.SetSize(100.0f, 100.0f);
331   stage.Add( dummy2 );
332   DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusGained );
333   DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusLost );
334
335   DummyControl dummy3 = DummyControl::New(true);
336   DummyControlImplOverride& dummy3Impl = static_cast<DummyControlImplOverride&>(dummy3.GetImplementation());
337   dummy3.SetSize(100.0f, 100.0f);
338   stage.Add( dummy3 );
339   DALI_TEST_CHECK( ! dummy3Impl.keyInputFocusGained );
340   DALI_TEST_CHECK( ! dummy3Impl.keyInputFocusLost );
341
342   manager.SetFocus(dummy1);
343   DALI_TEST_CHECK(dummy1 == manager.GetCurrentFocusControl());
344
345   manager.SetFocus(dummy2);
346   DALI_TEST_CHECK(dummy2 == manager.GetCurrentFocusControl());
347
348   manager.SetFocus(dummy3);
349   DALI_TEST_CHECK(dummy3 == manager.GetCurrentFocusControl());
350   dummy1Impl.keyInputFocusGained = false;
351   dummy1Impl.keyInputFocusLost = false;
352   dummy2Impl.keyInputFocusGained = false;
353   dummy2Impl.keyInputFocusLost = false;
354   dummy3Impl.keyInputFocusGained = false;
355   dummy3Impl.keyInputFocusLost = false;
356
357   manager.RemoveFocus(dummy1);
358   DALI_TEST_CHECK(dummy3 == manager.GetCurrentFocusControl());
359   DALI_TEST_CHECK( dummy1Impl.keyInputFocusLost );
360   DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
361   DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusLost );
362   DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusGained );
363   DALI_TEST_CHECK( ! dummy3Impl.keyInputFocusLost );
364   DALI_TEST_CHECK( ! dummy3Impl.keyInputFocusGained );
365   dummy1Impl.keyInputFocusGained = false;
366   dummy1Impl.keyInputFocusLost = false;
367   dummy2Impl.keyInputFocusGained = false;
368   dummy2Impl.keyInputFocusLost = false;
369   dummy3Impl.keyInputFocusGained = false;
370   dummy3Impl.keyInputFocusLost = false;
371
372   END_TEST;
373 }
374
375 int UtcDaliKeyInputFocusManagerRemoveFocus03(void)
376 {
377   ToolkitTestApplication application;
378   Stage stage = Stage::GetCurrent();
379
380   tet_infoline(" Add 2 focus controls. Remove each of them from the bottom up. Test that the stack is now empty. Add a new control - check that it correctly has focus" );
381
382   KeyInputFocusManager manager = KeyInputFocusManager::Get();
383   DALI_TEST_CHECK(manager);
384
385   DummyControl dummy1 = DummyControl::New(true);
386   DummyControlImplOverride& dummy1Impl = static_cast<DummyControlImplOverride&>(dummy1.GetImplementation());
387   dummy1.SetSize(100.0f, 100.0f);
388   stage.Add( dummy1 );
389   DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
390   DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
391
392   DummyControl dummy2 = DummyControl::New(true);
393   DummyControlImplOverride& dummy2Impl = static_cast<DummyControlImplOverride&>(dummy2.GetImplementation());
394   dummy2.SetSize(100.0f, 100.0f);
395   stage.Add( dummy2 );
396   DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusGained );
397   DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusLost );
398
399   manager.SetFocus(dummy1);
400   DALI_TEST_CHECK(dummy1 == manager.GetCurrentFocusControl());
401
402   manager.SetFocus(dummy2);
403   DALI_TEST_CHECK(dummy2 == manager.GetCurrentFocusControl());
404
405   dummy1Impl.keyInputFocusGained = false;
406   dummy1Impl.keyInputFocusLost = false;
407   dummy2Impl.keyInputFocusGained = false;
408   dummy2Impl.keyInputFocusLost = false;
409
410   manager.RemoveFocus(dummy1);
411   DALI_TEST_CHECK(dummy2 == manager.GetCurrentFocusControl());
412   DALI_TEST_CHECK( dummy1Impl.keyInputFocusLost );
413   DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
414   DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusLost );
415   DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusGained );
416   dummy1Impl.keyInputFocusGained = false;
417   dummy1Impl.keyInputFocusLost = false;
418   dummy2Impl.keyInputFocusGained = false;
419   dummy2Impl.keyInputFocusLost = false;
420
421   manager.RemoveFocus(dummy2);
422   DALI_TEST_CHECK(Control() == manager.GetCurrentFocusControl());
423   DALI_TEST_CHECK( dummy2Impl.keyInputFocusLost );
424   DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusGained );
425   DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
426   DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
427   dummy1Impl.keyInputFocusGained = false;
428   dummy1Impl.keyInputFocusLost = false;
429   dummy2Impl.keyInputFocusGained = false;
430   dummy2Impl.keyInputFocusLost = false;
431
432   PushButton pushButton1 = PushButton::New();
433   stage.Add( pushButton1 );
434   manager.SetFocus( pushButton1 );
435   DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
436   DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusLost );
437   DALI_TEST_CHECK( pushButton1 == manager.GetCurrentFocusControl());
438   END_TEST;
439 }
440
441 int UtcDaliKeyInputFocusManagerRemoveFocus04(void)
442 {
443   ToolkitTestApplication application;
444   Stage stage = Stage::GetCurrent();
445
446   tet_infoline(" Test what happens if the removed control is not on the focus stack");
447   KeyInputFocusManager manager = KeyInputFocusManager::Get();
448   DALI_TEST_CHECK(manager);
449
450   PushButton pushButton1 = PushButton::New();
451   PushButton pushButton2 = PushButton::New();
452   stage.Add( pushButton1 );
453   stage.Add( pushButton2 );
454   manager.SetFocus( pushButton1 );
455   manager.SetFocus( pushButton2 );
456
457   PushButton pushButton3 = PushButton::New();
458   stage.Add( pushButton3 );
459   manager.RemoveFocus( pushButton3 );
460   DALI_TEST_CHECK( pushButton2 == manager.GetCurrentFocusControl());
461   END_TEST;
462 }
463
464 int UtcDaliKeyInputFocusManagerDestroyObject01(void)
465 {
466   ToolkitTestApplication application;
467   Stage stage = Stage::GetCurrent();
468
469   tet_infoline(" Add 2 controls to the stack. Unparent and destroy the topmost. Check that it is removed from the stack, and that the bottommost is correctly focused" );
470
471   KeyInputFocusManager manager = KeyInputFocusManager::Get();
472   DALI_TEST_CHECK(manager);
473
474   DummyControl dummy1 = DummyControl::New(true);
475   DummyControlImplOverride& dummy1Impl = static_cast<DummyControlImplOverride&>(dummy1.GetImplementation());
476   dummy1.SetSize(100.0f, 100.0f);
477   stage.Add( dummy1 );
478   DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
479   DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
480
481   {
482     DummyControl dummy2 = DummyControl::New(true);
483     DummyControlImplOverride& dummy2Impl = static_cast<DummyControlImplOverride&>(dummy2.GetImplementation());
484     dummy2.SetSize(100.0f, 100.0f);
485     stage.Add( dummy2 );
486     DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusGained );
487     DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusLost );
488
489     manager.SetFocus(dummy1);
490     DALI_TEST_CHECK(dummy1 == manager.GetCurrentFocusControl());
491
492     manager.SetFocus(dummy2);
493     DALI_TEST_CHECK(dummy2 == manager.GetCurrentFocusControl());
494
495     dummy1Impl.keyInputFocusGained = false;
496     dummy1Impl.keyInputFocusLost = false;
497     dummy2Impl.keyInputFocusGained = false;
498     dummy2Impl.keyInputFocusLost = false;
499
500     stage.Remove(dummy2);
501   }
502
503   DALI_TEST_CHECK(dummy1 == manager.GetCurrentFocusControl());
504   DALI_TEST_CHECK( dummy1Impl.keyInputFocusGained );
505   DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
506   END_TEST;
507 }
508
509 int UtcDaliKeyInputFocusManagerDestroyObject02(void)
510 {
511   ToolkitTestApplication application;
512   Stage stage = Stage::GetCurrent();
513
514   tet_infoline(" Add 2 controls to the stack. Destroy a different actor entirely. Check that the stack is un-affected.");
515
516   KeyInputFocusManager manager = KeyInputFocusManager::Get();
517   DALI_TEST_CHECK(manager);
518
519   DummyControl dummy1 = DummyControl::New(true);
520   DummyControlImplOverride& dummy1Impl = static_cast<DummyControlImplOverride&>(dummy1.GetImplementation());
521   dummy1.SetSize(100.0f, 100.0f);
522   stage.Add( dummy1 );
523   DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusGained );
524   DALI_TEST_CHECK( ! dummy1Impl.keyInputFocusLost );
525
526
527   DummyControl dummy2 = DummyControl::New(true);
528   DummyControlImplOverride& dummy2Impl = static_cast<DummyControlImplOverride&>(dummy2.GetImplementation());
529   dummy2.SetSize(100.0f, 100.0f);
530   stage.Add( dummy2 );
531   DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusGained );
532   DALI_TEST_CHECK( ! dummy2Impl.keyInputFocusLost );
533
534   manager.SetFocus(dummy1);
535   DALI_TEST_CHECK(dummy1 == manager.GetCurrentFocusControl());
536
537   manager.SetFocus(dummy2);
538   DALI_TEST_CHECK(dummy2 == manager.GetCurrentFocusControl());
539
540   dummy1Impl.keyInputFocusGained = false;
541   dummy1Impl.keyInputFocusLost = false;
542   dummy2Impl.keyInputFocusGained = false;
543   dummy2Impl.keyInputFocusLost = false;
544
545   {
546     BufferImage image = CreateBufferImage();
547     ImageActor imageActor = ImageActor::New( image );
548     stage.Add( imageActor );
549     imageActor.SetSize(100, 100);
550
551     application.SendNotification();
552     application.Render();
553
554     stage.Remove( imageActor );
555   }
556
557   DALI_TEST_CHECK( dummy2 == manager.GetCurrentFocusControl());
558   END_TEST;
559 }
560
561 int UtcDaliKeyInputFocusManagerIsKeyboardListener(void)
562 {
563   ToolkitTestApplication application;
564   Stage stage = Stage::GetCurrent();
565
566   tet_infoline(" UtcDaliKeyInputFocusManagerIsKeyboardListener");
567
568   KeyInputFocusManager manager = KeyInputFocusManager::Get();
569   DALI_TEST_CHECK(manager);
570
571   PushButton pushButton1 = PushButton::New();
572   PushButton pushButton2 = PushButton::New();
573   stage.Add( pushButton1 );
574   stage.Add( pushButton2 );
575
576   manager.SetFocus(pushButton1);
577   DALI_TEST_CHECK(pushButton1 == manager.GetCurrentFocusControl());
578
579   manager.SetFocus(pushButton2);
580   DALI_TEST_CHECK(pushButton2 == manager.GetCurrentFocusControl());
581
582   DALI_TEST_CHECK(manager.IsKeyboardListener(pushButton1));
583   DALI_TEST_CHECK(manager.IsKeyboardListener(pushButton2));
584
585   manager.RemoveFocus(pushButton2);
586   DALI_TEST_CHECK(!manager.IsKeyboardListener(pushButton2));
587
588   manager.RemoveFocus(pushButton1);
589   DALI_TEST_CHECK(!manager.IsKeyboardListener(pushButton1));
590
591   manager.SetFocus(pushButton2);
592   DALI_TEST_CHECK(manager.IsKeyboardListener(pushButton2));
593   pushButton2.ClearKeyInputFocus();
594   DALI_TEST_CHECK(!manager.IsKeyboardListener(pushButton2));
595   END_TEST;
596 }
597
598 int UtcDaliKeyInputFocusManagerSignalKeyInputFocusChanged(void)
599 {
600   ToolkitTestApplication application;
601   KeyInputFocusManager manager = KeyInputFocusManager::Get();
602   Stage stage = Stage::GetCurrent();
603
604   tet_infoline(" UtcDaliKeyInputFocusManagerSignalKeyInputFocusChanged");
605
606   PushButton pushButton1 = PushButton::New();
607   PushButton pushButton2 = PushButton::New();
608
609   stage.Add( pushButton1 );
610   stage.Add( pushButton2 );
611
612   PushButton gainActor, lostActor;
613   KeyInputFocusChangedCallback callback( gainActor, lostActor );
614   manager.KeyInputFocusChangedSignal().Connect( &callback, &KeyInputFocusChangedCallback::Callback );
615
616   manager.SetFocus(pushButton1);
617
618   DALI_TEST_CHECK( gainActor == pushButton1 );
619   DALI_TEST_CHECK( lostActor == Control() );
620
621   gainActor.Reset();
622   lostActor.Reset();
623
624   manager.SetFocus(pushButton2);
625
626   DALI_TEST_CHECK( gainActor == pushButton2 );
627   DALI_TEST_CHECK( lostActor == pushButton1 );
628
629   gainActor.Reset();
630   lostActor.Reset();
631
632   // Removing the focus actor from the stage would also result in signal emission.
633   stage.Remove( pushButton1 );
634   stage.Remove( pushButton2 );
635
636   DALI_TEST_CHECK( gainActor == Control() );
637   DALI_TEST_CHECK( lostActor == Control() );
638   END_TEST;
639 }
640
641 int UtcDaliKeyInputFocusManagerSignalUnhandledKeyEvent(void)
642 {
643   ToolkitTestApplication application;
644
645   tet_infoline("UtcDaliKeyInputFocusManagerSignalUnhandledKeyEvent");
646
647   SignalData data;
648   SignalUnhandledKeyEventCallback callback( data );
649
650   KeyInputFocusManager manager = KeyInputFocusManager::Get();
651   manager.UnhandledKeyEventSignal().Connect( &callback, &SignalUnhandledKeyEventCallback::Callback );
652
653
654   Integration::KeyEvent event("a", "a", 0, 0, 0, Integration::KeyEvent::Up);
655   application.ProcessEvent(event);
656
657   DALI_TEST_CHECK(data.functorCalled);
658   DALI_TEST_CHECK(event.keyName == data.receivedKeyEvent.keyPressedName );
659   DALI_TEST_CHECK(event.keyCode == data.receivedKeyEvent.keyCode);
660   DALI_TEST_CHECK(event.keyString == data.receivedKeyEvent.keyPressed );
661   DALI_TEST_CHECK(event.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.state) );
662
663   data.Reset();
664
665   Integration::KeyEvent event2("v", "v", 0, 0, 0, Integration::KeyEvent::Up);
666   application.ProcessEvent(event2);
667
668   DALI_TEST_CHECK(data.functorCalled);
669   DALI_TEST_CHECK(event2.keyName == data.receivedKeyEvent.keyPressedName );
670   DALI_TEST_CHECK(event2.keyCode == data.receivedKeyEvent.keyCode);
671   DALI_TEST_CHECK(event2.keyString == data.receivedKeyEvent.keyPressed );
672   END_TEST;
673 }