FBXPathTests.m 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. /**
  2. * Copyright (c) 2015-present, Facebook, Inc.
  3. * All rights reserved.
  4. *
  5. * This source code is licensed under the BSD-style license found in the
  6. * LICENSE file in the root directory of this source tree. An additional grant
  7. * of patent rights can be found in the PATENTS file in the same directory.
  8. */
  9. #import <XCTest/XCTest.h>
  10. #import "FBMacros.h"
  11. #import "FBXPath.h"
  12. #import "FBXPath-Private.h"
  13. #import "XCUIElementDouble.h"
  14. #import "XCElementSnapshotDouble.h"
  15. #import "FBXCElementSnapshotWrapper+Helpers.h"
  16. @interface FBXPathTests : XCTestCase
  17. @end
  18. @implementation FBXPathTests
  19. - (NSString *)xmlStringWithElement:(id<FBXCElementSnapshot>)snapshot
  20. xpathQuery:(nullable NSString *)query
  21. excludingAttributes:(nullable NSArray<NSString *> *)excludedAttributes
  22. {
  23. xmlDocPtr doc;
  24. xmlTextWriterPtr writer = xmlNewTextWriterDoc(&doc, 0);
  25. NSMutableDictionary *elementStore = [NSMutableDictionary dictionary];
  26. int buffersize;
  27. xmlChar *xmlbuff = NULL;
  28. int rc = xmlTextWriterStartDocument(writer, NULL, "UTF-8", NULL);
  29. if (rc >= 0) {
  30. rc = [FBXPath xmlRepresentationWithRootElement:snapshot
  31. writer:writer
  32. elementStore:elementStore
  33. query:query
  34. excludingAttributes:excludedAttributes];
  35. if (rc >= 0) {
  36. rc = xmlTextWriterEndDocument(writer);
  37. }
  38. }
  39. if (rc >= 0) {
  40. xmlDocDumpFormatMemory(doc, &xmlbuff, &buffersize, 1);
  41. }
  42. xmlFreeTextWriter(writer);
  43. xmlFreeDoc(doc);
  44. XCTAssertTrue(rc >= 0);
  45. XCTAssertEqual(1, [elementStore count]);
  46. NSString *result = [NSString stringWithCString:(const char *)xmlbuff encoding:NSUTF8StringEncoding];
  47. xmlFree(xmlbuff);
  48. return result;
  49. }
  50. - (void)testDefaultXPathPresentation
  51. {
  52. XCElementSnapshotDouble *snapshot = [XCElementSnapshotDouble new];
  53. id<FBElement> element = (id<FBElement>)[FBXCElementSnapshotWrapper ensureWrapped:(id)snapshot];
  54. NSString *resultXml = [self xmlStringWithElement:(id<FBXCElementSnapshot>)element
  55. xpathQuery:nil
  56. excludingAttributes:nil];
  57. NSLog(@"[DefaultXPath] Result XML:\n%@", resultXml);
  58. NSString *expectedXml = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<%@ type=\"%@\" value=\"%@\" name=\"%@\" label=\"%@\" enabled=\"%@\" visible=\"%@\" accessible=\"%@\" x=\"%@\" y=\"%@\" width=\"%@\" height=\"%@\" index=\"%lu\" traits=\"%@\" private_indexPath=\"top\"/>\n",
  59. 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];
  60. XCTAssertTrue([resultXml isEqualToString: expectedXml]);
  61. }
  62. - (void)testtXPathPresentationWithSomeAttributesExcluded
  63. {
  64. XCElementSnapshotDouble *snapshot = [XCElementSnapshotDouble new];
  65. id<FBElement> element = (id<FBElement>)[FBXCElementSnapshotWrapper ensureWrapped:(id)snapshot];
  66. NSString *resultXml = [self xmlStringWithElement:(id<FBXCElementSnapshot>)element
  67. xpathQuery:nil
  68. excludingAttributes:@[@"type", @"visible", @"value", @"index", @"traits", @"nativeFrame"]];
  69. NSString *expectedXml = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<%@ name=\"%@\" label=\"%@\" enabled=\"%@\" accessible=\"%@\" x=\"%@\" y=\"%@\" width=\"%@\" height=\"%@\" private_indexPath=\"top\"/>\n",
  70. element.wdType, element.wdName, element.wdLabel, FBBoolToString(element.wdEnabled), FBBoolToString(element.wdAccessible), element.wdRect[@"x"], element.wdRect[@"y"], element.wdRect[@"width"], element.wdRect[@"height"]];
  71. XCTAssertEqualObjects(resultXml, expectedXml);
  72. }
  73. - (void)testXPathPresentationBasedOnQueryMatchingAllAttributes
  74. {
  75. XCElementSnapshotDouble *snapshot = [XCElementSnapshotDouble new];
  76. snapshot.value = @"йоло<>&\"";
  77. snapshot.label = @"a\nb";
  78. id<FBElement> element = (id<FBElement>)[FBXCElementSnapshotWrapper ensureWrapped:(id)snapshot];
  79. NSString *resultXml = [self xmlStringWithElement:(id<FBXCElementSnapshot>)element
  80. xpathQuery:[NSString stringWithFormat:@"//%@[@*]", element.wdType]
  81. excludingAttributes:@[@"visible"]];
  82. NSString *expectedXml = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<%@ type=\"%@\" value=\"%@\" name=\"%@\" label=\"%@\" enabled=\"%@\" visible=\"%@\" accessible=\"%@\" x=\"%@\" y=\"%@\" width=\"%@\" height=\"%@\" index=\"%lu\" hittable=\"%@\" traits=\"%@\" nativeFrame=\"%@\" private_indexPath=\"top\"/>\n",
  83. element.wdType, element.wdType, @"йоло&lt;&gt;&amp;&quot;", element.wdName, @"a&#10;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)];
  84. XCTAssertEqualObjects(expectedXml, resultXml);
  85. }
  86. - (void)testXPathPresentationBasedOnQueryMatchingSomeAttributes
  87. {
  88. XCElementSnapshotDouble *snapshot = [XCElementSnapshotDouble new];
  89. id<FBElement> element = (id<FBElement>)[FBXCElementSnapshotWrapper ensureWrapped:(id)snapshot];
  90. NSString *resultXml = [self xmlStringWithElement:(id<FBXCElementSnapshot>)element
  91. xpathQuery:[NSString stringWithFormat:@"//%@[@%@ and contains(@%@, 'blabla')]", element.wdType, @"value", @"name"]
  92. excludingAttributes:nil];
  93. NSString *expectedXml = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<%@ value=\"%@\" name=\"%@\" private_indexPath=\"top\"/>\n",
  94. element.wdType, element.wdValue, element.wdName];
  95. XCTAssertTrue([resultXml isEqualToString: expectedXml]);
  96. }
  97. - (void)testSnapshotXPathResultsMatching
  98. {
  99. xmlDocPtr doc;
  100. xmlTextWriterPtr writer = xmlNewTextWriterDoc(&doc, 0);
  101. NSMutableDictionary *elementStore = [NSMutableDictionary dictionary];
  102. XCElementSnapshotDouble *snapshot = [XCElementSnapshotDouble new];
  103. id<FBElement> root = (id<FBElement>)[FBXCElementSnapshotWrapper ensureWrapped:(id)snapshot];
  104. NSString *query = [NSString stringWithFormat:@"//%@", root.wdType];
  105. int rc = xmlTextWriterStartDocument(writer, NULL, "UTF-8", NULL);
  106. if (rc >= 0) {
  107. rc = [FBXPath xmlRepresentationWithRootElement:(id<FBXCElementSnapshot>)root
  108. writer:writer
  109. elementStore:elementStore
  110. query:query
  111. excludingAttributes:nil];
  112. if (rc >= 0) {
  113. rc = xmlTextWriterEndDocument(writer);
  114. }
  115. }
  116. if (rc < 0) {
  117. xmlFreeTextWriter(writer);
  118. xmlFreeDoc(doc);
  119. XCTFail(@"Unable to create the source XML document");
  120. }
  121. xmlXPathObjectPtr queryResult = [FBXPath evaluate:query document:doc contextNode:NULL];
  122. if (NULL == queryResult) {
  123. xmlFreeTextWriter(writer);
  124. xmlFreeDoc(doc);
  125. XCTAssertNotEqual(NULL, queryResult);
  126. }
  127. NSArray *matchingSnapshots = [FBXPath collectMatchingSnapshots:queryResult->nodesetval
  128. elementStore:elementStore];
  129. xmlXPathFreeObject(queryResult);
  130. xmlFreeTextWriter(writer);
  131. xmlFreeDoc(doc);
  132. XCTAssertNotNil(matchingSnapshots);
  133. XCTAssertEqual(1, [matchingSnapshots count]);
  134. }
  135. @end