use XCTUnwrap

This commit is contained in:
yonaskolb
2019-11-10 12:09:37 +11:00
parent 0e4e08bfc4
commit 66569d3670
3 changed files with 46 additions and 123 deletions
@@ -48,6 +48,7 @@ class ProjectGeneratorTests: XCTestCase {
let options = SpecOptions(bundleIdPrefix: "com.test")
let project = Project(name: "test", targets: [framework], options: options)
let pbxProj = try project.generatePbxProj()
guard let target = pbxProj.nativeTargets.first,
let buildConfigList = target.buildConfigurationList,
let buildConfig = buildConfigList.buildConfigurations.first else {
@@ -68,9 +69,7 @@ class ProjectGeneratorTests: XCTestCase {
let options = SpecOptions(developmentLanguage: "de")
let project = Project(name: "test", options: options)
let pbxProj = try project.generatePbxProj()
guard let pbxProject = pbxProj.projects.first else {
throw failure("Could't find PBXProject")
}
let pbxProject = try XCTUnwrap(pbxProj.projects.first)
try expect(pbxProject.developmentRegion) == "de"
}
@@ -138,18 +137,17 @@ class ProjectGeneratorTests: XCTestCase {
configs: [Config(name: "config")]
)
let pbxProj = try project.generatePbxProj()
guard let config = pbxProj.buildConfigurations.first else {
throw failure("configuration not found")
}
let config = try XCTUnwrap(pbxProj.buildConfigurations.first)
try expect(config.buildSettings.isEmpty).to.beTrue()
}
$0.it("merges settings") {
let project = try Project(path: fixturePath + "settings_test.yml")
guard let config = project.getConfig("config1") else { throw failure("Couldn't find config1") }
let config = try XCTUnwrap(project.getConfig("config1"))
let debugProjectSettings = project.getProjectBuildSettings(config: config)
guard let target = project.getTarget("Target") else { throw failure("Couldn't find Target") }
let target = try XCTUnwrap(project.getTarget("Target"))
let targetDebugSettings = project.getTargetBuildSettings(target: target, config: config)
var buildSettings = BuildSettings()
@@ -274,17 +272,9 @@ class ProjectGeneratorTests: XCTestCase {
let project = Project(name: "test", targets: [appTargetWithAttributes, framework, optionalFramework, testTargetWithAttributes])
let pbxProject = try project.generatePbxProj()
guard let targetAttributes = pbxProject.projects.first?.targetAttributes else {
throw failure("Couldn't find Project TargetAttributes")
}
guard let appTarget = pbxProject.targets(named: app.name).first else {
throw failure("Couldn't find App Target")
}
guard let uiTestTarget = pbxProject.targets(named: uiTest.name).first else {
throw failure("Couldn't find UITest Target")
}
let targetAttributes = try XCTUnwrap(pbxProject.projects.first?.targetAttributes)
let appTarget = try XCTUnwrap(pbxProject.targets(named: app.name).first)
let uiTestTarget = try XCTUnwrap(pbxProject.targets(named: uiTest.name).first)
try expect((targetAttributes[uiTestTarget]?["TestTargetID"] as? PBXNativeTarget)?.name) == app.name
try expect(targetAttributes[uiTestTarget]?["ProvisioningStyle"] as? String) == "Manual"
@@ -297,18 +287,8 @@ class ProjectGeneratorTests: XCTestCase {
let project = Project(name: "", targets: [target], options: .init(deploymentTarget: DeploymentTarget(iOS: "10.0", watchOS: "3.0")))
let pbxProject = try project.generatePbxProj()
guard let projectConfigList = pbxProject.projects.first?.buildConfigurationList,
let projectConfig = projectConfigList.buildConfigurations.first
else {
throw failure("Couldn't find Project config")
}
guard let targetConfigList = pbxProject.nativeTargets.first?.buildConfigurationList,
let targetConfig = targetConfigList.buildConfigurations.first
else {
throw failure("Couldn't find Target config")
}
let projectConfig = try XCTUnwrap(pbxProject.projects.first?.buildConfigurationList?.buildConfigurations.first)
let targetConfig = try XCTUnwrap(pbxProject.nativeTargets.first?.buildConfigurationList?.buildConfigurations.first)
try expect(projectConfig.buildSettings["IPHONEOS_DEPLOYMENT_TARGET"] as? String) == "10.0"
try expect(projectConfig.buildSettings["WATCHOS_DEPLOYMENT_TARGET"] as? String) == "3.0"
@@ -608,9 +588,7 @@ class ProjectGeneratorTests: XCTestCase {
let pbxProject = try project.generatePbxProj()
for target in targets {
guard let nativeTarget = pbxProject.nativeTargets.first(where: { $0.name == target.name }) else {
throw failure("PBXNativeTarget for \(target) not found")
}
let nativeTarget = try XCTUnwrap(pbxProject.nativeTargets.first(where: { $0.name == target.name }))
let buildPhases = nativeTarget.buildPhases
let resourcesPhases = pbxProject.resourcesBuildPhases.filter { buildPhases.contains($0) }
@@ -775,9 +753,8 @@ class ProjectGeneratorTests: XCTestCase {
let pbxProject = try project.generatePbxProj()
func scriptBuildPhases(target: Target) throws -> [PBXShellScriptBuildPhase] {
guard let nativeTarget = pbxProject.nativeTargets.first(where: { $0.name == target.name }) else {
throw failure("PBXNativeTarget for \(target) not found")
}
let nativeTarget = try XCTUnwrap(pbxProject.nativeTargets.first(where: { $0.name == target.name }))
let buildPhases = nativeTarget.buildPhases
let scriptPhases = buildPhases.compactMap { $0 as? PBXShellScriptBuildPhase }
return scriptPhases
@@ -803,10 +780,7 @@ class ProjectGeneratorTests: XCTestCase {
scriptSpec.targets[0].postBuildScripts = [BuildScript(script: .script("script3"))]
let pbxProject = try scriptSpec.generatePbxProj()
guard let nativeTarget = pbxProject.nativeTargets
.first(where: { $0.buildPhases.count >= 3 }) else {
throw failure("Target with build phases not found")
}
let nativeTarget = try XCTUnwrap(pbxProject.nativeTargets.first(where: { $0.buildPhases.count >= 3 }))
let buildPhases = nativeTarget.buildPhases
let scripts = pbxProject.shellScriptBuildPhases
@@ -894,9 +868,7 @@ class ProjectGeneratorTests: XCTestCase {
let project = Project(name: "test", targets: [app, framework, optionalFramework, uiTest])
let pbxProject = try project.generatePbxProj()
guard let nativeTarget = pbxProject.nativeTargets.first(where: { $0.name == app.name }) else {
throw failure("PBXNativeTarget for \(app.name) not found")
}
let nativeTarget = try XCTUnwrap(pbxProject.nativeTargets.first(where: { $0.name == app.name }))
let frameworkPhases = nativeTarget.buildPhases.compactMap { $0 as? PBXFrameworksBuildPhase }
let frameworkBuildFiles = frameworkPhases[0].files ?? []
@@ -925,31 +897,21 @@ class ProjectGeneratorTests: XCTestCase {
], localPackages: ["../XcodeGen"], options: .init(localPackagesGroup: "MyPackages"))
let pbxProject = try project.generatePbxProj(specValidate: false)
guard let nativeTarget = pbxProject.nativeTargets.first(where: { $0.name == app.name }) else {
throw failure("PBXNativeTarget for \(app.name) not found")
}
let nativeTarget = try XCTUnwrap(pbxProject.nativeTargets.first(where: { $0.name == app.name }))
guard let projectSpecDependency = nativeTarget.packageProductDependencies.first(where: { $0.productName == "ProjectSpec" }) else {
throw failure("XCSwiftPackageProductDependency for \(app.name) not found")
}
let projectSpecDependency = try XCTUnwrap(nativeTarget.packageProductDependencies.first(where: { $0.productName == "ProjectSpec" })
try expect(projectSpecDependency.package?.name) == "XcodeGen"
try expect(projectSpecDependency.package?.versionRequirement) == .branch("master")
guard let codabilityDependency = nativeTarget.packageProductDependencies.first(where: { $0.productName == "Codability" }) else {
throw failure("XCSwiftPackageProductDependency for \(app.name) not found")
}
let codabilityDependency = try XCTUnwrap(nativeTarget.packageProductDependencies.first(where: { $0.productName == "Codability" }))
try expect(codabilityDependency.package?.name) == "Codability"
try expect(codabilityDependency.package?.versionRequirement) == .exact("1.0.0")
guard let localPackagesGroup = try pbxProject.getMainGroup().children.first(where: { $0.name == "MyPackages" }) as? PBXGroup else {
throw failure("Group not found")
}
let localPackagesGroup = try XCTUnwrap(try pbxProject.getMainGroup().children.first(where: { $0.name == "MyPackages" }) as? PBXGroup)
guard let localPackageFile = pbxProject.fileReferences.first(where: { $0.path == "../XcodeGen" }) else {
throw failure("FileReference not found")
}
let localPackageFile = try XCTUnwrap(pbxProject.fileReferences.first(where: { $0.path == "../XcodeGen" }))
try expect(localPackagesGroup.children.contains(localPackageFile)) == true
try expect(localPackageFile.lastKnownFileType) == "folder"
@@ -963,9 +925,7 @@ class ProjectGeneratorTests: XCTestCase {
let writer = FileWriter(project: project)
try writer.writePlists()
guard let targetConfig = pbxProject.nativeTargets.first?.buildConfigurationList?.buildConfigurations.first else {
throw failure("Couldn't find Target config")
}
let targetConfig = try XCTUnwrap(pbxProject.nativeTargets.first?.buildConfigurationList?.buildConfigurations.first)
try expect(targetConfig.buildSettings["INFOPLIST_FILE"] as? String) == plist.path
@@ -998,9 +958,7 @@ class ProjectGeneratorTests: XCTestCase {
let writer = FileWriter(project: project)
try writer.writePlists()
guard let targetConfig = pbxProject.nativeTargets.first?.buildConfigurationList?.buildConfigurations.first else {
throw failure("Couldn't find Target config")
}
let targetConfig = try XCTUnwrap(pbxProject.nativeTargets.first?.buildConfigurationList?.buildConfigurations.first)
// generated plist should not be in buildsettings
try expect(targetConfig.buildSettings["INFOPLIST_FILE"] as? String) == predefinedPlistPath
}
@@ -1077,9 +1035,7 @@ class ProjectGeneratorTests: XCTestCase {
let writer = FileWriter(project: project)
try writer.writePlists()
guard let targetConfig = pbxProject.nativeTargets.first?.buildConfigurationList?.buildConfigurations.first else {
throw failure("Couldn't find Target config")
}
let targetConfig = try XCTUnwrap(pbxProject.nativeTargets.first?.buildConfigurationList?.buildConfigurations.first)
try expect(targetConfig.buildSettings["INFOPLIST_FILE"] as? String) == plist.path
@@ -57,13 +57,9 @@ class SchemeGeneratorTests: XCTestCase {
schemes: [scheme]
)
let xcodeProject = try project.generateXcodeProject()
guard let target = xcodeProject.pbxproj.nativeTargets
.first(where: { $0.name == app.name }) else {
throw failure("Target not found")
}
guard let xcscheme = xcodeProject.sharedData?.schemes.first else {
throw failure("Scheme not found")
}
let target = try XCTUnwrap(xcodeProject.pbxproj.nativeTargets
.first(where: { $0.name == app.name }))
let xcscheme = try XCTUnwrap(xcodeProject.sharedData?.schemes.first)
try expect(scheme.name) == "MyScheme"
try expect(xcscheme.buildAction?.buildImplicitDependencies) == true
try expect(xcscheme.buildAction?.parallelizeBuild) == true
@@ -71,9 +67,7 @@ class SchemeGeneratorTests: XCTestCase {
try expect(xcscheme.buildAction?.preActions.first?.scriptText) == "echo Starting"
try expect(xcscheme.buildAction?.preActions.first?.environmentBuildable?.buildableName) == "MyApp.app"
try expect(xcscheme.buildAction?.preActions.first?.environmentBuildable?.blueprintName) == "MyApp"
guard let buildActionEntry = xcscheme.buildAction?.buildActionEntries.first else {
throw failure("Build Action entry not found")
}
let buildActionEntry = try XCTUnwrap(xcscheme.buildAction?.buildActionEntries.first)
try expect(buildActionEntry.buildFor) == BuildType.all
let buildableReferences: [XCScheme.BuildableReference] = [
@@ -118,9 +112,7 @@ class SchemeGeneratorTests: XCTestCase {
targets: [framework, frameworkTest]
)
let xcodeProject = try project.generateXcodeProject()
guard let xcscheme = xcodeProject.sharedData?.schemes.first else {
throw failure("Scheme not found")
}
let xcscheme = try XCTUnwrap(xcodeProject.sharedData?.schemes.first)
try expect(xcscheme.launchAction?.buildConfiguration) == "Debug"
try expect(xcscheme.testAction?.buildConfiguration) == "Debug"
@@ -149,9 +141,7 @@ class SchemeGeneratorTests: XCTestCase {
)
let xcodeProject = try project.generateXcodeProject()
guard let xcscheme = xcodeProject.sharedData?.schemes.first else {
throw failure("Scheme not found")
}
let xcscheme = try XCTUnwrap(xcodeProject.sharedData?.schemes.first)
try expect(
xcodeProject.pbxproj.nativeTargets
@@ -178,13 +168,9 @@ class SchemeGeneratorTests: XCTestCase {
try expect(xcodeProject.sharedData?.schemes.count) == 2
guard let xcscheme = xcodeProject.sharedData?.schemes
.first(where: { $0.name == "\(target.name) Test" }) else {
throw failure("Scheme not found")
}
guard let buildActionEntry = xcscheme.buildAction?.buildActionEntries.first else {
throw failure("Build Action entry not found")
}
let xcscheme = try XCTUnwrap(xcodeProject.sharedData?.schemes
.first(where: { $0.name == "\(target.name) Test" }))
let buildActionEntry = try XCTUnwrap(xcscheme.buildAction?.buildActionEntries.first)
try expect(buildActionEntry.buildableReference.blueprintIdentifier.count > 0) == true
@@ -205,9 +191,7 @@ class SchemeGeneratorTests: XCTestCase {
try expect(xcodeProject.sharedData?.schemes.count) == 1
guard let xcscheme = xcodeProject.sharedData?.schemes.first else {
throw failure("Scheme not found")
}
let xcscheme = try XCTUnwrap(xcodeProject.sharedData?.schemes.first)
try expect(xcscheme.launchAction?.environmentVariables) == variables
try expect(xcscheme.testAction?.environmentVariables) == variables
@@ -227,9 +211,7 @@ class SchemeGeneratorTests: XCTestCase {
)
let xcodeProject = try project.generateXcodeProject()
guard let xcscheme = xcodeProject.sharedData?.schemes.first else {
throw failure("Scheme not found")
}
let xcscheme = try XCTUnwrap(xcodeProject.sharedData?.schemes.first)
try expect(xcscheme.launchAction?.selectedDebuggerIdentifier) == ""
try expect(xcscheme.launchAction?.selectedLauncherIdentifier) == "Xcode.IDEFoundation.Launcher.PosixSpawn"
@@ -247,9 +229,7 @@ class SchemeGeneratorTests: XCTestCase {
try expect(xcodeProject.sharedData?.schemes.count) == 1
guard let xcscheme = xcodeProject.sharedData?.schemes.first else {
throw failure("Scheme not found")
}
let xcscheme = try XCTUnwrap(xcodeProject.sharedData?.schemes.first)
try expect(xcscheme.launchAction?.preActions.count) == 1
try expect(xcscheme.launchAction?.preActions.first?.title) == "Run"
@@ -284,9 +264,7 @@ class SchemeGeneratorTests: XCTestCase {
projectReferences: [projectReference]
)
let xcodeProject = try project.generateXcodeProject()
guard let xcscheme = xcodeProject.sharedData?.schemes.first else {
throw failure("Scheme not found")
}
let xcscheme = try XCTUnwrap(xcodeProject.sharedData?.schemes.first)
try expect(xcscheme.buildAction?.buildActionEntries.count) == 1
let buildableReference = xcscheme.buildAction?.buildActionEntries.first?.buildableReference
try expect(buildableReference?.blueprintName) == "ExternalTarget"
@@ -326,9 +304,7 @@ class SchemeGeneratorTests: XCTestCase {
]
)
let xcodeProject = try project.generateXcodeProject()
guard let xcscheme = xcodeProject.sharedData?.schemes.first else {
throw failure("Scheme not found")
}
let xcscheme = try XCTUnwrap(xcodeProject.sharedData?.schemes.first)
try expect(xcscheme.testAction?.codeCoverageEnabled) == true
try expect(xcscheme.testAction?.codeCoverageTargets.count) == 2
let buildableReference = xcscheme.testAction?.codeCoverageTargets.first
@@ -91,10 +91,8 @@ class SourceGeneratorTests: XCTestCase {
paths: ["Sources", "Foo.framework"],
names: ["Sources", "Foo.framework"]
)
guard let buildFile = pbxProj.buildFiles
.first(where: { $0.file == fileReference }) else {
throw failure("Cant find build file")
}
let buildFile = try XCTUnwrap(pbxProj.buildFiles
.first(where: { $0.file == fileReference }))
try expect(buildPhase?.files?.count) == 1
try expect(buildPhase?.files?.contains(buildFile)) == true
}
@@ -114,12 +112,8 @@ class SourceGeneratorTests: XCTestCase {
let project = Project(basePath: directoryPath, name: "Test", targets: [target])
let pbxProj = try project.generatePbxProj()
guard let fileReference = pbxProj.fileReferences.first(where: { $0.nameOrPath == "model2.xcdatamodel" }) else {
throw failure("Couldn't find model file reference")
}
guard let versionGroup = pbxProj.versionGroups.first else {
throw failure("Couldn't find version group")
}
let fileReference = try XCTUnwrap(pbxProj.fileReferences.first(where: { $0.nameOrPath == "model2.xcdatamodel" })
let versionGroup = try XCTUnwrap(pbxProj.versionGroups.first)
try expect(versionGroup.currentVersion) == fileReference
try expect(versionGroup.children.count) == 3
try expect(versionGroup.path) == "model.xcdatamodeld"
@@ -153,7 +147,7 @@ class SourceGeneratorTests: XCTestCase {
let baseResource = "Base.lproj/LocalizedStoryboard.storyboard"
let localizedResource = "en.lproj/LocalizedStoryboard.strings"
guard let variableGroup = getVariableGroups(resourceName).first else { throw failure("Couldn't find the variable group") }
let variableGroup = try XCTUnwrap(getVariableGroups(resourceName).first)
do {
let refs = getFileReferences(baseResource)
@@ -209,9 +203,9 @@ class SourceGeneratorTests: XCTestCase {
let stringsResourceName = "Localizable.strings"
let jsonResourceName = "empty.json"
guard let stringsVariableGroup = getVariableGroups(stringsResourceName).first else { throw failure("Couldn't find the variable group") }
let stringsVariableGroup = try XCTUnwrap(getVariableGroups(stringsResourceName).first)
guard let jsonVariableGroup = getVariableGroups(jsonResourceName).first else { throw failure("Couldn't find the variable group") }
let jsonVariableGroup = try XCTUnwrap(getVariableGroups(jsonResourceName).first)
let stringsResource = "en.lproj/Localizable.strings"
let jsonResource = "en-CA.lproj/empty.json"
@@ -749,10 +743,7 @@ class SourceGeneratorTests: XCTestCase {
paths: ["A", definition],
names: ["A", definition]
)
guard let buildFile = pbxProj.buildFiles
.first(where: { $0.file == fileReference }) else {
throw failure("Cant find build file")
}
let buildFile = try XCTUnwrap(pbxProj.buildFiles.first(where: { $0.file == fileReference }))
try pbxProj.expectFile(paths: ["A", definition], buildPhase: .sources)