/** * 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. */ #import #import "FBMacros.h" #import "FBXPath.h" #import "FBXPath-Private.h" #import "XCUIElementDouble.h" #import "XCElementSnapshotDouble.h" #import "FBXCElementSnapshotWrapper+Helpers.h" @interface FBXPathTests : XCTestCase @end @implementation FBXPathTests - (NSString *)xmlStringWithElement:(id)snapshot xpathQuery:(nullable NSString *)query excludingAttributes:(nullable NSArray *)excludedAttributes { xmlDocPtr doc; xmlTextWriterPtr writer = xmlNewTextWriterDoc(&doc, 0); NSMutableDictionary *elementStore = [NSMutableDictionary dictionary]; int buffersize; xmlChar *xmlbuff = NULL; int rc = xmlTextWriterStartDocument(writer, NULL, "UTF-8", NULL); if (rc >= 0) { rc = [FBXPath xmlRepresentationWithRootElement:snapshot writer:writer elementStore:elementStore query:query excludingAttributes:excludedAttributes]; if (rc >= 0) { rc = xmlTextWriterEndDocument(writer); } } if (rc >= 0) { xmlDocDumpFormatMemory(doc, &xmlbuff, &buffersize, 1); } xmlFreeTextWriter(writer); xmlFreeDoc(doc); XCTAssertTrue(rc >= 0); XCTAssertEqual(1, [elementStore count]); NSString *result = [NSString stringWithCString:(const char *)xmlbuff encoding:NSUTF8StringEncoding]; xmlFree(xmlbuff); return result; } - (void)testDefaultXPathPresentation { XCElementSnapshotDouble *snapshot = [XCElementSnapshotDouble new]; id element = (id)[FBXCElementSnapshotWrapper ensureWrapped:(id)snapshot]; NSString *resultXml = [self xmlStringWithElement:(id)element xpathQuery:nil excludingAttributes:nil]; NSLog(@"[DefaultXPath] Result XML:\n%@", resultXml); NSString *expectedXml = [NSString stringWithFormat:@"\n<%@ type=\"%@\" value=\"%@\" name=\"%@\" label=\"%@\" enabled=\"%@\" visible=\"%@\" accessible=\"%@\" x=\"%@\" y=\"%@\" width=\"%@\" height=\"%@\" index=\"%lu\" traits=\"%@\" private_indexPath=\"top\"/>\n", element.wdType, element.wdType, element.wdValue, element.wdName, element.wdLabel, FBBoolToString(element.wdEnabled), FBBoolToString(element.wdVisible), FBBoolToString(element.wdAccessible), element.wdRect[@"x"], element.wdRect[@"y"], element.wdRect[@"width"], element.wdRect[@"height"], element.wdIndex, element.wdTraits]; XCTAssertTrue([resultXml isEqualToString: expectedXml]); } - (void)testtXPathPresentationWithSomeAttributesExcluded { XCElementSnapshotDouble *snapshot = [XCElementSnapshotDouble new]; id element = (id)[FBXCElementSnapshotWrapper ensureWrapped:(id)snapshot]; NSString *resultXml = [self xmlStringWithElement:(id)element xpathQuery:nil excludingAttributes:@[@"type", @"visible", @"value", @"index", @"traits", @"nativeFrame"]]; NSString *expectedXml = [NSString stringWithFormat:@"\n<%@ name=\"%@\" label=\"%@\" enabled=\"%@\" accessible=\"%@\" x=\"%@\" y=\"%@\" width=\"%@\" height=\"%@\" private_indexPath=\"top\"/>\n", element.wdType, element.wdName, element.wdLabel, FBBoolToString(element.wdEnabled), FBBoolToString(element.wdAccessible), element.wdRect[@"x"], element.wdRect[@"y"], element.wdRect[@"width"], element.wdRect[@"height"]]; XCTAssertEqualObjects(resultXml, expectedXml); } - (void)testXPathPresentationBasedOnQueryMatchingAllAttributes { XCElementSnapshotDouble *snapshot = [XCElementSnapshotDouble new]; snapshot.value = @"йоло<>&\""; snapshot.label = @"a\nb"; id element = (id)[FBXCElementSnapshotWrapper ensureWrapped:(id)snapshot]; NSString *resultXml = [self xmlStringWithElement:(id)element xpathQuery:[NSString stringWithFormat:@"//%@[@*]", element.wdType] excludingAttributes:@[@"visible"]]; NSString *expectedXml = [NSString stringWithFormat:@"\n<%@ type=\"%@\" value=\"%@\" name=\"%@\" label=\"%@\" enabled=\"%@\" visible=\"%@\" accessible=\"%@\" x=\"%@\" y=\"%@\" width=\"%@\" height=\"%@\" index=\"%lu\" hittable=\"%@\" traits=\"%@\" nativeFrame=\"%@\" private_indexPath=\"top\"/>\n", element.wdType, element.wdType, @"йоло<>&"", element.wdName, @"a b", FBBoolToString(element.wdEnabled), FBBoolToString(element.wdVisible), FBBoolToString(element.wdAccessible), element.wdRect[@"x"], element.wdRect[@"y"], element.wdRect[@"width"], element.wdRect[@"height"], element.wdIndex, FBBoolToString(element.wdHittable), element.wdTraits, NSStringFromCGRect(element.wdNativeFrame)]; XCTAssertEqualObjects(expectedXml, resultXml); } - (void)testXPathPresentationBasedOnQueryMatchingSomeAttributes { XCElementSnapshotDouble *snapshot = [XCElementSnapshotDouble new]; id element = (id)[FBXCElementSnapshotWrapper ensureWrapped:(id)snapshot]; NSString *resultXml = [self xmlStringWithElement:(id)element xpathQuery:[NSString stringWithFormat:@"//%@[@%@ and contains(@%@, 'blabla')]", element.wdType, @"value", @"name"] excludingAttributes:nil]; NSString *expectedXml = [NSString stringWithFormat:@"\n<%@ value=\"%@\" name=\"%@\" private_indexPath=\"top\"/>\n", element.wdType, element.wdValue, element.wdName]; XCTAssertTrue([resultXml isEqualToString: expectedXml]); } - (void)testSnapshotXPathResultsMatching { xmlDocPtr doc; xmlTextWriterPtr writer = xmlNewTextWriterDoc(&doc, 0); NSMutableDictionary *elementStore = [NSMutableDictionary dictionary]; XCElementSnapshotDouble *snapshot = [XCElementSnapshotDouble new]; id root = (id)[FBXCElementSnapshotWrapper ensureWrapped:(id)snapshot]; NSString *query = [NSString stringWithFormat:@"//%@", root.wdType]; int rc = xmlTextWriterStartDocument(writer, NULL, "UTF-8", NULL); if (rc >= 0) { rc = [FBXPath xmlRepresentationWithRootElement:(id)root writer:writer elementStore:elementStore query:query excludingAttributes:nil]; if (rc >= 0) { rc = xmlTextWriterEndDocument(writer); } } if (rc < 0) { xmlFreeTextWriter(writer); xmlFreeDoc(doc); XCTFail(@"Unable to create the source XML document"); } xmlXPathObjectPtr queryResult = [FBXPath evaluate:query document:doc contextNode:NULL]; if (NULL == queryResult) { xmlFreeTextWriter(writer); xmlFreeDoc(doc); XCTAssertNotEqual(NULL, queryResult); } NSArray *matchingSnapshots = [FBXPath collectMatchingSnapshots:queryResult->nodesetval elementStore:elementStore]; xmlXPathFreeObject(queryResult); xmlFreeTextWriter(writer); xmlFreeDoc(doc); XCTAssertNotNil(matchingSnapshots); XCTAssertEqual(1, [matchingSnapshots count]); } @end