~unity-team/unity/trunk

« back to all changes in this revision

Viewing changes to tests/test_tabiterator.cpp

  • Committer: Tarmac
  • Author(s): Manuel de la Pena
  • Date: 2013-01-29 23:05:50 UTC
  • mfrom: (3016.2.9 tab-order)
  • Revision ID: tarmac-20130129230550-553eooa1me6hzyfk
Added API that allows children classes to add InputAreas to the TabIterator in order to modify the tab navigation order. Did some small refactoring to allow testing the TabIterator but without changing the Preview.h by using a forward class declaration as it used to be. Fixes: https://bugs.launchpad.net/bugs/1102387.

Approved by Nick Dedekind.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*-
 
2
/*
 
3
 * Copyright 2013 Canonical Ltd.
 
4
 *
 
5
 * This program is free software: you can redistribute it and/or modify it
 
6
 * under the terms of the GNU Lesser General Public License version 3, as
 
7
 * published by the  Free Software Foundation.
 
8
 *
 
9
 * This program is distributed in the hope that it will be useful, but
 
10
 * WITHOUT ANY WARRANTY; without even the implied warranties of
 
11
 * MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
 
12
 * PURPOSE.  See the applicable version of the GNU Lesser General Public
 
13
 * License for more details.
 
14
 *
 
15
 * You should have received a copy of both the GNU Lesser General Public
 
16
 * License version 3 along with this program.  If not, see
 
17
 * <http://www.gnu.org/licenses/>
 
18
 *
 
19
 * Authored by: Manuel de la Pena <manuel.delapena@canonical.com>
 
20
 *
 
21
 */
 
22
 
 
23
#include <gmock/gmock.h>
 
24
#include <gtest/gtest.h>
 
25
 
 
26
#include <unity-shared/IMTextEntry.h>
 
27
#include "dash/previews/TabIterator.h"
 
28
#include "test_utils.h"
 
29
 
 
30
using ::testing::Return;
 
31
 
 
32
namespace unity
 
