1 /*
2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "gtest/gtest.h"
17 #include "widget_selector.h"
18 #include "mock_element_node_iterator.h"
19 #include "mock_controller.h"
20
21 using namespace OHOS::uitest;
22 using namespace std;
23
24 class WidgetSelectorTest : public testing::Test {
25 protected:
SetUp()26 void SetUp() override
27 {
28 std::string domJson = R"(
29 {
30 "attributes":{
31 "windowId":"12",
32 "componentType":"List",
33 "accessibilityId":"1",
34 "content":"Text List",
35 "rectInScreen":"30,60,10,120"
36 },
37 "children":[
38 {
39 "attributes":{
40 "windowId":"12",
41 "accessibilityId":"2",
42 "componentType":"List",
43 "content":"Text List",
44 "rectInScreen":"30,60,10,120"
45 },
46 "children":[
47 {
48 "attributes":{
49 "windowId":"12",
50 "accessibilityId":"3",
51 "componentType":"Image",
52 "content":"Button",
53 "rectInScreen":"30,40,10,20"
54 },
55 "children":[
56 {
57 "attributes":{
58 "windowId":"12",
59 "accessibilityId":"4",
60 "componentType":"Text",
61 "content":"Text One",
62 "rectInScreen":"30,40,10,20"
63 },
64 "children":[]
65 }
66 ]
67 },
68 {
69 "attributes":{
70 "windowId":"12",
71 "componentType":"List",
72 "accessibilityId":"5",
73 "content":"Text List12",
74 "rectInScreen":"40,60,10,20"
75 },
76 "children":[
77 {
78 "attributes":{
79 "windowId":"12",
80 "accessibilityId":"6",
81 "componentType":"Text",
82 "content":"Text One",
83 "rectInScreen":"40,50,10,20"
84 },
85 "children":[]
86 },
87 {
88 "attributes":{
89 "windowId":"12",
90 "accessibilityId":"8",
91 "componentType":"Text",
92 "content":"Text Two",
93 "rectInScreen":"50,60,10,20"
94 },
95 "children":[]
96 }
97 ]
98 }
99 ]
100 },
101 {
102 "attributes":{
103 "windowId":"12",
104 "accessibilityId":"10",
105 "componentType":"Image",
106 "content":"Button",
107 "rectInScreen":"10,20,20,100"
108 },
109 "children":[]
110 },
111 {
112 "attributes":{
113 "windowId":"12",
114 "accessibilityId":"11",
115 "componentType":"Scroll",
116 "content":"Button",
117 "rectInScreen":"20,100,20,100"
118 },
119 "children":[
120 {
121 "attributes":{
122 "windowId":"12",
123 "accessibilityId":"12",
124 "componentType":"Image",
125 "content":"",
126 "rectInScreen":"20,100,20,100"
127 },
128 "children":[]
129 },
130 {
131 "attributes":{
132 "windowId":"12",
133 "accessibilityId":"14",
134 "componentType":"Button",
135 "content":"Text End Button",
136 "rectInScreen":"20,100,20,100"
137 },
138 "children":[
139 {
140 "attributes":{
141 "windowId":"12",
142 "accessibilityId":"15",
143 "componentType":"Text",
144 "content":"Text End",
145 "rectInScreen":"20,100,20,100"
146 },
147 "children":[]
148 }
149 ]
150 }
151 ]
152 }
153 ]
154 }
155 )";
156 iterator = MockElementNodeIterator::ConstructIteratorByJson(domJson);
157 w1.windowLayer_ = 2;
158 w1.bounds_ = Rect{0, 1000, 0, 1200};
159 w1.bundleName_ = "test1";
160 }
161 Window w1{12};
162 std::unique_ptr<ElementNodeIterator> iterator = nullptr;
163 ~WidgetSelectorTest() override = default;
164 };
165
TEST_F(WidgetSelectorTest,signleMatcherWithoutLocatorAndExistsNoTarget)166 TEST_F(WidgetSelectorTest, signleMatcherWithoutLocatorAndExistsNoTarget)
167 {
168 auto selector = WidgetSelector();
169 auto matcher = WidgetMatchModel(UiAttr::TEXT, "WLJ", EQ);
170 selector.AddMatcher(matcher);
171
172 std::vector<Widget> visits;
173 std::vector<int> targets;
174 selector.Select(w1, *iterator.get(), visits, targets);
175 ASSERT_EQ(0, targets.size());
176 }
177
TEST_F(WidgetSelectorTest,signleMatcherWithoutLocatorAndExistsSingleTarget)178 TEST_F(WidgetSelectorTest, signleMatcherWithoutLocatorAndExistsSingleTarget)
179 {
180 auto selector = WidgetSelector();
181 auto matcher = WidgetMatchModel(UiAttr::TEXT, "Text One", EQ);
182 selector.AddMatcher(matcher);
183
184 std::vector<Widget> visits;
185 std::vector<int> targets;
186 selector.Select(w1, *iterator.get(), visits, targets);
187
188 ASSERT_EQ(1, targets.size());
189 // check the result widget
190 ASSERT_EQ("4", visits[targets[0]].GetAttr(UiAttr::ACCESSIBILITY_ID));
191 }
192
TEST_F(WidgetSelectorTest,multiMatcherWithoutLocatorAndExistsSingleTarget)193 TEST_F(WidgetSelectorTest, multiMatcherWithoutLocatorAndExistsSingleTarget)
194 {
195 auto selector = WidgetSelector();
196 auto matcher0 = WidgetMatchModel(UiAttr::TEXT, "Text One", EQ);
197 auto matcher1 = WidgetMatchModel(UiAttr::ACCESSIBILITY_ID, "6", EQ);
198 selector.AddMatcher(matcher0);
199 selector.AddMatcher(matcher1);
200
201 std::vector<Widget> visits;
202 std::vector<int> targets;
203 selector.Select(w1, *iterator.get(), visits, targets);
204
205 ASSERT_EQ(1, targets.size());
206 // check the result widget
207 ASSERT_EQ("6", visits[targets[0]].GetAttr(UiAttr::ACCESSIBILITY_ID));
208 }
209
TEST_F(WidgetSelectorTest,multiMatcherWithoutLocatorAndExistMultiTargets)210 TEST_F(WidgetSelectorTest, multiMatcherWithoutLocatorAndExistMultiTargets)
211 {
212 auto selector = WidgetSelector();
213 auto matcher0 = WidgetMatchModel(UiAttr::TEXT, "Text One", CONTAINS);
214 selector.AddMatcher(matcher0);
215 selector.SetWantMulti(true);
216 std::vector<Widget> visits;
217 std::vector<int> targets;
218 selector.Select(w1, *iterator.get(), visits, targets);
219
220 ASSERT_EQ(2, targets.size());
221 // check the result widgets and the order, should arranges in DFS order
222
223 ASSERT_EQ("4", visits[targets[0]].GetAttr(UiAttr::ACCESSIBILITY_ID));
224 ASSERT_EQ("6", visits[targets[1]].GetAttr(UiAttr::ACCESSIBILITY_ID));
225 }
226
TEST_F(WidgetSelectorTest,singleFrontLocatorAndExistsNoTarget)227 TEST_F(WidgetSelectorTest, singleFrontLocatorAndExistsNoTarget)
228 {
229 ApiCallErr err(NO_ERROR);
230 auto selector = WidgetSelector();
231 auto matcher0 = WidgetMatchModel(UiAttr::TEXT, "Text List", CONTAINS);
232 selector.AddMatcher(matcher0);
233
234 auto frontMatcher = WidgetMatchModel(UiAttr::TEXT, "Text List12", EQ);
235 auto frontLocator = WidgetSelector();
236 frontLocator.AddMatcher(frontMatcher);
237 selector.AddFrontLocator(frontLocator, err);
238 ASSERT_EQ(NO_ERROR, err.code_);
239 std::vector<Widget> visits;
240 std::vector<int> targets;
241 selector.Select(w1, *iterator.get(), visits, targets);
242 // "id10" is not in front of "*Transfer*", so no widget should be selected
243 ASSERT_EQ(0, targets.size());
244 }
245
TEST_F(WidgetSelectorTest,singleFrontLocatorAndExistsSingleTarget)246 TEST_F(WidgetSelectorTest, singleFrontLocatorAndExistsSingleTarget)
247 {
248 ApiCallErr err(NO_ERROR);
249 auto selector = WidgetSelector();
250 auto matcher0 = WidgetMatchModel(UiAttr::TEXT, "Text One", CONTAINS);
251 selector.AddMatcher(matcher0);
252
253 auto frontMatcher = WidgetMatchModel(UiAttr::TEXT, "Text List12", EQ);
254 auto frontLocator = WidgetSelector();
255 frontLocator.AddMatcher(frontMatcher);
256 selector.AddFrontLocator(frontLocator, err);
257 ASSERT_EQ(NO_ERROR, err.code_);
258 std::vector<Widget> visits;
259 std::vector<int> targets;
260 selector.Select(w1, *iterator.get(), visits, targets);
261 // "id10" is not in front of "*Transfer*", so no widget should be selected
262 ASSERT_EQ(1, targets.size());
263 ASSERT_EQ("6", visits[targets[0]].GetAttr(UiAttr::ACCESSIBILITY_ID));
264 }
265
TEST_F(WidgetSelectorTest,singleFrontLocatorAndExistMultiTargets)266 TEST_F(WidgetSelectorTest, singleFrontLocatorAndExistMultiTargets)
267 {
268 ApiCallErr err(NO_ERROR);
269 auto selector = WidgetSelector();
270 auto matcher0 = WidgetMatchModel(UiAttr::TEXT, "Text", STARTS_WITH);
271 selector.AddMatcher(matcher0);
272
273 auto frontMatcher = WidgetMatchModel(UiAttr::TYPE, "Scroll", EQ);
274 auto frontLocator = WidgetSelector();
275 frontLocator.AddMatcher(frontMatcher);
276 selector.AddFrontLocator(frontLocator, err);
277 selector.SetWantMulti(true);
278 ASSERT_EQ(NO_ERROR, err.code_);
279
280 std::vector<Widget> visits;
281 std::vector<int> targets;
282 selector.Select(w1, *iterator.get(), visits, targets);
283 // "id9" is not in front of "Transfer files" and "Transfer photos", so two widgets should be selected
284 ASSERT_EQ(2, targets.size());
285 // check the result widgets and the order, should arranges in DFS order
286 ASSERT_EQ("14", visits[targets[0]].GetAttr(UiAttr::ACCESSIBILITY_ID));
287 ASSERT_EQ("15", visits[targets[1]].GetAttr(UiAttr::ACCESSIBILITY_ID));
288 }
289
TEST_F(WidgetSelectorTest,multiFrontLocatorAndExistsNoTarget)290 TEST_F(WidgetSelectorTest, multiFrontLocatorAndExistsNoTarget)
291 {
292 ApiCallErr err(NO_ERROR);
293 auto selector = WidgetSelector();
294 auto matcher0 = WidgetMatchModel(UiAttr::TEXT, "Text List", CONTAINS);
295 selector.AddMatcher(matcher0);
296
297 auto frontMatcher0 = WidgetMatchModel(UiAttr::TEXT, "Text List12", EQ);
298 auto frontLocator0 = WidgetSelector();
299 frontLocator0.AddMatcher(frontMatcher0);
300 selector.AddFrontLocator(frontLocator0, err);
301 ASSERT_EQ(NO_ERROR, err.code_);
302 auto frontMatcher1 = WidgetMatchModel(UiAttr::TYPE, "Image", EQ);
303 auto frontLocator1 = WidgetSelector();
304 frontLocator1.AddMatcher(frontMatcher1);
305 selector.AddFrontLocator(frontLocator1, err);
306 ASSERT_EQ(NO_ERROR, err.code_);
307 std::vector<Widget> visits;
308 std::vector<int> targets;
309 selector.Select(w1, *iterator.get(), visits, targets);
310 // "id1" is in front of "*Transfer*" but "id10" isn't, so no widget should be selected
311 ASSERT_EQ(0, targets.size());
312 }
313
TEST_F(WidgetSelectorTest,multiFrontLocatorAndExistsSingleTarget)314 TEST_F(WidgetSelectorTest, multiFrontLocatorAndExistsSingleTarget)
315 {
316 ApiCallErr err(NO_ERROR);
317 auto selector = WidgetSelector();
318 auto matcher0 = WidgetMatchModel(UiAttr::TEXT, "Text Two", CONTAINS);
319 selector.AddMatcher(matcher0);
320
321 auto frontMatcher0 = WidgetMatchModel(UiAttr::TEXT, "Text List12", EQ);
322 auto frontLocator0 = WidgetSelector();
323 frontLocator0.AddMatcher(frontMatcher0);
324 selector.AddFrontLocator(frontLocator0, err);
325 ASSERT_EQ(NO_ERROR, err.code_);
326 auto frontMatcher1 = WidgetMatchModel(UiAttr::TYPE, "Image", EQ);
327 auto frontLocator1 = WidgetSelector();
328 frontLocator1.AddMatcher(frontMatcher1);
329 selector.AddFrontLocator(frontLocator1, err);
330 ASSERT_EQ(NO_ERROR, err.code_);
331 std::vector<Widget> visits;
332 std::vector<int> targets;
333 selector.Select(w1, *iterator.get(), visits, targets);
334 // "id1" is in front of "*Transfer*" but "id10" isn't, so no widget should be selected
335 ASSERT_EQ(1, targets.size());
336 ASSERT_EQ("8", visits[targets[0]].GetAttr(UiAttr::ACCESSIBILITY_ID));
337 }
338
TEST_F(WidgetSelectorTest,multiFrontLocatorAndExistMultiTargets)339 TEST_F(WidgetSelectorTest, multiFrontLocatorAndExistMultiTargets)
340 {
341 ApiCallErr err(NO_ERROR);
342 auto selector = WidgetSelector();
343 auto matcher0 = WidgetMatchModel(UiAttr::TEXT, "Text", STARTS_WITH);
344 selector.AddMatcher(matcher0);
345
346 auto frontMatcher0 = WidgetMatchModel(UiAttr::TYPE, "Image", EQ);
347 auto frontLocator0 = WidgetSelector();
348 frontLocator0.AddMatcher(frontMatcher0);
349 selector.AddFrontLocator(frontLocator0, err);
350 ASSERT_EQ(NO_ERROR, err.code_);
351 auto frontMatcher1 = WidgetMatchModel(UiAttr::TEXT, "Text List12", EQ);
352 auto frontLocator1 = WidgetSelector();
353 frontLocator1.AddMatcher(frontMatcher1);
354 selector.AddFrontLocator(frontLocator1, err);
355 ASSERT_EQ(NO_ERROR, err.code_);
356 selector.SetWantMulti(true);
357 std::vector<Widget> visits;
358 std::vector<int> targets;
359 selector.Select(w1, *iterator.get(), visits, targets);
360
361 // both "id8" and "id9" are in front of "Transfer files" but not "*Transfer*", two widgets should be selected
362 ASSERT_EQ(4, targets.size());
363 // check the result widgets and the order, should arranges in DFS order
364 ASSERT_EQ("6", visits.at(targets.at(0)).GetAttr(ACCESSIBILITY_ID));
365 ASSERT_EQ("8", visits.at(targets.at(1)).GetAttr(ACCESSIBILITY_ID));
366 ASSERT_EQ("14", visits.at(targets.at(2)).GetAttr(ACCESSIBILITY_ID));
367 ASSERT_EQ("15", visits.at(targets.at(3)).GetAttr(ACCESSIBILITY_ID));
368 }
369
TEST_F(WidgetSelectorTest,singleRearLocatorAndExistsNoTarget)370 TEST_F(WidgetSelectorTest, singleRearLocatorAndExistsNoTarget)
371 {
372 ApiCallErr err(NO_ERROR);
373 auto selector = WidgetSelector();
374 auto matcher0 = WidgetMatchModel(UiAttr::TEXT, "Text End", EQ);
375 selector.AddMatcher(matcher0);
376
377 auto rearMatcher = WidgetMatchModel(UiAttr::TYPE, "Scroll", EQ);
378 auto rearLocator = WidgetSelector();
379 rearLocator.AddMatcher(rearMatcher);
380 selector.AddRearLocator(rearLocator, err);
381 ASSERT_EQ(NO_ERROR, err.code_);
382
383 std::vector<Widget> visits;
384 std::vector<int> targets;
385 selector.Select(w1, *iterator.get(), visits, targets);
386 // "id10" is not in rear of "*Transfer*", so no widget should be selected
387 ASSERT_EQ(0, targets.size());
388 }
389
TEST_F(WidgetSelectorTest,singleRearLocatorAndExistsSingleTarget)390 TEST_F(WidgetSelectorTest, singleRearLocatorAndExistsSingleTarget)
391 {
392 ApiCallErr err(NO_ERROR);
393 auto selector = WidgetSelector();
394 auto matcher0 = WidgetMatchModel(UiAttr::TEXT, "Text Two", EQ);
395 selector.AddMatcher(matcher0);
396
397 auto rearMatcher = WidgetMatchModel(UiAttr::TYPE, "Scroll", EQ);
398 auto rearLocator = WidgetSelector();
399 rearLocator.AddMatcher(rearMatcher);
400 selector.AddRearLocator(rearLocator, err);
401 ASSERT_EQ(NO_ERROR, err.code_);
402
403 std::vector<Widget> visits;
404 std::vector<int> targets;
405 selector.Select(w1, *iterator.get(), visits, targets);
406 // "id9" is not in rear of "Transfer photos" but not "Transfer files", so one widget should be selected
407 ASSERT_EQ(1, targets.size());
408 ASSERT_EQ("8", visits.at(targets.at(0)).GetAttr(UiAttr::ACCESSIBILITY_ID));
409 }
410
TEST_F(WidgetSelectorTest,singleRearLocatorAndExistMultiTargets)411 TEST_F(WidgetSelectorTest, singleRearLocatorAndExistMultiTargets)
412 {
413 ApiCallErr err(NO_ERROR);
414 auto selector = WidgetSelector();
415 auto matcher0 = WidgetMatchModel(UiAttr::TEXT, "Text One", EQ);
416 selector.AddMatcher(matcher0);
417
418 auto rearMatcher = WidgetMatchModel(UiAttr::TYPE, "Scroll", EQ);
419 auto rearLocator = WidgetSelector();
420 rearLocator.AddMatcher(rearMatcher);
421 selector.AddRearLocator(rearLocator, err);
422 ASSERT_EQ(NO_ERROR, err.code_);
423 selector.SetWantMulti(true);
424 std::vector<Widget> visits;
425 std::vector<int> targets;
426 selector.Select(w1, *iterator.get(), visits, targets);
427 // "id9" is not in rear of "Transfer photos" but not "Transfer files", so one widget should be selected
428 ASSERT_EQ(2, targets.size());
429 ASSERT_EQ("4", visits.at(targets.at(0)).GetAttr(UiAttr::ACCESSIBILITY_ID));
430 ASSERT_EQ("6", visits.at(targets.at(1)).GetAttr(UiAttr::ACCESSIBILITY_ID));
431 }
432
TEST_F(WidgetSelectorTest,frontAndRearLocatorsAndExistsNoTarget)433 TEST_F(WidgetSelectorTest, frontAndRearLocatorsAndExistsNoTarget)
434 {
435 ApiCallErr err(NO_ERROR);
436 auto selector = WidgetSelector();
437 auto matcher0 = WidgetMatchModel(UiAttr::TEXT, "Text Two", EQ);
438 selector.AddMatcher(matcher0);
439
440 auto frontMatcher = WidgetMatchModel(UiAttr::TYPE, "Scroll", EQ);
441 auto frontLocator = WidgetSelector();
442 frontLocator.AddMatcher(frontMatcher);
443 selector.AddFrontLocator(frontLocator, err);
444 ASSERT_EQ(NO_ERROR, err.code_);
445 auto rearMatcher = WidgetMatchModel(UiAttr::TEXT, "Text List12", EQ);
446 auto rearLocator = WidgetSelector();
447 rearLocator.AddMatcher(rearMatcher);
448 selector.AddRearLocator(rearLocator, err);
449 ASSERT_EQ(NO_ERROR, err.code_);
450 std::vector<Widget> visits;
451 std::vector<int> targets;
452 selector.Select(w1, *iterator.get(), visits, targets);
453 // no "*Transfer*" is between "id8" and "id10", so no widget should be selected
454 ASSERT_EQ(0, targets.size());
455 }
456
TEST_F(WidgetSelectorTest,frontAndRearLocatorsAndExistsSingleTarget)457 TEST_F(WidgetSelectorTest, frontAndRearLocatorsAndExistsSingleTarget)
458 {
459 ApiCallErr err(NO_ERROR);
460 auto selector = WidgetSelector();
461 auto matcher0 = WidgetMatchModel(UiAttr::TEXT, "Text One", EQ);
462 selector.AddMatcher(matcher0);
463
464 auto frontMatcher = WidgetMatchModel(UiAttr::TEXT, "Text List12", EQ);
465 auto frontLocator = WidgetSelector();
466 frontLocator.AddMatcher(frontMatcher);
467 selector.AddFrontLocator(frontLocator, err);
468 ASSERT_EQ(NO_ERROR, err.code_);
469 auto rearMatcher = WidgetMatchModel(UiAttr::TYPE, "Scroll", EQ);
470 auto rearLocator = WidgetSelector();
471 rearLocator.AddMatcher(rearMatcher);
472 selector.AddRearLocator(rearLocator, err);
473 ASSERT_EQ(NO_ERROR, err.code_);
474 selector.SetWantMulti(true);
475 std::vector<Widget> visits;
476 std::vector<int> targets;
477 selector.Select(w1, *iterator.get(), visits, targets);
478
479 // only "Transfer photos" is between "id7" and "id10", one widget should be selected
480 ASSERT_EQ(1, targets.size());
481 ASSERT_EQ("6", visits.at(targets.at(0)).GetAttr(UiAttr::ACCESSIBILITY_ID));
482 }
483
TEST_F(WidgetSelectorTest,frontAndRearLocatorsAndExistMultiTargets)484 TEST_F(WidgetSelectorTest, frontAndRearLocatorsAndExistMultiTargets)
485 {
486 ApiCallErr err(NO_ERROR);
487 auto selector = WidgetSelector();
488 auto matcher0 = WidgetMatchModel(UiAttr::TEXT, "Text", CONTAINS);
489 selector.AddMatcher(matcher0);
490
491 auto frontMatcher = WidgetMatchModel(UiAttr::TEXT, "Text List12", EQ);
492 auto frontLocator = WidgetSelector();
493 frontLocator.AddMatcher(frontMatcher);
494 selector.AddFrontLocator(frontLocator, err);
495 ASSERT_EQ(NO_ERROR, err.code_);
496 auto rearMatcher = WidgetMatchModel(UiAttr::TYPE, "Button", EQ);
497 auto rearLocator = WidgetSelector();
498 rearLocator.AddMatcher(rearMatcher);
499 selector.AddRearLocator(rearLocator, err);
500 ASSERT_EQ(NO_ERROR, err.code_);
501
502 selector.SetWantMulti(true);
503 std::vector<Widget> visits;
504 std::vector<int> targets;
505 selector.Select(w1, *iterator.get(), visits, targets);
506
507 // both of "Use USB to" and "Transfer photos" are between "id3" and "id9", so two widgets should be selected
508 ASSERT_EQ(2, targets.size());
509 // check the result widgets and the order, should arranges in DFS order
510 ASSERT_EQ("6", visits.at(targets.at(0)).GetAttr(UiAttr::ACCESSIBILITY_ID));
511 ASSERT_EQ("8", visits.at(targets.at(1)).GetAttr(UiAttr::ACCESSIBILITY_ID));
512
513 selector.SetWantMulti(false);
514 std::vector<Widget> visits2;
515 std::vector<int> targets2;
516 selector.Select(w1, *iterator.get(), visits2, targets2);
517
518 // both of "Use USB to" and "Transfer photos" are between "id3" and "id9", so two widgets should be selected
519 ASSERT_EQ(1, targets2.size());
520 // check the result widgets and the order, should arranges in DFS order
521 ASSERT_EQ("6", visits2.at(targets2.at(0)).GetAttr(UiAttr::ACCESSIBILITY_ID));
522 }
523
TEST_F(WidgetSelectorTest,nestingUsageDetect)524 TEST_F(WidgetSelectorTest, nestingUsageDetect)
525 {
526 ApiCallErr err(NO_ERROR);
527 auto selector = WidgetSelector();
528 auto matcher0 = WidgetMatchModel(UiAttr::TEXT, "Text", CONTAINS);
529 selector.AddMatcher(matcher0);
530
531 auto frontMatcher = WidgetMatchModel(UiAttr::TEXT, "Text", CONTAINS);
532 auto frontLocator = WidgetSelector();
533 frontLocator.AddMatcher(frontMatcher);
534 ASSERT_EQ(NO_ERROR, err.code_);
535 frontLocator.AddRearLocator(frontLocator, err);
536 ASSERT_EQ(NO_ERROR, err.code_);
537
538 // make the front locator nesting
539 selector.AddFrontLocator(frontLocator, err);
540 ASSERT_EQ(ERR_INVALID_INPUT, err.code_);
541 }
542
TEST_F(WidgetSelectorTest,selectorDescription)543 TEST_F(WidgetSelectorTest, selectorDescription)
544 {
545 ApiCallErr err(NO_ERROR);
546 auto selector = WidgetSelector();
547 auto matcher0 = WidgetMatchModel(UiAttr::TEXT, "Text", CONTAINS);
548 selector.AddMatcher(matcher0);
549
550 auto frontMatcher = WidgetMatchModel(UiAttr::TEXT, "Text List12", EQ);
551 auto frontLocator = WidgetSelector();
552 frontLocator.AddMatcher(frontMatcher);
553 selector.AddFrontLocator(frontLocator, err);
554 ASSERT_EQ(NO_ERROR, err.code_);
555 auto rearMatcher = WidgetMatchModel(UiAttr::TYPE, "Button", EQ);
556 auto rearLocator = WidgetSelector();
557 rearLocator.AddMatcher(rearMatcher);
558 selector.AddRearLocator(rearLocator, err);
559 ASSERT_EQ(NO_ERROR, err.code_);
560
561 auto description = selector.Describe();
562 auto pos0 = description.find("selfMatcher");
563 auto pos1 = description.find(matcher0.Describe());
564 auto pos2 = description.find("frontMatcher");
565 auto pos3 = description.find(frontMatcher.Describe());
566 auto pos4 = description.find("rearMatcher");
567 auto pos5 = description.find(rearMatcher.Describe());
568 ASSERT_TRUE(pos0 != string::npos && pos0 > 0);
569 ASSERT_TRUE(pos1 != string::npos && pos1 > pos0);
570 ASSERT_TRUE(pos2 != string::npos && pos2 > pos1);
571 ASSERT_TRUE(pos3 != string::npos && pos3 > pos2);
572 ASSERT_TRUE(pos4 != string::npos && pos4 > pos3);
573 ASSERT_TRUE(pos5 != string::npos && pos5 > pos4);
574 }
575
TEST_F(WidgetSelectorTest,singleParentLocatorAndExistsNoTarget)576 TEST_F(WidgetSelectorTest, singleParentLocatorAndExistsNoTarget)
577 {
578 ApiCallErr err(NO_ERROR);
579 auto selector = WidgetSelector();
580 auto matcher0 = WidgetMatchModel(UiAttr::TEXT, "Text One", EQ);
581 selector.AddMatcher(matcher0);
582
583 auto parentMatcher = WidgetMatchModel(UiAttr::TYPE, "Scroll", EQ);
584 auto parentLocator = WidgetSelector();
585 parentLocator.AddMatcher(parentMatcher);
586 selector.AddParentLocator(parentLocator, err);
587 ASSERT_EQ(NO_ERROR, err.code_);
588 std::vector<Widget> visits;
589 std::vector<int> targets;
590 selector.Select(w1, *iterator.get(), visits, targets);
591
592 // both of "Use USB to" and "Transfer photos" are between "id3" and "id9", so two widgets should be selected
593 ASSERT_EQ(0, targets.size());
594 }
595
TEST_F(WidgetSelectorTest,singleParentLocatorAndExistsSingleTarget)596 TEST_F(WidgetSelectorTest, singleParentLocatorAndExistsSingleTarget)
597 {
598 ApiCallErr err(NO_ERROR);
599 auto selector = WidgetSelector();
600 auto matcher0 = WidgetMatchModel(UiAttr::TEXT, "Text End", EQ);
601 selector.AddMatcher(matcher0);
602
603 auto parentMatcher = WidgetMatchModel(UiAttr::TYPE, "Scroll", EQ);
604 auto parentLocator = WidgetSelector();
605 parentLocator.AddMatcher(parentMatcher);
606 selector.AddParentLocator(parentLocator, err);
607 ASSERT_EQ(NO_ERROR, err.code_);
608 std::vector<Widget> visits;
609 std::vector<int> targets;
610 selector.Select(w1, *iterator.get(), visits, targets);
611
612 // both of "Use USB to" and "Transfer photos" are between "id3" and "id9", so two widgets should be selected
613 ASSERT_EQ(1, targets.size());
614 ASSERT_EQ("15", visits.at(targets.at(0)).GetAttr(UiAttr::ACCESSIBILITY_ID));
615 }
616
TEST_F(WidgetSelectorTest,singleParentLocatorAndExistMultiTargets)617 TEST_F(WidgetSelectorTest, singleParentLocatorAndExistMultiTargets)
618 {
619 ApiCallErr err(NO_ERROR);
620 auto selector = WidgetSelector();
621 auto matcher0 = WidgetMatchModel(UiAttr::TEXT, "Text", CONTAINS);
622 selector.AddMatcher(matcher0);
623
624 auto parentMatcher = WidgetMatchModel(UiAttr::TYPE, "Scroll", EQ);
625 auto parentLocator = WidgetSelector();
626 parentLocator.AddMatcher(parentMatcher);
627 selector.AddParentLocator(parentLocator, err);
628 selector.SetWantMulti(true);
629 ASSERT_EQ(NO_ERROR, err.code_);
630 std::vector<Widget> visits;
631 std::vector<int> targets;
632 selector.Select(w1, *iterator.get(), visits, targets);
633
634 // both of "Use USB to" and "Transfer photos" are between "id3" and "id9", so two widgets should be selected
635 ASSERT_EQ(2, targets.size());
636 ASSERT_EQ("14", visits.at(targets.at(0)).GetAttr(UiAttr::ACCESSIBILITY_ID));
637 ASSERT_EQ("15", visits.at(targets.at(1)).GetAttr(UiAttr::ACCESSIBILITY_ID));
638 }
639
TEST_F(WidgetSelectorTest,singleParentLocatorAndExistMultiAnchor)640 TEST_F(WidgetSelectorTest, singleParentLocatorAndExistMultiAnchor)
641 {
642 ApiCallErr err(NO_ERROR);
643 auto selector = WidgetSelector();
644 auto matcher0 = WidgetMatchModel(UiAttr::TEXT, "Text", CONTAINS);
645 selector.AddMatcher(matcher0);
646
647 auto parentMatcher = WidgetMatchModel(UiAttr::TYPE, "Image", EQ);
648 auto parentLocator = WidgetSelector();
649 parentLocator.AddMatcher(parentMatcher);
650 selector.AddParentLocator(parentLocator, err);
651 selector.SetWantMulti(true);
652 ASSERT_EQ(NO_ERROR, err.code_);
653 std::vector<Widget> visits;
654 std::vector<int> targets;
655 selector.Select(w1, *iterator.get(), visits, targets);
656
657 // both of "Use USB to" and "Transfer photos" are between "id3" and "id9", so two widgets should be selected
658 ASSERT_EQ(1, targets.size());
659 ASSERT_EQ("4", visits.at(targets.at(0)).GetAttr(UiAttr::ACCESSIBILITY_ID));
660 }
661
TEST_F(WidgetSelectorTest,parentAndParentLocatorsAndExistsNoTarget)662 TEST_F(WidgetSelectorTest, parentAndParentLocatorsAndExistsNoTarget)
663 {
664 ApiCallErr err(NO_ERROR);
665 auto selector = WidgetSelector();
666 auto matcher0 = WidgetMatchModel(UiAttr::TEXT, "Text End", EQ);
667 selector.AddMatcher(matcher0);
668
669 auto parentMatcher = WidgetMatchModel(UiAttr::ACCESSIBILITY_ID, "2", EQ);
670 auto parentLocator = WidgetSelector();
671 parentLocator.AddMatcher(parentMatcher);
672 selector.AddParentLocator(parentLocator, err);
673 ASSERT_EQ(NO_ERROR, err.code_);
674
675 auto parentMatcher1 = WidgetMatchModel(UiAttr::ACCESSIBILITY_ID, "5", EQ);
676 auto parentLocator1 = WidgetSelector();
677 parentLocator1.AddMatcher(parentMatcher1);
678 selector.AddParentLocator(parentLocator1, err);
679 ASSERT_EQ(NO_ERROR, err.code_);
680
681 std::vector<Widget> visits;
682 std::vector<int> targets;
683 selector.Select(w1, *iterator.get(), visits, targets);
684
685 ASSERT_EQ(0, targets.size());
686 }
687
TEST_F(WidgetSelectorTest,parentAndParentLocatorsAndExistsSingleTarget)688 TEST_F(WidgetSelectorTest, parentAndParentLocatorsAndExistsSingleTarget)
689 {
690 ApiCallErr err(NO_ERROR);
691 auto selector = WidgetSelector();
692 auto matcher0 = WidgetMatchModel(UiAttr::TEXT, "Text One", EQ);
693 selector.AddMatcher(matcher0);
694
695 auto parentMatcher = WidgetMatchModel(UiAttr::ACCESSIBILITY_ID, "2", EQ);
696 auto parentLocator = WidgetSelector();
697 parentLocator.AddMatcher(parentMatcher);
698 selector.AddParentLocator(parentLocator, err);
699 ASSERT_EQ(NO_ERROR, err.code_);
700
701 auto parentMatcher1 = WidgetMatchModel(UiAttr::ACCESSIBILITY_ID, "5", EQ);
702 auto parentLocator1 = WidgetSelector();
703 parentLocator1.AddMatcher(parentMatcher1);
704 selector.AddParentLocator(parentLocator1, err);
705 ASSERT_EQ(NO_ERROR, err.code_);
706
707 std::vector<Widget> visits;
708 std::vector<int> targets;
709 selector.Select(w1, *iterator.get(), visits, targets);
710
711 ASSERT_EQ(1, targets.size());
712 ASSERT_EQ("6", visits.at(targets.at(0)).GetAttr(UiAttr::ACCESSIBILITY_ID));
713 }
714
TEST_F(WidgetSelectorTest,parentAndParentLocatorsAndExistsMultiTarget)715 TEST_F(WidgetSelectorTest, parentAndParentLocatorsAndExistsMultiTarget)
716 {
717 ApiCallErr err(NO_ERROR);
718 auto selector = WidgetSelector();
719 auto matcher0 = WidgetMatchModel(UiAttr::TEXT, "Text", CONTAINS);
720 selector.AddMatcher(matcher0);
721
722 auto parentMatcher = WidgetMatchModel(UiAttr::ACCESSIBILITY_ID, "2", EQ);
723 auto parentLocator = WidgetSelector();
724 parentLocator.AddMatcher(parentMatcher);
725 selector.AddParentLocator(parentLocator, err);
726 ASSERT_EQ(NO_ERROR, err.code_);
727
728 auto parentMatcher1 = WidgetMatchModel(UiAttr::ACCESSIBILITY_ID, "5", EQ);
729 auto parentLocator1 = WidgetSelector();
730 parentLocator1.AddMatcher(parentMatcher1);
731 selector.AddParentLocator(parentLocator1, err);
732 ASSERT_EQ(NO_ERROR, err.code_);
733 selector.SetWantMulti(true);
734 std::vector<Widget> visits;
735 std::vector<int> targets;
736 selector.Select(w1, *iterator.get(), visits, targets);
737
738 ASSERT_EQ(2, targets.size());
739 ASSERT_EQ("6", visits.at(targets.at(0)).GetAttr(UiAttr::ACCESSIBILITY_ID));
740 ASSERT_EQ("8", visits.at(targets.at(1)).GetAttr(UiAttr::ACCESSIBILITY_ID));
741 }
742
TEST_F(WidgetSelectorTest,frontAndParentLocatorsAndExistsNoTarget)743 TEST_F(WidgetSelectorTest, frontAndParentLocatorsAndExistsNoTarget)
744 {
745 ApiCallErr err(NO_ERROR);
746 auto selector = WidgetSelector();
747 auto matcher0 = WidgetMatchModel(UiAttr::TEXT, "Text", CONTAINS);
748 selector.AddMatcher(matcher0);
749
750 auto parentMatcher = WidgetMatchModel(UiAttr::ACCESSIBILITY_ID, "2", EQ);
751 auto parentLocator = WidgetSelector();
752 parentLocator.AddMatcher(parentMatcher);
753 selector.AddParentLocator(parentLocator, err);
754 ASSERT_EQ(NO_ERROR, err.code_);
755
756 auto frontMatcher = WidgetMatchModel(UiAttr::TYPE, "Scroll", EQ);
757 auto frontLocator = WidgetSelector();
758 frontLocator.AddMatcher(frontMatcher);
759 selector.AddFrontLocator(frontLocator, err);
760 ASSERT_EQ(NO_ERROR, err.code_);
761
762 selector.SetWantMulti(true);
763 ASSERT_EQ(NO_ERROR, err.code_);
764 std::vector<Widget> visits;
765 std::vector<int> targets;
766 selector.Select(w1, *iterator.get(), visits, targets);
767
768 ASSERT_EQ(0, targets.size());
769 }
770
TEST_F(WidgetSelectorTest,frontAndParentLocatorsAndExistsSingleTarget)771 TEST_F(WidgetSelectorTest, frontAndParentLocatorsAndExistsSingleTarget)
772 {
773 ApiCallErr err(NO_ERROR);
774 auto selector = WidgetSelector();
775 auto matcher0 = WidgetMatchModel(UiAttr::TEXT, "Text One", CONTAINS);
776 selector.AddMatcher(matcher0);
777
778 auto parentMatcher = WidgetMatchModel(UiAttr::ACCESSIBILITY_ID, "2", EQ);
779 auto parentLocator = WidgetSelector();
780 parentLocator.AddMatcher(parentMatcher);
781 selector.AddParentLocator(parentLocator, err);
782 ASSERT_EQ(NO_ERROR, err.code_);
783
784 auto frontMatcher = WidgetMatchModel(UiAttr::TEXT, "Text List12", EQ);
785 auto frontLocator = WidgetSelector();
786 frontLocator.AddMatcher(frontMatcher);
787 selector.AddFrontLocator(frontLocator, err);
788 ASSERT_EQ(NO_ERROR, err.code_);
789
790 std::vector<Widget> visits;
791 std::vector<int> targets;
792 selector.Select(w1, *iterator.get(), visits, targets);
793 ASSERT_EQ(1, targets.size());
794 ASSERT_EQ("6", visits.at(targets.at(0)).GetAttr(UiAttr::ACCESSIBILITY_ID));
795 }
796
TEST_F(WidgetSelectorTest,frontAndParentLocatorsAndExistsMultiTargets)797 TEST_F(WidgetSelectorTest, frontAndParentLocatorsAndExistsMultiTargets)
798 {
799 ApiCallErr err(NO_ERROR);
800 auto selector = WidgetSelector();
801 auto matcher0 = WidgetMatchModel(UiAttr::TEXT, "Text One", CONTAINS);
802 selector.AddMatcher(matcher0);
803
804 auto parentMatcher = WidgetMatchModel(UiAttr::ACCESSIBILITY_ID, "2", EQ);
805 auto parentLocator = WidgetSelector();
806 parentLocator.AddMatcher(parentMatcher);
807 selector.AddParentLocator(parentLocator, err);
808 ASSERT_EQ(NO_ERROR, err.code_);
809
810 auto frontMatcher = WidgetMatchModel(UiAttr::TYPE, "Image", EQ);
811 auto frontLocator = WidgetSelector();
812 frontLocator.AddMatcher(frontMatcher);
813 selector.AddFrontLocator(frontLocator, err);
814 ASSERT_EQ(NO_ERROR, err.code_);
815 selector.SetWantMulti(true);
816 std::vector<Widget> visits;
817 std::vector<int> targets;
818 selector.Select(w1, *iterator.get(), visits, targets);
819 ASSERT_EQ(2, targets.size());
820 ASSERT_EQ("4", visits.at(targets.at(0)).GetAttr(UiAttr::ACCESSIBILITY_ID));
821 ASSERT_EQ("6", visits.at(targets.at(1)).GetAttr(UiAttr::ACCESSIBILITY_ID));
822 }
823
TEST_F(WidgetSelectorTest,rearAndParentLocatorsAndExistsNoTarget)824 TEST_F(WidgetSelectorTest, rearAndParentLocatorsAndExistsNoTarget)
825 {
826 ApiCallErr err(NO_ERROR);
827 auto selector = WidgetSelector();
828 auto matcher0 = WidgetMatchModel(UiAttr::TEXT, "Text One", CONTAINS);
829 selector.AddMatcher(matcher0);
830
831 auto parentMatcher = WidgetMatchModel(UiAttr::ACCESSIBILITY_ID, "11", EQ);
832 auto parentLocator = WidgetSelector();
833 parentLocator.AddMatcher(parentMatcher);
834 selector.AddParentLocator(parentLocator, err);
835 ASSERT_EQ(NO_ERROR, err.code_);
836
837 auto rearMatcher = WidgetMatchModel(UiAttr::TEXT, "Text List12", EQ);
838 auto rearLocator = WidgetSelector();
839 rearLocator.AddMatcher(rearMatcher);
840 selector.AddRearLocator(rearLocator, err);
841 ASSERT_EQ(NO_ERROR, err.code_);
842 std::vector<Widget> visits;
843 std::vector<int> targets;
844 selector.Select(w1, *iterator.get(), visits, targets);
845 ASSERT_EQ(0, targets.size());
846 }
847
TEST_F(WidgetSelectorTest,rearAndParentLocatorsAndExistsSingleTarget)848 TEST_F(WidgetSelectorTest, rearAndParentLocatorsAndExistsSingleTarget)
849 {
850 ApiCallErr err(NO_ERROR);
851 auto selector = WidgetSelector();
852 auto matcher0 = WidgetMatchModel(UiAttr::TEXT, "Text One", CONTAINS);
853 selector.AddMatcher(matcher0);
854
855 auto parentMatcher = WidgetMatchModel(UiAttr::ACCESSIBILITY_ID, "2", EQ);
856 auto parentLocator = WidgetSelector();
857 parentLocator.AddMatcher(parentMatcher);
858 selector.AddParentLocator(parentLocator, err);
859 ASSERT_EQ(NO_ERROR, err.code_);
860
861 auto rearMatcher = WidgetMatchModel(UiAttr::TEXT, "Text List12", EQ);
862 auto rearLocator = WidgetSelector();
863 rearLocator.AddMatcher(rearMatcher);
864 selector.AddRearLocator(rearLocator, err);
865 ASSERT_EQ(NO_ERROR, err.code_);
866 std::vector<Widget> visits;
867 std::vector<int> targets;
868 selector.Select(w1, *iterator.get(), visits, targets);
869 ASSERT_EQ(1, targets.size());
870 ASSERT_EQ("4", visits.at(targets.at(0)).GetAttr(UiAttr::ACCESSIBILITY_ID));
871 }
872
TEST_F(WidgetSelectorTest,rearAndParentLocatorsAndExistsMultiTargets)873 TEST_F(WidgetSelectorTest, rearAndParentLocatorsAndExistsMultiTargets)
874 {
875 ApiCallErr err(NO_ERROR);
876 auto selector = WidgetSelector();
877 auto matcher0 = WidgetMatchModel(UiAttr::TEXT, "Text One", CONTAINS);
878 selector.AddMatcher(matcher0);
879
880 auto parentMatcher = WidgetMatchModel(UiAttr::ACCESSIBILITY_ID, "2", EQ);
881 auto parentLocator = WidgetSelector();
882 parentLocator.AddMatcher(parentMatcher);
883 selector.AddParentLocator(parentLocator, err);
884 ASSERT_EQ(NO_ERROR, err.code_);
885
886 auto rearMatcher = WidgetMatchModel(UiAttr::TEXT, "Text Two", EQ);
887 auto rearLocator = WidgetSelector();
888 rearLocator.AddMatcher(rearMatcher);
889 selector.AddRearLocator(rearLocator, err);
890 ASSERT_EQ(NO_ERROR, err.code_);
891 std::vector<Widget> visits;
892 std::vector<int> targets;
893 selector.Select(w1, *iterator.get(), visits, targets);
894 ASSERT_EQ(1, targets.size());
895 ASSERT_EQ("4", visits.at(targets.at(0)).GetAttr(UiAttr::ACCESSIBILITY_ID));
896
897 selector.SetWantMulti(true);
898 std::vector<Widget> visits2;
899 std::vector<int> targets2;
900 selector.Select(w1, *iterator.get(), visits2, targets2);
901 ASSERT_EQ(2, targets2.size());
902 ASSERT_EQ("4", visits2.at(targets2.at(0)).GetAttr(UiAttr::ACCESSIBILITY_ID));
903 ASSERT_EQ("6", visits2.at(targets2.at(1)).GetAttr(UiAttr::ACCESSIBILITY_ID));
904 }
905
TEST_F(WidgetSelectorTest,frontAndrearAndParentLocatorsAndExistsNoTargets)906 TEST_F(WidgetSelectorTest, frontAndrearAndParentLocatorsAndExistsNoTargets)
907 {
908 ApiCallErr err(NO_ERROR);
909 auto selector = WidgetSelector();
910 auto matcher0 = WidgetMatchModel(UiAttr::ACCESSIBILITY_ID, "4", EQ);
911 selector.AddMatcher(matcher0);
912
913 auto parentMatcher = WidgetMatchModel(UiAttr::ACCESSIBILITY_ID, "2", EQ);
914 auto parentLocator = WidgetSelector();
915 parentLocator.AddMatcher(parentMatcher);
916 selector.AddParentLocator(parentLocator, err);
917 ASSERT_EQ(NO_ERROR, err.code_);
918
919 auto rearMatcher = WidgetMatchModel(UiAttr::TEXT, "Text Two", EQ);
920 auto rearLocator = WidgetSelector();
921 rearLocator.AddMatcher(rearMatcher);
922 selector.AddRearLocator(rearLocator, err);
923 ASSERT_EQ(NO_ERROR, err.code_);
924
925 auto frontMatcher = WidgetMatchModel(UiAttr::TEXT, "Text List12", EQ);
926 auto frontLocator = WidgetSelector();
927 frontLocator.AddMatcher(frontMatcher);
928 selector.AddFrontLocator(frontLocator, err);
929 ASSERT_EQ(NO_ERROR, err.code_);
930
931 std::vector<Widget> visits;
932 std::vector<int> targets;
933 selector.Select(w1, *iterator.get(), visits, targets);
934 ASSERT_EQ(0, targets.size());
935 }
936
TEST_F(WidgetSelectorTest,frontAndrearAndParentLocatorsAndExistsSingleTarget)937 TEST_F(WidgetSelectorTest, frontAndrearAndParentLocatorsAndExistsSingleTarget)
938 {
939 ApiCallErr err(NO_ERROR);
940 auto selector = WidgetSelector();
941 auto matcher0 = WidgetMatchModel(UiAttr::TEXT, "Text One", EQ);
942 selector.AddMatcher(matcher0);
943
944 auto parentMatcher = WidgetMatchModel(UiAttr::ACCESSIBILITY_ID, "2", EQ);
945 auto parentLocator = WidgetSelector();
946 parentLocator.AddMatcher(parentMatcher);
947 selector.AddParentLocator(parentLocator, err);
948 ASSERT_EQ(NO_ERROR, err.code_);
949
950 auto rearMatcher = WidgetMatchModel(UiAttr::TEXT, "Text Two", EQ);
951 auto rearLocator = WidgetSelector();
952 rearLocator.AddMatcher(rearMatcher);
953 selector.AddRearLocator(rearLocator, err);
954 ASSERT_EQ(NO_ERROR, err.code_);
955
956 auto frontMatcher = WidgetMatchModel(UiAttr::TEXT, "Text List12", EQ);
957 auto frontLocator = WidgetSelector();
958 frontLocator.AddMatcher(frontMatcher);
959 selector.AddFrontLocator(frontLocator, err);
960 ASSERT_EQ(NO_ERROR, err.code_);
961
962 std::vector<Widget> visits;
963 std::vector<int> targets;
964 selector.Select(w1, *iterator.get(), visits, targets);
965 ASSERT_EQ(1, targets.size());
966 ASSERT_EQ("6", visits.at(targets.at(0)).GetAttr(UiAttr::ACCESSIBILITY_ID));
967 }
968
TEST_F(WidgetSelectorTest,frontAndrearAndParentLocatorsAndExistsMultiTargets)969 TEST_F(WidgetSelectorTest, frontAndrearAndParentLocatorsAndExistsMultiTargets)
970 {
971 ApiCallErr err(NO_ERROR);
972 auto selector = WidgetSelector();
973 auto matcher0 = WidgetMatchModel(UiAttr::TEXT, "Text One", EQ);
974 selector.AddMatcher(matcher0);
975
976 auto parentMatcher = WidgetMatchModel(UiAttr::ACCESSIBILITY_ID, "2", EQ);
977 auto parentLocator = WidgetSelector();
978 parentLocator.AddMatcher(parentMatcher);
979 selector.AddParentLocator(parentLocator, err);
980 ASSERT_EQ(NO_ERROR, err.code_);
981
982 auto rearMatcher = WidgetMatchModel(UiAttr::TEXT, "Text Two", EQ);
983 auto rearLocator = WidgetSelector();
984 rearLocator.AddMatcher(rearMatcher);
985 selector.AddRearLocator(rearLocator, err);
986 ASSERT_EQ(NO_ERROR, err.code_);
987
988 auto frontMatcher = WidgetMatchModel(UiAttr::TYPE, "Image", EQ);
989 auto frontLocator = WidgetSelector();
990 frontLocator.AddMatcher(frontMatcher);
991 selector.AddFrontLocator(frontLocator, err);
992 ASSERT_EQ(NO_ERROR, err.code_);
993
994 std::vector<Widget> visits;
995 std::vector<int> targets;
996 selector.Select(w1, *iterator.get(), visits, targets);
997 ASSERT_EQ(1, targets.size());
998 ASSERT_EQ("4", visits.at(targets.at(0)).GetAttr(UiAttr::ACCESSIBILITY_ID));
999
1000 selector.SetWantMulti(true);
1001 std::vector<Widget> visits2;
1002 std::vector<int> targets2;
1003 selector.Select(w1, *iterator.get(), visits2, targets2);
1004 ASSERT_EQ(2, targets2.size());
1005 ASSERT_EQ("4", visits2.at(targets2.at(0)).GetAttr(UiAttr::ACCESSIBILITY_ID));
1006 ASSERT_EQ("6", visits2.at(targets2.at(1)).GetAttr(UiAttr::ACCESSIBILITY_ID));
1007 }