Adding new test harness
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit-unmanaged / utc-Dali-KeyInputFocusManager.cpp
1 //
2 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
3 //
4 // Licensed under the Flora License, Version 1.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://floralicense.org/license/
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 #include <iostream>
18 #include <stdlib.h>
19 #include <dali-toolkit-test-suite-utils.h>
20 #include <dali-toolkit/dali-toolkit.h>
21 #include <dali/integration-api/events/key-event-integ.h>
22
23
24 using namespace Dali;
25 using namespace Toolkit;
26
27 namespace
28 {
29
30 /**
31  * Callback class for KeyInputFocusChanged signal.
32  */
33 class KeyInputFocusChangedCallback : public Dali::ConnectionTracker
34 {
35 public:
36   /**
37    * Constructor
38    * @param[in]  gainActor  Ref to the actor that should be set as the one that gains key input focus.
39    * @param[in]  lostActor  Ref to the actor that should be set as the one that loses key input focus.
40    */
41   KeyInputFocusChangedCallback( Control& gainActor, Control& lostActor )
42   : mActorGain( gainActor ),
43     mActorLost( lostActor )
44   {
45   }
46
47   void Callback( Control gainingActor, Control lostActor )
48   {
49     mActorGain = gainingActor;
50     mActorLost = lostActor;
51   }
52
53   Control& mActorGain;
54   Control& mActorLost;
55 };
56
57 // Stores data that is populated in the callback and will be read by the TET cases
58 struct SignalData
59 {
60   SignalData()
61   : functorCalled(false)
62   {}
63
64   void Reset()
65   {
66     functorCalled = false;
67
68     receivedKeyEvent.keyModifier = 0;
69     receivedKeyEvent.keyPressedName.clear();
70     receivedKeyEvent.keyPressed.clear();
71
72   }
73
74   bool functorCalled;
75   KeyEvent receivedKeyEvent;
76 };
77
78 /**
79  * Callback class to test SignalUnhandledKeyEvent signal
80  */
81 class SignalUnhandledKeyEventCallback : public Dali::ConnectionTracker
82 {
83 public:
84   SignalUnhandledKeyEventCallback( SignalData& data ) : mSignalData( data ) { }
85
86   void Callback(const KeyEvent& event)
87   {
88     mSignalData.functorCalled = true;
89     mSignalData.receivedKeyEvent = event;
90   }
91
92   SignalData& mSignalData;
93 };
94
95 } // namespace
96
97 void key_input_focus_manager_startup(void)
98 {
99   test_return_value = TET_UNDEF;
100 }
101
102 void key_input_focus_manager_cleanup(void)
103 {
104   test_return_value = TET_PASS;
105 }
106
107 int UtcDaliKeyInputFocusManagerGet(void)
108 {
109   ToolkitTestApplication application;
110
111   tet_infoline(" UtcDaliKeyInputFocusManagerGet");
112
113   KeyInputFocusManager manager;
114   {
115     manager = KeyInputFocusManager::Get();
116     DALI_TEST_CHECK(manager);
117   }
118
119   KeyInputFocusManager newManager = KeyInputFocusManager::Get();
120   DALI_TEST_CHECK(newManager);
121
122   // Check that focus manager is a singleton
123   DALI_TEST_CHECK(manager == newManager);
124   END_TEST;
125 }
126
127 int UtcDaliKeyInputFocusManagerSetFocus(void)
128 {
129   ToolkitTestApplication application;
130   Stage stage = Stage::GetCurrent();
131
132   tet_infoline(" UtcDaliKeyInputFocusManagerSetFocus");
133
134   KeyInputFocusManager manager = KeyInputFocusManager::Get();
135   DALI_TEST_CHECK(manager);
136
137   PushButton pushButton1 = PushButton::New();
138   stage.Add( pushButton1 );
139
140   manager.SetFocus(pushButton1);
141   DALI_TEST_CHECK(pushButton1.HasKeyInputFocus());
142   END_TEST;
143 }
144
145 int UtcDaliKeyInputFocusManagerGetCurrentFocusControl(void)
146 {
147   ToolkitTestApplication application;
148   Stage stage = Stage::GetCurrent();
149
150   tet_infoline(" UtcDaliKeyInputFocusManagerGetCurrentFocusControl");
151
152   KeyInputFocusManager manager = KeyInputFocusManager::Get();
153   DALI_TEST_CHECK(manager);
154
155   PushButton pushButton1 = PushButton::New();
156   PushButton pushButton2 = PushButton::New();
157   stage.Add( pushButton1 );
158   stage.Add( pushButton2 );
159
160   manager.SetFocus(pushButton1);
161   DALI_TEST_CHECK(pushButton1 == manager.GetCurrentFocusControl());
162
163   manager.SetFocus(pushButton2);
164   DALI_TEST_CHECK(pushButton2 == manager.GetCurrentFocusControl());
165
166   manager.SetFocus(pushButton1);
167   DALI_TEST_CHECK(pushButton1 == manager.GetCurrentFocusControl());
168   END_TEST;
169 }
170
171 int UtcDaliKeyInputFocusManagerRemoveFocus(void)
172 {
173   ToolkitTestApplication application;
174   Stage stage = Stage::GetCurrent();
175
176   tet_infoline(" UtcDaliKeyInputFocusManagerRemoveFocus");
177
178   KeyInputFocusManager manager = KeyInputFocusManager::Get();
179   DALI_TEST_CHECK(manager);
180
181   PushButton pushButton1 = PushButton::New();
182   PushButton pushButton2 = PushButton::New();
183   stage.Add( pushButton1 );
184   stage.Add( pushButton2 );
185
186   manager.SetFocus(pushButton1);
187   DALI_TEST_CHECK(pushButton1 == manager.GetCurrentFocusControl());
188
189   manager.SetFocus(pushButton2);
190   DALI_TEST_CHECK(pushButton2 == manager.GetCurrentFocusControl());
191
192   manager.RemoveFocus(pushButton2);
193   DALI_TEST_CHECK(pushButton1 == manager.GetCurrentFocusControl());
194
195   manager.RemoveFocus(pushButton1);
196   DALI_TEST_CHECK(Control() == manager.GetCurrentFocusControl());
197   END_TEST;
198 }
199
200 int UtcDaliKeyInputFocusManagerIsKeyboardListener(void)
201 {
202   ToolkitTestApplication application;
203   Stage stage = Stage::GetCurrent();
204
205   tet_infoline(" UtcDaliKeyInputFocusManagerIsKeyboardListener");
206
207   KeyInputFocusManager manager = KeyInputFocusManager::Get();
208   DALI_TEST_CHECK(manager);
209
210   PushButton pushButton1 = PushButton::New();
211   PushButton pushButton2 = PushButton::New();
212   stage.Add( pushButton1 );
213   stage.Add( pushButton2 );
214
215   manager.SetFocus(pushButton1);
216   DALI_TEST_CHECK(pushButton1 == manager.GetCurrentFocusControl());
217
218   manager.SetFocus(pushButton2);
219   DALI_TEST_CHECK(pushButton2 == manager.GetCurrentFocusControl());
220
221   DALI_TEST_CHECK(manager.IsKeyboardListener(pushButton1));
222   DALI_TEST_CHECK(manager.IsKeyboardListener(pushButton2));
223
224   manager.RemoveFocus(pushButton2);
225   DALI_TEST_CHECK(!manager.IsKeyboardListener(pushButton2));
226
227   manager.RemoveFocus(pushButton1);
228   DALI_TEST_CHECK(!manager.IsKeyboardListener(pushButton1));
229
230   manager.SetFocus(pushButton2);
231   DALI_TEST_CHECK(manager.IsKeyboardListener(pushButton2));
232   pushButton2.ClearKeyInputFocus();
233   DALI_TEST_CHECK(!manager.IsKeyboardListener(pushButton2));
234   END_TEST;
235 }
236
237 int UtcDaliKeyInputFocusManagerSignalKeyInputFocusChanged(void)
238 {
239   ToolkitTestApplication application;
240   KeyInputFocusManager manager = KeyInputFocusManager::Get();
241   Stage stage = Stage::GetCurrent();
242
243   tet_infoline(" UtcDaliKeyInputFocusManagerSignalKeyInputFocusChanged");
244
245   PushButton pushButton1 = PushButton::New();
246   PushButton pushButton2 = PushButton::New();
247
248   stage.Add( pushButton1 );
249   stage.Add( pushButton2 );
250
251   PushButton gainActor, lostActor;
252   KeyInputFocusChangedCallback callback( gainActor, lostActor );
253   manager.KeyInputFocusChangedSignal().Connect( &callback, &KeyInputFocusChangedCallback::Callback );
254
255   manager.SetFocus(pushButton1);
256
257   DALI_TEST_CHECK( gainActor == pushButton1 );
258   DALI_TEST_CHECK( lostActor == Control() );
259
260   gainActor = lostActor = NULL;
261
262   manager.SetFocus(pushButton2);
263
264   DALI_TEST_CHECK( gainActor == pushButton2 );
265   DALI_TEST_CHECK( lostActor == pushButton1 );
266
267   gainActor = lostActor = NULL;
268
269   // Removing the focus actor from the stage would also result in signal emission.
270   stage.Remove( pushButton1 );
271   stage.Remove( pushButton2 );
272
273   DALI_TEST_CHECK( gainActor == Control() );
274   DALI_TEST_CHECK( lostActor == Control() );
275   END_TEST;
276 }
277
278 int UtcDaliKeyInputFocusManagerSignalUnhandledKeyEvent(void)
279 {
280   ToolkitTestApplication application;
281
282   tet_infoline("UtcDaliKeyInputFocusManagerSignalUnhandledKeyEvent");
283
284   SignalData data;
285   SignalUnhandledKeyEventCallback callback( data );
286
287   KeyInputFocusManager manager = KeyInputFocusManager::Get();
288   manager.UnhandledKeyEventSignal().Connect( &callback, &SignalUnhandledKeyEventCallback::Callback );
289
290
291   Integration::KeyEvent event("a", "a", 0, 0, 0, Integration::KeyEvent::Up);
292   application.ProcessEvent(event);
293
294   DALI_TEST_CHECK(data.functorCalled);
295   DALI_TEST_CHECK(event.keyName == data.receivedKeyEvent.keyPressedName );
296   DALI_TEST_CHECK(event.keyCode == data.receivedKeyEvent.keyCode);
297   DALI_TEST_CHECK(event.keyString == data.receivedKeyEvent.keyPressed );
298   DALI_TEST_CHECK(event.state == data.receivedKeyEvent.state );
299
300   data.Reset();
301
302   Integration::KeyEvent event2("v", "v", 0, 0, 0, Integration::KeyEvent::Up);
303   application.ProcessEvent(event2);
304
305   DALI_TEST_CHECK(data.functorCalled);
306   DALI_TEST_CHECK(event2.keyName == data.receivedKeyEvent.keyPressedName );
307   DALI_TEST_CHECK(event2.keyCode == data.receivedKeyEvent.keyCode);
308   DALI_TEST_CHECK(event2.keyString == data.receivedKeyEvent.keyPressed );
309   END_TEST;
310 }