From f2a72e338212c9b109a304fd83f7e949d6ddb69b Mon Sep 17 00:00:00 2001 From: Maksym Prokopchuk Date: Thu, 28 Nov 2019 00:09:11 +0100 Subject: [PATCH] Add Testable instead of Target in TestAction --- Sources/ProjectDescription/Scheme.swift | 24 +++++++++++++-- Sources/TuistCore/Models/Scheme.swift | 18 +++++++++-- .../Models/Scheme+TestData.swift | 2 +- .../Generator/SchemesGenerator.swift | 14 +++++---- .../Generator/GeneratorModelLoader.swift | 11 ++++++- .../Generator/SchemesGeneratorTests.swift | 30 ++++++++++++++++--- .../Generator/GeneratorModelLoaderTests.swift | 3 +- .../ProjectDescription+TestData.swift | 2 +- 8 files changed, 86 insertions(+), 18 deletions(-) diff --git a/Sources/ProjectDescription/Scheme.swift b/Sources/ProjectDescription/Scheme.swift index 7a0e4f543..ee3465c48 100644 --- a/Sources/ProjectDescription/Scheme.swift +++ b/Sources/ProjectDescription/Scheme.swift @@ -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 { diff --git a/Sources/TuistCore/Models/Scheme.swift b/Sources/TuistCore/Models/Scheme.swift index 3a01663f0..4cb6b8201 100644 --- a/Sources/TuistCore/Models/Scheme.swift +++ b/Sources/TuistCore/Models/Scheme.swift @@ -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 diff --git a/Sources/TuistCoreTesting/Models/Scheme+TestData.swift b/Sources/TuistCoreTesting/Models/Scheme+TestData.swift index 70ff6146a..aaf985e13 100644 --- a/Sources/TuistCoreTesting/Models/Scheme+TestData.swift +++ b/Sources/TuistCoreTesting/Models/Scheme+TestData.swift @@ -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, diff --git a/Sources/TuistGenerator/Generator/SchemesGenerator.swift b/Sources/TuistGenerator/Generator/SchemesGenerator.swift index c59681698..f2a3e5ed9 100644 --- a/Sources/TuistGenerator/Generator/SchemesGenerator.swift +++ b/Sources/TuistGenerator/Generator/SchemesGenerator.swift @@ -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) } diff --git a/Sources/TuistKit/Generator/GeneratorModelLoader.swift b/Sources/TuistKit/Generator/GeneratorModelLoader.swift index d6e9cb28c..8e311cc12 100644 --- a/Sources/TuistKit/Generator/GeneratorModelLoader.swift +++ b/Sources/TuistKit/Generator/GeneratorModelLoader.swift @@ -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 diff --git a/Tests/TuistGeneratorTests/Generator/SchemesGeneratorTests.swift b/Tests/TuistGeneratorTests/Generator/SchemesGeneratorTests.swift index fe6984474..d029c2767 100644 --- a/Tests/TuistGeneratorTests/Generator/SchemesGeneratorTests.swift +++ b/Tests/TuistGeneratorTests/Generator/SchemesGeneratorTests.swift @@ -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]) diff --git a/Tests/TuistKitTests/Generator/GeneratorModelLoaderTests.swift b/Tests/TuistKitTests/Generator/GeneratorModelLoaderTests.swift index cb3d011dd..c43cff3c8 100644 --- a/Tests/TuistKitTests/Generator/GeneratorModelLoaderTests.swift +++ b/Tests/TuistKitTests/Generator/GeneratorModelLoaderTests.swift @@ -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) { diff --git a/Tests/TuistKitTests/Generator/TestData/ProjectDescription+TestData.swift b/Tests/TuistKitTests/Generator/TestData/ProjectDescription+TestData.swift index c1561e0de..60eb6fc3e 100644 --- a/Tests/TuistKitTests/Generator/TestData/ProjectDescription+TestData.swift +++ b/Tests/TuistKitTests/Generator/TestData/ProjectDescription+TestData.swift @@ -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 {