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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + +