Add Testable instead of Target in TestAction

This commit is contained in:
Maksym Prokopchuk 2019-11-28 00:09:11 +01:00
parent 8635579dbd
commit f2a72e3382
8 changed files with 86 additions and 18 deletions

View File

@ -71,7 +71,7 @@ public struct BuildAction: Equatable, Codable {
// MARK: - TestAction
public struct TestAction: Equatable, Codable {
public let targets: [String]
public let targets: [TestableTarget]
public let arguments: Arguments?
public let configurationName: String
public let coverage: Bool
@ -79,7 +79,7 @@ public struct TestAction: Equatable, Codable {
public let preActions: [ExecutionAction]
public let postActions: [ExecutionAction]
public init(targets: [String],
public init(targets: [TestableTarget] = [],
arguments: Arguments? = nil,
configurationName: String,
coverage: Bool = false,
@ -95,7 +95,7 @@ public struct TestAction: Equatable, Codable {
self.codeCoverageTargets = codeCoverageTargets
}
public init(targets: [String],
public init(targets: [TestableTarget],
arguments: Arguments? = nil,
config: PresetBuildConfiguration = .debug,
coverage: Bool = false,
@ -112,6 +112,24 @@ public struct TestAction: Equatable, Codable {
}
}
public struct TestableTarget: Equatable, Hashable, Codable, ExpressibleByStringLiteral {
public let target: String
public let isSkipped: Bool
public let isParallelizable: Bool
public let isRandomExecutionOrdering: Bool
public init(target: String, skipped: Bool = false, parallelizable: Bool = false, randomExecutionOrdering: Bool = false) {
self.target = target
self.isSkipped = skipped
self.isParallelizable = parallelizable
self.isRandomExecutionOrdering = randomExecutionOrdering
}
public init(stringLiteral value: String) {
self.init(target: value)
}
}
// MARK: - RunAction
public struct RunAction: Equatable, Codable {

View File

@ -114,7 +114,7 @@ public class BuildAction: Equatable {
public class TestAction: Equatable {
// MARK: - Attributes
public let targets: [String]
public let targets: [TestableTarget]
public let arguments: Arguments?
public let configurationName: String
public let coverage: Bool
@ -124,7 +124,7 @@ public class TestAction: Equatable {
// MARK: - Init
public init(targets: [String] = [],
public init(targets: [TestableTarget] = [],
arguments: Arguments? = nil,
configurationName: String,
coverage: Bool = false,
@ -153,6 +153,20 @@ public class TestAction: Equatable {
}
}
public struct TestableTarget: Equatable, Hashable {
public let target: String
public let isSkipped: Bool
public let isParallelizable: Bool
public let isRandomExecutionOrdering: Bool
public init(target: String, skipped: Bool = false, parallelizable: Bool = false, randomExecutionOrdering: Bool = false) {
self.target = target
self.isSkipped = skipped
self.isParallelizable = parallelizable
self.isRandomExecutionOrdering = randomExecutionOrdering
}
}
public class RunAction: Equatable {
// MARK: - Attributes

View File

@ -21,7 +21,7 @@ public extension RunAction {
}
public extension TestAction {
static func test(targets: [String] = ["AppTests"],
static func test(targets: [TestableTarget] = [TestableTarget(target: "AppTests")],
arguments: Arguments? = Arguments.test(),
configurationName: String = BuildConfiguration.debug.name,
coverage: Bool = false,

View File

@ -44,7 +44,7 @@ final class SchemesGenerator: SchemesGenerating {
let scheme = Scheme(name: target.name,
shared: true,
buildAction: BuildAction(targets: [target.name]),
testAction: TestAction(targets: [target.name], configurationName: buildConfiguration),
testAction: TestAction(targets: [TestableTarget(target: target.name)], configurationName: buildConfiguration),
runAction: RunAction(configurationName: buildConfiguration,
executable: target.productName,
arguments: Arguments(environment: target.environment)))
@ -211,15 +211,19 @@ final class SchemesGenerator: SchemesGenerating {
var preActions: [XCScheme.ExecutionAction] = []
var postActions: [XCScheme.ExecutionAction] = []
testAction.targets.forEach { name in
guard let target = project.targets.first(where: { $0.name == name }), target.product.testsBundle else { return }
guard let pbxTarget = generatedProject.targets[name] else { return }
testAction.targets.forEach { test in
let targetName = test.target
guard let target = project.targets.first(where: { $0.name == targetName }), target.product.testsBundle else { return }
guard let pbxTarget = generatedProject.targets[targetName] else { return }
let reference = self.targetBuildableReference(target: target,
pbxTarget: pbxTarget,
projectName: generatedProject.name)
let testable = XCScheme.TestableReference(skipped: false, buildableReference: reference)
let testable = XCScheme.TestableReference(skipped: test.isSkipped,
parallelizable: test.isParallelizable,
randomExecutionOrdering: test.isRandomExecutionOrdering,
buildableReference: reference)
testables.append(testable)
}

View File

@ -597,7 +597,7 @@ extension TuistCore.BuildAction {
extension TuistCore.TestAction {
static func from(manifest: ProjectDescription.TestAction) -> TuistCore.TestAction {
let targets = manifest.targets
let targets = manifest.targets.map { TuistCore.TestableTarget.from(manifest: $0) }
let arguments = manifest.arguments.map { TuistCore.Arguments.from(manifest: $0) }
let configurationName = manifest.configurationName
let coverage = manifest.coverage
@ -615,6 +615,15 @@ extension TuistCore.TestAction {
}
}
extension TuistCore.TestableTarget {
static func from(manifest: ProjectDescription.TestableTarget) -> TuistCore.TestableTarget {
return TestableTarget(target: manifest.target,
skipped: manifest.isSkipped,
parallelizable: manifest.isParallelizable,
randomExecutionOrdering: manifest.isRandomExecutionOrdering)
}
}
extension TuistCore.RunAction {
static func from(manifest: ProjectDescription.RunAction) -> TuistCore.RunAction {
let configurationName = manifest.configurationName

View File

@ -125,7 +125,7 @@ final class SchemeGeneratorTests: XCTestCase {
let preAction = ExecutionAction(title: "Pre Action", scriptText: "echo Pre Actions", target: "AppTests")
let postAction = ExecutionAction(title: "Post Action", scriptText: "echo Post Actions", target: "AppTests")
let testAction = TestAction.test(targets: ["AppTests"], preActions: [preAction], postActions: [postAction])
let testAction = TestAction.test(targets: [TestableTarget(target: "AppTests")], preActions: [preAction], postActions: [postAction])
let scheme = Scheme.test(name: "AppTests", shared: true, testAction: testAction)
let project = Project.test(targets: [testTarget])
@ -162,7 +162,7 @@ final class SchemeGeneratorTests: XCTestCase {
let target = Target.test(name: "App", product: .app)
let testTarget = Target.test(name: "AppTests", product: .unitTests)
let testAction = TestAction.test(targets: ["AppTests"], coverage: true, codeCoverageTargets: ["App"])
let testAction = TestAction.test(targets: [TestableTarget(target: "AppTests")], coverage: true, codeCoverageTargets: ["App"])
let buildAction = BuildAction.test(targets: ["App"])
let scheme = Scheme.test(name: "AppTests", shared: true, buildAction: buildAction, testAction: testAction)
@ -181,6 +181,28 @@ final class SchemeGeneratorTests: XCTestCase {
XCTAssertEqual(codeCoverageTargetsBuildableReference?.first?.buildableName, "App.app")
}
func test_schemeTestAction_with_testable_info() {
let target = Target.test(name: "App", product: .app)
let testTarget = Target.test(name: "AppTests", product: .unitTests)
let testableTarget = TestableTarget(target: "AppTests", skipped: false, parallelizable: true, randomExecutionOrdering: true)
let testAction = TestAction.test(targets: [testableTarget])
let buildAction = BuildAction.test(targets: ["App"])
let scheme = Scheme.test(name: "AppTests", shared: true, buildAction: buildAction, testAction: testAction)
let project = Project.test(targets: [target, testTarget])
let pbxTarget = PBXNativeTarget(name: "App", productType: .application)
let pbxTestTarget = PBXNativeTarget(name: "AppTests", productType: .unitTestBundle)
let generatedProject = GeneratedProject.test(targets: ["AppTests": pbxTestTarget, "App": pbxTarget])
let got = subject.schemeTestAction(scheme: scheme, project: project, generatedProject: generatedProject)
let testableTargetReference = got!.testables[0]
XCTAssertEqual(testableTargetReference.skipped, false)
XCTAssertEqual(testableTargetReference.parallelizable, true)
XCTAssertEqual(testableTargetReference.randomExecutionOrdering, true)
}
func test_schemeBuildAction() {
let target = Target.test(name: "App", product: .app)
let pbxTarget = PBXNativeTarget(name: "App")
@ -268,7 +290,7 @@ final class SchemeGeneratorTests: XCTestCase {
let pbxTarget = PBXNativeTarget(name: "App")
let buildAction = BuildAction.test(targets: ["Library"])
let testAction = TestAction.test(targets: ["Library"])
let testAction = TestAction.test(targets: [TestableTarget(target: "Library")])
let scheme = Scheme.test(name: "Library", buildAction: buildAction, testAction: testAction, runAction: nil)
@ -321,7 +343,7 @@ final class SchemeGeneratorTests: XCTestCase {
let target = Target.test(name: "Library", platform: .iOS, product: .dynamicLibrary)
let buildAction = BuildAction.test(targets: ["Library"])
let testAction = TestAction.test(targets: ["Library"])
let testAction = TestAction.test(targets: [TestableTarget(target: "Library")])
let scheme = Scheme.test(name: "Library", buildAction: buildAction, testAction: testAction, runAction: nil)
let project = Project.test(path: AbsolutePath("/project.xcodeproj"), targets: [target])

View File

@ -819,7 +819,8 @@ class GeneratorModelLoaderTest: TuistUnitTestCase {
matches manifest: ProjectDescription.TestAction,
file: StaticString = #file,
line: UInt = #line) {
XCTAssertEqual(testAction.targets, manifest.targets, file: file, line: line)
let targets = manifest.targets.map { TestableTarget.from(manifest: $0) }
XCTAssertEqual(testAction.targets, targets, file: file, line: line)
XCTAssertTrue(testAction.configurationName == manifest.configurationName, file: file, line: line)
XCTAssertEqual(testAction.coverage, manifest.coverage, file: file, line: line)
optionalAssert(testAction.arguments, manifest.arguments) {

View File

@ -100,7 +100,7 @@ extension BuildAction {
}
extension TestAction {
static func test(targets: [String] = [],
static func test(targets: [TestableTarget] = [],
arguments: Arguments? = nil,
config: PresetBuildConfiguration = .debug,
coverage: Bool = true) -> TestAction {