diff --git a/.swiftpm/xcode/xcshareddata/xcschemes/xcparse-package-Package.xcscheme b/.swiftpm/xcode/xcshareddata/xcschemes/xcparse-package-Package.xcscheme
new file mode 100644
index 0000000..4dfd356
--- /dev/null
+++ b/.swiftpm/xcode/xcshareddata/xcschemes/xcparse-package-Package.xcscheme
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.swiftpm/xcode/xcshareddata/xcschemes/xcparse-visualizer.xcscheme b/.swiftpm/xcode/xcshareddata/xcschemes/xcparse-visualizer.xcscheme
new file mode 100644
index 0000000..ad85b87
--- /dev/null
+++ b/.swiftpm/xcode/xcshareddata/xcschemes/xcparse-visualizer.xcscheme
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.swiftpm/xcode/xcshareddata/xcschemes/xcparse.xcscheme b/.swiftpm/xcode/xcshareddata/xcschemes/xcparse.xcscheme
new file mode 100644
index 0000000..470f227
--- /dev/null
+++ b/.swiftpm/xcode/xcshareddata/xcschemes/xcparse.xcscheme
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Package.swift b/Package.swift
index 1274d96..92c7d8e 100644
--- a/Package.swift
+++ b/Package.swift
@@ -4,7 +4,7 @@
import PackageDescription
let package = Package(
- name: "xcparse",
+ name: "xcparse-package",
platforms: [
.macOS(.v10_13),
],
@@ -19,9 +19,11 @@ let package = Package(
name: "xcparse",
dependencies: [ "XCParseCore" ]),
.target(name: "XCParseCore"),
+ .target(name: "xcparse-visualizer",
+ dependencies: [ "XCParseCore" ]),
.testTarget(
name: "xcparseTests",
- dependencies: ["xcparse"]),
+ dependencies: ["xcparse"])
],
swiftLanguageVersions: [.v5]
)
diff --git a/Sources/XCParseCore/XCPResultDecoding.swift b/Sources/XCParseCore/XCPResultDecoding.swift
index c0e13c3..dc58125 100644
--- a/Sources/XCParseCore/XCPResultDecoding.swift
+++ b/Sources/XCParseCore/XCPResultDecoding.swift
@@ -56,17 +56,383 @@ class XCResultValueType : Codable {
}
}
-class XCResultObject: Codable {
- let type: XCResultObjectType
+public class XCResultNestedObjectType {
+ public var name: String
+ public var value: String
+ public var children = [XCResultNestedObjectType]()
+ init(name: String, value: String) {
+ self.name = name
+ self.value = value
+ }
+}
+open class XCResultObject: Codable {
+ public var type: XCResultObjectType
+ public var properties: [String : Any] = [:]
+ public var children = [XCResultObjectFirstNesting]()
private enum CodingKeys : String, CodingKey {
case type = "_type"
}
+
+ public func appendToProperties(propertyList: [String: Any]) {
+ for (key, value) in propertyList {
+ properties.updateValue(value, forKey: key)
+ }
+ }
+
+ public func getNestedElementValue(dictElement: (key: String, value: Any)) -> String {
+ var nestedVal = ""
+ if dictElement.value is Int {
+ let temp = dictElement.value as! Int
+ nestedVal = String(temp)
+ }
+ else if dictElement.value is Date {
+ let temp = dictElement.value as! Date
+ let formatter = DateFormatter()
+ formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
+ nestedVal = formatter.string(from:temp)
+ }
+ else if dictElement.value is Bool {
+ let temp = dictElement.value as! Bool
+ nestedVal = String(temp)
+ }
+ else if dictElement.value is Double {
+ let temp = dictElement.value as! Double
+ nestedVal = String(temp)
+ }
+ else if dictElement.value is String {
+ nestedVal = dictElement.value as! String
+ }
+ return nestedVal
+ }
+
+ public func generateObjectTree() {
+ for element in self.properties {
+ var val = ""
+ val = getNestedElementValue(dictElement: element)
+ var nestedItem = XCResultObjectFirstNesting(name: element.key, value: val)
+ self.children.append(nestedItem)
+ addFirstNestedElement(element: element, nestedItem: nestedItem)
+ }
+ }
+
+ public func addFirstNestedElement(element: (key: String, value: Any), nestedItem: XCResultNestedObjectType) {
+ if let nestedObject = element.value as? XCResultObject {
+ for secondElement in nestedObject.properties {
+ var nestedVal = ""
+ nestedVal = getNestedElementValue(dictElement: secondElement)
+ var secondNestedItem = XCResultObjectSecondNesting(name: secondElement.key, value: nestedVal)
+ nestedItem.children.append(secondNestedItem)
+ addSecondNestedElement(secondElement: secondElement, secondNestedItem: secondNestedItem)
+ }
+ }
+ else if let nestedObjectList = element.value as? [XCResultObject] {
+ for arrayElement in nestedObjectList {
+ var nestedArrayItem = XCResultObjectSecondNesting(name: arrayElement.type.name, value: "")
+ nestedItem.children.append(nestedArrayItem)
+ for thirdElement in arrayElement.properties {
+ var secondNestedVal = ""
+ secondNestedVal = getNestedElementValue(dictElement: thirdElement)
+ var thirdNestedItem = XCResultObjectThirdNesting(name: thirdElement.key, value: secondNestedVal)
+ nestedArrayItem.children.append(thirdNestedItem)
+ addThirdNestedElement(thirdElement: thirdElement, thirdNestedItem: thirdNestedItem)
+ }
+ }
+ }
+ }
+ public func addSecondNestedElement(secondElement: (key: String, value: Any), secondNestedItem: XCResultNestedObjectType) {
+ if let secondNestedObject = secondElement.value as? XCResultObject {
+ for thirdElement in secondNestedObject.properties {
+ var secondNestedVal = ""
+ secondNestedVal = getNestedElementValue(dictElement: thirdElement)
+ var thirdNestedItem = XCResultObjectThirdNesting(name: thirdElement.key, value: secondNestedVal)
+ secondNestedItem.children.append(thirdNestedItem)
+ addThirdNestedElement(thirdElement: thirdElement, thirdNestedItem: thirdNestedItem)
+ }
+ }
+ else if let secondNestedObjectList = secondElement.value as? [XCResultObject] {
+ for arrayElement in secondNestedObjectList {
+ var nestedArrayItem = XCResultObjectThirdNesting(name: arrayElement.type.name, value: "")
+ secondNestedItem.children.append(nestedArrayItem)
+ for thirdElement in arrayElement.properties {
+ var thirdNestedVal = ""
+ thirdNestedVal = getNestedElementValue(dictElement: thirdElement)
+ var thirdNestedItem = XCResultObjectThirdNesting(name: thirdElement.key, value: thirdNestedVal)
+ nestedArrayItem.children.append(thirdNestedItem)
+ addThirdNestedElement(thirdElement: thirdElement, thirdNestedItem: thirdNestedItem)
+ }
+ }
+ }
+ }
+
+ public func addThirdNestedElement(thirdElement: (key: String, value: Any), thirdNestedItem: XCResultNestedObjectType) {
+ if let fourthNestedObject = thirdElement.value as? XCResultObject {
+ for fourthElement in fourthNestedObject.properties {
+ var thirdNestedVal = ""
+ thirdNestedVal = getNestedElementValue(dictElement: fourthElement)
+ var fourthNestedItem = XCResultObjectFourthNesting(name:fourthElement.key, value: thirdNestedVal)
+ thirdNestedItem.children.append(fourthNestedItem)
+ addFourthNestedElement(fourthElement: fourthElement, fourthNestedItem: fourthNestedItem)
+ }
+ }
+ else if let fourthNestedObjectList = thirdElement.value as? [XCResultObject] {
+ for arrayElement in fourthNestedObjectList {
+ var nestedArrayItem = XCResultObjectFourthNesting(name: arrayElement.type.name, value: "")
+ thirdNestedItem.children.append(nestedArrayItem)
+ for fourthElement in arrayElement.properties {
+ var fourthNestedVal = ""
+ fourthNestedVal = getNestedElementValue(dictElement: fourthElement)
+ var fourthNestedItem = XCResultObjectFourthNesting(name: fourthElement.key, value: fourthNestedVal)
+ nestedArrayItem.children.append(fourthNestedItem)
+ addFourthNestedElement(fourthElement: fourthElement, fourthNestedItem: fourthNestedItem)
+ }
+ }
+ }
+ }
+
+ public func addFourthNestedElement(fourthElement: (key: String, value: Any), fourthNestedItem: XCResultNestedObjectType) {
+ if let fifthNestedObject = fourthElement.value as? XCResultObject {
+ for fifthElement in fifthNestedObject.properties {
+ var fourthNestedVal = ""
+ fourthNestedVal = getNestedElementValue(dictElement: fifthElement)
+ var fifthNestedItem = XCResultObjectFifthNesting(name:fifthElement.key, value: fourthNestedVal)
+ fourthNestedItem.children.append(fifthNestedItem)
+ addFifthNestedElement(fifthElement: fifthElement, fifthNestedItem: fifthNestedItem)
+ }
+ }
+ else if let fifthNestedObjectList = fourthElement.value as? [XCResultObject] {
+ for arrayElement in fifthNestedObjectList {
+ var nestedArrayItem = XCResultObjectFifthNesting(name: arrayElement.type.name, value: "")
+ fourthNestedItem.children.append(nestedArrayItem)
+ for fifthElement in arrayElement.properties {
+ var fifthNestedVal = ""
+ fifthNestedVal = getNestedElementValue(dictElement: fifthElement)
+ var fifthNestedItem = XCResultObjectFifthNesting(name: fifthElement.key, value: fifthNestedVal)
+ nestedArrayItem.children.append(fifthNestedItem)
+ addFifthNestedElement(fifthElement: fifthElement, fifthNestedItem: fifthNestedItem)
+ }
+ }
+ }
+ }
+
+ public func addFifthNestedElement(fifthElement: (key: String, value: Any), fifthNestedItem: XCResultNestedObjectType) {
+ if let sixthNestedObject = fifthElement.value as? XCResultObject {
+ for sixthElement in sixthNestedObject.properties {
+ var fifthNestedVal = ""
+ fifthNestedVal = getNestedElementValue(dictElement: sixthElement)
+ var sixthNestedItem = XCResultObjectSixthNesting(name:sixthElement.key, value: fifthNestedVal)
+ fifthNestedItem.children.append(sixthNestedItem)
+ addSixthNestedElement(sixthElement: sixthElement, sixthNestedItem: sixthNestedItem)
+ }
+ }
+ else if let sixthNestedObjectList = fifthElement.value as? [XCResultObject] {
+ for arrayElement in sixthNestedObjectList {
+ var nestedArrayItem = XCResultObjectSixthNesting(name: arrayElement.type.name, value: "")
+ fifthNestedItem.children.append(nestedArrayItem)
+ for sixthElement in arrayElement.properties {
+ var sixthNestedVal = ""
+ sixthNestedVal = getNestedElementValue(dictElement: sixthElement)
+ var sixthNestedItem = XCResultObjectSixthNesting(name: sixthElement.key, value: sixthNestedVal)
+ nestedArrayItem.children.append(sixthNestedItem)
+ addSixthNestedElement(sixthElement: sixthElement, sixthNestedItem: sixthNestedItem)
+ }
+ }
+ }
+ }
+
+ public func addSixthNestedElement(sixthElement: (key: String, value: Any), sixthNestedItem: XCResultNestedObjectType) {
+ if let seventhNestedObject = sixthElement.value as? XCResultObject {
+ for seventhElement in seventhNestedObject.properties {
+ var sixthNestedVal = ""
+ sixthNestedVal = getNestedElementValue(dictElement: seventhElement)
+ var seventhNestedItem = XCResultObjectSeventhNesting(name:seventhElement.key, value: sixthNestedVal)
+ sixthNestedItem.children.append(seventhNestedItem)
+ addSeventhNestedElement(seventhElement: seventhElement, seventhNestedItem: seventhNestedItem)
+ }
+ }
+ else if let seventhNestedObjectList = sixthElement.value as? [XCResultObject] {
+ for arrayElement in seventhNestedObjectList {
+ var nestedArrayItem = XCResultObjectSeventhNesting(name: arrayElement.type.name, value: "")
+ sixthNestedItem.children.append(nestedArrayItem)
+ for seventhElement in arrayElement.properties {
+ var seventhNestedVal = ""
+ seventhNestedVal = getNestedElementValue(dictElement: seventhElement)
+ var seventhNestedItem = XCResultObjectSeventhNesting(name: seventhElement.key, value: seventhNestedVal)
+ nestedArrayItem.children.append(seventhNestedItem)
+ addSeventhNestedElement(seventhElement: seventhElement, seventhNestedItem: seventhNestedItem)
+ }
+ }
+ }
+ }
+
+ public func addSeventhNestedElement(seventhElement: (key: String, value: Any), seventhNestedItem: XCResultNestedObjectType) {
+ if let eighthNestedObject = seventhElement.value as? XCResultObject {
+ for eighthElement in eighthNestedObject.properties {
+ var seventhNestedVal = ""
+ seventhNestedVal = getNestedElementValue(dictElement: eighthElement)
+ var eighthNestedItem = XCResultObjectEighthNesting(name:eighthElement.key, value: seventhNestedVal)
+ seventhNestedItem.children.append(eighthNestedItem)
+ addEighthNestedElement(eighthElement: eighthElement, eighthNestedItem: eighthNestedItem)
+ }
+ }
+ else if let eighthNestedObjectList = seventhElement.value as? [XCResultObject] {
+ for arrayElement in eighthNestedObjectList {
+ var nestedArrayItem = XCResultObjectEighthNesting(name: arrayElement.type.name, value: "")
+ seventhNestedItem.children.append(nestedArrayItem)
+ for eighthElement in arrayElement.properties {
+ var eighthNestedVal = ""
+ eighthNestedVal = getNestedElementValue(dictElement: eighthElement)
+ var eighthNestedItem = XCResultObjectEighthNesting(name: eighthElement.key, value: eighthNestedVal)
+ nestedArrayItem.children.append(eighthNestedItem)
+ addEighthNestedElement(eighthElement: eighthElement, eighthNestedItem: eighthNestedItem)
+ }
+ }
+ }
+ }
+
+ public func addEighthNestedElement(eighthElement: (key: String, value: Any), eighthNestedItem: XCResultNestedObjectType) {
+ if let ninthNestedObject = eighthElement.value as? XCResultObject {
+ for ninthElement in ninthNestedObject.properties {
+ var eighthNestedVal = ""
+ eighthNestedVal = getNestedElementValue(dictElement: ninthElement)
+ var ninthNestedItem = XCResultObjectNinthNesting(name:ninthElement.key, value: eighthNestedVal)
+ eighthNestedItem.children.append(ninthNestedItem)
+ addNinthNestedElement(ninthElement: ninthElement, ninthNestedItem: ninthNestedItem)
+ }
+ }
+ else if let ninthNestedObjectList = eighthElement.value as? [XCResultObject] {
+ for arrayElement in ninthNestedObjectList {
+ var nestedArrayItem = XCResultObjectNinthNesting(name: arrayElement.type.name, value: "")
+ eighthNestedItem.children.append(nestedArrayItem)
+ for ninthElement in arrayElement.properties {
+ var ninthNestedVal = ""
+ ninthNestedVal = getNestedElementValue(dictElement: ninthElement)
+ var ninthNestedItem = XCResultObjectNinthNesting(name: ninthElement.key, value: ninthNestedVal)
+ nestedArrayItem.children.append(ninthNestedItem)
+ addNinthNestedElement(ninthElement: ninthElement, ninthNestedItem: ninthNestedItem)
+ }
+ }
+ }
+ }
+
+ public func addNinthNestedElement(ninthElement: (key: String, value: Any), ninthNestedItem: XCResultNestedObjectType) {
+ if let tenthNestedObject = ninthElement.value as? XCResultObject {
+ for tenthElement in tenthNestedObject.properties {
+ var ninthNestedVal = ""
+ ninthNestedVal = getNestedElementValue(dictElement: tenthElement)
+ var tenthNestedItem = XCResultObjectTenthNesting(name:tenthElement.key, value: ninthNestedVal)
+ ninthNestedItem.children.append(tenthNestedItem)
+ addTenthNestedElement(tenthElement: tenthElement, tenthNestedItem: tenthNestedItem)
+ }
+ }
+ else if let tenthNestedObjectList = ninthElement.value as? [XCResultObject] {
+ for arrayElement in tenthNestedObjectList {
+ var nestedArrayItem = XCResultObjectTenthNesting(name: arrayElement.type.name, value: "")
+ ninthNestedItem.children.append(nestedArrayItem)
+ for tenthElement in arrayElement.properties {
+ var tenthNestedVal = ""
+ tenthNestedVal = getNestedElementValue(dictElement: tenthElement)
+ var tenthNestedItem = XCResultObjectTenthNesting(name: tenthElement.key, value: tenthNestedVal)
+ nestedArrayItem.children.append(tenthNestedItem)
+ addTenthNestedElement(tenthElement: tenthElement, tenthNestedItem: tenthNestedItem)
+ }
+ }
+ }
+ }
+
+ public func addTenthNestedElement(tenthElement: (key: String, value: Any), tenthNestedItem: XCResultNestedObjectType) {
+ if let eleventhNestedObject = tenthElement.value as? XCResultObject {
+ for eleventhElement in eleventhNestedObject.properties {
+ var tenthNestedVal = ""
+ tenthNestedVal = getNestedElementValue(dictElement: eleventhElement)
+ var eleventhNestedItem = XCResultObjectEleventhNesting(name:eleventhElement.key, value: tenthNestedVal)
+ tenthNestedItem.children.append(eleventhNestedItem)
+ }
+ }
+ else if let eleventhNestedObjectList = tenthElement.value as? [XCResultObject] {
+ for arrayElement in eleventhNestedObjectList {
+ var nestedArrayItem = XCResultObjectEleventhNesting(name: arrayElement.type.name, value: "")
+ tenthNestedItem.children.append(nestedArrayItem)
+ for eleventhElement in arrayElement.properties {
+ var eleventhNestedVal = ""
+ eleventhNestedVal = getNestedElementValue(dictElement: eleventhElement)
+ var eleventhNestedItem = XCResultObjectEleventhNesting(name: eleventhElement.key, value: eleventhNestedVal)
+ nestedArrayItem.children.append(eleventhNestedItem)
+ }
+ }
+ }
+ }
}
-class XCResultObjectType: Codable {
- let name: String
- let supertype: XCResultObjectType?
+public class XCResultObjectFirstNesting: XCResultNestedObjectType {
+ public override init(name: String, value: String) {
+ super.init(name: name,value: value)
+ }
+}
+
+public class XCResultObjectSecondNesting: XCResultNestedObjectType {
+ public override init(name: String, value: String) {
+ super.init(name: name,value: value)
+ }
+}
+
+public class XCResultObjectThirdNesting: XCResultNestedObjectType {
+ public override init(name: String, value: String) {
+ super.init(name: name,value: value)
+ }
+}
+
+public class XCResultObjectFourthNesting: XCResultNestedObjectType {
+ public override init(name: String, value: String) {
+ super.init(name: name,value: value)
+ }
+}
+
+public class XCResultObjectFifthNesting: XCResultNestedObjectType {
+ public override init(name: String, value: String) {
+ super.init(name: name,value: value)
+ }
+}
+
+public class XCResultObjectSixthNesting: XCResultNestedObjectType {
+ public override init(name: String, value: String) {
+ super.init(name: name,value: value)
+ }
+}
+
+public class XCResultObjectSeventhNesting: XCResultNestedObjectType {
+ public override init(name: String, value: String) {
+ super.init(name: name,value: value)
+ }
+}
+
+public class XCResultObjectEighthNesting: XCResultNestedObjectType {
+ public override init(name: String, value: String) {
+ super.init(name: name,value: value)
+ }
+}
+
+public class XCResultObjectNinthNesting: XCResultNestedObjectType {
+ public override init(name: String, value: String) {
+ super.init(name: name,value: value)
+ }
+}
+
+public class XCResultObjectTenthNesting: XCResultNestedObjectType {
+ public override init(name: String, value: String) {
+ super.init(name: name,value: value)
+ }
+}
+
+public class XCResultObjectEleventhNesting: XCResultNestedObjectType {
+ public override init(name: String, value: String) {
+ super.init(name: name,value: value)
+ }
+}
+
+public class XCResultObjectType: Codable {
+ public let name: String
+ public let supertype: XCResultObjectType?
private enum CodingKeys : String, CodingKey {
case name = "_name"
diff --git a/Sources/XCParseCore/XCPResultTypes.swift b/Sources/XCParseCore/XCPResultTypes.swift
index 5519f73..2c93f21 100644
--- a/Sources/XCParseCore/XCPResultTypes.swift
+++ b/Sources/XCParseCore/XCPResultTypes.swift
@@ -9,20 +9,23 @@
import Foundation
-open class ActionAbstractTestSummary : Codable {
+open class ActionAbstractTestSummary : XCResultObject {
public let name: String?
- enum ActionAbstractTestSummaryCodingKeys: String, CodingKey {
+ public enum ActionAbstractTestSummaryCodingKeys: String, CodingKey {
case name
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ActionAbstractTestSummaryCodingKeys.self)
name = try container.decodeXCResultTypeIfPresent(forKey: .name)
+ try super.init(from: decoder)
+ let propertyList = ["name" : name]
+ self.appendToProperties(propertyList: propertyList)
}
}
-open class ActionDeviceRecord : Codable {
+open class ActionDeviceRecord : XCResultObject {
public let name: String
public let isConcreteDevice: Bool
public let operatingSystemVersion: String
@@ -42,7 +45,7 @@ open class ActionDeviceRecord : Codable {
public let logicalCPUCoresPerPackage: Int?
public let platformRecord: ActionPlatformRecord
- enum ActionDeviceRecordCodingKeys: String, CodingKey {
+ public enum ActionDeviceRecordCodingKeys: String, CodingKey {
case name
case isConcreteDevice
case operatingSystemVersion
@@ -63,7 +66,7 @@ open class ActionDeviceRecord : Codable {
case platformRecord
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ActionDeviceRecordCodingKeys.self)
name = try container.decodeXCResultType(forKey: .name)
isConcreteDevice = try container.decodeXCResultType(forKey: .isConcreteDevice)
@@ -83,26 +86,33 @@ open class ActionDeviceRecord : Codable {
physicalCPUCoresPerPackage = try container.decodeXCResultTypeIfPresent(forKey: .physicalCPUCoresPerPackage)
logicalCPUCoresPerPackage = try container.decodeXCResultTypeIfPresent(forKey: .logicalCPUCoresPerPackage)
platformRecord = try container.decodeXCResultObject(forKey: .platformRecord)
+ try super.init(from: decoder)
+ let propertyList = ["name":name, "isConcreteDevice":isConcreteDevice, "operatingSystemVersion":operatingSystemVersion, "operatingSystemVersionWithBuildNumber":operatingSystemVersionWithBuildNumber, "nativeArchitecture":nativeArchitecture, "modelName":modelName, "modelCode":modelCode, "modelUTI":modelUTI, "identifier":identifier, "isWireless":isWireless, "cpuKind":cpuKind, "cpuCount":cpuCount, "cpuSpeedInMHz": cpuSpeedInMHz, "busSpeedInMHz": busSpeedInMHz,
+ "ramSizeInMegabytes": ramSizeInMegabytes, "physicalCPUCoresPerPackage":physicalCPUCoresPerPackage, "logicalCPUCoresPerPackage":logicalCPUCoresPerPackage, "platformRecord":platformRecord] as [String : Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
-open class ActionPlatformRecord : Codable {
+open class ActionPlatformRecord : XCResultObject {
public let identifier: String
public let userDescription: String
- enum ActionPlatformRecordCodingKeys: String, CodingKey {
+ public enum ActionPlatformRecordCodingKeys: String, CodingKey {
case identifier
case userDescription
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ActionPlatformRecordCodingKeys.self)
identifier = try container.decodeXCResultType(forKey: .identifier)
userDescription = try container.decodeXCResultType(forKey: .userDescription)
+ try super.init(from: decoder)
+ let propertyList = ["identifier":identifier, "userDescription":userDescription]
+ self.appendToProperties(propertyList: propertyList)
}
}
-open class ActionRecord : Codable {
+open class ActionRecord : XCResultObject {
public let schemeCommandName: String
public let schemeTaskName: String
public let title: String?
@@ -112,7 +122,7 @@ open class ActionRecord : Codable {
public let buildResult: ActionResult
public let actionResult: ActionResult
- enum ActionRecordCodingKeys: String, CodingKey {
+ public enum ActionRecordCodingKeys: String, CodingKey {
case schemeCommandName
case schemeTaskName
case title
@@ -123,7 +133,7 @@ open class ActionRecord : Codable {
case actionResult
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ActionRecordCodingKeys.self)
schemeCommandName = try container.decodeXCResultType(forKey: .schemeCommandName)
schemeTaskName = try container.decodeXCResultType(forKey: .schemeTaskName)
@@ -133,10 +143,13 @@ open class ActionRecord : Codable {
runDestination = try container.decodeXCResultObject(forKey: .runDestination)
buildResult = try container.decodeXCResultObject(forKey: .buildResult)
actionResult = try container.decodeXCResultObject(forKey: .actionResult)
+ try super.init(from: decoder)
+ let propertyList = ["schemeCommandName": schemeCommandName, "schemeTaskName": schemeTaskName, "title": title, "startedTime":startedTime, "endedTime":endedTime, "runDestination":runDestination, "buildResult":buildResult, "actionResult": actionResult] as [String : Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
-open class ActionResult : Codable {
+open class ActionResult : XCResultObject {
public let resultName: String
public let status: String
public let metrics: ResultMetrics
@@ -147,7 +160,7 @@ open class ActionResult : Codable {
public let testsRef: Reference?
public let diagnosticsRef: Reference?
- enum ActionResultCodingKeys: String, CodingKey {
+ public enum ActionResultCodingKeys: String, CodingKey {
case resultName
case status
case metrics
@@ -159,7 +172,7 @@ open class ActionResult : Codable {
case diagnosticsRef
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ActionResultCodingKeys.self)
resultName = try container.decodeXCResultType(forKey: .resultName)
status = try container.decodeXCResultType(forKey: .status)
@@ -170,17 +183,20 @@ open class ActionResult : Codable {
logRef = try container.decodeXCResultObjectIfPresent(forKey: .logRef)
testsRef = try container.decodeXCResultObjectIfPresent(forKey: .testsRef)
diagnosticsRef = try container.decodeXCResultObjectIfPresent(forKey: .diagnosticsRef)
+ try super.init(from: decoder)
+ let propertyList = ["resultName": resultName, "status": status, "metrics": metrics, "issues": issues, "coverage": coverage, "timelineRef": timelineRef, "logRef": logRef, "testsRef": testsRef, "diagnosticsRef": diagnosticsRef] as [String: Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
-open class ActionRunDestinationRecord : Codable {
+open class ActionRunDestinationRecord : XCResultObject {
public let displayName: String
public let targetArchitecture: String
public let targetDeviceRecord: ActionDeviceRecord
public let localComputerRecord: ActionDeviceRecord
public let targetSDKRecord: ActionSDKRecord
- enum ActionRunDestinationRecordCodingKeys: String, CodingKey {
+ public enum ActionRunDestinationRecordCodingKeys: String, CodingKey {
case displayName
case targetArchitecture
case targetDeviceRecord
@@ -188,39 +204,45 @@ open class ActionRunDestinationRecord : Codable {
case targetSDKRecord
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ActionRunDestinationRecordCodingKeys.self)
displayName = try container.decodeXCResultType(forKey: .displayName)
targetArchitecture = try container.decodeXCResultType(forKey: .targetArchitecture)
targetDeviceRecord = try container.decodeXCResultObject(forKey: .targetDeviceRecord)
localComputerRecord = try container.decodeXCResultObject(forKey: .localComputerRecord)
targetSDKRecord = try container.decodeXCResultObject(forKey: .targetSDKRecord)
+ try super.init(from: decoder)
+ let propertyList = ["displayName": displayName, "targetArchitecture": targetArchitecture, "targetDeviceRecord": targetDeviceRecord, "localComputerRecord": localComputerRecord, "targetSDKRecord": targetSDKRecord] as [String: Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
-open class ActionSDKRecord : Codable {
+open class ActionSDKRecord : XCResultObject {
public let name: String
public let identifier: String
public let operatingSystemVersion: String
public let isInternal: Bool
- enum ActionSDKRecordCodingKeys: String, CodingKey {
+ public enum ActionSDKRecordCodingKeys: String, CodingKey {
case name
case identifier
case operatingSystemVersion
case isInternal
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ActionSDKRecordCodingKeys.self)
name = try container.decodeXCResultType(forKey: .name)
identifier = try container.decodeXCResultType(forKey: .identifier)
operatingSystemVersion = try container.decodeXCResultType(forKey: .operatingSystemVersion)
isInternal = try container.decodeXCResultTypeIfPresent(forKey: .isInternal) ?? false
+ try super.init(from: decoder)
+ let propertyList = ["name": name, "identifier": identifier, "operatingSystemVersion": operatingSystemVersion, "isInternal": isInternal] as [String: Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
-open class ActionTestActivitySummary : Codable {
+open class ActionTestActivitySummary : XCResultObject {
public let title: String
public let activityType: String
public let uuid: String
@@ -229,7 +251,7 @@ open class ActionTestActivitySummary : Codable {
public let attachments: [ActionTestAttachment]
public let subactivities: [ActionTestActivitySummary]
- enum ActionTestActivitySummaryCodingKeys: String, CodingKey {
+ public enum ActionTestActivitySummaryCodingKeys: String, CodingKey {
case title
case activityType
case uuid
@@ -239,7 +261,7 @@ open class ActionTestActivitySummary : Codable {
case subactivities
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ActionTestActivitySummaryCodingKeys.self)
title = try container.decodeXCResultType(forKey: .title)
activityType = try container.decodeXCResultType(forKey: .activityType)
@@ -249,10 +271,13 @@ open class ActionTestActivitySummary : Codable {
attachments = try container.decodeIfPresent(XCResultArrayValue.self, forKey: .attachments)?.values ?? []
subactivities = try container.decodeIfPresent(XCResultArrayValue.self, forKey: .subactivities)?.values ?? []
+ try super.init(from: decoder)
+ let propertyList = ["title": title, "activityType": activityType, "uuid": uuid, "start": start, "finish": finish, "attachments": attachments, "subactivities": subactivities] as [String: Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
-open class ActionTestAttachment : Codable {
+open class ActionTestAttachment : XCResultObject {
public let uniformTypeIdentifier: String
public let name: String?
public let timestamp: Date?
@@ -263,7 +288,7 @@ open class ActionTestAttachment : Codable {
public let payloadRef: Reference?
public let payloadSize: Int
- enum ActionTestAttachmentCodingKeys: String, CodingKey {
+ public enum ActionTestAttachmentCodingKeys: String, CodingKey {
case uniformTypeIdentifier
case name
case timestamp
@@ -275,7 +300,7 @@ open class ActionTestAttachment : Codable {
case payloadSize
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ActionTestAttachmentCodingKeys.self)
uniformTypeIdentifier = try container.decodeXCResultType(forKey: .uniformTypeIdentifier)
name = try container.decodeXCResultTypeIfPresent(forKey: .name)
@@ -286,28 +311,34 @@ open class ActionTestAttachment : Codable {
filename = try container.decodeXCResultTypeIfPresent(forKey: .filename)
payloadRef = try container.decodeXCResultObjectIfPresent(forKey: .payloadRef)
payloadSize = try container.decodeXCResultType(forKey: .payloadSize)
+ try super.init(from: decoder)
+ let propertyList = ["uniformTypeIdentifier": uniformTypeIdentifier, "name": name, "timestamp": timestamp, "lifetime": lifetime, "inActivityIdentifier": inActivityIdentifier, "filename": filename, "payloadRef": payloadRef, "payloadSize": payloadSize] as [String: Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
-open class ActionTestFailureSummary : Codable {
+open class ActionTestFailureSummary : XCResultObject {
public let message: String?
public let fileName: String
public let lineNumber: Int
public let isPerformanceFailure: Bool
- enum ActionTestFailureSummaryCodingKeys: String, CodingKey {
+ public enum ActionTestFailureSummaryCodingKeys: String, CodingKey {
case message
case fileName
case lineNumber
case isPerformanceFailure
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ActionTestFailureSummaryCodingKeys.self)
message = try container.decodeXCResultTypeIfPresent(forKey: .message)
fileName = try container.decodeXCResultType(forKey: .fileName)
lineNumber = try container.decodeXCResultType(forKey: .lineNumber)
isPerformanceFailure = try container.decodeXCResultType(forKey: .isPerformanceFailure)
+ try super.init(from: decoder)
+ let propertyList = ["message": message, "fileName": fileName, "lineNumber": lineNumber, "isPerformanceFailure": isPerformanceFailure] as [String: Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
@@ -319,7 +350,7 @@ open class ActionTestMetadata : ActionTestSummaryIdentifiableObject {
public let failureSummariesCount: Int
public let activitySummariesCount: Int
- enum ActionTestMetadataCodingKeys: String, CodingKey {
+ public enum ActionTestMetadataCodingKeys: String, CodingKey {
case testStatus
case duration
case summaryRef
@@ -328,7 +359,7 @@ open class ActionTestMetadata : ActionTestSummaryIdentifiableObject {
case activitySummariesCount
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ActionTestMetadataCodingKeys.self)
testStatus = try container.decodeXCResultType(forKey: .testStatus)
duration = try container.decodeXCResultTypeIfPresent(forKey: .duration)
@@ -338,12 +369,13 @@ open class ActionTestMetadata : ActionTestSummaryIdentifiableObject {
performanceMetricsCount = try container.decodeXCResultTypeIfPresent(forKey: .performanceMetricsCount) ?? 0
failureSummariesCount = try container.decodeXCResultTypeIfPresent(forKey: .failureSummariesCount) ?? 0
activitySummariesCount = try container.decodeXCResultTypeIfPresent(forKey: .activitySummariesCount) ?? 0
-
try super.init(from: decoder)
+ let propertyList = ["testStatus": testStatus, "duration": duration, "summaryRef": summaryRef, "performanceMetricsCount": performanceMetricsCount, "failureSummariesCount": failureSummariesCount, "activitySummariesCount": activitySummariesCount] as [String: Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
-open class ActionTestPerformanceMetricSummary : Codable {
+open class ActionTestPerformanceMetricSummary : XCResultObject {
public let displayName: String
public let unitOfMeasurement: String
public let measurements: [Double]
@@ -355,7 +387,7 @@ open class ActionTestPerformanceMetricSummary : Codable {
public let maxRegression: Double?
public let maxStandardDeviation: Double?
- enum ActionTestPerformanceMetricSummaryCodingKeys: String, CodingKey {
+ public enum ActionTestPerformanceMetricSummaryCodingKeys: String, CodingKey {
case displayName
case unitOfMeasurement
case measurements
@@ -368,7 +400,7 @@ open class ActionTestPerformanceMetricSummary : Codable {
case maxStandardDeviation
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ActionTestPerformanceMetricSummaryCodingKeys.self)
displayName = try container.decodeXCResultType(forKey: .displayName)
unitOfMeasurement = try container.decodeXCResultType(forKey: .unitOfMeasurement)
@@ -383,38 +415,46 @@ open class ActionTestPerformanceMetricSummary : Codable {
maxPercentRelativeStandardDeviation = try container.decodeXCResultTypeIfPresent(forKey: .maxPercentRelativeStandardDeviation)
maxRegression = try container.decodeXCResultTypeIfPresent(forKey: .maxRegression)
maxStandardDeviation = try container.decodeXCResultTypeIfPresent(forKey: .maxStandardDeviation)
+ try super.init(from: decoder)
+ let propertyList = ["displayName": displayName, "unitOfMeasurement": unitOfMeasurement, "measurements": measurements, "identifier": identifier, "baselineName": baselineName, "baselineAverage": baselineAverage, "maxPercentRegression": maxPercentRegression, "maxPercentRelativeStandardDeviation": maxPercentRelativeStandardDeviation, "maxRegression": maxRegression, "maxStandardDeviation": maxStandardDeviation] as [String: Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
-open class ActionTestPlanRunSummaries : Codable {
+open class ActionTestPlanRunSummaries : XCResultObject {
public let summaries: [ActionTestPlanRunSummary]
- enum ActionTestPlanRunSummariesCodingKeys: String, CodingKey {
+ public enum ActionTestPlanRunSummariesCodingKeys: String, CodingKey {
case summaries
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ActionTestPlanRunSummariesCodingKeys.self)
let summaryValues = try container.decode(XCResultArrayValue.self, forKey: .summaries)
summaries = summaryValues.values
+ try super.init(from: decoder)
+ let propertyList = ["summaries": summaries] as [String: Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
open class ActionTestPlanRunSummary : ActionAbstractTestSummary {
public let testableSummaries: [ActionTestableSummary]
- enum ActionTestPlanRunSummaryCodingKeys: String, CodingKey {
+ public enum ActionTestPlanRunSummaryCodingKeys: String, CodingKey {
case testableSummaries
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ActionTestPlanRunSummaryCodingKeys.self)
let summaryValues = try container.decode(XCResultArrayValue.self, forKey: .testableSummaries)
testableSummaries = summaryValues.values
try super.init(from: decoder)
+ let propertyList = ["testableSummaries": testableSummaries] as [String: Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
@@ -425,7 +465,7 @@ open class ActionTestSummary : ActionTestSummaryIdentifiableObject {
public let failureSummaries: [ActionTestFailureSummary]
public let activitySummaries: [ActionTestActivitySummary]
- enum ActionTestSummaryCodingKeys: String, CodingKey {
+ public enum ActionTestSummaryCodingKeys: String, CodingKey {
case testStatus
case duration
case performanceMetrics
@@ -433,7 +473,7 @@ open class ActionTestSummary : ActionTestSummaryIdentifiableObject {
case activitySummaries
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ActionTestSummaryCodingKeys.self)
duration = try container.decodeXCResultType(forKey: .duration)
testStatus = try container.decodeXCResultType(forKey: .testStatus)
@@ -443,6 +483,8 @@ open class ActionTestSummary : ActionTestSummaryIdentifiableObject {
activitySummaries = try container.decodeIfPresent(XCResultArrayValue.self, forKey: .activitySummaries)?.values ?? []
try super.init(from: decoder)
+ let propertyList = ["testStatus": testStatus, "duration": duration, "performanceMetrics": performanceMetrics, "failureSummaries": failureSummaries, "activitySummaries": activitySummaries] as [String: Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
@@ -450,32 +492,36 @@ open class ActionTestSummaryGroup : ActionTestSummaryIdentifiableObject {
public let duration: Double
public let subtests: [ActionTestSummaryIdentifiableObject]
- enum ActionTestSummaryGroupCodingKeys: String, CodingKey {
+ public enum ActionTestSummaryGroupCodingKeys: String, CodingKey {
case duration
case subtests
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ActionTestSummaryGroupCodingKeys.self)
duration = try container.decodeXCResultType(forKey: .duration)
let subtestsValues = try container.decode(XCResultArrayValue.self, forKey: .subtests)
subtests = subtestsValues.values
try super.init(from: decoder)
+ let propertyList = ["duration": duration, "subtests": subtests] as [String: Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
open class ActionTestSummaryIdentifiableObject : ActionAbstractTestSummary {
public let identifier: String?
- enum ActionTestSummaryIdentifiableObjectCodingKeys: String, CodingKey {
+ public enum ActionTestSummaryIdentifiableObjectCodingKeys: String, CodingKey {
case identifier
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ActionTestSummaryIdentifiableObjectCodingKeys.self)
identifier = try container.decodeXCResultTypeIfPresent(forKey: .identifier)
try super.init(from: decoder)
+ let propertyList = ["identifier": identifier] as [String: Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
@@ -489,7 +535,7 @@ open class ActionTestableSummary : ActionAbstractTestSummary {
public let testLanguage: String?
public let testRegion: String?
- enum ActionTestableSummaryCodingKeys: String, CodingKey {
+ public enum ActionTestableSummaryCodingKeys: String, CodingKey {
case projectRelativePath
case targetName
case testKind
@@ -500,7 +546,7 @@ open class ActionTestableSummary : ActionAbstractTestSummary {
case testRegion
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ActionTestableSummaryCodingKeys.self)
projectRelativePath = try container.decodeXCResultTypeIfPresent(forKey: .projectRelativePath)
targetName = try container.decodeXCResultTypeIfPresent(forKey: .targetName)
@@ -516,36 +562,41 @@ open class ActionTestableSummary : ActionAbstractTestSummary {
testRegion = try container.decodeXCResultTypeIfPresent(forKey: .testRegion)
try super.init(from: decoder)
+ let propertyList = ["projectRelativePath": projectRelativePath, "targetName": targetName, "testKind": testKind, "tests": tests, "diagnosticsDirectoryName": diagnosticsDirectoryName, "failureSummaries": failureSummaries, "testLanguage": testLanguage, "testRegion": testRegion] as [String: Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
-open class ActionsInvocationMetadata : Codable {
+open class ActionsInvocationMetadata : XCResultObject {
public let creatingWorkspaceFilePath: String
public let uniqueIdentifier: String
public let schemeIdentifier: EntityIdentifier?
- enum ActionsInvocationMetadataCodingKeys: String, CodingKey {
+ public enum ActionsInvocationMetadataCodingKeys: String, CodingKey {
case creatingWorkspaceFilePath
case uniqueIdentifier
case schemeIdentifier
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ActionsInvocationMetadataCodingKeys.self)
creatingWorkspaceFilePath = try container.decodeXCResultType(forKey: .creatingWorkspaceFilePath)
uniqueIdentifier = try container.decodeXCResultType(forKey: .uniqueIdentifier)
schemeIdentifier = try container.decodeXCResultObjectIfPresent(forKey: .schemeIdentifier)
+ try super.init(from: decoder)
+ let propertyList = ["creatingWorkspaceFilePath": creatingWorkspaceFilePath, "uniqueIdentifier": uniqueIdentifier, "schemeIdentifier": schemeIdentifier] as [String: Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
-public class ActionsInvocationRecord : Codable {
+open class ActionsInvocationRecord : XCResultObject {
public let metadataRef: Reference?
public let metrics: ResultMetrics
public let issues: ResultIssueSummaries
public let actions: [ActionRecord]
public let archive: ArchiveInfo?
- enum ActionsInvocationRecordCodingKeys: String, CodingKey {
+ public enum ActionsInvocationRecordCodingKeys: String, CodingKey {
case metadataRef
case metrics
case issues
@@ -553,7 +604,7 @@ public class ActionsInvocationRecord : Codable {
case archive
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ActionsInvocationRecordCodingKeys.self)
metadataRef = try container.decodeXCResultObjectIfPresent(forKey: .metadataRef)
metrics = try container.decodeXCResultObject(forKey: .metrics)
@@ -561,8 +612,10 @@ public class ActionsInvocationRecord : Codable {
let actionValues = try container.decode(XCResultArrayValue.self, forKey: .actions)
actions = actionValues.values
-
archive = try container.decodeXCResultObjectIfPresent(forKey: .archive)
+ try super.init(from: decoder)
+ let propertyList = ["metadataRef": metadataRef as Reference?, "metrics": metrics as ResultMetrics, "issues": issues as ResultIssueSummaries, "actions": actions as [ActionRecord], "archive": archive as ArchiveInfo?] as [String : Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
@@ -571,44 +624,47 @@ open class ActivityLogCommandInvocationSection : ActivityLogSection {
public let emittedOutput: String
public let exitCode: Int?
- enum ActivityLogCommandInvocationSectionCodingKeys: String, CodingKey {
+ public enum ActivityLogCommandInvocationSectionCodingKeys: String, CodingKey {
case commandDetails
case emittedOutput
case exitCode
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ActivityLogCommandInvocationSectionCodingKeys.self)
commandDetails = try container.decodeXCResultType(forKey: .commandDetails)
emittedOutput = try container.decodeXCResultType(forKey: .emittedOutput)
exitCode = try container.decodeXCResultTypeIfPresent(forKey: .exitCode)
try super.init(from: decoder)
+ let propertyList = ["commandDetails": commandDetails, "emittedOutput": emittedOutput, "exitCode": exitCode] as [String : Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
open class ActivityLogMajorSection : ActivityLogSection {
public let subtitle: String
- enum ActivityLogMajorSectionCodingKeys: String, CodingKey {
+ public enum ActivityLogMajorSectionCodingKeys: String, CodingKey {
case subtitle
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ActivityLogMajorSectionCodingKeys.self)
subtitle = try container.decodeXCResultType(forKey: .subtitle)
try super.init(from: decoder)
+ let propertyList = ["subtitle": subtitle] as [String : Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
-open class ActivityLogMessage : Codable {
- public let type: String
+open class ActivityLogMessage : XCResultObject {
public let title: String
public let shortTitle: String?
public let category: String?
public let location: DocumentLocation?
public let annotations: [ActivityLogMessageAnnotation]
- enum ActivityLogMessageCodingKeys: String, CodingKey {
+ public enum ActivityLogMessageCodingKeys: String, CodingKey {
case type
case title
case shortTitle
@@ -617,9 +673,8 @@ open class ActivityLogMessage : Codable {
case annotations
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ActivityLogMessageCodingKeys.self)
- type = try container.decodeXCResultType(forKey: .type)
title = try container.decodeXCResultType(forKey: .title)
shortTitle = try container.decodeXCResultTypeIfPresent(forKey: .shortTitle)
category = try container.decodeXCResultTypeIfPresent(forKey: .category)
@@ -627,26 +682,33 @@ open class ActivityLogMessage : Codable {
let annotationValues = try container.decode(XCResultArrayValue.self, forKey: .annotations)
annotations = annotationValues.values
+ try super.init(from: decoder)
+ type = try container.decodeXCResultType(forKey: .type)
+ let propertyList = ["type": type, "title": title, "shortTitle": shortTitle, "category": category, "location": location, "annotations": annotations] as [String : Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
-open class ActivityLogMessageAnnotation : Codable {
+open class ActivityLogMessageAnnotation : XCResultObject {
public let title: String
public let location: DocumentLocation?
- enum ActivityLogMessageCodingKeys: String, CodingKey {
+ public enum ActivityLogMessageCodingKeys: String, CodingKey {
case title
case location
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ActivityLogMessageCodingKeys.self)
title = try container.decodeXCResultType(forKey: .title)
location = try container.decodeXCResultObjectIfPresent(forKey: .location)
+ try super.init(from: decoder)
+ let propertyList = ["title": title, "location": location] as [String : Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
-open class ActivityLogSection : Codable {
+open class ActivityLogSection : XCResultObject {
public let domainType: String
public let title: String
public let startTime: Date?
@@ -655,7 +717,7 @@ open class ActivityLogSection : Codable {
public let subsections: [ActivityLogSection]
public let messages: [ActivityLogMessage]
- enum ActivityLogSectionCodingKeys: String, CodingKey {
+ public enum ActivityLogSectionCodingKeys: String, CodingKey {
case domainType
case title
case startTime
@@ -665,7 +727,7 @@ open class ActivityLogSection : Codable {
case messages
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ActivityLogSectionCodingKeys.self)
domainType = try container.decodeXCResultType(forKey: .domainType)
title = try container.decodeXCResultType(forKey: .title)
@@ -678,20 +740,25 @@ open class ActivityLogSection : Codable {
let messageValues = try container.decode(XCResultArrayValue.self, forKey: .messages)
messages = messageValues.values
+ try super.init(from: decoder)
+ let propertyList = ["domainType": domainType, "title": title, "startTime": startTime, "duration": duration, "result": result, "subsections": subsections, "messages": messages] as [String : Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
open class ActivityLogTargetBuildSection : ActivityLogMajorSection {
public let productType: String?
- enum ActivityLogTargetBuildSectionCodingKeys: String, CodingKey {
+ public enum ActivityLogTargetBuildSectionCodingKeys: String, CodingKey {
case productType
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ActivityLogTargetBuildSectionCodingKeys.self)
productType = try container.decodeXCResultTypeIfPresent(forKey: .productType)
try super.init(from: decoder)
+ let propertyList = ["productType": productType] as [String : Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
@@ -705,7 +772,7 @@ open class ActivityLogUnitTestSection : ActivityLogSection {
public let runnablePath: String?
public let runnableUTI: String?
- enum ActivityLogUnitTestSectionCodingKeys: String, CodingKey {
+ public enum ActivityLogUnitTestSectionCodingKeys: String, CodingKey {
case testName
case suiteName
case summary
@@ -716,7 +783,7 @@ open class ActivityLogUnitTestSection : ActivityLogSection {
case runnableUTI
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ActivityLogUnitTestSectionCodingKeys.self)
testName = try container.decodeXCResultTypeIfPresent(forKey: .testName)
suiteName = try container.decodeXCResultTypeIfPresent(forKey: .suiteName)
@@ -727,19 +794,24 @@ open class ActivityLogUnitTestSection : ActivityLogSection {
runnablePath = try container.decodeXCResultTypeIfPresent(forKey: .runnablePath)
runnableUTI = try container.decodeXCResultTypeIfPresent(forKey: .runnableUTI)
try super.init(from: decoder)
+ let propertyList = ["testName": testName, "suiteName": suiteName, "summary": summary, "emittedOutput": emittedOutput, "performanceTestOutput": performanceTestOutput, "testsPassedString": testsPassedString, "runnablePath": runnablePath, "runnableUTI": runnableUTI] as [String : Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
-open class ArchiveInfo : Codable {
+open class ArchiveInfo : XCResultObject {
public let path: String?
- enum ArchiveInfoCodingKeys: String, CodingKey {
+ public enum ArchiveInfoCodingKeys: String, CodingKey {
case path
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ArchiveInfoCodingKeys.self)
path = try container.decodeXCResultTypeIfPresent(forKey: .path)
+ try super.init(from: decoder)
+ let propertyList = ["path": path] as [String : Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
@@ -751,22 +823,25 @@ open class ArchiveInfo : Codable {
// // TODO: Alex - fill this in
//}
-open class CodeCoverageInfo : Codable {
+open class CodeCoverageInfo : XCResultObject {
public let hasCoverageData: Bool
public let reportRef: Reference?
public let archiveRef: Reference?
- enum CodeCoverageInfoCodingKeys: String, CodingKey {
+ public enum CodeCoverageInfoCodingKeys: String, CodingKey {
case hasCoverageData
case reportRef
case archiveRef
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodeCoverageInfoCodingKeys.self)
hasCoverageData = try container.decodeXCResultTypeIfPresent(forKey: .hasCoverageData) ?? false
reportRef = try container.decodeXCResultObjectIfPresent(forKey: .reportRef)
archiveRef = try container.decodeXCResultObjectIfPresent(forKey: .archiveRef)
+ try super.init(from: decoder)
+ let propertyList = ["hasCoverageData": hasCoverageData, "reportRef": reportRef, "archiveRef": archiveRef] as [String : Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
@@ -774,19 +849,22 @@ open class CodeCoverageInfo : Codable {
// // TODO: Alex - fill this in
//}
-open class DocumentLocation : Codable {
+open class DocumentLocation : XCResultObject {
public let url: String
public let concreteTypeName: String
- enum DocumentLocationCodingKeys: String, CodingKey {
+ public enum DocumentLocationCodingKeys: String, CodingKey {
case url
case concreteTypeName
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: DocumentLocationCodingKeys.self)
url = try container.decodeXCResultType(forKey: .url)
concreteTypeName = try container.decodeXCResultType(forKey: .concreteTypeName)
+ try super.init(from: decoder)
+ let propertyList = ["url": url, "concreteTypeName": concreteTypeName] as [String : Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
@@ -794,25 +872,28 @@ open class DocumentLocation : Codable {
// // TODO: Alex - fill this in
//}
-open class EntityIdentifier : Codable {
+open class EntityIdentifier : XCResultObject {
public let entityName: String
public let containerName: String
public let entityType: String
public let sharedState: String
- enum EntityIdentifierCodingKeys: String, CodingKey {
+ public enum EntityIdentifierCodingKeys: String, CodingKey {
case entityName
case containerName
case entityType
case sharedState
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: EntityIdentifierCodingKeys.self)
entityName = try container.decodeXCResultType(forKey: .entityName)
containerName = try container.decodeXCResultType(forKey: .containerName)
entityType = try container.decodeXCResultType(forKey: .entityType)
sharedState = try container.decodeXCResultType(forKey: .sharedState)
+ try super.init(from: decoder)
+ let propertyList = ["entityName": entityName, "containerName": containerName, "entityType": entityType, "sharedState": sharedState] as [String : Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
@@ -820,87 +901,100 @@ open class EntityIdentifier : Codable {
// // TODO: Alex - fill this in
//}
-open class IssueSummary : Codable {
+open class IssueSummary : XCResultObject {
public let issueType: String
public let message: String
public let producingTarget: String?
public let documentLocationInCreatingWorkspace: DocumentLocation?
- enum EntityIdentifierCodingKeys: String, CodingKey {
+ public enum EntityIdentifierCodingKeys: String, CodingKey {
case issueType
case message
case producingTarget
case documentLocationInCreatingWorkspace
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: EntityIdentifierCodingKeys.self)
issueType = try container.decodeXCResultType(forKey: .issueType)
message = try container.decodeXCResultType(forKey: .message)
producingTarget = try container.decodeXCResultTypeIfPresent(forKey: .producingTarget)
documentLocationInCreatingWorkspace = try container.decodeXCResultObjectIfPresent(forKey: .documentLocationInCreatingWorkspace)
+ try super.init(from: decoder)
+ let propertyList = ["issueType": issueType, "message": message, "producingTarget": producingTarget, "documentLocationInCreatingWorkspace": documentLocationInCreatingWorkspace] as [String : Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
-open class ObjectID : Codable {
+open class ObjectID : XCResultObject {
public let hash: String
- enum ObjectIDCodingKeys: String, CodingKey {
+ public enum ObjectIDCodingKeys: String, CodingKey {
case hash
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ObjectIDCodingKeys.self)
hash = try container.decodeXCResultType(forKey: .hash)
+ try super.init(from: decoder)
+ let propertyList = ["hash": hash] as [String : Any]
+ self.appendToProperties(propertyList: propertyList)
+
}
}
-open class Reference : Codable {
+open class Reference : XCResultObject {
public let id: String
public let targetType: TypeDefinition?
- enum ReferenceCodingKeys: String, CodingKey {
+ public enum ReferenceCodingKeys: String, CodingKey {
case id
case targetType
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ReferenceCodingKeys.self)
id = try container.decodeXCResultType(forKey: .id)
targetType = try container.decodeXCResultObjectIfPresent(forKey: .targetType)
+ try super.init(from: decoder)
+ let propertyList = ["id": id, "targetType": targetType] as [String : Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
-open class ResultIssueSummaries : Codable {
+open class ResultIssueSummaries : XCResultObject {
public let analyzerWarningSummaries: [IssueSummary]
public let errorSummaries: [IssueSummary]
public let testFailureSummaries: [TestFailureIssueSummary]
public let warningSummaries: [IssueSummary]
- enum ResultIssueSummariesCodingKeys: String, CodingKey {
+ public enum ResultIssueSummariesCodingKeys: String, CodingKey {
case analyzerWarningSummaries
case errorSummaries
case testFailureSummaries
case warningSummaries
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ResultIssueSummariesCodingKeys.self)
analyzerWarningSummaries = try container.decodeIfPresent(XCResultArrayValue.self, forKey: .analyzerWarningSummaries)?.values ?? []
errorSummaries = try container.decodeIfPresent(XCResultArrayValue.self, forKey: .errorSummaries)?.values ?? []
testFailureSummaries = try container.decodeIfPresent(XCResultArrayValue.self, forKey: .testFailureSummaries)?.values ?? []
warningSummaries = try container.decodeIfPresent(XCResultArrayValue.self, forKey: .warningSummaries)?.values ?? []
+ try super.init(from: decoder)
+ let propertyList = ["analyzerWarningSummaries": analyzerWarningSummaries, "errorSummaries": errorSummaries, "testFailureSummaries": testFailureSummaries, "warningSummaries": warningSummaries] as [String : Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
-open class ResultMetrics : Codable {
+open class ResultMetrics : XCResultObject {
public let analyzerWarningCount: Int
public let errorCount: Int
public let testsCount: Int
public let testsFailedCount: Int
public let warningCount: Int
- enum ResultMetricsCodingKeys: String, CodingKey {
+ public enum ResultMetricsCodingKeys: String, CodingKey {
case analyzerWarningCount
case errorCount
case testsCount
@@ -908,13 +1002,16 @@ open class ResultMetrics : Codable {
case warningCount
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ResultMetricsCodingKeys.self)
analyzerWarningCount = try container.decodeXCResultTypeIfPresent(forKey: .analyzerWarningCount) ?? 0
errorCount = try container.decodeXCResultTypeIfPresent(forKey: .errorCount) ?? 0
testsCount = try container.decodeXCResultTypeIfPresent(forKey: .testsCount) ?? 0
testsFailedCount = try container.decodeXCResultTypeIfPresent(forKey: .testsFailedCount) ?? 0
warningCount = try container.decodeXCResultTypeIfPresent(forKey: .warningCount) ?? 0
+ try super.init(from: decoder)
+ let propertyList = ["analyzerWarningCount": analyzerWarningCount, "errorCount": errorCount, "testsCount": testsCount, "testsFailedCount": testsFailedCount, "warningCount": warningCount] as [String : Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
@@ -935,30 +1032,36 @@ open class ResultMetrics : Codable {
open class TestFailureIssueSummary : IssueSummary {
public let testCaseName: String
- enum TestFailureIssueSummaryCodingKeys: String, CodingKey {
+ public enum TestFailureIssueSummaryCodingKeys: String, CodingKey {
case testCaseName
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: TestFailureIssueSummaryCodingKeys.self)
testCaseName = try container.decodeXCResultType(forKey: .testCaseName)
try super.init(from: decoder)
+ let propertyList = ["testCaseName": testCaseName] as [String : Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
-open class TypeDefinition : Codable {
+open class TypeDefinition : XCResultObject {
public let name: String
public let supertype: TypeDefinition?
- enum TypeDefinitionCodingKeys: String, CodingKey {
+ public enum TypeDefinitionCodingKeys: String, CodingKey {
case name
case supertype
}
- required public init(from decoder: Decoder) throws {
+ public required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: TypeDefinitionCodingKeys.self)
name = try container.decodeXCResultType(forKey: .name)
supertype = try container.decodeXCResultObjectIfPresent(forKey: .supertype)
+ try super.init(from: decoder)
+ let propertyList = ["name": name, "supertype": supertype] as [String : Any]
+ self.appendToProperties(propertyList: propertyList)
}
}
+
diff --git a/Sources/xcparse-visualizer/AppDelegate.swift b/Sources/xcparse-visualizer/AppDelegate.swift
new file mode 100644
index 0000000..007c408
--- /dev/null
+++ b/Sources/xcparse-visualizer/AppDelegate.swift
@@ -0,0 +1,26 @@
+//
+// AppDelegate.swift
+// Sample-Test-App
+//
+// Created by Rishab Sukumar on 8/12/19.
+// Copyright © 2019 Rishab Sukumar. All rights reserved.
+//
+
+import Cocoa
+
+@NSApplicationMain
+class AppDelegate: NSObject, NSApplicationDelegate {
+
+
+
+ func applicationDidFinishLaunching(_ aNotification: Notification) {
+ // Insert code here to initialize your application
+ }
+
+ func applicationWillTerminate(_ aNotification: Notification) {
+ // Insert code here to tear down your application
+ }
+
+
+}
+
diff --git a/Sources/xcparse-visualizer/Console.swift b/Sources/xcparse-visualizer/Console.swift
new file mode 100644
index 0000000..33d3718
--- /dev/null
+++ b/Sources/xcparse-visualizer/Console.swift
@@ -0,0 +1,36 @@
+//
+// ConsoleIO.swift
+// xcparse
+//
+// Created by Rishab Sukumar on 8/8/19.
+// Copyright © 2019 ChargePoint, Inc. All rights reserved.
+//
+
+import Foundation
+
+enum OutputType {
+ case error
+ case standard
+}
+
+class Console {
+
+ // MARK: -
+ // MARK: Shell
+ // user3064009's answer on https://stackoverflow.com/questions/26971240/how-do-i-run-an-terminal-command-in-a-swift-script-e-g-xcodebuild
+ func shellCommand(_ command: String) -> String {
+ let task = Process()
+ task.launchPath = "/bin/bash"
+ task.arguments = ["-c", command]
+
+ let pipe = Pipe()
+ task.standardOutput = pipe
+ task.launch()
+
+ let data = pipe.fileHandleForReading.readDataToEndOfFile()
+ let output: String = NSString(data: data, encoding: String.Encoding.utf8.rawValue)! as String
+
+ return output
+ }
+
+}
diff --git a/Sources/xcparse-visualizer/View Controllers/ViewController.swift b/Sources/xcparse-visualizer/View Controllers/ViewController.swift
new file mode 100644
index 0000000..19569c2
--- /dev/null
+++ b/Sources/xcparse-visualizer/View Controllers/ViewController.swift
@@ -0,0 +1,27 @@
+//
+// ViewController.swift
+// Sample-Test-App
+//
+// Created by Rishab Sukumar on 8/12/19.
+// Copyright © 2019 Rishab Sukumar. All rights reserved.
+//
+
+import Cocoa
+
+class ViewController: NSViewController {
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ // Do any additional setup after loading the view.
+ }
+
+ override var representedObject: Any? {
+ didSet {
+ // Update the view, if already loaded.
+ }
+ }
+
+
+}
+
diff --git a/Sources/xcparse-visualizer/View Controllers/allTestsViewController.swift b/Sources/xcparse-visualizer/View Controllers/allTestsViewController.swift
new file mode 100644
index 0000000..41bfbd7
--- /dev/null
+++ b/Sources/xcparse-visualizer/View Controllers/allTestsViewController.swift
@@ -0,0 +1,21 @@
+//
+// allTestsViewController.swift
+// Sample-Test-App
+//
+// Created by Rishab Sukumar on 8/22/19.
+// Copyright © 2019 Rishab Sukumar. All rights reserved.
+//
+
+import Cocoa
+
+class allTestsViewController: NSViewController {
+
+ @IBOutlet weak var SampleAppTestContainer: NSView!
+ @IBOutlet weak var navToTestsContainer: NSView!
+ override func viewDidLoad() {
+ super.viewDidLoad()
+ // Do view setup here.
+ SampleAppTestContainer.isHidden = true
+ }
+
+}
diff --git a/Sources/xcparse-visualizer/View Controllers/breakdownWindowController.swift b/Sources/xcparse-visualizer/View Controllers/breakdownWindowController.swift
new file mode 100644
index 0000000..7c5647b
--- /dev/null
+++ b/Sources/xcparse-visualizer/View Controllers/breakdownWindowController.swift
@@ -0,0 +1,27 @@
+//
+// breakdownWIndowController.swift
+// Sample-Test-App
+//
+// Created by Rishab Sukumar on 8/23/19.
+// Copyright © 2019 Rishab Sukumar. All rights reserved.
+//
+
+import Cocoa
+
+class breakdownWindowController: NSWindowController {
+
+ override func windowDidLoad() {
+ super.windowDidLoad()
+
+ // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
+ }
+
+ override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
+ let destVC = segue.destinationController as! exportViewController
+ let windowVC = segue.sourceController as! breakdownWindowController
+ if let sourceVC = windowVC.contentViewController {
+ destVC.sourceVC = sourceVC
+ destVC.fromToolbar = true
+ }
+ }
+}
diff --git a/Sources/xcparse-visualizer/View Controllers/exportViewController.swift b/Sources/xcparse-visualizer/View Controllers/exportViewController.swift
new file mode 100644
index 0000000..9899556
--- /dev/null
+++ b/Sources/xcparse-visualizer/View Controllers/exportViewController.swift
@@ -0,0 +1,103 @@
+//
+// exportViewController.swift
+// Sample-Test-App
+//
+// Created by Rishab Sukumar on 8/22/19.
+// Copyright © 2019 Rishab Sukumar. All rights reserved.
+//
+
+import Cocoa
+import XCParseCore
+
+class exportViewController: NSViewController {
+
+ @IBOutlet weak var folderPathField: NSTextField!
+ @IBOutlet weak var selectButton: NSButton!
+ @IBOutlet weak var exportButton: NSButton!
+ @IBOutlet weak var filenameField: NSTextField!
+ @IBOutlet weak var extensionField: NSTextField!
+ @IBOutlet weak var enterFilenameLabel: NSTextField!
+ var sourceVC : Any!
+ var fromToolbar : Bool = false
+ override func viewDidLoad() {
+ super.viewDidLoad()
+ // Do view setup here.
+ }
+
+ @IBAction func hitEnter(_ sender: NSTextField) {
+ if filenameField.isHidden == false {
+ if !filenameField.stringValue.isEmpty {
+ exportButton.isEnabled = true
+ }
+ }
+ }
+
+ @IBAction func clickedSelectButton(_ sender: NSButton) {
+ let dialog = NSOpenPanel();
+
+ dialog.showsResizeIndicator = true
+ dialog.showsHiddenFiles = false
+ dialog.canChooseDirectories = true
+ dialog.canCreateDirectories = true
+ dialog.allowsMultipleSelection = false
+ dialog.canChooseFiles = false
+
+ if (dialog.runModal() == NSApplication.ModalResponse.OK) {
+ let result = dialog.url // Pathname of the file
+
+ if (result != nil) {
+ let path = result!.path
+ folderPathField.stringValue = path
+ }
+ } else {
+ // User clicked on "Cancel"
+ return
+ }
+ if fromToolbar {
+ filenameField.isHidden = false
+ extensionField.isHidden = false
+ enterFilenameLabel.isHidden = false
+ extensionField.placeholderString = ".json"
+ }
+ if !folderPathField.stringValue.isEmpty {
+ exportButton.isHidden = false
+ if filenameField.isHidden == false && filenameField.stringValue.isEmpty {
+ exportButton.isEnabled = false
+ }
+ }
+ }
+
+ @IBAction func clickExport(_ sender: NSButton) {
+ if let vc = sourceVC as? objectBreakdownViewController {
+ xcparseFields.destinationPath = folderPathField.stringValue
+ vc.copyFileAndOpen()
+ dismiss(self)
+ }
+ else if let vc = sourceVC as? subtestSummaryBreakdownViewController {
+ xcparseFields.destinationPath = folderPathField.stringValue
+ vc.copyFileAndOpen()
+ dismiss(self)
+ }
+ else {
+ if(fromToolbar) {
+ fromToolbar = false
+ xcparseFields.destinationPath = folderPathField.stringValue
+
+ let console = Console()
+ if let tabVC = sourceVC as? NSTabViewController {
+ if let vc = tabVC.tabViewItems[tabVC.selectedTabViewItemIndex].viewController as? objectBreakdownViewController {
+ FileManager.default.createFile(atPath: "\(xcparseFields.destinationPath)/\(filenameField.stringValue)\( extensionField.placeholderString!)", contents: vc.xcresultJSONData, attributes: nil)
+ }
+ else if let vc = tabVC.tabViewItems[tabVC.selectedTabViewItemIndex].viewController as? testSummariesBreakdownViewController {
+ FileManager.default.createFile(atPath: "\(xcparseFields.destinationPath)/\(filenameField.stringValue)\( extensionField.placeholderString!)", contents: vc.xcresultJSONData, attributes: nil)
+ }
+ else if let vc = tabVC.tabViewItems[tabVC.selectedTabViewItemIndex].viewController as? subtestSummaryBreakdownViewController {
+ FileManager.default.createFile(atPath: "\(xcparseFields.destinationPath)/\(filenameField.stringValue)\( extensionField.placeholderString!)", contents: vc.xcresultJSONData, attributes: nil)
+ }
+ }
+ let _ = console.shellCommand("open \(xcparseFields.destinationPath)/\(filenameField.stringValue)\(extensionField.placeholderString!)")
+ dismiss(self)
+ }
+ }
+ }
+}
diff --git a/Sources/xcparse-visualizer/View Controllers/firstViewController.swift b/Sources/xcparse-visualizer/View Controllers/firstViewController.swift
new file mode 100644
index 0000000..a5fded3
--- /dev/null
+++ b/Sources/xcparse-visualizer/View Controllers/firstViewController.swift
@@ -0,0 +1,44 @@
+//
+// firstViewController.swift
+// Sample-Test-App
+//
+// Created by Rishab Sukumar on 8/13/19.
+// Copyright © 2019 Rishab Sukumar. All rights reserved.
+//
+
+import Cocoa
+
+class firstViewController: NSViewController {
+
+
+ @IBOutlet weak var messageField: NSTextField!
+ @IBOutlet weak var container: NSView!
+ @IBOutlet weak var titleLabel: NSTextField!
+ @IBOutlet weak var containerView: NSView!
+ @IBOutlet weak var updateButton: NSButton!
+ var message = ""
+ var label = ""
+ @IBAction func isButtonClick(_ sender: Any) {
+ message = messageField?.stringValue ?? ""
+ if message.isEmpty {
+ return
+ }
+ else {
+ label = message
+ titleLabel.stringValue = label
+ }
+ }
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+ // Do view setup here.
+ }
+
+ override var representedObject: Any? {
+ didSet {
+ // Update the view, if already loaded.
+ }
+ }
+
+
+}
diff --git a/Sources/xcparse-visualizer/View Controllers/objectBreakdownViewController.swift b/Sources/xcparse-visualizer/View Controllers/objectBreakdownViewController.swift
new file mode 100644
index 0000000..976c691
--- /dev/null
+++ b/Sources/xcparse-visualizer/View Controllers/objectBreakdownViewController.swift
@@ -0,0 +1,507 @@
+//
+// xcparseObjectBreakdown.swift
+// Sample-Test-App
+//
+// Created by Rishab Sukumar on 8/14/19.
+// Copyright © 2019 Rishab Sukumar. All rights reserved.
+//
+
+import Cocoa
+import XCParseCore
+
+class objectBreakdownViewController: NSViewController {
+ @IBOutlet weak var objectBreakdownOutlineView: NSOutlineView!
+ var xcparseObjects = [XCResultObject]()
+ var xcresultJSONData = Data()
+ var xcresultPath : String = ""
+ var destinationPath : String = ""
+ var temporaryDirectoryURL : URL = URL(string: ".")!
+ @IBAction func doubleClickedItem(_ sender: NSOutlineView) {
+ if let item = sender.item(atRow: sender.clickedRow) as? XCResultNestedObjectType {
+ if item.name == "id" {
+ if let parentItem = sender.parent(forItem: item) as? XCResultNestedObjectType {
+ if parentItem.name == "testsRef" {
+ if(!xcresultPath.isEmpty) {
+ let console = Console()
+ let xcresultJSON = console.shellCommand("xcrun xcresulttool get --path \(xcresultPath) --format json --id \(item.value)")
+ xcresultJSONData = Data(xcresultJSON.utf8)
+ saveData()
+ self.performSegue(withIdentifier: "addTestBreakdownTab", sender: sender)
+ }
+ }
+ else if parentItem.name == "reportRef" {
+ if(!xcresultPath.isEmpty) {
+ let console = Console()
+ let _ = console.shellCommand("xcrun xcresulttool export --path \(xcresultPath) --id \(item.value) --output-path \(temporaryDirectoryURL.path)/action.xccovreport --type file")
+ performSegue(withIdentifier: "objectBreakdownExport", sender: sender)
+ }
+ }
+ }
+ }
+ }
+ }
+
+ func copyFileAndOpen() {
+ grabGlobalData()
+ let console = Console()
+ let _ = console.shellCommand("cp \(temporaryDirectoryURL.path)/action.xccovreport \(destinationPath)/action.xccovreport")
+ let _ = console.shellCommand("open \(destinationPath)/action.xccovreport")
+ }
+
+ override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
+ if let vc = segue.destinationController as? exportViewController {
+ vc.sourceVC = self
+ }
+ }
+
+ func saveData() {
+ xcparseFields.xcresultJSONData = xcresultJSONData
+ xcparseFields.xcresultPath = xcresultPath
+ xcparseFields.destinationPath = destinationPath
+ xcparseFields.temporaryDirectoryURL = temporaryDirectoryURL
+ }
+
+
+ func grabGlobalData() {
+ xcresultJSONData = xcparseFields.xcresultJSONData
+ xcresultPath = xcparseFields.xcresultPath
+ destinationPath = xcparseFields.destinationPath
+ temporaryDirectoryURL = xcparseFields.temporaryDirectoryURL
+ }
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+ // Do view setup here.
+ grabGlobalData()
+ if !xcresultJSONData.isEmpty {
+ let testJSON = try! JSONSerialization.jsonObject(with: Data(xcresultJSONData), options: []) as? [String:AnyObject]
+ let decoder = JSONDecoder()
+ let test = try! decoder.decode(ActionsInvocationRecord.self, from: xcresultJSONData)
+ xcparseObjects.append(test)
+ test.generateObjectTree()
+ objectBreakdownOutlineView.delegate = self
+ objectBreakdownOutlineView.dataSource = self
+ }
+ }
+
+ override var representedObject: Any? {
+ didSet {
+ // Update the view, if already loaded.
+ }
+ }
+
+
+}
+
+extension objectBreakdownViewController: NSOutlineViewDataSource {
+
+ func outlineView(_ outlineView: NSOutlineView, numberOfChildrenOfItem item: Any?) -> Int {
+ if let xcObject = item as? XCResultObject {
+ return xcObject.children.count
+ }
+ else if let xcObject = item as? XCResultObjectFirstNesting {
+ return xcObject.children.count
+ }
+ else if let xcObject = item as? XCResultObjectSecondNesting {
+ return xcObject.children.count
+ }
+ else if let xcObject = item as? XCResultObjectThirdNesting {
+ return xcObject.children.count
+ }
+ else if let xcObject = item as? XCResultObjectFourthNesting {
+ return xcObject.children.count
+ }
+ else if let xcObject = item as? XCResultObjectFifthNesting {
+ return xcObject.children.count
+ }
+ else if let xcObject = item as? XCResultObjectSixthNesting {
+ return xcObject.children.count
+ }
+ else if let xcObject = item as? XCResultObjectSeventhNesting {
+ return xcObject.children.count
+ }
+ else if let xcObject = item as? XCResultObjectEighthNesting {
+ return xcObject.children.count
+ }
+ else if let xcObject = item as? XCResultObjectNinthNesting {
+ return xcObject.children.count
+ }
+ else if let xcObject = item as? XCResultObjectTenthNesting {
+ return xcObject.children.count
+ }
+ else {
+ return xcparseObjects.count
+ }
+
+ }
+
+ func outlineView(_ outlineView: NSOutlineView, child index: Int, ofItem item: Any?) -> Any {
+ if let xcObject = item as? XCResultObject {
+ return xcObject.children[index]
+ }
+ else if let xcObject = item as? XCResultObjectFirstNesting {
+ return xcObject.children[index]
+ }
+ else if let xcObject = item as? XCResultObjectSecondNesting {
+ return xcObject.children[index]
+ }
+ else if let xcObject = item as? XCResultObjectThirdNesting {
+ return xcObject.children[index]
+ }
+ else if let xcObject = item as? XCResultObjectFourthNesting {
+ return xcObject.children[index]
+ }
+ else if let xcObject = item as? XCResultObjectFifthNesting {
+ return xcObject.children[index]
+ }
+ else if let xcObject = item as? XCResultObjectSixthNesting {
+ return xcObject.children[index]
+ }
+ else if let xcObject = item as? XCResultObjectSeventhNesting {
+ return xcObject.children[index]
+ }
+ else if let xcObject = item as? XCResultObjectEighthNesting {
+ return xcObject.children[index]
+ }
+ else if let xcObject = item as? XCResultObjectNinthNesting {
+ return xcObject.children[index]
+ }
+ else if let xcObject = item as? XCResultObjectTenthNesting {
+ return xcObject.children[index]
+ }
+ else {
+ return xcparseObjects[index]
+ }
+
+
+ }
+
+ func outlineView(_ outlineView: NSOutlineView, isItemExpandable item: Any) -> Bool {
+ if let xcObject = item as? XCResultObject {
+ return xcObject.children.count > 0
+ }
+ else if let xcObject = item as? XCResultObjectFirstNesting {
+ return xcObject.children.count > 0
+ }
+ else if let xcObject = item as? XCResultObjectSecondNesting {
+ return xcObject.children.count > 0
+ }
+ else if let xcObject = item as? XCResultObjectThirdNesting {
+ return xcObject.children.count > 0
+ }
+ else if let xcObject = item as? XCResultObjectFourthNesting {
+ return xcObject.children.count > 0
+ }
+ else if let xcObject = item as? XCResultObjectFifthNesting {
+ return xcObject.children.count > 0
+ }
+ else if let xcObject = item as? XCResultObjectSixthNesting {
+ return xcObject.children.count > 0
+ }
+ else if let xcObject = item as? XCResultObjectSeventhNesting {
+ return xcObject.children.count > 0
+ }
+ else if let xcObject = item as? XCResultObjectEighthNesting {
+ return xcObject.children.count > 0
+ }
+ else if let xcObject = item as? XCResultObjectNinthNesting {
+ return xcObject.children.count > 0
+ }
+ else if let xcObject = item as? XCResultObjectTenthNesting {
+ return xcObject.children.count > 0
+ }
+ return false
+ }
+}
+
+extension objectBreakdownViewController: NSOutlineViewDelegate {
+
+ func outlineView(_ outlineView: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView? {
+ var view: NSTableCellView?
+ var value : String = ""
+ if let xcObject = item as? XCResultNestedObjectType {
+ if xcObject.name == "coverage" {
+ for file in xcObject.children {
+ if file.name == "reportRef" {
+ if file.children.count > 0 {
+ value = "Has coverage data"
+ }
+ else {
+ value = "No coverage data"
+ }
+ }
+ }
+ }
+ else if xcObject.name == "actionResult" {
+ for file in xcObject.children {
+ if file.name == "testsRef" {
+ if file.children.count > 0 {
+ value = "Has tests"
+ }
+ else {
+ value = "No tests"
+ }
+ }
+ }
+ }
+ else {
+ value = xcObject.value
+ }
+ }
+ if let xcObject = item as? XCResultObject {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = ""
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ObjectCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.type.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectFirstNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectSecondNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "SecondObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectThirdNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ThirdObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectFourthNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "FourthObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectFifthNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "FifthObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectSixthNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "SixthObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectSeventhNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "SeventhObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectEighthNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "EighthObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectNinthNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "NinthObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectTenthNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "TenthObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectEleventhNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "EleventhObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ return view
+ }
+
+}
+
diff --git a/Sources/xcparse-visualizer/View Controllers/secondViewController.swift b/Sources/xcparse-visualizer/View Controllers/secondViewController.swift
new file mode 100644
index 0000000..fa2fd6f
--- /dev/null
+++ b/Sources/xcparse-visualizer/View Controllers/secondViewController.swift
@@ -0,0 +1,37 @@
+//
+// secondViewController.swift
+// Sample-Test-App
+//
+// Created by Rishab Sukumar on 8/13/19.
+// Copyright © 2019 Rishab Sukumar. All rights reserved.
+//
+
+import Cocoa
+
+class secondViewController: NSViewController {
+
+
+ @IBOutlet weak var countLabel: NSTextField!
+ var count : String = ""
+ @IBAction func buttonPressed(_ sender: Any) {
+ if count == "" {
+ count = "1"
+ }
+ else {
+ count = String((Int(count) ?? 0) + 1)
+ }
+ countLabel?.stringValue = count
+ }
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ // Do any additional setup after loading the view.
+ }
+
+ override var representedObject: Any? {
+ didSet {
+ }
+ }
+
+}
+
diff --git a/Sources/xcparse-visualizer/View Controllers/subtestSummaryBreakdownViewController.swift b/Sources/xcparse-visualizer/View Controllers/subtestSummaryBreakdownViewController.swift
new file mode 100644
index 0000000..2d28732
--- /dev/null
+++ b/Sources/xcparse-visualizer/View Controllers/subtestSummaryBreakdownViewController.swift
@@ -0,0 +1,486 @@
+//
+// subtestSummaryBreakdownViewController.swift
+// Sample-Test-App
+//
+// Created by Rishab Sukumar on 8/20/19.
+// Copyright © 2019 Rishab Sukumar. All rights reserved.
+//
+
+import Cocoa
+import XCParseCore
+
+class subtestSummaryBreakdownViewController: NSViewController {
+
+ @IBOutlet weak var subtestSummaryOutlineView: NSOutlineView!
+ var subtestSummaryObjects = [XCResultObject]()
+ var xcresultJSONData = Data()
+ var xcresultPath : String = ""
+ var destinationPath : String = ""
+ var temporaryDirectoryURL : URL = URL(string: ".")!
+ var filename : String = ""
+ @IBAction func doubleClickedItem(_ sender: NSOutlineView) {
+ if let item = sender.item(atRow: sender.clickedRow) as? XCResultNestedObjectType {
+ if item.name == "id" {
+ if let parentItem = sender.parent(forItem: item) as? XCResultNestedObjectType {
+ if parentItem.name == "payloadRef" {
+ if let grandParentItem = sender.parent(forItem: parentItem) as? XCResultNestedObjectType {
+ for object in grandParentItem.children {
+ if object.name == "filename" {
+ filename = object.value
+ break
+ }
+ }
+ if(!xcresultPath.isEmpty) {
+ let console = Console()
+ console.shellCommand("xcrun xcresulttool export --path \(xcresultPath) --id \(item.value) --output-path \(temporaryDirectoryURL.path)/\(filename) --type file")
+ performSegue(withIdentifier: "subtestSummaryBreakdownExport", sender: sender)
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+
+ func copyFileAndOpen() {
+ grabGlobalData()
+ let console = Console()
+ console.shellCommand("cp \(temporaryDirectoryURL.path)/\(filename) \(destinationPath)/")
+ console.shellCommand("rm \(temporaryDirectoryURL.path)/\(filename)")
+ console.shellCommand("open \(destinationPath)/\(filename)")
+ }
+
+ override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
+ if let vc = segue.destinationController as? exportViewController {
+ vc.sourceVC = self
+ }
+ }
+
+ func grabGlobalData() {
+ xcresultJSONData = xcparseFields.xcresultJSONData
+ xcresultPath = xcparseFields.xcresultPath
+ destinationPath = xcparseFields.destinationPath
+ temporaryDirectoryURL = xcparseFields.temporaryDirectoryURL
+ }
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+ // Do view setup here.
+ xcresultJSONData = xcparseFields.xcresultJSONData
+ xcresultPath = xcparseFields.xcresultPath
+ destinationPath = xcparseFields.destinationPath
+ temporaryDirectoryURL = xcparseFields.temporaryDirectoryURL
+ let testJSON = try! JSONSerialization.jsonObject(with: Data(xcresultJSONData), options: []) as? [String:AnyObject]
+ let decoder = JSONDecoder()
+ let test = try! decoder.decode(ActionTestSummary.self, from: xcresultJSONData)
+ test.generateObjectTree()
+ subtestSummaryObjects.append(test)
+ subtestSummaryOutlineView.dataSource = self
+ subtestSummaryOutlineView.delegate = self
+ }
+
+ override var representedObject: Any? {
+ didSet {
+ // Update the view, if already loaded.
+ }
+ }
+
+}
+
+extension subtestSummaryBreakdownViewController: NSOutlineViewDataSource {
+
+ func outlineView(_ outlineView: NSOutlineView, numberOfChildrenOfItem item: Any?) -> Int {
+ if let xcObject = item as? XCResultObject {
+ return xcObject.children.count
+ }
+ else if let xcObject = item as? XCResultObjectFirstNesting {
+ return xcObject.children.count
+ }
+ else if let xcObject = item as? XCResultObjectSecondNesting {
+ return xcObject.children.count
+ }
+ else if let xcObject = item as? XCResultObjectThirdNesting {
+ return xcObject.children.count
+ }
+ else if let xcObject = item as? XCResultObjectFourthNesting {
+ return xcObject.children.count
+ }
+ else if let xcObject = item as? XCResultObjectFifthNesting {
+ return xcObject.children.count
+ }
+ else if let xcObject = item as? XCResultObjectSixthNesting {
+ return xcObject.children.count
+ }
+ else if let xcObject = item as? XCResultObjectSeventhNesting {
+ return xcObject.children.count
+ }
+ else if let xcObject = item as? XCResultObjectEighthNesting {
+ return xcObject.children.count
+ }
+ else if let xcObject = item as? XCResultObjectNinthNesting {
+ return xcObject.children.count
+ }
+ else if let xcObject = item as? XCResultObjectTenthNesting {
+ return xcObject.children.count
+ }
+ else {
+ return subtestSummaryObjects.count
+ }
+
+ }
+
+ func outlineView(_ outlineView: NSOutlineView, child index: Int, ofItem item: Any?) -> Any {
+ if let xcObject = item as? XCResultObject {
+ return xcObject.children[index]
+ }
+ else if let xcObject = item as? XCResultObjectFirstNesting {
+ return xcObject.children[index]
+ }
+ else if let xcObject = item as? XCResultObjectSecondNesting {
+ return xcObject.children[index]
+ }
+ else if let xcObject = item as? XCResultObjectThirdNesting {
+ return xcObject.children[index]
+ }
+ else if let xcObject = item as? XCResultObjectFourthNesting {
+ return xcObject.children[index]
+ }
+ else if let xcObject = item as? XCResultObjectFifthNesting {
+ return xcObject.children[index]
+ }
+ else if let xcObject = item as? XCResultObjectSixthNesting {
+ return xcObject.children[index]
+ }
+ else if let xcObject = item as? XCResultObjectSeventhNesting {
+ return xcObject.children[index]
+ }
+ else if let xcObject = item as? XCResultObjectEighthNesting {
+ return xcObject.children[index]
+ }
+ else if let xcObject = item as? XCResultObjectNinthNesting {
+ return xcObject.children[index]
+ }
+ else if let xcObject = item as? XCResultObjectTenthNesting {
+ return xcObject.children[index]
+ }
+ else {
+ return subtestSummaryObjects[index]
+ }
+
+
+ }
+
+ func outlineView(_ outlineView: NSOutlineView, isItemExpandable item: Any) -> Bool {
+ if let xcObject = item as? XCResultObject {
+ return xcObject.children.count > 0
+ }
+ else if let xcObject = item as? XCResultObjectFirstNesting {
+ return xcObject.children.count > 0
+ }
+ else if let xcObject = item as? XCResultObjectSecondNesting {
+ return xcObject.children.count > 0
+ }
+ else if let xcObject = item as? XCResultObjectThirdNesting {
+ return xcObject.children.count > 0
+ }
+ else if let xcObject = item as? XCResultObjectFourthNesting {
+ return xcObject.children.count > 0
+ }
+ else if let xcObject = item as? XCResultObjectFifthNesting {
+ return xcObject.children.count > 0
+ }
+ else if let xcObject = item as? XCResultObjectSixthNesting {
+ return xcObject.children.count > 0
+ }
+ else if let xcObject = item as? XCResultObjectSeventhNesting {
+ return xcObject.children.count > 0
+ }
+ else if let xcObject = item as? XCResultObjectEighthNesting {
+ return xcObject.children.count > 0
+ }
+ else if let xcObject = item as? XCResultObjectNinthNesting {
+ return xcObject.children.count > 0
+ }
+ else if let xcObject = item as? XCResultObjectTenthNesting {
+ return xcObject.children.count > 0
+ }
+ return false
+ }
+}
+
+extension subtestSummaryBreakdownViewController: NSOutlineViewDelegate {
+
+ func outlineView(_ outlineView: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView? {
+ var view: NSTableCellView?
+ var value: String = ""
+ if let xcObject = item as? XCResultNestedObjectType {
+ if xcObject.name == "ActionTestActivitySummary" {
+ for file in xcObject.children {
+ if file.name == "attachments" {
+ if file.children.count > 0 {
+ value = "Has attachment"
+ }
+ }
+ }
+ }
+ else {
+ value = xcObject.value
+ }
+ }
+ if let xcObject = item as? XCResultObject {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = ""
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ObjectCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.type.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectFirstNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectSecondNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "SecondObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectThirdNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ThirdObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectFourthNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "FourthObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectFifthNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "FifthObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectSixthNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "SixthObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectSeventhNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "SeventhObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectEighthNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "EighthObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectNinthNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "NinthObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectTenthNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "TenthObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectEleventhNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "EleventhObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ return view
+ }
+
+}
diff --git a/Sources/xcparse-visualizer/View Controllers/testSummariesBreakdownViewController.swift b/Sources/xcparse-visualizer/View Controllers/testSummariesBreakdownViewController.swift
new file mode 100644
index 0000000..dfb7219
--- /dev/null
+++ b/Sources/xcparse-visualizer/View Controllers/testSummariesBreakdownViewController.swift
@@ -0,0 +1,448 @@
+//
+// testSummariesBreakdownViewController.swift
+// Sample-Test-App
+//
+// Created by Rishab Sukumar on 8/20/19.
+// Copyright © 2019 Rishab Sukumar. All rights reserved.
+//
+
+import Cocoa
+import XCParseCore
+
+class testSummariesBreakdownViewController: NSViewController {
+ @IBOutlet weak var testSummariesOutlineView: NSOutlineView!
+ var testSummariesObjects = [XCResultObject]()
+ var xcresultJSONData = Data()
+ var xcresultPath : String = ""
+ var destinationPath : String = ""
+ var temporaryDirectoryURL : URL = URL(string: ".")!
+ @IBAction func doubleClickedItem(_ sender: NSOutlineView) {
+ if let item = sender.item(atRow: sender.clickedRow) as? XCResultNestedObjectType {
+ if item.name == "id" {
+ if let parentItem = sender.parent(forItem: item) as? XCResultNestedObjectType {
+ if parentItem.name == "summaryRef" {
+ if(!xcresultPath.isEmpty) {
+ let console = Console()
+ let xcresultJSON = console.shellCommand("xcrun xcresulttool get --path \(xcresultPath) --format json --id \(item.value)")
+ xcresultJSONData = Data(xcresultJSON.utf8)
+ saveData()
+ self.performSegue(withIdentifier: "addSummaryBreakdownTab", sender: sender)
+ }
+ }
+ }
+ }
+ }
+ }
+
+ func saveData() {
+ xcparseFields.xcresultJSONData = xcresultJSONData
+ xcparseFields.xcresultPath = xcresultPath
+ xcparseFields.destinationPath = destinationPath
+ xcparseFields.temporaryDirectoryURL = temporaryDirectoryURL
+ }
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+ // Do view setup here.
+ xcresultJSONData = xcparseFields.xcresultJSONData
+ xcresultPath = xcparseFields.xcresultPath
+ destinationPath = xcparseFields.destinationPath
+ temporaryDirectoryURL = xcparseFields.temporaryDirectoryURL
+ let testJSON = try! JSONSerialization.jsonObject(with: Data(xcresultJSONData), options: []) as? [String:AnyObject]
+ let decoder = JSONDecoder()
+ let test = try! decoder.decode(ActionTestPlanRunSummaries.self, from: xcresultJSONData)
+ test.generateObjectTree()
+ testSummariesObjects.append(test)
+ testSummariesOutlineView.dataSource = self
+ testSummariesOutlineView.delegate = self
+ }
+
+ override var representedObject: Any? {
+ didSet {
+ // Update the view, if already loaded.
+ }
+ }
+
+}
+
+extension testSummariesBreakdownViewController: NSOutlineViewDataSource {
+
+ func outlineView(_ outlineView: NSOutlineView, numberOfChildrenOfItem item: Any?) -> Int {
+ if let xcObject = item as? XCResultObject {
+ return xcObject.children.count
+ }
+ else if let xcObject = item as? XCResultObjectFirstNesting {
+ return xcObject.children.count
+ }
+ else if let xcObject = item as? XCResultObjectSecondNesting {
+ return xcObject.children.count
+ }
+ else if let xcObject = item as? XCResultObjectThirdNesting {
+ return xcObject.children.count
+ }
+ else if let xcObject = item as? XCResultObjectFourthNesting {
+ return xcObject.children.count
+ }
+ else if let xcObject = item as? XCResultObjectFifthNesting {
+ return xcObject.children.count
+ }
+ else if let xcObject = item as? XCResultObjectSixthNesting {
+ return xcObject.children.count
+ }
+ else if let xcObject = item as? XCResultObjectSeventhNesting {
+ return xcObject.children.count
+ }
+ else if let xcObject = item as? XCResultObjectEighthNesting {
+ return xcObject.children.count
+ }
+ else if let xcObject = item as? XCResultObjectNinthNesting {
+ return xcObject.children.count
+ }
+ else if let xcObject = item as? XCResultObjectTenthNesting {
+ return xcObject.children.count
+ }
+ else {
+ return testSummariesObjects.count
+ }
+
+ }
+
+ func outlineView(_ outlineView: NSOutlineView, child index: Int, ofItem item: Any?) -> Any {
+ if let xcObject = item as? XCResultObject {
+ return xcObject.children[index]
+ }
+ else if let xcObject = item as? XCResultObjectFirstNesting {
+ return xcObject.children[index]
+ }
+ else if let xcObject = item as? XCResultObjectSecondNesting {
+ return xcObject.children[index]
+ }
+ else if let xcObject = item as? XCResultObjectThirdNesting {
+ return xcObject.children[index]
+ }
+ else if let xcObject = item as? XCResultObjectFourthNesting {
+ return xcObject.children[index]
+ }
+ else if let xcObject = item as? XCResultObjectFifthNesting {
+ return xcObject.children[index]
+ }
+ else if let xcObject = item as? XCResultObjectSixthNesting {
+ return xcObject.children[index]
+ }
+ else if let xcObject = item as? XCResultObjectSeventhNesting {
+ return xcObject.children[index]
+ }
+ else if let xcObject = item as? XCResultObjectEighthNesting {
+ return xcObject.children[index]
+ }
+ else if let xcObject = item as? XCResultObjectNinthNesting {
+ return xcObject.children[index]
+ }
+ else if let xcObject = item as? XCResultObjectTenthNesting {
+ return xcObject.children[index]
+ }
+ else {
+ return testSummariesObjects[index]
+ }
+
+
+ }
+
+ func outlineView(_ outlineView: NSOutlineView, isItemExpandable item: Any) -> Bool {
+ if let xcObject = item as? XCResultObject {
+ return xcObject.children.count > 0
+ }
+ else if let xcObject = item as? XCResultObjectFirstNesting {
+ return xcObject.children.count > 0
+ }
+ else if let xcObject = item as? XCResultObjectSecondNesting {
+ return xcObject.children.count > 0
+ }
+ else if let xcObject = item as? XCResultObjectThirdNesting {
+ return xcObject.children.count > 0
+ }
+ else if let xcObject = item as? XCResultObjectFourthNesting {
+ return xcObject.children.count > 0
+ }
+ else if let xcObject = item as? XCResultObjectFifthNesting {
+ return xcObject.children.count > 0
+ }
+ else if let xcObject = item as? XCResultObjectSixthNesting {
+ return xcObject.children.count > 0
+ }
+ else if let xcObject = item as? XCResultObjectSeventhNesting {
+ return xcObject.children.count > 0
+ }
+ else if let xcObject = item as? XCResultObjectEighthNesting {
+ return xcObject.children.count > 0
+ }
+ else if let xcObject = item as? XCResultObjectNinthNesting {
+ return xcObject.children.count > 0
+ }
+ else if let xcObject = item as? XCResultObjectTenthNesting {
+ return xcObject.children.count > 0
+ }
+ return false
+ }
+}
+
+extension testSummariesBreakdownViewController: NSOutlineViewDelegate {
+
+ func outlineView(_ outlineView: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView? {
+ var view: NSTableCellView?
+ if let xcObject = item as? XCResultObject {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = ""
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ObjectCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.type.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectFirstNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = xcObject.value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectSecondNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = xcObject.value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "SecondObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectThirdNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = xcObject.value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ThirdObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectFourthNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = xcObject.value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "FourthObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectFifthNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = xcObject.value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "FifthObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectSixthNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = xcObject.value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "SixthObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectSeventhNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = xcObject.value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "SeventhObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectEighthNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = xcObject.value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "EighthObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectNinthNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = xcObject.value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "NinthObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectTenthNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = xcObject.value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "TenthObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ else if let xcObject = item as? XCResultObjectEleventhNesting {
+ if tableColumn!.identifier.rawValue == "ValueColumn" {
+ //2
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ValueCell"), owner: self) as? NSTableCellView
+
+ if let textField = view?.textField {
+ //3
+ textField.stringValue = xcObject.value
+ textField.sizeToFit()
+ }
+ }
+ else {
+ view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "EleventhObjectValueCell"), owner: self) as? NSTableCellView
+ if let textField = view?.textField {
+ //5
+ textField.stringValue = xcObject.name
+ textField.sizeToFit()
+ }
+ // More code here
+ }
+ }
+ return view
+ }
+
+}
diff --git a/Sources/xcparse-visualizer/View Controllers/testTabViewController.swift b/Sources/xcparse-visualizer/View Controllers/testTabViewController.swift
new file mode 100644
index 0000000..f8eee47
--- /dev/null
+++ b/Sources/xcparse-visualizer/View Controllers/testTabViewController.swift
@@ -0,0 +1,20 @@
+//
+// testTabViewController.swift
+// Sample-Test-App
+//
+// Created by Rishab Sukumar on 8/14/19.
+// Copyright © 2019 Rishab Sukumar. All rights reserved.
+//
+
+import Cocoa
+
+class testTabViewController: NSViewController {
+
+ @IBOutlet weak var testButton: NSButton!
+ override func viewDidLoad() {
+ super.viewDidLoad()
+ testButton.identifier = NSUserInterfaceItemIdentifier(rawValue: "testButton")
+ // Do view setup here.
+ }
+
+}
diff --git a/Sources/xcparse-visualizer/View Controllers/xcparseViewController.swift b/Sources/xcparse-visualizer/View Controllers/xcparseViewController.swift
new file mode 100644
index 0000000..82e4fea
--- /dev/null
+++ b/Sources/xcparse-visualizer/View Controllers/xcparseViewController.swift
@@ -0,0 +1,46 @@
+//
+// xcparseViewController.swift
+// Sample-Test-App
+//
+// Created by Rishab Sukumar on 8/14/19.
+// Copyright © 2019 Rishab Sukumar. All rights reserved.
+//
+
+import Cocoa
+import XCParseCore
+class xcparseViewController: NSViewController {
+
+
+ @IBOutlet weak var errorField: NSTextField!
+ @IBOutlet var xcPathField: xcparseView!
+ @IBOutlet weak var parseButton: NSButton!
+ var xcresultJSONData = Data()
+ var temporaryDirectoryURL : URL = URL(string: ".")!
+ override func viewDidLoad() {
+ super.viewDidLoad()
+ // Do view setup here.
+ }
+
+ @IBAction func parsePressed(_ sender: Any) {
+ let path = xcPathField.string
+ if(!path.isEmpty) {
+ errorField.isHidden = true
+ let console = Console()
+ let fileManager: FileManager = FileManager.default
+ temporaryDirectoryURL = try! fileManager.url(for: .cachesDirectory, in: .userDomainMask, appropriateFor: URL(string: "."), create: true)
+ let xcresultJSON = console.shellCommand("xcrun xcresulttool get --path \(path) --format json")
+ xcresultJSONData = Data(xcresultJSON.utf8)
+ saveData()
+ self.performSegue(withIdentifier: "objectBreakdown", sender: sender)
+ }
+ else {
+ errorField.isHidden = false
+ }
+ }
+
+ func saveData() {
+ xcparseFields.xcresultJSONData = xcresultJSONData
+ xcparseFields.xcresultPath = xcPathField.string
+ xcparseFields.temporaryDirectoryURL = temporaryDirectoryURL
+ }
+}
diff --git a/Sources/xcparse-visualizer/addBreakdownTab.swift b/Sources/xcparse-visualizer/addBreakdownTab.swift
new file mode 100644
index 0000000..ff2e669
--- /dev/null
+++ b/Sources/xcparse-visualizer/addBreakdownTab.swift
@@ -0,0 +1,29 @@
+//
+// passDataSegue.swift
+// Sample-Test-App
+//
+// Created by Rishab Sukumar on 8/22/19.
+// Copyright © 2019 Rishab Sukumar. All rights reserved.
+//
+
+import Cocoa
+
+class addBreakdownTab: NSStoryboardSegue {
+
+ override func perform() {
+ let sourceVC = self.sourceController as! NSViewController
+ let destVC = self.destinationController as! NSViewController
+ if sourceVC.parent is NSTabViewController {
+ if let tabVC = sourceVC.parent as? NSTabViewController {
+ tabVC.addChild(destVC)
+ tabVC.selectedTabViewItemIndex = tabVC.tabViewItems.count-1
+ }
+ }
+ else {
+ if let tabVC = sourceVC.parent?.parent as? NSTabViewController {
+ tabVC.addChild(destVC)
+ tabVC.selectedTabViewItemIndex = tabVC.tabViewItems.count-1
+ }
+ }
+ }
+}
diff --git a/Sources/xcparse-visualizer/customSegue.swift b/Sources/xcparse-visualizer/customSegue.swift
new file mode 100644
index 0000000..08fc402
--- /dev/null
+++ b/Sources/xcparse-visualizer/customSegue.swift
@@ -0,0 +1,28 @@
+//
+// customSegue.swift
+// Sample-Test-App
+//
+// Created by Rishab Sukumar on 8/22/19.
+// Copyright © 2019 Rishab Sukumar. All rights reserved.
+//
+
+import Cocoa
+
+class customSegue: NSStoryboardSegue {
+
+ override func perform() {
+ if let sourceVC = self.sourceController as? testTabViewController {
+ let destVC = self.destinationController as! NSViewController
+ let containerVC = sourceVC.parent as! allTestsViewController
+ containerVC.navToTestsContainer.isHidden = true
+ containerVC.SampleAppTestContainer.isHidden = false
+ }
+ else if let sourceVC = self.sourceController as? firstViewController {
+ let destVC = self.destinationController as! NSViewController
+ let containerVC = sourceVC.parent as! allTestsViewController
+ containerVC.navToTestsContainer.isHidden = false
+ containerVC.SampleAppTestContainer.isHidden = true
+ }
+
+ }
+}
diff --git a/Sources/xcparse-visualizer/xcparseFields.swift b/Sources/xcparse-visualizer/xcparseFields.swift
new file mode 100644
index 0000000..a913a8a
--- /dev/null
+++ b/Sources/xcparse-visualizer/xcparseFields.swift
@@ -0,0 +1,16 @@
+//
+// xcparseFields.swift
+// Sample-Test-App
+//
+// Created by Rishab Sukumar on 8/22/19.
+// Copyright © 2019 Rishab Sukumar. All rights reserved.
+//
+
+import Cocoa
+
+class xcparseFields: NSObject {
+ static var xcresultJSONData = Data()
+ static var xcresultPath : String = ""
+ static var destinationPath : String = ""
+ static var temporaryDirectoryURL : URL = URL(string: ".")!
+}
diff --git a/Sources/xcparse-visualizer/xcparseView.swift b/Sources/xcparse-visualizer/xcparseView.swift
new file mode 100644
index 0000000..4e3a16d
--- /dev/null
+++ b/Sources/xcparse-visualizer/xcparseView.swift
@@ -0,0 +1,71 @@
+//
+// xcparseView.swift
+// Sample-Test-App
+//
+// Created by Rishab Sukumar on 8/14/19.
+// Copyright © 2019 Rishab Sukumar. All rights reserved.
+//
+
+import Cocoa
+
+class xcparseView: NSTextView {
+
+ var filePath: String?
+ let expectedExt = ["xcresult"] //file extensions allowed for Drag&Drop (example: "jpg","png","docx", etc..)
+
+ required init?(coder: NSCoder) {
+ super.init(coder: coder)
+
+ self.wantsLayer = true
+ self.layer?.backgroundColor = NSColor.controlBackgroundColor.cgColor
+ registerForDraggedTypes([NSPasteboard.PasteboardType.URL, NSPasteboard.PasteboardType.fileURL])
+ }
+
+ override func draw(_ dirtyRect: NSRect) {
+ super.draw(dirtyRect)
+ // Drawing code here.
+ }
+
+ override func draggingEntered(_ sender: NSDraggingInfo) -> NSDragOperation {
+ if checkExtension(sender) == true {
+ self.layer?.backgroundColor = NSColor.systemGray.cgColor
+ return .copy
+ } else {
+ return NSDragOperation()
+ }
+ }
+
+ fileprivate func checkExtension(_ drag: NSDraggingInfo) -> Bool {
+ guard let board = drag.draggingPasteboard.propertyList(forType: NSPasteboard.PasteboardType(rawValue: "NSFilenamesPboardType")) as? NSArray,
+ let path = board[0] as? String
+ else { return false }
+
+ let suffix = URL(fileURLWithPath: path).pathExtension
+ for ext in self.expectedExt {
+ if ext.lowercased() == suffix {
+ return true
+ }
+ }
+ return false
+ }
+
+ override func draggingExited(_ sender: NSDraggingInfo?) {
+ self.layer?.backgroundColor = NSColor.controlBackgroundColor.cgColor
+ }
+
+ override func draggingEnded(_ sender: NSDraggingInfo) {
+ self.layer?.backgroundColor = NSColor.controlBackgroundColor.cgColor
+ }
+
+ override func performDragOperation(_ sender: NSDraggingInfo) -> Bool {
+ guard let pasteboard = sender.draggingPasteboard.propertyList(forType: NSPasteboard.PasteboardType(rawValue: "NSFilenamesPboardType")) as? NSArray,
+ let path = pasteboard[0] as? String
+ else { return false }
+
+ //GET YOUR FILE PATH !!!
+ self.filePath = path
+ self.string = self.filePath ?? ""
+ return true
+ }
+
+}
diff --git a/xcparse-visualizer/CPTMixedTestPlan.xctestplan b/xcparse-visualizer/CPTMixedTestPlan.xctestplan
new file mode 100644
index 0000000..2bf5581
--- /dev/null
+++ b/xcparse-visualizer/CPTMixedTestPlan.xctestplan
@@ -0,0 +1,97 @@
+{
+ "configurations" : [
+ {
+ "id" : "22879577-E2D5-4F5E-B941-D5489AD27175",
+ "name" : "Light Mode",
+ "options" : {
+ "commandLineArgumentEntries" : [
+ {
+ "argument" : "-CPTUIUserInterfaceStyle \"Light\""
+ }
+ ]
+ }
+ },
+ {
+ "id" : "D0860B07-7497-4722-B82D-3D22E76B0AA5",
+ "name" : "Dark Mode",
+ "options" : {
+ "commandLineArgumentEntries" : [
+ {
+ "argument" : "-CPTUIUserInterfaceStyle \"Dark\""
+ }
+ ]
+ }
+ },
+ {
+ "id" : "65825086-C2E2-403B-BFB1-491096312DCD",
+ "name" : "Keep All Screenshots",
+ "options" : {
+ "uiTestingScreenshotsLifetime" : "keepAlways",
+ "userAttachmentLifetime" : "keepAlways"
+ }
+ },
+ {
+ "id" : "DFB3ECB4-CF6C-4745-8FAD-C342F5CCEF40",
+ "name" : "No Screenshots",
+ "options" : {
+ "uiTestingScreenshotsLifetime" : "keepNever",
+ "userAttachmentLifetime" : "keepNever"
+ }
+ },
+ {
+ "id" : "C6592213-3287-4806-8BAE-5B96C15F83D1",
+ "name" : "Delete screenshots on success",
+ "options" : {
+
+ }
+ },
+ {
+ "id" : "E3E552C4-7068-4FE4-8C22-9E9863AFCF11",
+ "name" : "Random Order",
+ "options" : {
+ "testExecutionOrdering" : "random"
+ }
+ }
+ ],
+ "defaultOptions" : {
+
+ },
+ "testTargets" : [
+ {
+ "target" : {
+ "containerPath" : "container:xcparse-visualizer.xcodeproj",
+ "identifier" : "5443C25023037F72009E7319",
+ "name" : "CPTBundleWithMultipleSuites"
+ }
+ },
+ {
+ "target" : {
+ "containerPath" : "container:xcparse-visualizer.xcodeproj",
+ "identifier" : "5443C22D23037027009E7319",
+ "name" : "CPTEmptyTestBundle"
+ }
+ },
+ {
+ "target" : {
+ "containerPath" : "container:xcparse-visualizer.xcodeproj",
+ "identifier" : "5443C26523047D57009E7319",
+ "name" : "CPTUnitTestBundle"
+ }
+ },
+ {
+ "target" : {
+ "containerPath" : "container:xcparse-visualizer.xcodeproj",
+ "identifier" : "54FABB1A2302265700369599",
+ "name" : "xcparse-visualizerTests"
+ }
+ },
+ {
+ "target" : {
+ "containerPath" : "container:xcparse-visualizer.xcodeproj",
+ "identifier" : "54FABB252302265700369599",
+ "name" : "xcparse-visualizerUITests"
+ }
+ }
+ ],
+ "version" : 1
+}
diff --git a/xcparse-visualizer/CPTTestPlanWithEmptyBundle.xctestplan b/xcparse-visualizer/CPTTestPlanWithEmptyBundle.xctestplan
new file mode 100644
index 0000000..a837724
--- /dev/null
+++ b/xcparse-visualizer/CPTTestPlanWithEmptyBundle.xctestplan
@@ -0,0 +1,24 @@
+{
+ "configurations" : [
+ {
+ "id" : "02D5567F-181C-4C65-AEFE-1DFE9078F602",
+ "name" : "Configuration 1",
+ "options" : {
+
+ }
+ }
+ ],
+ "defaultOptions" : {
+
+ },
+ "testTargets" : [
+ {
+ "target" : {
+ "containerPath" : "container:xcparse-visualizer.xcodeproj",
+ "identifier" : "5443C22D23037027009E7319",
+ "name" : "CPTEmptyTestBundle"
+ }
+ }
+ ],
+ "version" : 1
+}
diff --git a/xcparse-visualizer/CPTTestPlanWithMultipleConfigurations.xctestplan b/xcparse-visualizer/CPTTestPlanWithMultipleConfigurations.xctestplan
new file mode 100644
index 0000000..b6c7c45
--- /dev/null
+++ b/xcparse-visualizer/CPTTestPlanWithMultipleConfigurations.xctestplan
@@ -0,0 +1,101 @@
+{
+ "configurations" : [
+ {
+ "id" : "3BCC2033-9AA3-4F62-ABDE-08574B9FF783",
+ "name" : "Light Mode",
+ "options" : {
+
+ }
+ },
+ {
+ "id" : "EBE4936B-705D-4ED1-9DA9-4F7C34A0152C",
+ "name" : "Dark Mode",
+ "options" : {
+ "commandLineArgumentEntries" : [
+ {
+ "argument" : "-CPTUIUserInterfaceStyle \"Dark\""
+ }
+ ]
+ }
+ },
+ {
+ "id" : "827F82D9-BA2B-421B-8ED9-B186D20DABE7",
+ "name" : "Random Order",
+ "options" : {
+ "commandLineArgumentEntries" : [
+
+ ],
+ "testExecutionOrdering" : "random"
+ }
+ },
+ {
+ "id" : "14CAB5EF-3AD0-439F-95F5-E898227C0C14",
+ "name" : "Keep All Screenshots",
+ "options" : {
+ "commandLineArgumentEntries" : [
+
+ ],
+ "uiTestingScreenshotsLifetime" : "keepAlways",
+ "userAttachmentLifetime" : "keepAlways"
+ }
+ },
+ {
+ "id" : "FCC36C7F-9203-4210-9E45-FE1C3DD6B563",
+ "name" : "No Screenshots",
+ "options" : {
+ "commandLineArgumentEntries" : [
+
+ ],
+ "uiTestingScreenshotsLifetime" : "keepNever",
+ "userAttachmentLifetime" : "keepNever"
+ }
+ },
+ {
+ "id" : "E3A51DD9-0FAF-4FE7-BD4E-5414BDCE3A84",
+ "name" : "Delete screenshots on success",
+ "options" : {
+ "commandLineArgumentEntries" : [
+
+ ]
+ }
+ }
+ ],
+ "defaultOptions" : {
+ "commandLineArgumentEntries" : [
+ {
+ "argument" : "-CPTUIUserInterfaceStyle \"Dark\""
+ }
+ ]
+ },
+ "testTargets" : [
+ {
+ "target" : {
+ "containerPath" : "container:xcparse-visualizer.xcodeproj",
+ "identifier" : "5443C25023037F72009E7319",
+ "name" : "CPTBundleWithMultipleSuites"
+ }
+ },
+ {
+ "target" : {
+ "containerPath" : "container:xcparse-visualizer.xcodeproj",
+ "identifier" : "5443C22D23037027009E7319",
+ "name" : "CPTEmptyTestBundle"
+ }
+ },
+ {
+ "target" : {
+ "containerPath" : "container:xcparse-visualizer.xcodeproj",
+ "identifier" : "54FABB1A2302265700369599",
+ "name" : "xcparse-visualizerTests"
+ }
+ },
+ {
+ "target" : {
+ "containerPath" : "container:xcparse-visualizer.xcodeproj",
+ "identifier" : "54FABB252302265700369599",
+ "name" : "xcparse-visualizerUITests"
+ }
+ }
+ ],
+ "version" : 1
+}
diff --git a/xcparse-visualizer/CPTTestPlanWithSampleTests.xctestplan b/xcparse-visualizer/CPTTestPlanWithSampleTests.xctestplan
new file mode 100644
index 0000000..9977fde
--- /dev/null
+++ b/xcparse-visualizer/CPTTestPlanWithSampleTests.xctestplan
@@ -0,0 +1,31 @@
+{
+ "configurations" : [
+ {
+ "id" : "006A402D-3626-4BFB-AF09-B08712232159",
+ "name" : "Configuration 1",
+ "options" : {
+
+ }
+ }
+ ],
+ "defaultOptions" : {
+
+ },
+ "testTargets" : [
+ {
+ "target" : {
+ "containerPath" : "container:xcparse-visualizer.xcodeproj",
+ "identifier" : "54FABB1A2302265700369599",
+ "name" : "xcparse-visualizerTests"
+ }
+ },
+ {
+ "target" : {
+ "containerPath" : "container:xcparse-visualizer.xcodeproj",
+ "identifier" : "54FABB252302265700369599",
+ "name" : "xcparse-visualizerUITests"
+ }
+ }
+ ],
+ "version" : 1
+}
diff --git a/xcparse-visualizer/CPTTestPlanWithUnitTests.xctestplan b/xcparse-visualizer/CPTTestPlanWithUnitTests.xctestplan
new file mode 100644
index 0000000..0f568b2
--- /dev/null
+++ b/xcparse-visualizer/CPTTestPlanWithUnitTests.xctestplan
@@ -0,0 +1,24 @@
+{
+ "configurations" : [
+ {
+ "id" : "500C97D5-2ABA-46ED-923E-E2C55F484B00",
+ "name" : "Configuration 1",
+ "options" : {
+
+ }
+ }
+ ],
+ "defaultOptions" : {
+
+ },
+ "testTargets" : [
+ {
+ "target" : {
+ "containerPath" : "container:xcparse-visualizer.xcodeproj",
+ "identifier" : "5443C26523047D57009E7319",
+ "name" : "CPTUnitTestBundle"
+ }
+ }
+ ],
+ "version" : 1
+}
diff --git a/xcparse-visualizer/README.md b/xcparse-visualizer/README.md
new file mode 100644
index 0000000..e113bc3
--- /dev/null
+++ b/xcparse-visualizer/README.md
@@ -0,0 +1,4 @@
+# xcparse-visualizer
+
+macOS application to visualize the models contained within a given XCode *.xcresult file.
+
diff --git a/xcparse-visualizer/Tests/CPTBundleWithMultipleSuites/CPTBundleWithMultipleSuites.swift b/xcparse-visualizer/Tests/CPTBundleWithMultipleSuites/CPTBundleWithMultipleSuites.swift
new file mode 100644
index 0000000..30f7e74
--- /dev/null
+++ b/xcparse-visualizer/Tests/CPTBundleWithMultipleSuites/CPTBundleWithMultipleSuites.swift
@@ -0,0 +1,43 @@
+//
+// CPTBundleWithMultipleSuites.swift
+// CPTBundleWithMultipleSuites
+//
+// Created by Rishab Sukumar on 8/13/19.
+// Copyright © 2019 Rishab Sukumar. All rights reserved.
+//
+
+import XCTest
+
+class CPTBundleWithMultipleSuites : XCTestCase {
+
+ override func setUp() {
+ // Put setup code here. This method is called before the invocation of each test method in the class.
+
+ // In UI tests it is usually best to stop immediately when a failure occurs.
+ continueAfterFailure = false
+
+ // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
+ }
+
+ override func tearDown() {
+ // Put teardown code here. This method is called after the invocation of each test method in the class.
+ }
+
+ func testExample() {
+ // UI tests must launch the application that they test.
+ let app = XCUIApplication()
+ app.launch()
+
+ // Use recording to get started writing UI tests.
+ // Use XCTAssert and related functions to verify your tests produce the correct results.
+ }
+
+ func testLaunchPerformance() {
+ if #available(macOS 10.15, iOS 13.0, tvOS 13.0, *) {
+ // This measures how long it takes to launch your application.
+ measure(metrics: [XCTOSSignpostMetric.applicationLaunch]) {
+ XCUIApplication().launch()
+ }
+ }
+ }
+}
diff --git a/xcparse-visualizer/Tests/CPTBundleWithMultipleSuites/CPTNavigateTabs.swift b/xcparse-visualizer/Tests/CPTBundleWithMultipleSuites/CPTNavigateTabs.swift
new file mode 100644
index 0000000..abc88f2
--- /dev/null
+++ b/xcparse-visualizer/Tests/CPTBundleWithMultipleSuites/CPTNavigateTabs.swift
@@ -0,0 +1,62 @@
+//
+// CPTNavigateTabs.swift
+// CPTBundleWithMultipleSuites
+//
+// Created by Rishab Sukumar on 8/13/19.
+// Copyright © 2019 Rishab Sukumar. All rights reserved.
+//
+
+import XCTest
+
+class CPTNavigateTabs: XCTestCase {
+
+ let app = XCUIApplication()
+ override func setUp() {
+ // Put setup code here. This method is called before the invocation of each test method in the class.
+
+ // In UI tests it is usually best to stop immediately when a failure occurs.
+ continueAfterFailure = false
+ app.launch()
+ let testsTab = self.app.radioButtons["Tests"]
+ testsTab.click()
+ // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
+ }
+
+ override func tearDown() {
+ // Put teardown code here. This method is called after the invocation of each test method in the class.
+ self.app.terminate()
+ }
+
+ func testMessageTab() {
+ let testButton : XCUIElement = self.app.buttons["testButton"]
+ testButton.click()
+ let messageTab = self.app.radioButtons["Message"]
+ messageTab.click()
+ saveScreenshot(name: "CPTAutomationMessageTab")
+ }
+
+ func testMessageCountTab() {
+ let testButton : XCUIElement = self.app.buttons["testButton"]
+ testButton.click()
+ let messageCountTab = self.app.radioButtons["Message Counts"]
+ messageCountTab.click()
+ saveScreenshot(name: "CPTAutomationMessageCountTab")
+ }
+
+ func testRandomTab() {
+ let testButton : XCUIElement = self.app.buttons["testButton"]
+ testButton.click()
+ let randomTab = self.app.radioButtons["Random"]
+ randomTab.click()
+ saveScreenshot(name: "CPTAutomationRandomTab")
+ }
+
+ func saveScreenshot(name : String) {
+ let screenshot = self.app.screenshot()
+ let attachment : XCTAttachment = XCTAttachment(screenshot: screenshot)
+ attachment.lifetime = .keepAlways
+ attachment.name = name
+ add(attachment)
+ }
+
+}
diff --git a/xcparse-visualizer/Tests/CPTBundleWithMultipleSuites/CPTTitleChangeTests.swift b/xcparse-visualizer/Tests/CPTBundleWithMultipleSuites/CPTTitleChangeTests.swift
new file mode 100644
index 0000000..f0d483d
--- /dev/null
+++ b/xcparse-visualizer/Tests/CPTBundleWithMultipleSuites/CPTTitleChangeTests.swift
@@ -0,0 +1,58 @@
+//
+// CPTTitleChangeTests.swift
+// CPTBundleWithMultipleSuites
+//
+// Created by Rishab Sukumar on 8/13/19.
+// Copyright © 2019 Rishab Sukumar. All rights reserved.
+//
+
+import XCTest
+
+class CPTTitleChangeTests: XCTestCase {
+
+ let app = XCUIApplication()
+ override func setUp() {
+ // Put setup code here. This method is called before the invocation of each test method in the class.
+
+ // In UI tests it is usually best to stop immediately when a failure occurs.
+ continueAfterFailure = false
+ app.launch()
+ let testsTab = self.app.radioButtons["Tests"]
+ testsTab.click()
+ // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
+ }
+
+ override func tearDown() {
+ // Put teardown code here. This method is called after the invocation of each test method in the class.
+ self.app.terminate()
+ }
+
+ func testEnterString() {
+ let testButton : XCUIElement = self.app.buttons["testButton"]
+ testButton.click()
+ let messageField : XCUIElement = self.app.textFields["messageField"]
+ messageField.click()
+ messageField.typeText("Hello")
+ saveScreenshot(name: "CPTAutomationTypedText")
+ }
+
+ func saveScreenshot(name : String) {
+ let screenshot = self.app.screenshot()
+ let attachment : XCTAttachment = XCTAttachment(screenshot: screenshot)
+ attachment.lifetime = .keepAlways
+ attachment.name = name
+ add(attachment)
+ }
+
+ func testChangeTitle() {
+ let testButton : XCUIElement = self.app.buttons["testButton"]
+ testButton.click()
+ let messageField : XCUIElement = self.app.textFields["messageField"]
+ messageField.click()
+ messageField.typeText("Changed Title")
+ saveScreenshot(name: "CPTAutomationTypedText")
+ let updateButton : XCUIElement = self.app.buttons["updateButton"]
+ updateButton.click()
+ saveScreenshot(name: "CPTAutomationUpdatedTitle")
+ }
+}
diff --git a/xcparse-visualizer/Tests/CPTBundleWithMultipleSuites/Info.plist b/xcparse-visualizer/Tests/CPTBundleWithMultipleSuites/Info.plist
new file mode 100644
index 0000000..64d65ca
--- /dev/null
+++ b/xcparse-visualizer/Tests/CPTBundleWithMultipleSuites/Info.plist
@@ -0,0 +1,22 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ $(PRODUCT_BUNDLE_PACKAGE_TYPE)
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ 1
+
+
diff --git a/xcparse-visualizer/Tests/CPTEmptyTestBundle/CPTEmptyTestBundle.swift b/xcparse-visualizer/Tests/CPTEmptyTestBundle/CPTEmptyTestBundle.swift
new file mode 100644
index 0000000..56147aa
--- /dev/null
+++ b/xcparse-visualizer/Tests/CPTEmptyTestBundle/CPTEmptyTestBundle.swift
@@ -0,0 +1,27 @@
+//
+// CPTEmptyTestBundle.swift
+// CPTEmptyTestBundle
+//
+// Created by Rishab Sukumar on 8/13/19.
+// Copyright © 2019 Rishab Sukumar. All rights reserved.
+//
+
+import XCTest
+
+class CPTEmptyTestBundle: XCTestCase {
+
+ override func setUp() {
+ // Put setup code here. This method is called before the invocation of each test method in the class.
+
+ // In UI tests it is usually best to stop immediately when a failure occurs.
+ continueAfterFailure = false
+
+ // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
+ }
+
+ override func tearDown() {
+ // Put teardown code here. This method is called after the invocation of each test method in the class.
+ }
+
+
+}
diff --git a/xcparse-visualizer/Tests/CPTEmptyTestBundle/Info.plist b/xcparse-visualizer/Tests/CPTEmptyTestBundle/Info.plist
new file mode 100644
index 0000000..64d65ca
--- /dev/null
+++ b/xcparse-visualizer/Tests/CPTEmptyTestBundle/Info.plist
@@ -0,0 +1,22 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ $(PRODUCT_BUNDLE_PACKAGE_TYPE)
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ 1
+
+
diff --git a/xcparse-visualizer/Tests/CPTTitleChangeTests/CPTTitleChangeTests.swift b/xcparse-visualizer/Tests/CPTTitleChangeTests/CPTTitleChangeTests.swift
new file mode 100644
index 0000000..2414acb
--- /dev/null
+++ b/xcparse-visualizer/Tests/CPTTitleChangeTests/CPTTitleChangeTests.swift
@@ -0,0 +1,50 @@
+//
+// CPTTitleChangeTests.swift
+// CPTTitleChangeTests
+//
+// Created by Rishab Sukumar on 8/13/19.
+// Copyright © 2019 Rishab Sukumar. All rights reserved.
+//
+
+import XCTest
+
+class CPTTitleChangeTests: XCTestCase {
+
+ let app = XCUIApplication()
+ override func setUp() {
+ // Put setup code here. This method is called before the invocation of each test method in the class.
+
+ // In UI tests it is usually best to stop immediately when a failure occurs.
+ continueAfterFailure = false
+ app.launch()
+ let testsTab = self.app.radioButtons["Tests"]
+ testsTab.click()
+
+ // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
+ }
+
+ override func tearDown() {
+ // Put teardown code here. This method is called after the invocation of each test method in the class.
+ self.app.terminate()
+ }
+
+ func saveScreenshot(name : String) {
+ let screenshot = self.app.screenshot()
+ let attachment : XCTAttachment = XCTAttachment(screenshot: screenshot)
+ attachment.lifetime = .keepAlways
+ attachment.name = name
+ add(attachment)
+ }
+
+ func testChangeTitle() {
+ let testButton : XCUIElement = self.app.buttons["testButton"]
+ testButton.click()
+ let messageField : XCUIElement = self.app.textFields["messageField"]
+ messageField.click()
+ messageField.typeText("Changed Title")
+ saveScreenshot(name: "CPTAutomationTypedText")
+ let updateButton : XCUIElement = self.app.buttons["updateButton"]
+ updateButton.click()
+ saveScreenshot(name: "CPTAutomationUpdatedTitle")
+ }
+}
diff --git a/xcparse-visualizer/Tests/CPTTitleChangeTests/Info.plist b/xcparse-visualizer/Tests/CPTTitleChangeTests/Info.plist
new file mode 100644
index 0000000..64d65ca
--- /dev/null
+++ b/xcparse-visualizer/Tests/CPTTitleChangeTests/Info.plist
@@ -0,0 +1,22 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ $(PRODUCT_BUNDLE_PACKAGE_TYPE)
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ 1
+
+
diff --git a/xcparse-visualizer/Tests/CPTUnitTestBundle/CPTTestChangeTitle.swift b/xcparse-visualizer/Tests/CPTUnitTestBundle/CPTTestChangeTitle.swift
new file mode 100644
index 0000000..d49ae54
--- /dev/null
+++ b/xcparse-visualizer/Tests/CPTUnitTestBundle/CPTTestChangeTitle.swift
@@ -0,0 +1,33 @@
+//
+// CPTTestChangeTitle.swift
+// CPTUnitTestBundle
+//
+// Created by Rishab Sukumar on 8/14/19.
+// Copyright © 2019 Rishab Sukumar. All rights reserved.
+//
+
+import XCTest
+@testable import xcparse_visualizer
+class CPTTestChangeTitle: XCTestCase {
+
+ let app = firstViewController()
+ override func setUp() {
+ super.setUp()
+ // Put setup code here. This method is called before the invocation of each test method in the class.
+ }
+
+ override func tearDown() {
+ super.tearDown()
+ // Put teardown code here. This method is called after the invocation of each test method in the class.
+ }
+
+ func testChangeTitle() {
+ app.message = "Test1"
+ app.isButtonClick(self)
+ XCTAssertEqual(app.label, app.message)
+ app.message = "Test2"
+ app.isButtonClick(self)
+ XCTAssertEqual(app.label, app.message)
+ }
+
+}
diff --git a/xcparse-visualizer/Tests/CPTUnitTestBundle/CPTTestIncrement.swift b/xcparse-visualizer/Tests/CPTUnitTestBundle/CPTTestIncrement.swift
new file mode 100644
index 0000000..7f40f3c
--- /dev/null
+++ b/xcparse-visualizer/Tests/CPTUnitTestBundle/CPTTestIncrement.swift
@@ -0,0 +1,34 @@
+//
+// CPTTestIncrement.swift
+// CPTUnitTestBundle
+//
+// Created by Rishab Sukumar on 8/14/19.
+// Copyright © 2019 Rishab Sukumar. All rights reserved.
+//
+
+import XCTest
+@testable import xcparse_visualizer
+
+class CPTTestIncrement: XCTestCase {
+ let app = secondViewController()
+
+ override func setUp() {
+ super.setUp()
+ // Put setup code here. This method is called before the invocation of each test method in the class.
+ }
+
+ override func tearDown() {
+ super.tearDown()
+ // Put teardown code here. This method is called after the invocation of each test method in the class.
+ }
+
+ func testIncrement() {
+ app.buttonPressed(self)
+ XCTAssertEqual(app.count, "1")
+ for i in 1...5 {
+ app.buttonPressed(self)
+ }
+ XCTAssertEqual(app.count, "6")
+ }
+
+}
diff --git a/xcparse-visualizer/Tests/CPTUnitTestBundle/CPTUnitTestBundle.swift b/xcparse-visualizer/Tests/CPTUnitTestBundle/CPTUnitTestBundle.swift
new file mode 100644
index 0000000..b19acc3
--- /dev/null
+++ b/xcparse-visualizer/Tests/CPTUnitTestBundle/CPTUnitTestBundle.swift
@@ -0,0 +1,35 @@
+//
+// CPTUnitTestBundle.swift
+// CPTUnitTestBundle
+//
+// Created by Rishab Sukumar on 8/14/19.
+// Copyright © 2019 Rishab Sukumar. All rights reserved.
+//
+
+import XCTest
+
+class CPTUnitTestBundle: XCTestCase {
+
+ override func setUp() {
+ super.setUp()
+ // Put setup code here. This method is called before the invocation of each test method in the class.
+ }
+
+ override func tearDown() {
+ super.tearDown()
+ // Put teardown code here. This method is called after the invocation of each test method in the class.
+ }
+
+ func testExample() {
+ // This is an example of a functional test case.
+ // Use XCTAssert and related functions to verify your tests produce the correct results.
+ }
+
+ func testPerformanceExample() {
+ // This is an example of a performance test case.
+ measure {
+ // Put the code you want to measure the time of here.
+ }
+ }
+
+}
diff --git a/xcparse-visualizer/Tests/CPTUnitTestBundle/Info.plist b/xcparse-visualizer/Tests/CPTUnitTestBundle/Info.plist
new file mode 100644
index 0000000..64d65ca
--- /dev/null
+++ b/xcparse-visualizer/Tests/CPTUnitTestBundle/Info.plist
@@ -0,0 +1,22 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ $(PRODUCT_BUNDLE_PACKAGE_TYPE)
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ 1
+
+
diff --git a/xcparse-visualizer/Tests/Sample-Test-AppTests/Info.plist b/xcparse-visualizer/Tests/Sample-Test-AppTests/Info.plist
new file mode 100644
index 0000000..64d65ca
--- /dev/null
+++ b/xcparse-visualizer/Tests/Sample-Test-AppTests/Info.plist
@@ -0,0 +1,22 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ $(PRODUCT_BUNDLE_PACKAGE_TYPE)
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ 1
+
+
diff --git a/xcparse-visualizer/Tests/Sample-Test-AppTests/Sample_Test_AppTests.swift b/xcparse-visualizer/Tests/Sample-Test-AppTests/Sample_Test_AppTests.swift
new file mode 100644
index 0000000..9fa7969
--- /dev/null
+++ b/xcparse-visualizer/Tests/Sample-Test-AppTests/Sample_Test_AppTests.swift
@@ -0,0 +1,34 @@
+//
+// Sample_Test_AppTests.swift
+// Sample-Test-AppTests
+//
+// Created by Rishab Sukumar on 8/12/19.
+// Copyright © 2019 Rishab Sukumar. All rights reserved.
+//
+
+import XCTest
+@testable import xcparse_visualizer
+
+class Sample_Test_AppTests: XCTestCase {
+
+ override func setUp() {
+ // Put setup code here. This method is called before the invocation of each test method in the class.
+ }
+
+ override func tearDown() {
+ // Put teardown code here. This method is called after the invocation of each test method in the class.
+ }
+
+ func testExample() {
+ // This is an example of a functional test case.
+ // Use XCTAssert and related functions to verify your tests produce the correct results.
+ }
+
+ func testPerformanceExample() {
+ // This is an example of a performance test case.
+ self.measure {
+ // Put the code you want to measure the time of here.
+ }
+ }
+
+}
diff --git a/xcparse-visualizer/Tests/Sample-Test-AppUITests/Info.plist b/xcparse-visualizer/Tests/Sample-Test-AppUITests/Info.plist
new file mode 100644
index 0000000..64d65ca
--- /dev/null
+++ b/xcparse-visualizer/Tests/Sample-Test-AppUITests/Info.plist
@@ -0,0 +1,22 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ $(PRODUCT_BUNDLE_PACKAGE_TYPE)
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ 1
+
+
diff --git a/xcparse-visualizer/Tests/Sample-Test-AppUITests/Sample_Test_AppUITests.swift b/xcparse-visualizer/Tests/Sample-Test-AppUITests/Sample_Test_AppUITests.swift
new file mode 100644
index 0000000..e1a54cd
--- /dev/null
+++ b/xcparse-visualizer/Tests/Sample-Test-AppUITests/Sample_Test_AppUITests.swift
@@ -0,0 +1,43 @@
+//
+// Sample_Test_AppUITests.swift
+// Sample-Test-AppUITests
+//
+// Created by Rishab Sukumar on 8/12/19.
+// Copyright © 2019 Rishab Sukumar. All rights reserved.
+//
+
+import XCTest
+
+class Sample_Test_AppUITests: XCTestCase {
+
+ override func setUp() {
+ // Put setup code here. This method is called before the invocation of each test method in the class.
+
+ // In UI tests it is usually best to stop immediately when a failure occurs.
+ continueAfterFailure = false
+
+ // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
+ }
+
+ override func tearDown() {
+ // Put teardown code here. This method is called after the invocation of each test method in the class.
+ }
+
+ func testExample() {
+ // UI tests must launch the application that they test.
+ let app = XCUIApplication()
+ app.launch()
+
+ // Use recording to get started writing UI tests.
+ // Use XCTAssert and related functions to verify your tests produce the correct results.
+ }
+
+ func testLaunchPerformance() {
+ if #available(macOS 10.15, iOS 13.0, tvOS 13.0, *) {
+ // This measures how long it takes to launch your application.
+ measure(metrics: [XCTOSSignpostMetric.applicationLaunch]) {
+ XCUIApplication().launch()
+ }
+ }
+ }
+}
diff --git a/xcparse-visualizer/XCParseCore/Info.plist b/xcparse-visualizer/XCParseCore/Info.plist
new file mode 100644
index 0000000..6d4bca4
--- /dev/null
+++ b/xcparse-visualizer/XCParseCore/Info.plist
@@ -0,0 +1,24 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ $(PRODUCT_BUNDLE_PACKAGE_TYPE)
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ $(CURRENT_PROJECT_VERSION)
+ NSHumanReadableCopyright
+ Copyright © 2019 Rishab Sukumar. All rights reserved.
+
+
diff --git a/xcparse-visualizer/XCParseCore/XCParseCore.h b/xcparse-visualizer/XCParseCore/XCParseCore.h
new file mode 100644
index 0000000..86d3dd5
--- /dev/null
+++ b/xcparse-visualizer/XCParseCore/XCParseCore.h
@@ -0,0 +1,19 @@
+//
+// XCParseCore.h
+// XCParseCore
+//
+// Created by Rishab Sukumar on 8/26/19.
+// Copyright © 2019 Rishab Sukumar. All rights reserved.
+//
+
+#import
+
+//! Project version number for XCParseCore.
+FOUNDATION_EXPORT double XCParseCoreVersionNumber;
+
+//! Project version string for XCParseCore.
+FOUNDATION_EXPORT const unsigned char XCParseCoreVersionString[];
+
+// In this header, you should import all the public headers of your framework using statements like #import
+
+
diff --git a/xcparse-visualizer/xcparse-visualizer-app/Assets.xcassets/AppIcon.appiconset/Contents.json b/xcparse-visualizer/xcparse-visualizer-app/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..2db2b1c
--- /dev/null
+++ b/xcparse-visualizer/xcparse-visualizer-app/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,58 @@
+{
+ "images" : [
+ {
+ "idiom" : "mac",
+ "size" : "16x16",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "mac",
+ "size" : "16x16",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "mac",
+ "size" : "32x32",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "mac",
+ "size" : "32x32",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "mac",
+ "size" : "128x128",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "mac",
+ "size" : "128x128",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "mac",
+ "size" : "256x256",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "mac",
+ "size" : "256x256",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "mac",
+ "size" : "512x512",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "mac",
+ "size" : "512x512",
+ "scale" : "2x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/xcparse-visualizer/xcparse-visualizer-app/Assets.xcassets/Contents.json b/xcparse-visualizer/xcparse-visualizer-app/Assets.xcassets/Contents.json
new file mode 100644
index 0000000..da4a164
--- /dev/null
+++ b/xcparse-visualizer/xcparse-visualizer-app/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/xcparse-visualizer/xcparse-visualizer-app/Base.lproj/Main.storyboard b/xcparse-visualizer/xcparse-visualizer-app/Base.lproj/Main.storyboard
new file mode 100644
index 0000000..b410f5b
--- /dev/null
+++ b/xcparse-visualizer/xcparse-visualizer-app/Base.lproj/Main.storyboard
@@ -0,0 +1,2532 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/xcparse-visualizer/xcparse-visualizer-app/Info.plist b/xcparse-visualizer/xcparse-visualizer-app/Info.plist
new file mode 100644
index 0000000..039b2c1
--- /dev/null
+++ b/xcparse-visualizer/xcparse-visualizer-app/Info.plist
@@ -0,0 +1,40 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDocumentTypes
+
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIconFile
+
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ $(PRODUCT_BUNDLE_PACKAGE_TYPE)
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ 1
+ LSApplicationCategoryType
+ public.app-category.developer-tools
+ LSMinimumSystemVersion
+ $(MACOSX_DEPLOYMENT_TARGET)
+ NSHumanReadableCopyright
+ Copyright © 2019 Rishab Sukumar. All rights reserved.
+ NSMainStoryboardFile
+ Main
+ NSPrincipalClass
+ NSApplication
+ NSSupportsAutomaticTermination
+
+ NSSupportsSuddenTermination
+
+
+
diff --git a/xcparse-visualizer/xcparse-visualizer-app/Sample_Test_App.entitlements b/xcparse-visualizer/xcparse-visualizer-app/Sample_Test_App.entitlements
new file mode 100644
index 0000000..311b32b
--- /dev/null
+++ b/xcparse-visualizer/xcparse-visualizer-app/Sample_Test_App.entitlements
@@ -0,0 +1,10 @@
+
+
+
+
+ com.apple.security.app-sandbox
+
+ com.apple.security.files.user-selected.read-only
+
+
+
diff --git a/xcparse-visualizer/xcparse-visualizer.xcodeproj/CPTMixedTestPlan.xctestplan b/xcparse-visualizer/xcparse-visualizer.xcodeproj/CPTMixedTestPlan.xctestplan
new file mode 100644
index 0000000..55664f5
--- /dev/null
+++ b/xcparse-visualizer/xcparse-visualizer.xcodeproj/CPTMixedTestPlan.xctestplan
@@ -0,0 +1,97 @@
+{
+ "configurations" : [
+ {
+ "id" : "27CA1D05-24F8-4E99-8E92-E737C151AA9F",
+ "name" : "Light Mode",
+ "options" : {
+ "commandLineArgumentEntries" : [
+ {
+ "argument" : "-CPTUIUserInterfaceStyle \"Light\""
+ }
+ ]
+ }
+ },
+ {
+ "id" : "B7BBCF58-549E-490E-A4AE-FFBAD9F95E32",
+ "name" : "Dark Mode",
+ "options" : {
+ "commandLineArgumentEntries" : [
+ {
+ "argument" : "-CPTUIUserInterfaceStyle \"Dark\""
+ }
+ ]
+ }
+ },
+ {
+ "id" : "B466332A-8EA1-4C80-A43B-1536A1478C65",
+ "name" : "Keep all screenshots",
+ "options" : {
+ "uiTestingScreenshotsLifetime" : "keepAlways",
+ "userAttachmentLifetime" : "keepAlways"
+ }
+ },
+ {
+ "id" : "4F6FD14B-1ACC-4F78-BE7F-137A881A80E6",
+ "name" : "No screenshots",
+ "options" : {
+ "uiTestingScreenshotsLifetime" : "keepNever",
+ "userAttachmentLifetime" : "keepNever"
+ }
+ },
+ {
+ "id" : "0FEFB153-632A-47BA-A2BA-3DAE55C2B392",
+ "name" : "Delete screenshots on success",
+ "options" : {
+
+ }
+ },
+ {
+ "id" : "2617E195-C234-46FB-BF66-8A6BD95EBEBC",
+ "name" : "Random Order",
+ "options" : {
+ "testExecutionOrdering" : "random"
+ }
+ }
+ ],
+ "defaultOptions" : {
+
+ },
+ "testTargets" : [
+ {
+ "target" : {
+ "containerPath" : "container:Sample-Test-App.xcodeproj",
+ "identifier" : "5443C26523047D57009E7319",
+ "name" : "CPTUnitTestBundle"
+ }
+ },
+ {
+ "target" : {
+ "containerPath" : "container:Sample-Test-App.xcodeproj",
+ "identifier" : "5443C25023037F72009E7319",
+ "name" : "CPTBundleWithMultipleSuites"
+ }
+ },
+ {
+ "target" : {
+ "containerPath" : "container:Sample-Test-App.xcodeproj",
+ "identifier" : "54FABB1A2302265700369599",
+ "name" : "Sample-Test-AppTests"
+ }
+ },
+ {
+ "target" : {
+ "containerPath" : "container:Sample-Test-App.xcodeproj",
+ "identifier" : "5443C22D23037027009E7319",
+ "name" : "CPTEmptyTestBundle"
+ }
+ },
+ {
+ "target" : {
+ "containerPath" : "container:Sample-Test-App.xcodeproj",
+ "identifier" : "54FABB252302265700369599",
+ "name" : "Sample-Test-AppUITests"
+ }
+ }
+ ],
+ "version" : 1
+}
diff --git a/xcparse-visualizer/xcparse-visualizer.xcodeproj/CPTMultipleConfigurations.xctestplan b/xcparse-visualizer/xcparse-visualizer.xcodeproj/CPTMultipleConfigurations.xctestplan
new file mode 100644
index 0000000..ac260dc
--- /dev/null
+++ b/xcparse-visualizer/xcparse-visualizer.xcodeproj/CPTMultipleConfigurations.xctestplan
@@ -0,0 +1,103 @@
+{
+ "configurations" : [
+ {
+ "id" : "E6CEF359-5FB4-4FD6-B088-64EEE64D8E30",
+ "name" : "Default",
+ "options" : {
+
+ }
+ },
+ {
+ "id" : "743DEE8C-35DB-4DE2-9E91-BBAB72A26F52",
+ "name" : "Keep all Screenshots",
+ "options" : {
+ "uiTestingScreenshotsLifetime" : "keepAlways",
+ "userAttachmentLifetime" : "keepAlways"
+ }
+ },
+ {
+ "id" : "D7F063B7-1B11-4CB5-9805-6940CAAEEDEE",
+ "name" : "Random Order",
+ "options" : {
+ "testExecutionOrdering" : "random"
+ }
+ },
+ {
+ "id" : "150DE09E-86F2-48EF-8D55-B66653FFEABA",
+ "name" : "Different Localization Settings",
+ "options" : {
+ "areLocalizationScreenshotsEnabled" : true,
+ "language" : "ru",
+ "locationScenario" : {
+ "identifier" : "Hong Kong, China",
+ "referenceType" : "built-in"
+ },
+ "region" : "QA"
+ }
+ },
+ {
+ "id" : "4F146380-E237-40C0-A5CA-0D431F0F08E8",
+ "name" : "No Screenshots",
+ "options" : {
+ "uiTestingScreenshotsLifetime" : "keepNever",
+ "userAttachmentLifetime" : "keepNever"
+ }
+ },
+ {
+ "id" : "1C02D320-E0D9-4783-A8F9-04DB6E32266D",
+ "name" : "Light Mode",
+ "options" : {
+ "commandLineArgumentEntries" : [
+ {
+ "argument" : "-CPTUIUserInterfaceStyle \"Light\""
+ }
+ ]
+ }
+ },
+ {
+ "id" : "7E8B90CA-E1FD-47A7-9991-25FA2C8745D0",
+ "name" : "Dark Mode",
+ "options" : {
+ "commandLineArgumentEntries" : [
+ {
+ "argument" : "-CPTUIUserInterfaceStyle \"Dark\""
+ }
+ ]
+ }
+ }
+ ],
+ "defaultOptions" : {
+
+ },
+ "testTargets" : [
+ {
+ "target" : {
+ "containerPath" : "container:Sample-Test-App.xcodeproj",
+ "identifier" : "5443C25023037F72009E7319",
+ "name" : "CPTBundleWithMultipleSuites"
+ }
+ },
+ {
+ "target" : {
+ "containerPath" : "container:Sample-Test-App.xcodeproj",
+ "identifier" : "5443C22D23037027009E7319",
+ "name" : "CPTEmptyTestBundle"
+ }
+ },
+ {
+ "target" : {
+ "containerPath" : "container:Sample-Test-App.xcodeproj",
+ "identifier" : "54FABB1A2302265700369599",
+ "name" : "Sample-Test-AppTests"
+ }
+ },
+ {
+ "target" : {
+ "containerPath" : "container:Sample-Test-App.xcodeproj",
+ "identifier" : "54FABB252302265700369599",
+ "name" : "Sample-Test-AppUITests"
+ }
+ }
+ ],
+ "version" : 1
+}
diff --git a/xcparse-visualizer/xcparse-visualizer.xcodeproj/CPTSingleBundleSingleTest.xctestplan b/xcparse-visualizer/xcparse-visualizer.xcodeproj/CPTSingleBundleSingleTest.xctestplan
new file mode 100644
index 0000000..ba52c89
--- /dev/null
+++ b/xcparse-visualizer/xcparse-visualizer.xcodeproj/CPTSingleBundleSingleTest.xctestplan
@@ -0,0 +1,24 @@
+{
+ "configurations" : [
+ {
+ "id" : "F444536E-139E-4513-ABBD-66A1924C6BEB",
+ "name" : "Configuration 1",
+ "options" : {
+
+ }
+ }
+ ],
+ "defaultOptions" : {
+
+ },
+ "testTargets" : [
+ {
+ "target" : {
+ "containerPath" : "container:xcparse-visualizer.xcodeproj",
+ "identifier" : "5443C23B230370C0009E7319",
+ "name" : "CPTTitleChangeTests"
+ }
+ }
+ ],
+ "version" : 1
+}
diff --git a/xcparse-visualizer/xcparse-visualizer.xcodeproj/CPTTestPlanWithEmptyBundle.xctestplan b/xcparse-visualizer/xcparse-visualizer.xcodeproj/CPTTestPlanWithEmptyBundle.xctestplan
new file mode 100644
index 0000000..fdf2b65
--- /dev/null
+++ b/xcparse-visualizer/xcparse-visualizer.xcodeproj/CPTTestPlanWithEmptyBundle.xctestplan
@@ -0,0 +1,24 @@
+{
+ "configurations" : [
+ {
+ "id" : "2E945ED3-27E0-4E40-A65E-41B0425E802B",
+ "name" : "Configuration 1",
+ "options" : {
+
+ }
+ }
+ ],
+ "defaultOptions" : {
+
+ },
+ "testTargets" : [
+ {
+ "target" : {
+ "containerPath" : "container:Sample-Test-App.xcodeproj",
+ "identifier" : "5443C22D23037027009E7319",
+ "name" : "CPTEmptyTestBundle"
+ }
+ }
+ ],
+ "version" : 1
+}
diff --git a/xcparse-visualizer/xcparse-visualizer.xcodeproj/CPTTestPlanWithSampleTests.xctestplan b/xcparse-visualizer/xcparse-visualizer.xcodeproj/CPTTestPlanWithSampleTests.xctestplan
new file mode 100644
index 0000000..b9e39bb
--- /dev/null
+++ b/xcparse-visualizer/xcparse-visualizer.xcodeproj/CPTTestPlanWithSampleTests.xctestplan
@@ -0,0 +1,31 @@
+{
+ "configurations" : [
+ {
+ "id" : "3792B2CA-4278-4127-B77A-367758F3268D",
+ "name" : "Configuration 1",
+ "options" : {
+
+ }
+ }
+ ],
+ "defaultOptions" : {
+
+ },
+ "testTargets" : [
+ {
+ "target" : {
+ "containerPath" : "container:Sample-Test-App.xcodeproj",
+ "identifier" : "54FABB1A2302265700369599",
+ "name" : "Sample-Test-AppTests"
+ }
+ },
+ {
+ "target" : {
+ "containerPath" : "container:Sample-Test-App.xcodeproj",
+ "identifier" : "54FABB252302265700369599",
+ "name" : "Sample-Test-AppUITests"
+ }
+ }
+ ],
+ "version" : 1
+}
diff --git a/xcparse-visualizer/xcparse-visualizer.xcodeproj/project.pbxproj b/xcparse-visualizer/xcparse-visualizer.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..b1362c6
--- /dev/null
+++ b/xcparse-visualizer/xcparse-visualizer.xcodeproj/project.pbxproj
@@ -0,0 +1,1513 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 50;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 5435A32123159A4100460172 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5487722223158BF900CB48E6 /* Info.plist */; };
+ 5435A32223159A4A00460172 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5487722023158BF900CB48E6 /* Main.storyboard */; };
+ 5435A3502315A26400460172 /* xcparsePackageDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = 5435A34E2315A26400460172 /* xcparsePackageDescription.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5435A3542315A27300460172 /* Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = 548ACE912314A25D00C08A70 /* Package.swift */; };
+ 5443C23123037027009E7319 /* CPTEmptyTestBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5443C23023037027009E7319 /* CPTEmptyTestBundle.swift */; };
+ 5443C23F230370C0009E7319 /* CPTTitleChangeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5443C23E230370C0009E7319 /* CPTTitleChangeTests.swift */; };
+ 5443C25423037F72009E7319 /* CPTBundleWithMultipleSuites.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5443C25323037F72009E7319 /* CPTBundleWithMultipleSuites.swift */; };
+ 5443C25C23037FE9009E7319 /* CPTNavigateTabs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5443C25B23037FE9009E7319 /* CPTNavigateTabs.swift */; };
+ 5443C25E23038036009E7319 /* CPTTitleChangeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5443C25D23038036009E7319 /* CPTTitleChangeTests.swift */; };
+ 5443C26923047D57009E7319 /* CPTUnitTestBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5443C26823047D57009E7319 /* CPTUnitTestBundle.swift */; };
+ 5443C27123047E14009E7319 /* CPTTestIncrement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5443C27023047E14009E7319 /* CPTTestIncrement.swift */; };
+ 5443C2742304840D009E7319 /* CPTTestChangeTitle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5443C2732304840D009E7319 /* CPTTestChangeTitle.swift */; };
+ 5487722323158BF900CB48E6 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5487721F23158BF900CB48E6 /* Assets.xcassets */; };
+ 548ACEB52314A2C400C08A70 /* customSegue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 548ACE9D2314A2C400C08A70 /* customSegue.swift */; };
+ 548ACEB62314A2C400C08A70 /* Console.swift in Sources */ = {isa = PBXBuildFile; fileRef = 548ACE9E2314A2C400C08A70 /* Console.swift */; };
+ 548ACEB72314A2C400C08A70 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 548ACEA02314A2C400C08A70 /* ViewController.swift */; };
+ 548ACEB82314A2C400C08A70 /* testTabViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 548ACEA12314A2C400C08A70 /* testTabViewController.swift */; };
+ 548ACEB92314A2C400C08A70 /* breakdownWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 548ACEA22314A2C400C08A70 /* breakdownWindowController.swift */; };
+ 548ACEBA2314A2C400C08A70 /* firstViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 548ACEA32314A2C400C08A70 /* firstViewController.swift */; };
+ 548ACEBB2314A2C400C08A70 /* testSummariesBreakdownViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 548ACEA42314A2C400C08A70 /* testSummariesBreakdownViewController.swift */; };
+ 548ACEBC2314A2C400C08A70 /* xcparseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 548ACEA52314A2C400C08A70 /* xcparseViewController.swift */; };
+ 548ACEBD2314A2C400C08A70 /* exportViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 548ACEA62314A2C400C08A70 /* exportViewController.swift */; };
+ 548ACEBE2314A2C400C08A70 /* allTestsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 548ACEA72314A2C400C08A70 /* allTestsViewController.swift */; };
+ 548ACEBF2314A2C400C08A70 /* subtestSummaryBreakdownViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 548ACEA82314A2C400C08A70 /* subtestSummaryBreakdownViewController.swift */; };
+ 548ACEC02314A2C400C08A70 /* objectBreakdownViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 548ACEA92314A2C400C08A70 /* objectBreakdownViewController.swift */; };
+ 548ACEC12314A2C400C08A70 /* secondViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 548ACEAA2314A2C400C08A70 /* secondViewController.swift */; };
+ 548ACEC22314A2C400C08A70 /* xcparseFields.swift in Sources */ = {isa = PBXBuildFile; fileRef = 548ACEAB2314A2C400C08A70 /* xcparseFields.swift */; };
+ 548ACEC32314A2C400C08A70 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 548ACEAC2314A2C400C08A70 /* AppDelegate.swift */; };
+ 548ACEC42314A2C400C08A70 /* xcparseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 548ACEAD2314A2C400C08A70 /* xcparseView.swift */; };
+ 548ACEC52314A2C400C08A70 /* addBreakdownTab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 548ACEAE2314A2C400C08A70 /* addBreakdownTab.swift */; };
+ 548ACF292314AB7300C08A70 /* XCParseCore.h in Headers */ = {isa = PBXBuildFile; fileRef = 548ACF272314AB7300C08A70 /* XCParseCore.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 548ACF2C2314AB7300C08A70 /* XCParseCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 548ACF252314AB7300C08A70 /* XCParseCore.framework */; };
+ 548ACF2D2314AB7300C08A70 /* XCParseCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 548ACF252314AB7300C08A70 /* XCParseCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 549EBECF2314AB9A000247C8 /* XCPResultTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 548ACE9A2314A2C400C08A70 /* XCPResultTypes.swift */; };
+ 549EBED02314AB9A000247C8 /* XCPResultDecoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 548ACE9B2314A2C400C08A70 /* XCPResultDecoding.swift */; };
+ 54FABB202302265700369599 /* Sample_Test_AppTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FABB1F2302265700369599 /* Sample_Test_AppTests.swift */; };
+ 54FABB2B2302265700369599 /* Sample_Test_AppUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FABB2A2302265700369599 /* Sample_Test_AppUITests.swift */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 5443C23323037027009E7319 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 54FABB012302265600369599 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 54FABB082302265600369599;
+ remoteInfo = "Sample-Test-App";
+ };
+ 5443C241230370C0009E7319 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 54FABB012302265600369599 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 54FABB082302265600369599;
+ remoteInfo = "Sample-Test-App";
+ };
+ 5443C25623037F72009E7319 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 54FABB012302265600369599 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 54FABB082302265600369599;
+ remoteInfo = "Sample-Test-App";
+ };
+ 5443C26B23047D57009E7319 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 54FABB012302265600369599 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 54FABB082302265600369599;
+ remoteInfo = "Sample-Test-App";
+ };
+ 548ACF2A2314AB7300C08A70 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 54FABB012302265600369599 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 548ACF242314AB7300C08A70;
+ remoteInfo = XCParseCore;
+ };
+ 54FABB1C2302265700369599 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 54FABB012302265600369599 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 54FABB082302265600369599;
+ remoteInfo = "Sample-Test-App";
+ };
+ 54FABB272302265700369599 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 54FABB012302265600369599 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 54FABB082302265600369599;
+ remoteInfo = "Sample-Test-App";
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 548ACF1D2314AAF400C08A70 /* Embed Frameworks */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ 548ACF2D2314AB7300C08A70 /* XCParseCore.framework in Embed Frameworks */,
+ );
+ name = "Embed Frameworks";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 5435A3202315988A00460172 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; };
+ 5435A34C2315A26400460172 /* xcparsePackageDescription.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = xcparsePackageDescription.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 5435A34E2315A26400460172 /* xcparsePackageDescription.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = xcparsePackageDescription.h; sourceTree = ""; };
+ 5435A34F2315A26400460172 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 5443C22E23037027009E7319 /* CPTEmptyTestBundle.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CPTEmptyTestBundle.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+ 5443C23023037027009E7319 /* CPTEmptyTestBundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CPTEmptyTestBundle.swift; sourceTree = ""; };
+ 5443C23223037027009E7319 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 5443C23C230370C0009E7319 /* CPTTitleChangeTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CPTTitleChangeTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+ 5443C23E230370C0009E7319 /* CPTTitleChangeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CPTTitleChangeTests.swift; sourceTree = ""; };
+ 5443C240230370C0009E7319 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 5443C25123037F72009E7319 /* CPTBundleWithMultipleSuites.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CPTBundleWithMultipleSuites.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+ 5443C25323037F72009E7319 /* CPTBundleWithMultipleSuites.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CPTBundleWithMultipleSuites.swift; sourceTree = ""; };
+ 5443C25523037F72009E7319 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 5443C25B23037FE9009E7319 /* CPTNavigateTabs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CPTNavigateTabs.swift; sourceTree = ""; };
+ 5443C25D23038036009E7319 /* CPTTitleChangeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CPTTitleChangeTests.swift; sourceTree = ""; };
+ 5443C26623047D57009E7319 /* CPTUnitTestBundle.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CPTUnitTestBundle.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+ 5443C26823047D57009E7319 /* CPTUnitTestBundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CPTUnitTestBundle.swift; sourceTree = ""; };
+ 5443C26A23047D57009E7319 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 5443C27023047E14009E7319 /* CPTTestIncrement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CPTTestIncrement.swift; sourceTree = ""; };
+ 5443C2732304840D009E7319 /* CPTTestChangeTitle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CPTTestChangeTitle.swift; sourceTree = ""; };
+ 5487721E23158BF900CB48E6 /* Sample_Test_App.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Sample_Test_App.entitlements; sourceTree = ""; };
+ 5487721F23158BF900CB48E6 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ 5487722123158BF900CB48E6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
+ 5487722223158BF900CB48E6 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 5487722723158C9500CB48E6 /* CPTMixedTestPlan.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = CPTMixedTestPlan.xctestplan; sourceTree = ""; };
+ 5487722823158D7C00CB48E6 /* CPTSingleBundleSingleTest.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; name = CPTSingleBundleSingleTest.xctestplan; path = "xcparse-visualizer.xcodeproj/CPTSingleBundleSingleTest.xctestplan"; sourceTree = ""; };
+ 5487722923158DC300CB48E6 /* CPTTestPlanWithSampleTests.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = CPTTestPlanWithSampleTests.xctestplan; sourceTree = ""; };
+ 5487722A23158DE500CB48E6 /* CPTTestPlanWithEmptyBundle.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = CPTTestPlanWithEmptyBundle.xctestplan; sourceTree = ""; };
+ 5487722B23158E0700CB48E6 /* CPTTestPlanWithMultipleConfigurations.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = CPTTestPlanWithMultipleConfigurations.xctestplan; sourceTree = ""; };
+ 5487722C23158E9600CB48E6 /* CPTTestPlanWithUnitTests.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = CPTTestPlanWithUnitTests.xctestplan; sourceTree = ""; };
+ 548ACE912314A25D00C08A70 /* Package.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; name = Package.swift; path = ../Package.swift; sourceTree = ""; };
+ 548ACE9A2314A2C400C08A70 /* XCPResultTypes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCPResultTypes.swift; sourceTree = ""; };
+ 548ACE9B2314A2C400C08A70 /* XCPResultDecoding.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCPResultDecoding.swift; sourceTree = ""; };
+ 548ACE9D2314A2C400C08A70 /* customSegue.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = customSegue.swift; sourceTree = ""; };
+ 548ACE9E2314A2C400C08A70 /* Console.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Console.swift; sourceTree = ""; };
+ 548ACEA02314A2C400C08A70 /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
+ 548ACEA12314A2C400C08A70 /* testTabViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = testTabViewController.swift; sourceTree = ""; };
+ 548ACEA22314A2C400C08A70 /* breakdownWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = breakdownWindowController.swift; sourceTree = ""; };
+ 548ACEA32314A2C400C08A70 /* firstViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = firstViewController.swift; sourceTree = ""; };
+ 548ACEA42314A2C400C08A70 /* testSummariesBreakdownViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = testSummariesBreakdownViewController.swift; sourceTree = ""; };
+ 548ACEA52314A2C400C08A70 /* xcparseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = xcparseViewController.swift; sourceTree = ""; };
+ 548ACEA62314A2C400C08A70 /* exportViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = exportViewController.swift; sourceTree = ""; };
+ 548ACEA72314A2C400C08A70 /* allTestsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = allTestsViewController.swift; sourceTree = ""; };
+ 548ACEA82314A2C400C08A70 /* subtestSummaryBreakdownViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = subtestSummaryBreakdownViewController.swift; sourceTree = ""; };
+ 548ACEA92314A2C400C08A70 /* objectBreakdownViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = objectBreakdownViewController.swift; sourceTree = ""; };
+ 548ACEAA2314A2C400C08A70 /* secondViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = secondViewController.swift; sourceTree = ""; };
+ 548ACEAB2314A2C400C08A70 /* xcparseFields.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = xcparseFields.swift; sourceTree = ""; };
+ 548ACEAC2314A2C400C08A70 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ 548ACEAD2314A2C400C08A70 /* xcparseView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = xcparseView.swift; sourceTree = ""; };
+ 548ACEAE2314A2C400C08A70 /* addBreakdownTab.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = addBreakdownTab.swift; sourceTree = ""; };
+ 548ACF252314AB7300C08A70 /* XCParseCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = XCParseCore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 548ACF272314AB7300C08A70 /* XCParseCore.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XCParseCore.h; sourceTree = ""; };
+ 548ACF282314AB7300C08A70 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 54FABB092302265600369599 /* xcparse-visualizer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "xcparse-visualizer.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 54FABB1B2302265700369599 /* xcparse-visualizerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "xcparse-visualizerTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 54FABB1F2302265700369599 /* Sample_Test_AppTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Sample_Test_AppTests.swift; sourceTree = ""; };
+ 54FABB212302265700369599 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 54FABB262302265700369599 /* xcparse-visualizerUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "xcparse-visualizerUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 54FABB2A2302265700369599 /* Sample_Test_AppUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Sample_Test_AppUITests.swift; sourceTree = ""; };
+ 54FABB2C2302265700369599 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 5435A3492315A26400460172 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 5443C22B23037027009E7319 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 5443C239230370C0009E7319 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 5443C24E23037F72009E7319 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 5443C26323047D57009E7319 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 548ACF222314AB7300C08A70 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 54FABB062302265600369599 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 548ACF2C2314AB7300C08A70 /* XCParseCore.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 54FABB182302265700369599 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 54FABB232302265700369599 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 5435A32323159AA200460172 /* Tests */ = {
+ isa = PBXGroup;
+ children = (
+ 54FABB1E2302265700369599 /* Sample-Test-AppTests */,
+ 54FABB292302265700369599 /* Sample-Test-AppUITests */,
+ 5443C22F23037027009E7319 /* CPTEmptyTestBundle */,
+ 5443C23D230370C0009E7319 /* CPTTitleChangeTests */,
+ 5443C25223037F72009E7319 /* CPTBundleWithMultipleSuites */,
+ 5443C26723047D57009E7319 /* CPTUnitTestBundle */,
+ );
+ path = Tests;
+ sourceTree = "";
+ };
+ 5435A34D2315A26400460172 /* xcparsePackageDescription */ = {
+ isa = PBXGroup;
+ children = (
+ 5435A34E2315A26400460172 /* xcparsePackageDescription.h */,
+ 5435A34F2315A26400460172 /* Info.plist */,
+ );
+ path = xcparsePackageDescription;
+ sourceTree = "";
+ };
+ 5443C22F23037027009E7319 /* CPTEmptyTestBundle */ = {
+ isa = PBXGroup;
+ children = (
+ 5443C23023037027009E7319 /* CPTEmptyTestBundle.swift */,
+ 5443C23223037027009E7319 /* Info.plist */,
+ );
+ path = CPTEmptyTestBundle;
+ sourceTree = "";
+ };
+ 5443C23D230370C0009E7319 /* CPTTitleChangeTests */ = {
+ isa = PBXGroup;
+ children = (
+ 5443C23E230370C0009E7319 /* CPTTitleChangeTests.swift */,
+ 5443C240230370C0009E7319 /* Info.plist */,
+ );
+ path = CPTTitleChangeTests;
+ sourceTree = "";
+ };
+ 5443C25223037F72009E7319 /* CPTBundleWithMultipleSuites */ = {
+ isa = PBXGroup;
+ children = (
+ 5443C25323037F72009E7319 /* CPTBundleWithMultipleSuites.swift */,
+ 5443C25523037F72009E7319 /* Info.plist */,
+ 5443C25B23037FE9009E7319 /* CPTNavigateTabs.swift */,
+ 5443C25D23038036009E7319 /* CPTTitleChangeTests.swift */,
+ );
+ path = CPTBundleWithMultipleSuites;
+ sourceTree = "";
+ };
+ 5443C26723047D57009E7319 /* CPTUnitTestBundle */ = {
+ isa = PBXGroup;
+ children = (
+ 5443C26823047D57009E7319 /* CPTUnitTestBundle.swift */,
+ 5443C26A23047D57009E7319 /* Info.plist */,
+ 5443C27023047E14009E7319 /* CPTTestIncrement.swift */,
+ 5443C2732304840D009E7319 /* CPTTestChangeTitle.swift */,
+ );
+ path = CPTUnitTestBundle;
+ sourceTree = "";
+ };
+ 5443C27723048AC4009E7319 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+ 5487721D23158BF900CB48E6 /* xcparse-visualizer-app */ = {
+ isa = PBXGroup;
+ children = (
+ 5487721E23158BF900CB48E6 /* Sample_Test_App.entitlements */,
+ 5487721F23158BF900CB48E6 /* Assets.xcassets */,
+ 5487722023158BF900CB48E6 /* Main.storyboard */,
+ 5487722223158BF900CB48E6 /* Info.plist */,
+ );
+ path = "xcparse-visualizer-app";
+ sourceTree = SOURCE_ROOT;
+ };
+ 548ACE982314A2C400C08A70 /* Sources */ = {
+ isa = PBXGroup;
+ children = (
+ 548ACE992314A2C400C08A70 /* XCParseCore */,
+ 548ACE9C2314A2C400C08A70 /* xcparse-visualizer */,
+ );
+ name = Sources;
+ path = ../Sources;
+ sourceTree = "";
+ };
+ 548ACE992314A2C400C08A70 /* XCParseCore */ = {
+ isa = PBXGroup;
+ children = (
+ 548ACE9A2314A2C400C08A70 /* XCPResultTypes.swift */,
+ 548ACE9B2314A2C400C08A70 /* XCPResultDecoding.swift */,
+ );
+ path = XCParseCore;
+ sourceTree = "";
+ };
+ 548ACE9C2314A2C400C08A70 /* xcparse-visualizer */ = {
+ isa = PBXGroup;
+ children = (
+ 548ACE9D2314A2C400C08A70 /* customSegue.swift */,
+ 548ACE9E2314A2C400C08A70 /* Console.swift */,
+ 548ACE9F2314A2C400C08A70 /* View Controllers */,
+ 548ACEAB2314A2C400C08A70 /* xcparseFields.swift */,
+ 548ACEAC2314A2C400C08A70 /* AppDelegate.swift */,
+ 548ACEAD2314A2C400C08A70 /* xcparseView.swift */,
+ 548ACEAE2314A2C400C08A70 /* addBreakdownTab.swift */,
+ );
+ path = "xcparse-visualizer";
+ sourceTree = "";
+ };
+ 548ACE9F2314A2C400C08A70 /* View Controllers */ = {
+ isa = PBXGroup;
+ children = (
+ 548ACEA02314A2C400C08A70 /* ViewController.swift */,
+ 548ACEA12314A2C400C08A70 /* testTabViewController.swift */,
+ 548ACEA22314A2C400C08A70 /* breakdownWindowController.swift */,
+ 548ACEA32314A2C400C08A70 /* firstViewController.swift */,
+ 548ACEA42314A2C400C08A70 /* testSummariesBreakdownViewController.swift */,
+ 548ACEA52314A2C400C08A70 /* xcparseViewController.swift */,
+ 548ACEA62314A2C400C08A70 /* exportViewController.swift */,
+ 548ACEA72314A2C400C08A70 /* allTestsViewController.swift */,
+ 548ACEA82314A2C400C08A70 /* subtestSummaryBreakdownViewController.swift */,
+ 548ACEA92314A2C400C08A70 /* objectBreakdownViewController.swift */,
+ 548ACEAA2314A2C400C08A70 /* secondViewController.swift */,
+ );
+ path = "View Controllers";
+ sourceTree = "";
+ };
+ 548ACF262314AB7300C08A70 /* XCParseCore */ = {
+ isa = PBXGroup;
+ children = (
+ 548ACF272314AB7300C08A70 /* XCParseCore.h */,
+ 548ACF282314AB7300C08A70 /* Info.plist */,
+ );
+ path = XCParseCore;
+ sourceTree = "";
+ };
+ 54FABB002302265600369599 = {
+ isa = PBXGroup;
+ children = (
+ 5435A3202315988A00460172 /* README.md */,
+ 5487722823158D7C00CB48E6 /* CPTSingleBundleSingleTest.xctestplan */,
+ 5487722923158DC300CB48E6 /* CPTTestPlanWithSampleTests.xctestplan */,
+ 5487722A23158DE500CB48E6 /* CPTTestPlanWithEmptyBundle.xctestplan */,
+ 5487722B23158E0700CB48E6 /* CPTTestPlanWithMultipleConfigurations.xctestplan */,
+ 5487722723158C9500CB48E6 /* CPTMixedTestPlan.xctestplan */,
+ 5487722C23158E9600CB48E6 /* CPTTestPlanWithUnitTests.xctestplan */,
+ 548ACE912314A25D00C08A70 /* Package.swift */,
+ 548ACE982314A2C400C08A70 /* Sources */,
+ 5435A32323159AA200460172 /* Tests */,
+ 5487721D23158BF900CB48E6 /* xcparse-visualizer-app */,
+ 548ACF262314AB7300C08A70 /* XCParseCore */,
+ 5435A34D2315A26400460172 /* xcparsePackageDescription */,
+ 54FABB0A2302265600369599 /* Products */,
+ 5443C27723048AC4009E7319 /* Frameworks */,
+ );
+ sourceTree = "";
+ };
+ 54FABB0A2302265600369599 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 54FABB092302265600369599 /* xcparse-visualizer.app */,
+ 54FABB1B2302265700369599 /* xcparse-visualizerTests.xctest */,
+ 54FABB262302265700369599 /* xcparse-visualizerUITests.xctest */,
+ 5443C22E23037027009E7319 /* CPTEmptyTestBundle.xctest */,
+ 5443C23C230370C0009E7319 /* CPTTitleChangeTests.xctest */,
+ 5443C25123037F72009E7319 /* CPTBundleWithMultipleSuites.xctest */,
+ 5443C26623047D57009E7319 /* CPTUnitTestBundle.xctest */,
+ 548ACF252314AB7300C08A70 /* XCParseCore.framework */,
+ 5435A34C2315A26400460172 /* xcparsePackageDescription.framework */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 54FABB1E2302265700369599 /* Sample-Test-AppTests */ = {
+ isa = PBXGroup;
+ children = (
+ 54FABB1F2302265700369599 /* Sample_Test_AppTests.swift */,
+ 54FABB212302265700369599 /* Info.plist */,
+ );
+ path = "Sample-Test-AppTests";
+ sourceTree = "";
+ };
+ 54FABB292302265700369599 /* Sample-Test-AppUITests */ = {
+ isa = PBXGroup;
+ children = (
+ 54FABB2A2302265700369599 /* Sample_Test_AppUITests.swift */,
+ 54FABB2C2302265700369599 /* Info.plist */,
+ );
+ path = "Sample-Test-AppUITests";
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ 5435A3472315A26400460172 /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 5435A3502315A26400460172 /* xcparsePackageDescription.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 548ACF202314AB7300C08A70 /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 548ACF292314AB7300C08A70 /* XCParseCore.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ 5435A34B2315A26400460172 /* xcparsePackageDescription */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 5435A3512315A26400460172 /* Build configuration list for PBXNativeTarget "xcparsePackageDescription" */;
+ buildPhases = (
+ 5435A3472315A26400460172 /* Headers */,
+ 5435A3482315A26400460172 /* Sources */,
+ 5435A3492315A26400460172 /* Frameworks */,
+ 5435A34A2315A26400460172 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = xcparsePackageDescription;
+ productName = xcparsePackageDescription;
+ productReference = 5435A34C2315A26400460172 /* xcparsePackageDescription.framework */;
+ productType = "com.apple.product-type.framework";
+ };
+ 5443C22D23037027009E7319 /* CPTEmptyTestBundle */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 5443C23523037027009E7319 /* Build configuration list for PBXNativeTarget "CPTEmptyTestBundle" */;
+ buildPhases = (
+ 5443C22A23037027009E7319 /* Sources */,
+ 5443C22B23037027009E7319 /* Frameworks */,
+ 5443C22C23037027009E7319 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 5443C23423037027009E7319 /* PBXTargetDependency */,
+ );
+ name = CPTEmptyTestBundle;
+ productName = CPTEmptyTestBundle;
+ productReference = 5443C22E23037027009E7319 /* CPTEmptyTestBundle.xctest */;
+ productType = "com.apple.product-type.bundle.ui-testing";
+ };
+ 5443C23B230370C0009E7319 /* CPTTitleChangeTests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 5443C243230370C0009E7319 /* Build configuration list for PBXNativeTarget "CPTTitleChangeTests" */;
+ buildPhases = (
+ 5443C238230370C0009E7319 /* Sources */,
+ 5443C239230370C0009E7319 /* Frameworks */,
+ 5443C23A230370C0009E7319 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 5443C242230370C0009E7319 /* PBXTargetDependency */,
+ );
+ name = CPTTitleChangeTests;
+ productName = CPTTitleChangeTests;
+ productReference = 5443C23C230370C0009E7319 /* CPTTitleChangeTests.xctest */;
+ productType = "com.apple.product-type.bundle.ui-testing";
+ };
+ 5443C25023037F72009E7319 /* CPTBundleWithMultipleSuites */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 5443C25823037F72009E7319 /* Build configuration list for PBXNativeTarget "CPTBundleWithMultipleSuites" */;
+ buildPhases = (
+ 5443C24D23037F72009E7319 /* Sources */,
+ 5443C24E23037F72009E7319 /* Frameworks */,
+ 5443C24F23037F72009E7319 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 5443C25723037F72009E7319 /* PBXTargetDependency */,
+ );
+ name = CPTBundleWithMultipleSuites;
+ productName = CPTBundleWithMultipleSuites;
+ productReference = 5443C25123037F72009E7319 /* CPTBundleWithMultipleSuites.xctest */;
+ productType = "com.apple.product-type.bundle.ui-testing";
+ };
+ 5443C26523047D57009E7319 /* CPTUnitTestBundle */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 5443C26D23047D57009E7319 /* Build configuration list for PBXNativeTarget "CPTUnitTestBundle" */;
+ buildPhases = (
+ 5443C26223047D57009E7319 /* Sources */,
+ 5443C26323047D57009E7319 /* Frameworks */,
+ 5443C26423047D57009E7319 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 5443C26C23047D57009E7319 /* PBXTargetDependency */,
+ );
+ name = CPTUnitTestBundle;
+ productName = CPTUnitTestBundle;
+ productReference = 5443C26623047D57009E7319 /* CPTUnitTestBundle.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
+ 548ACF242314AB7300C08A70 /* XCParseCore */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 548ACF2E2314AB7300C08A70 /* Build configuration list for PBXNativeTarget "XCParseCore" */;
+ buildPhases = (
+ 548ACF202314AB7300C08A70 /* Headers */,
+ 548ACF212314AB7300C08A70 /* Sources */,
+ 548ACF222314AB7300C08A70 /* Frameworks */,
+ 548ACF232314AB7300C08A70 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = XCParseCore;
+ productName = XCParseCore;
+ productReference = 548ACF252314AB7300C08A70 /* XCParseCore.framework */;
+ productType = "com.apple.product-type.framework";
+ };
+ 54FABB082302265600369599 /* xcparse-visualizer */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 54FABB2F2302265700369599 /* Build configuration list for PBXNativeTarget "xcparse-visualizer" */;
+ buildPhases = (
+ 54FABB052302265600369599 /* Sources */,
+ 54FABB062302265600369599 /* Frameworks */,
+ 54FABB072302265600369599 /* Resources */,
+ 548ACF1D2314AAF400C08A70 /* Embed Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 548ACF2B2314AB7300C08A70 /* PBXTargetDependency */,
+ );
+ name = "xcparse-visualizer";
+ productName = "Sample-Test-App";
+ productReference = 54FABB092302265600369599 /* xcparse-visualizer.app */;
+ productType = "com.apple.product-type.application";
+ };
+ 54FABB1A2302265700369599 /* xcparse-visualizerTests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 54FABB322302265700369599 /* Build configuration list for PBXNativeTarget "xcparse-visualizerTests" */;
+ buildPhases = (
+ 54FABB172302265700369599 /* Sources */,
+ 54FABB182302265700369599 /* Frameworks */,
+ 54FABB192302265700369599 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 54FABB1D2302265700369599 /* PBXTargetDependency */,
+ );
+ name = "xcparse-visualizerTests";
+ productName = "Sample-Test-AppTests";
+ productReference = 54FABB1B2302265700369599 /* xcparse-visualizerTests.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
+ 54FABB252302265700369599 /* xcparse-visualizerUITests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 54FABB352302265700369599 /* Build configuration list for PBXNativeTarget "xcparse-visualizerUITests" */;
+ buildPhases = (
+ 54FABB222302265700369599 /* Sources */,
+ 54FABB232302265700369599 /* Frameworks */,
+ 54FABB242302265700369599 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 54FABB282302265700369599 /* PBXTargetDependency */,
+ );
+ name = "xcparse-visualizerUITests";
+ productName = "Sample-Test-AppUITests";
+ productReference = 54FABB262302265700369599 /* xcparse-visualizerUITests.xctest */;
+ productType = "com.apple.product-type.bundle.ui-testing";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 54FABB012302265600369599 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastSwiftUpdateCheck = 1100;
+ LastUpgradeCheck = 1100;
+ ORGANIZATIONNAME = "Rishab Sukumar";
+ TargetAttributes = {
+ 5435A34B2315A26400460172 = {
+ CreatedOnToolsVersion = 11.0;
+ };
+ 5443C22D23037027009E7319 = {
+ CreatedOnToolsVersion = 11.0;
+ TestTargetID = 54FABB082302265600369599;
+ };
+ 5443C23B230370C0009E7319 = {
+ CreatedOnToolsVersion = 11.0;
+ TestTargetID = 54FABB082302265600369599;
+ };
+ 5443C25023037F72009E7319 = {
+ CreatedOnToolsVersion = 11.0;
+ TestTargetID = 54FABB082302265600369599;
+ };
+ 5443C26523047D57009E7319 = {
+ CreatedOnToolsVersion = 11.0;
+ TestTargetID = 54FABB082302265600369599;
+ };
+ 548ACF242314AB7300C08A70 = {
+ CreatedOnToolsVersion = 11.0;
+ };
+ 54FABB082302265600369599 = {
+ CreatedOnToolsVersion = 11.0;
+ };
+ 54FABB1A2302265700369599 = {
+ CreatedOnToolsVersion = 11.0;
+ TestTargetID = 54FABB082302265600369599;
+ };
+ 54FABB252302265700369599 = {
+ CreatedOnToolsVersion = 11.0;
+ TestTargetID = 54FABB082302265600369599;
+ };
+ };
+ };
+ buildConfigurationList = 54FABB042302265600369599 /* Build configuration list for PBXProject "xcparse-visualizer" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 54FABB002302265600369599;
+ productRefGroup = 54FABB0A2302265600369599 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 54FABB082302265600369599 /* xcparse-visualizer */,
+ 54FABB1A2302265700369599 /* xcparse-visualizerTests */,
+ 54FABB252302265700369599 /* xcparse-visualizerUITests */,
+ 5443C22D23037027009E7319 /* CPTEmptyTestBundle */,
+ 5443C23B230370C0009E7319 /* CPTTitleChangeTests */,
+ 5443C25023037F72009E7319 /* CPTBundleWithMultipleSuites */,
+ 5443C26523047D57009E7319 /* CPTUnitTestBundle */,
+ 548ACF242314AB7300C08A70 /* XCParseCore */,
+ 5435A34B2315A26400460172 /* xcparsePackageDescription */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 5435A34A2315A26400460172 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 5443C22C23037027009E7319 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 5443C23A230370C0009E7319 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 5443C24F23037F72009E7319 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 5443C26423047D57009E7319 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 548ACF232314AB7300C08A70 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 54FABB072302265600369599 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 5435A32223159A4A00460172 /* Main.storyboard in Resources */,
+ 5435A32123159A4100460172 /* Info.plist in Resources */,
+ 5487722323158BF900CB48E6 /* Assets.xcassets in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 54FABB192302265700369599 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 54FABB242302265700369599 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 5435A3482315A26400460172 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 5435A3542315A27300460172 /* Package.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 5443C22A23037027009E7319 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 5443C23123037027009E7319 /* CPTEmptyTestBundle.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 5443C238230370C0009E7319 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 5443C23F230370C0009E7319 /* CPTTitleChangeTests.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 5443C24D23037F72009E7319 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 5443C25E23038036009E7319 /* CPTTitleChangeTests.swift in Sources */,
+ 5443C25C23037FE9009E7319 /* CPTNavigateTabs.swift in Sources */,
+ 5443C25423037F72009E7319 /* CPTBundleWithMultipleSuites.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 5443C26223047D57009E7319 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 5443C2742304840D009E7319 /* CPTTestChangeTitle.swift in Sources */,
+ 5443C26923047D57009E7319 /* CPTUnitTestBundle.swift in Sources */,
+ 5443C27123047E14009E7319 /* CPTTestIncrement.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 548ACF212314AB7300C08A70 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 549EBECF2314AB9A000247C8 /* XCPResultTypes.swift in Sources */,
+ 549EBED02314AB9A000247C8 /* XCPResultDecoding.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 54FABB052302265600369599 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 548ACEBC2314A2C400C08A70 /* xcparseViewController.swift in Sources */,
+ 548ACEB72314A2C400C08A70 /* ViewController.swift in Sources */,
+ 548ACEBA2314A2C400C08A70 /* firstViewController.swift in Sources */,
+ 548ACEBE2314A2C400C08A70 /* allTestsViewController.swift in Sources */,
+ 548ACEB52314A2C400C08A70 /* customSegue.swift in Sources */,
+ 548ACEC22314A2C400C08A70 /* xcparseFields.swift in Sources */,
+ 548ACEB92314A2C400C08A70 /* breakdownWindowController.swift in Sources */,
+ 548ACEC42314A2C400C08A70 /* xcparseView.swift in Sources */,
+ 548ACEB62314A2C400C08A70 /* Console.swift in Sources */,
+ 548ACEC12314A2C400C08A70 /* secondViewController.swift in Sources */,
+ 548ACEBF2314A2C400C08A70 /* subtestSummaryBreakdownViewController.swift in Sources */,
+ 548ACEBB2314A2C400C08A70 /* testSummariesBreakdownViewController.swift in Sources */,
+ 548ACEBD2314A2C400C08A70 /* exportViewController.swift in Sources */,
+ 548ACEB82314A2C400C08A70 /* testTabViewController.swift in Sources */,
+ 548ACEC52314A2C400C08A70 /* addBreakdownTab.swift in Sources */,
+ 548ACEC02314A2C400C08A70 /* objectBreakdownViewController.swift in Sources */,
+ 548ACEC32314A2C400C08A70 /* AppDelegate.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 54FABB172302265700369599 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 54FABB202302265700369599 /* Sample_Test_AppTests.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 54FABB222302265700369599 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 54FABB2B2302265700369599 /* Sample_Test_AppUITests.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 5443C23423037027009E7319 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 54FABB082302265600369599 /* xcparse-visualizer */;
+ targetProxy = 5443C23323037027009E7319 /* PBXContainerItemProxy */;
+ };
+ 5443C242230370C0009E7319 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 54FABB082302265600369599 /* xcparse-visualizer */;
+ targetProxy = 5443C241230370C0009E7319 /* PBXContainerItemProxy */;
+ };
+ 5443C25723037F72009E7319 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 54FABB082302265600369599 /* xcparse-visualizer */;
+ targetProxy = 5443C25623037F72009E7319 /* PBXContainerItemProxy */;
+ };
+ 5443C26C23047D57009E7319 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 54FABB082302265600369599 /* xcparse-visualizer */;
+ targetProxy = 5443C26B23047D57009E7319 /* PBXContainerItemProxy */;
+ };
+ 548ACF2B2314AB7300C08A70 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 548ACF242314AB7300C08A70 /* XCParseCore */;
+ targetProxy = 548ACF2A2314AB7300C08A70 /* PBXContainerItemProxy */;
+ };
+ 54FABB1D2302265700369599 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 54FABB082302265600369599 /* xcparse-visualizer */;
+ targetProxy = 54FABB1C2302265700369599 /* PBXContainerItemProxy */;
+ };
+ 54FABB282302265700369599 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 54FABB082302265600369599 /* xcparse-visualizer */;
+ targetProxy = 54FABB272302265700369599 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ 5487722023158BF900CB48E6 /* Main.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 5487722123158BF900CB48E6 /* Base */,
+ );
+ name = Main.storyboard;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 5435A3522315A26400460172 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ CURRENT_PROJECT_VERSION = 1;
+ DEFINES_MODULE = YES;
+ DEVELOPMENT_TEAM = 6HDD2WG77F;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ INFOPLIST_FILE = xcparsePackageDescription/Info.plist;
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ "@loader_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.coulomb.ChargePoint.xcparsePackageDescription;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ SKIP_INSTALL = YES;
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = Debug;
+ };
+ 5435A3532315A26400460172 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ CURRENT_PROJECT_VERSION = 1;
+ DEFINES_MODULE = YES;
+ DEVELOPMENT_TEAM = 6HDD2WG77F;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ INFOPLIST_FILE = xcparsePackageDescription/Info.plist;
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ "@loader_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.coulomb.ChargePoint.xcparsePackageDescription;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ SKIP_INSTALL = YES;
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = Release;
+ };
+ 5443C23623037027009E7319 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ DEVELOPMENT_TEAM = 6HDD2WG77F;
+ INFOPLIST_FILE = Tests/CPTEmptyTestBundle/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ "@loader_path/../Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.coulomb.ChargePoint.CPTEmptyTestBundle;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE = "";
+ SWIFT_VERSION = 5.0;
+ TEST_TARGET_NAME = "xcparse-visualizer";
+ };
+ name = Debug;
+ };
+ 5443C23723037027009E7319 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ DEVELOPMENT_TEAM = 6HDD2WG77F;
+ INFOPLIST_FILE = Tests/CPTEmptyTestBundle/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ "@loader_path/../Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.coulomb.ChargePoint.CPTEmptyTestBundle;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE = "";
+ SWIFT_VERSION = 5.0;
+ TEST_TARGET_NAME = "xcparse-visualizer";
+ };
+ name = Release;
+ };
+ 5443C244230370C0009E7319 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ DEVELOPMENT_TEAM = 6HDD2WG77F;
+ INFOPLIST_FILE = Tests/CPTTitleChangeTests/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ "@loader_path/../Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.coulomb.ChargePoint.CPTTitleChangeTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_TARGET_NAME = "Sample-Test-App";
+ };
+ name = Debug;
+ };
+ 5443C245230370C0009E7319 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ DEVELOPMENT_TEAM = 6HDD2WG77F;
+ INFOPLIST_FILE = Tests/CPTTitleChangeTests/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ "@loader_path/../Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.coulomb.ChargePoint.CPTTitleChangeTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_TARGET_NAME = "Sample-Test-App";
+ };
+ name = Release;
+ };
+ 5443C25923037F72009E7319 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ DEVELOPMENT_TEAM = 6HDD2WG77F;
+ INFOPLIST_FILE = Tests/CPTBundleWithMultipleSuites/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ "@loader_path/../Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.coulomb.ChargePoint.CPTBundleWithMultipleSuites;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE = "";
+ SWIFT_VERSION = 5.0;
+ TEST_TARGET_NAME = "xcparse-visualizer";
+ };
+ name = Debug;
+ };
+ 5443C25A23037F72009E7319 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ DEVELOPMENT_TEAM = 6HDD2WG77F;
+ INFOPLIST_FILE = Tests/CPTBundleWithMultipleSuites/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ "@loader_path/../Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.coulomb.ChargePoint.CPTBundleWithMultipleSuites;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE = "";
+ SWIFT_VERSION = 5.0;
+ TEST_TARGET_NAME = "xcparse-visualizer";
+ };
+ name = Release;
+ };
+ 5443C26E23047D57009E7319 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ DEVELOPMENT_TEAM = 6HDD2WG77F;
+ INFOPLIST_FILE = Tests/CPTUnitTestBundle/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ "@loader_path/../Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.coulomb.ChargePoint.CPTUnitTestBundle;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/xcparse-visualizer.app/Contents/MacOS/xcparse-visualizer";
+ };
+ name = Debug;
+ };
+ 5443C26F23047D57009E7319 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ DEVELOPMENT_TEAM = 6HDD2WG77F;
+ INFOPLIST_FILE = Tests/CPTUnitTestBundle/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ "@loader_path/../Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.coulomb.ChargePoint.CPTUnitTestBundle;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/xcparse-visualizer.app/Contents/MacOS/xcparse-visualizer";
+ };
+ name = Release;
+ };
+ 548ACF2F2314AB7300C08A70 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ CURRENT_PROJECT_VERSION = 1;
+ DEFINES_MODULE = YES;
+ DEVELOPMENT_TEAM = 6HDD2WG77F;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ INFOPLIST_FILE = XCParseCore/Info.plist;
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ "@loader_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.coulomb.ChargePoint.XCParseCore;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ SKIP_INSTALL = YES;
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = Debug;
+ };
+ 548ACF302314AB7300C08A70 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ CURRENT_PROJECT_VERSION = 1;
+ DEFINES_MODULE = YES;
+ DEVELOPMENT_TEAM = 6HDD2WG77F;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ INFOPLIST_FILE = XCParseCore/Info.plist;
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ "@loader_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.coulomb.ChargePoint.XCParseCore;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ SKIP_INSTALL = YES;
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = Release;
+ };
+ 54FABB2D2302265700369599 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.14;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = macosx;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ };
+ name = Debug;
+ };
+ 54FABB2E2302265700369599 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.14;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ SDKROOT = macosx;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ };
+ name = Release;
+ };
+ 54FABB302302265700369599 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CODE_SIGN_ENTITLEMENTS = "xcparse-visualizer-app/Sample_Test_App.entitlements";
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ DEVELOPMENT_TEAM = 6HDD2WG77F;
+ ENABLE_HARDENED_RUNTIME = YES;
+ INFOPLIST_FILE = "$(SRCROOT)/xcparse-visualizer-app/Info.plist";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = "com.coulomb.ChargePoint.Sample-Test-App";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ };
+ name = Debug;
+ };
+ 54FABB312302265700369599 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CODE_SIGN_ENTITLEMENTS = "xcparse-visualizer-app/Sample_Test_App.entitlements";
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ DEVELOPMENT_TEAM = 6HDD2WG77F;
+ ENABLE_HARDENED_RUNTIME = YES;
+ INFOPLIST_FILE = "$(SRCROOT)/xcparse-visualizer-app/Info.plist";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = "com.coulomb.ChargePoint.Sample-Test-App";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ };
+ name = Release;
+ };
+ 54FABB332302265700369599 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ DEVELOPMENT_TEAM = 6HDD2WG77F;
+ INFOPLIST_FILE = "Tests/Sample-Test-AppTests/Info.plist";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ "@loader_path/../Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = "com.coulomb.ChargePoint.Sample-Test-AppTests";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/xcparse-visualizer.app/Contents/MacOS/xcparse-visualizer";
+ };
+ name = Debug;
+ };
+ 54FABB342302265700369599 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ DEVELOPMENT_TEAM = 6HDD2WG77F;
+ INFOPLIST_FILE = "Tests/Sample-Test-AppTests/Info.plist";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ "@loader_path/../Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = "com.coulomb.ChargePoint.Sample-Test-AppTests";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/xcparse-visualizer.app/Contents/MacOS/xcparse-visualizer";
+ };
+ name = Release;
+ };
+ 54FABB362302265700369599 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ DEVELOPMENT_TEAM = 6HDD2WG77F;
+ INFOPLIST_FILE = "Tests/Sample-Test-AppUITests/Info.plist";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ "@loader_path/../Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = "com.coulomb.ChargePoint.Sample-Test-AppUITests";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE = "";
+ SWIFT_VERSION = 5.0;
+ TEST_TARGET_NAME = "xcparse-visualizer";
+ };
+ name = Debug;
+ };
+ 54FABB372302265700369599 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ DEVELOPMENT_TEAM = 6HDD2WG77F;
+ INFOPLIST_FILE = "Tests/Sample-Test-AppUITests/Info.plist";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ "@loader_path/../Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = "com.coulomb.ChargePoint.Sample-Test-AppUITests";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE = "";
+ SWIFT_VERSION = 5.0;
+ TEST_TARGET_NAME = "xcparse-visualizer";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 5435A3512315A26400460172 /* Build configuration list for PBXNativeTarget "xcparsePackageDescription" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 5435A3522315A26400460172 /* Debug */,
+ 5435A3532315A26400460172 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 5443C23523037027009E7319 /* Build configuration list for PBXNativeTarget "CPTEmptyTestBundle" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 5443C23623037027009E7319 /* Debug */,
+ 5443C23723037027009E7319 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 5443C243230370C0009E7319 /* Build configuration list for PBXNativeTarget "CPTTitleChangeTests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 5443C244230370C0009E7319 /* Debug */,
+ 5443C245230370C0009E7319 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 5443C25823037F72009E7319 /* Build configuration list for PBXNativeTarget "CPTBundleWithMultipleSuites" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 5443C25923037F72009E7319 /* Debug */,
+ 5443C25A23037F72009E7319 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 5443C26D23047D57009E7319 /* Build configuration list for PBXNativeTarget "CPTUnitTestBundle" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 5443C26E23047D57009E7319 /* Debug */,
+ 5443C26F23047D57009E7319 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 548ACF2E2314AB7300C08A70 /* Build configuration list for PBXNativeTarget "XCParseCore" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 548ACF2F2314AB7300C08A70 /* Debug */,
+ 548ACF302314AB7300C08A70 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 54FABB042302265600369599 /* Build configuration list for PBXProject "xcparse-visualizer" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 54FABB2D2302265700369599 /* Debug */,
+ 54FABB2E2302265700369599 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 54FABB2F2302265700369599 /* Build configuration list for PBXNativeTarget "xcparse-visualizer" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 54FABB302302265700369599 /* Debug */,
+ 54FABB312302265700369599 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 54FABB322302265700369599 /* Build configuration list for PBXNativeTarget "xcparse-visualizerTests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 54FABB332302265700369599 /* Debug */,
+ 54FABB342302265700369599 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 54FABB352302265700369599 /* Build configuration list for PBXNativeTarget "xcparse-visualizerUITests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 54FABB362302265700369599 /* Debug */,
+ 54FABB372302265700369599 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 54FABB012302265600369599 /* Project object */;
+}
diff --git a/xcparse-visualizer/xcparse-visualizer.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/xcparse-visualizer/xcparse-visualizer.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..e445991
--- /dev/null
+++ b/xcparse-visualizer/xcparse-visualizer.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/xcparse-visualizer/xcparse-visualizer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/xcparse-visualizer/xcparse-visualizer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/xcparse-visualizer/xcparse-visualizer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/xcparse-visualizer/xcparse-visualizer.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/xcparse-visualizer/xcparse-visualizer.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 0000000..f9b0d7c
--- /dev/null
+++ b/xcparse-visualizer/xcparse-visualizer.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/xcparse-visualizer/xcparse-visualizer.xcodeproj/xcshareddata/xcschemes/xcparse-visualizer.xcscheme b/xcparse-visualizer/xcparse-visualizer.xcodeproj/xcshareddata/xcschemes/xcparse-visualizer.xcscheme
new file mode 100644
index 0000000..2dbf2a6
--- /dev/null
+++ b/xcparse-visualizer/xcparse-visualizer.xcodeproj/xcshareddata/xcschemes/xcparse-visualizer.xcscheme
@@ -0,0 +1,109 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/xcparse-visualizer/xcparsePackageDescription/Info.plist b/xcparse-visualizer/xcparsePackageDescription/Info.plist
new file mode 100644
index 0000000..6d4bca4
--- /dev/null
+++ b/xcparse-visualizer/xcparsePackageDescription/Info.plist
@@ -0,0 +1,24 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ $(PRODUCT_BUNDLE_PACKAGE_TYPE)
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ $(CURRENT_PROJECT_VERSION)
+ NSHumanReadableCopyright
+ Copyright © 2019 Rishab Sukumar. All rights reserved.
+
+
diff --git a/xcparse-visualizer/xcparsePackageDescription/xcparsePackageDescription.h b/xcparse-visualizer/xcparsePackageDescription/xcparsePackageDescription.h
new file mode 100644
index 0000000..17b19c2
--- /dev/null
+++ b/xcparse-visualizer/xcparsePackageDescription/xcparsePackageDescription.h
@@ -0,0 +1,19 @@
+//
+// xcparsePackageDescription.h
+// xcparsePackageDescription
+//
+// Created by Rishab Sukumar on 8/27/19.
+// Copyright © 2019 Rishab Sukumar. All rights reserved.
+//
+
+#import
+
+//! Project version number for xcparsePackageDescription.
+FOUNDATION_EXPORT double xcparsePackageDescriptionVersionNumber;
+
+//! Project version string for xcparsePackageDescription.
+FOUNDATION_EXPORT const unsigned char xcparsePackageDescriptionVersionString[];
+
+// In this header, you should import all the public headers of your framework using statements like #import
+
+