• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }