| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314 |
- /**
- * Copyright (c) 2015-present, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
- */
- #import <XCTest/XCTest.h>
- #import "XCUIElementDouble.h"
- #import "FBClassChainQueryParser.h"
- @interface FBClassChainTests : XCTestCase
- @end
- @implementation FBClassChainTests
- - (void)testValidChain
- {
- NSError *error;
- FBClassChain *result = [FBClassChainQueryParser parseQuery:@"XCUIElementTypeWindow/XCUIElementTypeButton" error:&error];
- XCTAssertNotNil(result);
- XCTAssertEqual(result.elements.count, 2);
-
- FBClassChainItem *firstElement = [result.elements firstObject];
- XCTAssertEqual(firstElement.type, XCUIElementTypeWindow);
- XCTAssertNil(firstElement.position);
- XCTAssertFalse(firstElement.isDescendant);
- FBClassChainItem *secondElement = [result.elements objectAtIndex:1];
- XCTAssertEqual(secondElement.type, XCUIElementTypeButton);
- XCTAssertNil(secondElement.position);
- XCTAssertFalse(secondElement.isDescendant);
- }
- - (void)testValidChainWithStar
- {
- NSError *error;
- FBClassChain *result = [FBClassChainQueryParser parseQuery:@"XCUIElementTypeWindow/XCUIElementTypeButton[3]/*[4]/*[5]/XCUIElementTypeAlert" error:&error];
- XCTAssertNotNil(result);
- XCTAssertEqual(result.elements.count, 5);
-
- FBClassChainItem *firstElement = [result.elements firstObject];
- XCTAssertEqual(firstElement.type, XCUIElementTypeWindow);
- XCTAssertNil(firstElement.position);
- XCTAssertFalse(firstElement.isDescendant);
-
- FBClassChainItem *secondElement = [result.elements objectAtIndex:1];
- XCTAssertEqual(secondElement.type, XCUIElementTypeButton);
- XCTAssertEqual(secondElement.position.integerValue, 3);
- XCTAssertFalse(secondElement.isDescendant);
-
- FBClassChainItem *thirdElement = [result.elements objectAtIndex:2];
- XCTAssertEqual(thirdElement.type, XCUIElementTypeAny);
- XCTAssertEqual(thirdElement.position.integerValue, 4);
- XCTAssertFalse(thirdElement.isDescendant);
-
- FBClassChainItem *fourthElement = [result.elements objectAtIndex:3];
- XCTAssertEqual(fourthElement.type, XCUIElementTypeAny);
- XCTAssertEqual(fourthElement.position.integerValue, 5);
- XCTAssertFalse(fourthElement.isDescendant);
-
- FBClassChainItem *fifthsElement = [result.elements objectAtIndex:4];
- XCTAssertEqual(fifthsElement.type, XCUIElementTypeAlert);
- XCTAssertNil(fifthsElement.position);
- XCTAssertFalse(fifthsElement.isDescendant);
- }
- - (void)testValidSingleStarChain
- {
- NSError *error;
- FBClassChain *result = [FBClassChainQueryParser parseQuery:@"*" error:&error];
- XCTAssertNotNil(result);
- XCTAssertEqual(result.elements.count, 1);
-
- FBClassChainItem *firstElement = [result.elements firstObject];
- XCTAssertEqual(firstElement.type, XCUIElementTypeAny);
- XCTAssertNil(firstElement.position);
- XCTAssertFalse(firstElement.isDescendant);
- }
- - (void)testValidSingleStarIndirectChain
- {
- NSError *error;
- FBClassChain *result = [FBClassChainQueryParser parseQuery:@"**/*/*/XCUIElementTypeButton" error:&error];
- XCTAssertNotNil(result);
- XCTAssertEqual(result.elements.count, 3);
-
- FBClassChainItem *firstElement = [result.elements firstObject];
- XCTAssertEqual(firstElement.type, XCUIElementTypeAny);
- XCTAssertNil(firstElement.position);
- XCTAssertTrue(firstElement.isDescendant);
-
- FBClassChainItem *secondElement = [result.elements objectAtIndex:1];
- XCTAssertEqual(secondElement.type, XCUIElementTypeAny);
- XCTAssertNil(secondElement.position);
- XCTAssertFalse(secondElement.isDescendant);
-
- FBClassChainItem *thirdElement = [result.elements objectAtIndex:2];
- XCTAssertEqual(thirdElement.type, XCUIElementTypeButton);
- XCTAssertNil(thirdElement.position);
- XCTAssertFalse(thirdElement.isDescendant);
- }
- - (void)testValidDoubleIndirectChainAndStar
- {
- NSError *error;
- FBClassChain *result = [FBClassChainQueryParser parseQuery:@"**/XCUIElementTypeButton/**/*" error:&error];
- XCTAssertNotNil(result);
- XCTAssertEqual(result.elements.count, 2);
-
- FBClassChainItem *firstElement = [result.elements firstObject];
- XCTAssertEqual(firstElement.type, XCUIElementTypeButton);
- XCTAssertNil(firstElement.position);
- XCTAssertTrue(firstElement.isDescendant);
-
- FBClassChainItem *secondElement = [result.elements objectAtIndex:1];
- XCTAssertEqual(secondElement.type, XCUIElementTypeAny);
- XCTAssertNil(secondElement.position);
- XCTAssertTrue(secondElement.isDescendant);
- }
- - (void)testValidDoubleIndirectChainAndClassName
- {
- NSError *error;
- FBClassChain *result = [FBClassChainQueryParser parseQuery:@"**/XCUIElementTypeButton/**/XCUIElementTypeImage" error:&error];
- XCTAssertNotNil(result);
- XCTAssertEqual(result.elements.count, 2);
-
- FBClassChainItem *firstElement = [result.elements firstObject];
- XCTAssertEqual(firstElement.type, XCUIElementTypeButton);
- XCTAssertNil(firstElement.position);
- XCTAssertTrue(firstElement.isDescendant);
-
- FBClassChainItem *secondElement = [result.elements objectAtIndex:1];
- XCTAssertEqual(secondElement.type, XCUIElementTypeImage);
- XCTAssertNil(secondElement.position);
- XCTAssertTrue(secondElement.isDescendant);
- }
- - (void)testValidChainWithNegativeIndex
- {
- NSError *error;
- FBClassChain *result = [FBClassChainQueryParser parseQuery:@"XCUIElementTypeWindow/XCUIElementTypeButton[-1]" error:&error];
- XCTAssertNotNil(result);
- XCTAssertEqual(result.elements.count, 2);
-
- FBClassChainItem *firstElement = [result.elements firstObject];
- XCTAssertEqual(firstElement.type, XCUIElementTypeWindow);
- XCTAssertNil(firstElement.position);
- XCTAssertEqual(firstElement.predicates.count, 0);
- XCTAssertFalse(firstElement.isDescendant);
-
- FBClassChainItem *secondElement = [result.elements objectAtIndex:1];
- XCTAssertEqual(secondElement.type, XCUIElementTypeButton);
- XCTAssertEqual(secondElement.position.integerValue, -1);
- XCTAssertEqual(secondElement.predicates.count, 0);
- XCTAssertFalse(secondElement.isDescendant);
- }
- - (void)testValidChainWithSinglePredicate
- {
- NSError *error;
- FBClassChain *result = [FBClassChainQueryParser parseQuery:@"XCUIElementTypeWindow[`name == 'blabla'`]/XCUIElementTypeButton" error:&error];
- XCTAssertNotNil(result);
- XCTAssertEqual(result.elements.count, 2);
-
- FBClassChainItem *firstElement = [result.elements firstObject];
- XCTAssertEqual(firstElement.type, XCUIElementTypeWindow);
- XCTAssertNil(firstElement.position);
- XCTAssertEqual(firstElement.predicates.count, 1);
- XCTAssertFalse(firstElement.isDescendant);
-
- FBClassChainItem *secondElement = [result.elements objectAtIndex:1];
- XCTAssertEqual(secondElement.type, XCUIElementTypeButton);
- XCTAssertNil(secondElement.position);
- XCTAssertEqual(secondElement.predicates.count, 0);
- XCTAssertFalse(secondElement.isDescendant);
- }
- - (void)testValidChainWithMultiplePredicates
- {
- NSError *error;
- FBClassChain *result = [FBClassChainQueryParser parseQuery:@"XCUIElementTypeWindow[`name == 'blabla'`]/XCUIElementTypeButton[`value == 'blabla'`]" error:&error];
- XCTAssertNotNil(result);
- XCTAssertEqual(result.elements.count, 2);
-
- FBClassChainItem *firstElement = [result.elements firstObject];
- XCTAssertEqual(firstElement.type, XCUIElementTypeWindow);
- XCTAssertNil(firstElement.position);
- XCTAssertEqual(firstElement.predicates.count, 1);
- XCTAssertFalse(firstElement.isDescendant);
-
- FBClassChainItem *secondElement = [result.elements objectAtIndex:1];
- XCTAssertEqual(secondElement.type, XCUIElementTypeButton);
- XCTAssertNil(secondElement.position);
- XCTAssertEqual(secondElement.predicates.count, 1);
- XCTAssertFalse(secondElement.isDescendant);
- }
- - (void)testValidChainWithIndirectSearchAndPredicates
- {
- NSError *error;
- FBClassChain *result = [FBClassChainQueryParser parseQuery:@"**/XCUIElementTypeTable[`name == 'blabla'`][10]/**/XCUIElementTypeButton[`value == 'blabla'`]" error:&error];
- XCTAssertNotNil(result);
- XCTAssertEqual(result.elements.count, 2);
-
- FBClassChainItem *firstElement = [result.elements firstObject];
- XCTAssertEqual(firstElement.type, XCUIElementTypeTable);
- XCTAssertEqual(firstElement.position.integerValue, 10);
- XCTAssertEqual(firstElement.predicates.count, 1);
- XCTAssertTrue(firstElement.isDescendant);
-
- FBClassChainItem *secondElement = [result.elements objectAtIndex:1];
- XCTAssertEqual(secondElement.type, XCUIElementTypeButton);
- XCTAssertNil(secondElement.position);
- XCTAssertEqual(secondElement.predicates.count, 1);
- XCTAssertTrue(secondElement.isDescendant);
- }
- - (void)testValidChainWithMultiplePredicatesAndPositions
- {
- NSError *error;
- FBClassChain *result = [FBClassChainQueryParser parseQuery:@"*[`name == \"к``ири````'лиця\"`][3]/XCUIElementTypeButton[`value == \"blabla\"`][-1]" error:&error];
- XCTAssertNotNil(result);
- XCTAssertEqual(result.elements.count, 2);
-
- FBClassChainItem *firstElement = [result.elements firstObject];
- XCTAssertEqual(firstElement.type, XCUIElementTypeAny);
- XCTAssertEqual(firstElement.position.integerValue, 3);
- XCTAssertEqual(firstElement.predicates.count, 1);
- XCTAssertFalse(firstElement.isDescendant);
-
- FBClassChainItem *secondElement = [result.elements objectAtIndex:1];
- XCTAssertEqual(secondElement.type, XCUIElementTypeButton);
- XCTAssertEqual(secondElement.position.integerValue, -1);
- XCTAssertEqual(secondElement.predicates.count, 1);
- XCTAssertFalse(secondElement.isDescendant);
- }
- - (void)testValidChainWithDescendantPredicate
- {
- NSError *error;
- FBClassChain *result = [FBClassChainQueryParser parseQuery:@"**/XCUIElementTypeTable[$type == 'XCUIElementTypeImage' AND name == 'olala'$][`name == 'blabla'`][10]" error:&error];
- XCTAssertNotNil(result);
- XCTAssertEqual(result.elements.count, 1);
-
- FBClassChainItem *firstElement = [result.elements firstObject];
- XCTAssertEqual(firstElement.type, XCUIElementTypeTable);
- XCTAssertEqual(firstElement.position.integerValue, 10);
- XCTAssertEqual(firstElement.predicates.count, 2);
- XCTAssertTrue(firstElement.isDescendant);
- }
- - (void)testValidChainWithMultipleDescendantPredicates
- {
- NSError *error;
- FBClassChain *result = [FBClassChainQueryParser parseQuery:@"**/XCUIElementTypeTable[$type == 'XCUIElementTypeImage' AND name == 'olala'$][`value == 'peace'`][$value == 'yolo'$][`name == 'blabla'`][10]" error:&error];
- XCTAssertNotNil(result);
- XCTAssertEqual(result.elements.count, 1);
-
- FBClassChainItem *firstElement = [result.elements firstObject];
- XCTAssertEqual(firstElement.type, XCUIElementTypeTable);
- XCTAssertEqual(firstElement.position.integerValue, 10);
- XCTAssertEqual(firstElement.predicates.count, 4);
- XCTAssertTrue(firstElement.isDescendant);
- }
- - (void)testInvalidChains
- {
- NSArray *invalidQueries = @[
- @"/XCUIElementTypeWindow"
- ,@"XCUIElementTypeWindow/"
- ,@"XCUIElementTypeWindow//*"
- ,@"XCUIElementTypeWindow*/*"
- ,@"**"
- ,@"***"
- ,@"**/*/**"
- ,@"/**"
- ,@"XCUIElementTypeWindow/**"
- ,@"**[1]/XCUIElementTypeWindow"
- ,@"**[`name == '1'`]/XCUIElementTypeWindow"
- ,@"XCUIElementTypeWindow[0]"
- ,@"XCUIElementTypeWindow[1][1]"
- ,@"blabla"
- ,@"XCUIElementTypeWindow/blabla"
- ,@" XCUIElementTypeWindow"
- ,@"XCUIElementTypeWindow[ 2 ]"
- ,@"XCUIElementTypeWindow[[2]"
- ,@"XCUIElementTypeWindow[2]]"
- ,@"XCUIElementType[Window[2]]"
- ,@"XCUIElementTypeWindow[visible = 1]"
- ,@"XCUIElementTypeWindow[1][`visible = 1`]"
- ,@"XCUIElementTypeWindow[1] [`visible = 1`]"
- ,@"XCUIElementTypeWindow[ `visible = 1`]"
- ,@"XCUIElementTypeWindow[`visible = 1][`name = \"bla\"`]"
- ,@"XCUIElementTypeWindow[`visible = 1]"
- ,@"XCUIElementTypeWindow[$visible = 1]"
- ,@"XCUIElementTypeWindow[``]"
- ,@"XCUIElementTypeWindow[$$]"
- ,@"XCUIElementTypeWindow[`name = \"bla```bla\"`]"
- ,@"XCUIElementTypeWindow[$name = \"bla$$$bla\"$]"
- ];
- for (NSString *invalidQuery in invalidQueries) {
- NSError *error;
- FBClassChain *result = [FBClassChainQueryParser parseQuery:invalidQuery error:&error];
- XCTAssertNil(result);
- XCTAssertNotNil(error);
- }
- }
- @end
|