1
// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*-
3
* Copyright 2013 Canonical Ltd.
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.
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.
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/>
19
* Authored by: Manuel de la Pena <manuel.delapena@canonical.com>
23
#include <gmock/gmock.h>
24
#include <gtest/gtest.h>
26
#include <unity-shared/IMTextEntry.h>
27
#include "dash/previews/TabIterator.h"
28
#include "test_utils.h"
30
using ::testing::Return;
41
class MockedTabIterator : public TabIterator
44
using TabIterator::areas_;
47
class TestTabIterator : public ::testing::Test
50
TestTabIterator() : Test(),
51
tab_iterator(new MockedTabIterator())
56
std::unique_ptr<MockedTabIterator> tab_iterator;
59
TEST_F(TestTabIterator, DoRemove)
61
unity::IMTextEntry* entry = new unity::IMTextEntry();
62
tab_iterator->areas_.push_front(entry);
63
tab_iterator->Remove(entry);
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());
70
TEST_F(TestTabIterator, DoRemoveMissing)
72
unity::IMTextEntry* entry = new unity::IMTextEntry();
73
tab_iterator->Remove(entry);
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());
80
TEST_F(TestTabIterator, Prepend)
82
for(int index=0; index < 10; ++index)
84
unity::IMTextEntry* entry = new unity::IMTextEntry();
85
tab_iterator->areas_.push_front(entry);
88
unity::IMTextEntry* entry = new unity::IMTextEntry();
89
tab_iterator->Prepend(entry);
91
std::list<nux::InputArea*>::iterator it = std::find(tab_iterator->areas_.begin(),
92
tab_iterator->areas_.end(), entry);
94
EXPECT_EQ(it, tab_iterator->areas_.begin());
97
TEST_F(TestTabIterator, Append)
99
for(int index=0; index < 10; ++index)
101
unity::IMTextEntry* entry = new unity::IMTextEntry();
102
tab_iterator->areas_.push_front(entry);
105
unity::IMTextEntry* entry = new unity::IMTextEntry();
106
tab_iterator->Append(entry);
107
nux::InputArea* last = tab_iterator->areas_.back();
109
EXPECT_TRUE(entry == last); // compare pointers
112
TEST_F(TestTabIterator, InsertIndex)
114
for(int index=0; index < 10; ++index)
116
unity::IMTextEntry* entry = new unity::IMTextEntry();
117
tab_iterator->areas_.push_front(entry);
119
unity::IMTextEntry* entry = new unity::IMTextEntry();
120
tab_iterator->Insert(entry, 5);
122
std::list<nux::InputArea*>::iterator it = tab_iterator->areas_.begin();
125
EXPECT_NE(tab_iterator->areas_.end(), it);
126
EXPECT_TRUE(entry == (unity::IMTextEntry*)*it);
129
TEST_F(TestTabIterator, InsertIndexTooLarge)
131
for(int index=0; index < 5; ++index)
133
unity::IMTextEntry* entry = new unity::IMTextEntry();
134
tab_iterator->areas_.push_front(entry);
137
unity::IMTextEntry* entry = new unity::IMTextEntry();
138
tab_iterator->Insert(entry, 7);
140
nux::InputArea* last = tab_iterator->areas_.back();
142
EXPECT_TRUE(entry == last); // compare pointers
145
TEST_F(TestTabIterator, InsertBefore)
147
unity::IMTextEntry* first_entry = new unity::IMTextEntry();
148
tab_iterator->areas_.push_front(first_entry);
150
unity::IMTextEntry* second_entry = new unity::IMTextEntry();
151
tab_iterator->InsertBefore(second_entry, first_entry);
153
EXPECT_TRUE(second_entry == *tab_iterator->areas_.begin());
156
TEST_F(TestTabIterator, InsertBeforeMissing)
158
for(int index=0; index < 5; ++index)
160
unity::IMTextEntry* entry = new unity::IMTextEntry();
161
tab_iterator->areas_.push_front(entry);
164
unity::IMTextEntry* first_entry = new unity::IMTextEntry();
165
unity::IMTextEntry* second_entry = new unity::IMTextEntry();
166
tab_iterator->InsertBefore(second_entry, first_entry);
168
std::list<nux::InputArea*>::iterator it = std::find(tab_iterator->areas_.begin(),
169
tab_iterator->areas_.end(), second_entry);
171
nux::InputArea* last = tab_iterator->areas_.back();
173
EXPECT_TRUE(second_entry == last);
176
TEST_F(TestTabIterator, InsertAfter)
178
unity::IMTextEntry* first_entry = new unity::IMTextEntry();
179
tab_iterator->areas_.push_front(first_entry);
181
unity::IMTextEntry* second_entry = new unity::IMTextEntry();
182
tab_iterator->InsertAfter(second_entry, first_entry);
184
nux::InputArea* last = tab_iterator->areas_.back();
186
EXPECT_TRUE(second_entry == last);
189
TEST_F(TestTabIterator, InsertAfterMissing)
191
for(int index=0; index < 5; ++index)
193
unity::IMTextEntry* entry = new unity::IMTextEntry();
194
tab_iterator->areas_.push_front(entry);
197
unity::IMTextEntry* first_entry = new unity::IMTextEntry();
198
unity::IMTextEntry* second_entry = new unity::IMTextEntry();
199
tab_iterator->InsertAfter(second_entry, first_entry);
201
std::list<nux::InputArea*>::iterator it = std::find(tab_iterator->areas_.begin(),
202
tab_iterator->areas_.end(), second_entry);
204
nux::InputArea* last = tab_iterator->areas_.back();
206
EXPECT_TRUE(second_entry == last);
209
TEST_F(TestTabIterator, GetDefaultFocus)
211
for(int index=0; index < 10; ++index)
213
unity::IMTextEntry* entry = new unity::IMTextEntry();
214
tab_iterator->areas_.push_front(entry);
217
unity::IMTextEntry* entry = new unity::IMTextEntry();
218
tab_iterator->Prepend(entry);
220
EXPECT_TRUE(tab_iterator->DefaultFocus() == entry);
223
TEST_F(TestTabIterator, GetDefaultFocusEmpty)
225
EXPECT_TRUE(tab_iterator->DefaultFocus() == nullptr);
228
TEST_F(TestTabIterator, FindKeyFocusAreaFromWindow)
230
nux::InputArea* current_focus_area = nux::GetWindowCompositor().GetKeyFocusArea();
231
// add the area to the iterator
232
tab_iterator->Prepend(current_focus_area);
234
EXPECT_TRUE(tab_iterator->FindKeyFocusArea(0, 0, 0) == current_focus_area);
237
TEST_F(TestTabIterator, FindKeyFocusFromIterator)
239
for(int index=0; index < 10; ++index)
241
unity::IMTextEntry* entry = new unity::IMTextEntry();
242
tab_iterator->areas_.push_front(entry);
245
unity::IMTextEntry* entry = new unity::IMTextEntry();
246
tab_iterator->Prepend(entry);
248
EXPECT_TRUE(tab_iterator->FindKeyFocusArea(0, 0, 0) == entry);
251
TEST_F(TestTabIterator, FindKeyFocusAreaEmpty)
253
EXPECT_TRUE(tab_iterator->FindKeyFocusArea(0, 0, 0) == nullptr);
256
TEST_F(TestTabIterator, KeyNavIterationEmpty)
258
nux::Area* area = tab_iterator->KeyNavIteration(nux::KEY_NAV_TAB_PREVIOUS);
259
EXPECT_TRUE(area == nullptr);
262
TEST_F(TestTabIterator, KeyNavIterationWrongDirection)
264
nux::Area* area = tab_iterator->KeyNavIteration(nux::KEY_NAV_NONE);
265
EXPECT_TRUE(area == nullptr);
268
TEST_F(TestTabIterator, KeyNavIterationWithNoCurrentSelectionAndPreviousMove)
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);
275
unity::IMTextEntry* result = (unity::IMTextEntry*) tab_iterator->KeyNavIteration(
276
nux::KEY_NAV_TAB_PREVIOUS);
278
EXPECT_TRUE(result == *tab_iterator->areas_.end());
281
TEST_F(TestTabIterator, KeyNavIterationNoCurrentSelectionAndNextMove)
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);
288
unity::IMTextEntry* result = (unity::IMTextEntry*) tab_iterator->KeyNavIteration(
289
nux::KEY_NAV_TAB_NEXT);
291
EXPECT_TRUE(result == *tab_iterator->areas_.begin());
294
TEST_F(TestTabIterator, KeyNavIterationWithPreviousSelectionIsFirstArea)
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);
301
nux::GetWindowCompositor().SetKeyFocusArea(*tab_iterator->areas_.begin());
303
unity::IMTextEntry* result = (unity::IMTextEntry*) tab_iterator->KeyNavIteration(
304
nux::KEY_NAV_TAB_PREVIOUS);
306
EXPECT_TRUE(result == *tab_iterator->areas_.end());
309
TEST_F(TestTabIterator, KeyNavIterationWithPreviousSelectionIsNotFirst)
311
for(int index=0; index < 10; ++index)
313
unity::IMTextEntry* entry = new unity::IMTextEntry();
314
tab_iterator->areas_.push_front(entry);
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);
322
for(int index=0; index < 10; ++index)
324
unity::IMTextEntry* entry = new unity::IMTextEntry();
325
tab_iterator->areas_.push_front(entry);
328
nux::GetWindowCompositor().SetKeyFocusArea(second_entry);
330
unity::IMTextEntry* result = (unity::IMTextEntry*) tab_iterator->KeyNavIteration(
331
nux::KEY_NAV_TAB_PREVIOUS);
332
EXPECT_TRUE(result == first_entry);
335
TEST_F(TestTabIterator, KeyNavIterationWithNextSelectionIsLast)
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();
341
tab_iterator->areas_.push_front(second_entry);
342
tab_iterator->areas_.push_front(first_entry);
344
nux::GetWindowCompositor().SetKeyFocusArea(not_in_areas);
346
unity::IMTextEntry* result = (unity::IMTextEntry*) tab_iterator->KeyNavIteration(
347
nux::KEY_NAV_TAB_NEXT);
349
EXPECT_TRUE(result == *tab_iterator->areas_.begin());
352
TEST_F(TestTabIterator, KeyNavIterationWithNextSelectionIsNotLast)
354
for(int index=0; index < 10; ++index)
356
unity::IMTextEntry* entry = new unity::IMTextEntry();
357
tab_iterator->areas_.push_front(entry);
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);
365
for(int index=0; index < 10; ++index)
367
unity::IMTextEntry* entry = new unity::IMTextEntry();
368
tab_iterator->areas_.push_front(entry);
371
nux::GetWindowCompositor().SetKeyFocusArea(first_entry);
373
unity::IMTextEntry* result = (unity::IMTextEntry*) tab_iterator->KeyNavIteration(
374
nux::KEY_NAV_TAB_NEXT);
375
EXPECT_TRUE(result == second_entry);