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