33
{
 
34
 
 
35
namespace dash
 
36
{
 
37
 
 
38
namespace previews
 
39
{
 
40
 
 
41
class MockedTabIterator : public TabIterator
 
42
{
 
43
public:
 
44
  using TabIterator::areas_;
 
45
};
 
46
 
 
47
class TestTabIterator : public ::testing::Test
 
48
{
 
49
  protected:
 
50
    TestTabIterator() : Test(),
 
51
      tab_iterator(new MockedTabIterator())
 
52
    {
 
53
    }
 
54
 
 
55
 
 
56
    std::unique_ptr<MockedTabIterator> tab_iterator;
 
57
};
 
58
 
 
59
TEST_F(TestTabIterator, DoRemove)
 
60
{
 
61
  unity::IMTextEntry* entry = new unity::IMTextEntry();
 
62
  tab_iterator->areas_.push_front(entry);
 
63
  tab_iterator->Remove(entry);
 
64
 
 
65
  std::list<nux::InputArea*>::iterator it = std::find(tab_iterator->areas_.begin(),
 
66
    tab_iterator->areas_.end(), entry);
 
67
  EXPECT_EQ(it, tab_iterator->areas_.end());
 
68
}
 
69
 
 
70
TEST_F(TestTabIterator, DoRemoveMissing)
 
71
{
 
72
  unity::IMTextEntry* entry = new unity::IMTextEntry();
 
73
  tab_iterator->Remove(entry);
 
74
 
 
75
  std::list<nux::InputArea*>::iterator it = std::find(tab_iterator->areas_.begin(),
 
76
    tab_iterator->areas_.end(), entry);
 
77
  EXPECT_EQ(it, tab_iterator->areas_.end());
 
78
}
 
79
 
 
80
TEST_F(TestTabIterator, Prepend)
 
81
{
 
82
  for(int index=0; index < 10; ++index)
 
83
  {
 
84
    unity::IMTextEntry* entry = new unity::IMTextEntry();
 
85
    tab_iterator->areas_.push_front(entry);
 
86
  }
 
87
 
 
88
  unity::IMTextEntry* entry = new unity::IMTextEntry();
 
89
  tab_iterator->Prepend(entry);
 
90
 
 
91
  std::list<nux::InputArea*>::iterator it = std::find(tab_iterator->areas_.begin(),
 
92
    tab_iterator->areas_.end(), entry);
 
93
 
 
94
  EXPECT_EQ(it, tab_iterator->areas_.begin());
 
95
}
 
96
 
 
97
TEST_F(TestTabIterator, Append)
 
98
{
 
99
  for(int index=0; index < 10; ++index)
 
100
  {
 
101
    unity::IMTextEntry* entry = new unity::IMTextEntry();
 
102
    tab_iterator->areas_.push_front(entry);
 
103
  }
 
104
 
 
105
  unity::IMTextEntry* entry = new unity::IMTextEntry();
 
106
  tab_iterator->Append(entry);
 
107
  nux::InputArea* last = tab_iterator->areas_.back();
 
108
 
 
109
  EXPECT_TRUE(entry == last);  // compare pointers
 
110
}
 
111
 
 
112
TEST_F(TestTabIterator, InsertIndex)
 
113
{
 
114
  for(int index=0; index < 10; ++index)
 
115
  {
 
116
    unity::IMTextEntry* entry = new unity::IMTextEntry();
 
117
    tab_iterator->areas_.push_front(entry);
 
118
  }
 
119
  unity::IMTextEntry* entry = new unity::IMTextEntry();
 
120
  tab_iterator->Insert(entry, 5);
 
121
 
 
122
  std::list<nux::InputArea*>::iterator it = tab_iterator->areas_.begin();
 
123
  std::advance(it, 5);
 
124
 
 
125
  EXPECT_NE(tab_iterator->areas_.end(), it);
 
126
  EXPECT_TRUE(entry == (unity::IMTextEntry*)*it);
 
127
}
 
128
 
 
129
TEST_F(TestTabIterator, InsertIndexTooLarge)
 
130
{
 
131
  for(int index=0; index < 5; ++index)
 
132
  {
 
133
    unity::IMTextEntry* entry = new unity::IMTextEntry();
 
134
    tab_iterator->areas_.push_front(entry);
 
135
  }
 
136
 
 
137
  unity::IMTextEntry* entry = new unity::IMTextEntry();
 
138
  tab_iterator->Insert(entry, 7);
 
139
 
 
140
  nux::InputArea* last = tab_iterator->areas_.back();
 
141
 
 
142
  EXPECT_TRUE(entry == last);  // compare pointers
 
143
}
 
144
 
 
145
TEST_F(TestTabIterator, InsertBefore)
 
146
{
 
147
  unity::IMTextEntry* first_entry = new unity::IMTextEntry();
 
148
  tab_iterator->areas_.push_front(first_entry);
 
149
 
 
150
  unity::IMTextEntry* second_entry = new unity::IMTextEntry();
 
151
  tab_iterator->InsertBefore(second_entry, first_entry);
 
152
 
 
153
  EXPECT_TRUE(second_entry == *tab_iterator->areas_.begin());
 
154
}
 
155
 
 
156
TEST_F(TestTabIterator, InsertBeforeMissing)
 
157
{
 
158
  for(int index=0; index < 5; ++index)
 
159
  {
 
160
    unity::IMTextEntry* entry = new unity::IMTextEntry();
 
161
    tab_iterator->areas_.push_front(entry);
 
162
  }
 
163
 
 
164
  unity::IMTextEntry* first_entry = new unity::IMTextEntry();
 
165
  unity::IMTextEntry* second_entry = new unity::IMTextEntry();
 
166
  tab_iterator->InsertBefore(second_entry, first_entry);
 
167
 
 
168
  std::list<nux::InputArea*>::iterator it = std::find(tab_iterator->areas_.begin(),
 
169
    tab_iterator->areas_.end(), second_entry);
 
170
 
 
171
  nux::InputArea* last = tab_iterator->areas_.back();
 
172
 
 
173
  EXPECT_TRUE(second_entry == last);
 
174
}
 
175
 
 
176
TEST_F(TestTabIterator, InsertAfter)
 
177
{
 
178
  unity::IMTextEntry* first_entry = new unity::IMTextEntry();
 
179
  tab_iterator->areas_.push_front(first_entry);
 
180
 
 
181
  unity::IMTextEntry* second_entry = new unity::IMTextEntry();
 
182
  tab_iterator->InsertAfter(second_entry, first_entry);
 
183
 
 
184
  nux::InputArea* last = tab_iterator->areas_.back();
 
185
 
 
186
  EXPECT_TRUE(second_entry == last);
 
187
}
 
188
 
 
189
TEST_F(TestTabIterator, InsertAfterMissing)
 
190
{
 
191
  for(int index=0; index < 5; ++index)
 
192
  {
 
193
    unity::IMTextEntry* entry = new unity::IMTextEntry();
 
194
    tab_iterator->areas_.push_front(entry);
 
195
  }
 
196
 
 
197
  unity::IMTextEntry* first_entry = new unity::IMTextEntry();
 
198
  unity::IMTextEntry* second_entry = new unity::IMTextEntry();
 
199
  tab_iterator->InsertAfter(second_entry, first_entry);
 
200
 
 
201
  std::list<nux::InputArea*>::iterator it = std::find(tab_iterator->areas_.begin(),
 
202
    tab_iterator->areas_.end(), second_entry);
 
203
 
 
204
  nux::InputArea* last = tab_iterator->areas_.back();
 
205
 
 
206
  EXPECT_TRUE(second_entry == last);
 
207
}
 
208
 
 
209
TEST_F(TestTabIterator, GetDefaultFocus)
 
210
{
 
211
  for(int index=0; index < 10; ++index)
 
212
  {
 
213
    unity::IMTextEntry* entry = new unity::IMTextEntry();
 
214
    tab_iterator->areas_.push_front(entry);
 
215
  }
 
216
 
 
217
  unity::IMTextEntry* entry = new unity::IMTextEntry();
 
218
  tab_iterator->Prepend(entry);
 
219
 
 
220
  EXPECT_TRUE(tab_iterator->DefaultFocus() == entry);
 
221
}
 
222
 
 
223
TEST_F(TestTabIterator, GetDefaultFocusEmpty)
 
224
{
 
225
  EXPECT_TRUE(tab_iterator->DefaultFocus() == nullptr);
 
226
}
 
227
 
 
228
TEST_F(TestTabIterator, FindKeyFocusAreaFromWindow)
 
229
{
 
230
  nux::InputArea* current_focus_area = nux::GetWindowCompositor().GetKeyFocusArea();
 
231
  // add the area to the iterator
 
232
  tab_iterator->Prepend(current_focus_area);
 
233
 
 
234
  EXPECT_TRUE(tab_iterator->FindKeyFocusArea(0, 0, 0) == current_focus_area);
 
235
}
 
236
 
 
237
TEST_F(TestTabIterator, FindKeyFocusFromIterator)
 
238
{
 
239
  for(int index=0; index < 10; ++index)
 
240
  {
 
241
    unity::IMTextEntry* entry = new unity::IMTextEntry();
 
242
    tab_iterator->areas_.push_front(entry);
 
243
  }
 
244
 
 
245
  unity::IMTextEntry* entry = new unity::IMTextEntry();
 
246
  tab_iterator->Prepend(entry);
 
247
 
 
248
  EXPECT_TRUE(tab_iterator->FindKeyFocusArea(0, 0, 0) == entry);
 
249
}
 
250
 
 
251
TEST_F(TestTabIterator, FindKeyFocusAreaEmpty)
 
252
{
 
253
  EXPECT_TRUE(tab_iterator->FindKeyFocusArea(0, 0, 0) == nullptr);
 
254
}
 
255
 
 
256
TEST_F(TestTabIterator, KeyNavIterationEmpty)
 
257
{
 
258
  nux::Area* area = tab_iterator->KeyNavIteration(nux::KEY_NAV_TAB_PREVIOUS);
 
259
  EXPECT_TRUE(area == nullptr);
 
260
}
 
261
 
 
262
TEST_F(TestTabIterator, KeyNavIterationWrongDirection)
 
263
{
 
264
  nux::Area* area = tab_iterator->KeyNavIteration(nux::KEY_NAV_NONE);
 
265
  EXPECT_TRUE(area == nullptr);
 
266
}
 
267
 
 
268
TEST_F(TestTabIterator, KeyNavIterationWithNoCurrentSelectionAndPreviousMove)
 
269
{
 
270
  unity::IMTextEntry* first_entry = new unity::IMTextEntry();
 
271
  unity::IMTextEntry* second_entry = new unity::IMTextEntry();
 
272
  tab_iterator->areas_.push_front(second_entry);
 
273
  tab_iterator->areas_.push_front(first_entry);
 
274
 
 
275
  unity::IMTextEntry* result = (unity::IMTextEntry*) tab_iterator->KeyNavIteration(
 
276
    nux::KEY_NAV_TAB_PREVIOUS);
 
277
 
 
278
  EXPECT_TRUE(result == *tab_iterator->areas_.end());
 
279
}
 
280
 
 
281
TEST_F(TestTabIterator, KeyNavIterationNoCurrentSelectionAndNextMove)
 
282
{
 
283
  unity::IMTextEntry* first_entry = new unity::IMTextEntry();
 
284
  unity::IMTextEntry* second_entry = new unity::IMTextEntry();
 
285
  tab_iterator->areas_.push_front(second_entry);
 
286
  tab_iterator->areas_.push_front(first_entry);
 
287
 
 
288
  unity::IMTextEntry* result = (unity::IMTextEntry*) tab_iterator->KeyNavIteration(
 
289
    nux::KEY_NAV_TAB_NEXT);
 
290
 
 
291
  EXPECT_TRUE(result == *tab_iterator->areas_.begin());
 
292
}
 
293
 
 
294
TEST_F(TestTabIterator, KeyNavIterationWithPreviousSelectionIsFirstArea)
 
295
{
 
296
  unity::IMTextEntry* first_entry = new unity::IMTextEntry();
 
297
  unity::IMTextEntry* second_entry = new unity::IMTextEntry();
 
298
  tab_iterator->areas_.push_front(second_entry);
 
299
  tab_iterator->areas_.push_front(first_entry);
 
300
 
 
301
  nux::GetWindowCompositor().SetKeyFocusArea(*tab_iterator->areas_.begin());
 
302
 
 
303
  unity::IMTextEntry* result = (unity::IMTextEntry*) tab_iterator->KeyNavIteration(
 
304
    nux::KEY_NAV_TAB_PREVIOUS);
 
305
 
 
306
  EXPECT_TRUE(result == *tab_iterator->areas_.end());
 
307
}
 
308
 
 
309
TEST_F(TestTabIterator, KeyNavIterationWithPreviousSelectionIsNotFirst)
 
310
{
 
311
  for(int index=0; index < 10; ++index)
 
312
  {
 
313
    unity::IMTextEntry* entry = new unity::IMTextEntry();
 
314
    tab_iterator->areas_.push_front(entry);
 
315
  }
 
316
 
 
317
  unity::IMTextEntry* first_entry = new unity::IMTextEntry();
 
318
  unity::IMTextEntry* second_entry = new unity::IMTextEntry();
 
319
  tab_iterator->areas_.push_front(second_entry);
 
320
  tab_iterator->areas_.push_front(first_entry);
 
321
 
 
322
  for(int index=0; index < 10; ++index)
 
323
  {
 
324
    unity::IMTextEntry* entry = new unity::IMTextEntry();
 
325
    tab_iterator->areas_.push_front(entry);
 
326
  }
 
327
 
 
328
  nux::GetWindowCompositor().SetKeyFocusArea(second_entry);
 
329
 
 
330
  unity::IMTextEntry* result = (unity::IMTextEntry*) tab_iterator->KeyNavIteration(
 
331
    nux::KEY_NAV_TAB_PREVIOUS);
 
332
  EXPECT_TRUE(result == first_entry);
 
333
}
 
334
 
 
335
TEST_F(TestTabIterator, KeyNavIterationWithNextSelectionIsLast)
 
336
{
 
337
  unity::IMTextEntry* first_entry = new unity::IMTextEntry();
 
338
  unity::IMTextEntry* second_entry = new unity::IMTextEntry();
 
339
  unity::IMTextEntry* not_in_areas = new unity::IMTextEntry();
 
340
 
 
341
  tab_iterator->areas_.push_front(second_entry);
 
342
  tab_iterator->areas_.push_front(first_entry);
 
343
 
 
344
  nux::GetWindowCompositor().SetKeyFocusArea(not_in_areas);
 
345
 
 
346
  unity::IMTextEntry* result = (unity::IMTextEntry*) tab_iterator->KeyNavIteration(
 
347
    nux::KEY_NAV_TAB_NEXT);
 
348
 
 
349
  EXPECT_TRUE(result == *tab_iterator->areas_.begin());
 
350
}
 
351
 
 
352
TEST_F(TestTabIterator, KeyNavIterationWithNextSelectionIsNotLast)
 
353
{
 
354
  for(int index=0; index < 10; ++index)
 
355
  {
 
356
    unity::IMTextEntry* entry = new unity::IMTextEntry();
 
357
    tab_iterator->areas_.push_front(entry);
 
358
  }
 
359
 
 
360
  unity::IMTextEntry* first_entry = new unity::IMTextEntry();
 
361
  unity::IMTextEntry* second_entry = new unity::IMTextEntry();
 
362
  tab_iterator->areas_.push_front(second_entry);
 
363
  tab_iterator->areas_.push_front(first_entry);
 
364
 
 
365
  for(int index=0; index < 10; ++index)
 
366
  {
 
367
    unity::IMTextEntry* entry = new unity::IMTextEntry();
 
368
    tab_iterator->areas_.push_front(entry);
 
369
  }
 
370
 
 
371
  nux::GetWindowCompositor().SetKeyFocusArea(first_entry);
 
372
 
 
373
  unity::IMTextEntry* result = (unity::IMTextEntry*) tab_iterator->KeyNavIteration(
 
374
    nux::KEY_NAV_TAB_NEXT);
 
375
  EXPECT_TRUE(result == second_entry);
 
376
}
 
377
 
 
378
} // previews
 
379
 
 
380
} // dash
 
381
 
 
382
} // unity