Update SpecValidation to validate TargetReference definitions in the Scheme.Test action. Add additional coverate to ProjectSpectTests

This commit is contained in:
Liam Nichols
2020-02-06 10:45:21 +00:00
parent bb8bceccf0
commit d69b028294
3 changed files with 28 additions and 16 deletions
+21 -12
View File
@@ -194,24 +194,21 @@ extension Project {
}
for scheme in schemes {
for buildTarget in scheme.build.targets {
switch buildTarget.target.location {
case .local:
if getProjectTarget(buildTarget.target.name) == nil {
errors.append(.invalidSchemeTarget(scheme: scheme.name, target: buildTarget.target.name))
}
case .project(let project):
if getProjectReference(project) == nil {
errors.append(.invalidProjectReference(scheme: scheme.name, reference: project))
}
}
}
errors.append(
contentsOf: scheme.build.targets.compactMap({ validationError(for: $0.target, in: scheme, action: "build") })
)
if let action = scheme.run, let config = action.config, getConfig(config) == nil {
errors.append(.invalidSchemeConfig(scheme: scheme.name, config: config))
}
if let action = scheme.test, let config = action.config, getConfig(config) == nil {
errors.append(.invalidSchemeConfig(scheme: scheme.name, config: config))
}
errors.append(
contentsOf: scheme.test?.targets.compactMap({ validationError(for: $0.targetReference, in: scheme, action: "test") }) ?? []
)
errors.append(
contentsOf: scheme.test?.coverageTargets.compactMap({ validationError(for: $0, in: scheme, action: "test") }) ?? []
)
if let action = scheme.profile, let config = action.config, getConfig(config) == nil {
errors.append(.invalidSchemeConfig(scheme: scheme.name, config: config))
}
@@ -233,4 +230,16 @@ extension Project {
throw SpecValidationError.ValidationError.invalidXcodeGenVersion(minimumVersion: minimumXcodeGenVersion, version: xcodeGenVersion)
}
}
/// Returns a descriptive error if the given target reference was invalid otherwise `nil`.
private func validationError(for targetReference: TargetReference, in scheme: Scheme, action: String) -> SpecValidationError.ValidationError? {
switch targetReference.location {
case .local where getProjectTarget(targetReference.name) == nil:
return .invalidSchemeTarget(scheme: scheme.name, target: targetReference.name, action: action)
case .project(let project) where getProjectReference(project) == nil:
return .invalidProjectReference(scheme: scheme.name, reference: project)
case .local, .project:
return nil
}
}
}
@@ -16,7 +16,7 @@ public struct SpecValidationError: Error, CustomStringConvertible {
case invalidTargetConfigFile(target: String, configFile: String, config: String)
case invalidTargetSchemeConfigVariant(target: String, configVariant: String, configType: ConfigType)
case invalidTargetSchemeTest(target: String, testTarget: String)
case invalidSchemeTarget(scheme: String, target: String)
case invalidSchemeTarget(scheme: String, target: String, action: String)
case invalidSchemeConfig(scheme: String, config: String)
case invalidSwiftPackage(name: String, target: String)
case invalidLocalPackage(String)
@@ -50,8 +50,8 @@ public struct SpecValidationError: Error, CustomStringConvertible {
return "Target \(target.quoted) scheme has invalid test \(test.quoted)"
case let .invalidConfigFile(configFile, config):
return "Invalid config file \(configFile.quoted) for config \(config.quoted)"
case let .invalidSchemeTarget(scheme, target):
return "Scheme \(scheme.quoted) has invalid build target \(target.quoted)"
case let .invalidSchemeTarget(scheme, target, action):
return "Scheme \(scheme.quoted) has invalid \(action) target \(target.quoted)"
case let .invalidSchemeConfig(scheme, config):
return "Scheme \(scheme.quoted) has invalid build configuration \(config.quoted)"
case let .invalidBuildSettingConfig(config):