From 67989061b107d2e97b7a826ab95a553ca3a183f4 Mon Sep 17 00:00:00 2001 From: Mike Gerasimenko Date: Thu, 26 Mar 2026 10:31:12 +0100 Subject: [PATCH] Take in account direct test target dependencies in turbo mode --- .../DependencyCalculator.swift | 29 ++++++++++++++---- .../SelectiveTestingProjectTests.swift | 30 +++++++++++++++++-- 2 files changed, 51 insertions(+), 8 deletions(-) diff --git a/Sources/DependencyCalculator/DependencyCalculator.swift b/Sources/DependencyCalculator/DependencyCalculator.swift index 5df620d..aa63566 100644 --- a/Sources/DependencyCalculator/DependencyCalculator.swift +++ b/Sources/DependencyCalculator/DependencyCalculator.swift @@ -10,6 +10,18 @@ import Workspace public extension WorkspaceInfo { func affectedTargets(changedFiles: Set, incldueIndirectlyAffected: Bool = true) -> Set { + let directlyChanged = directlyChangedTargets(changedFiles: changedFiles) + + if incldueIndirectlyAffected { + let indirectlyAffected = indirectlyAffectedTargets(targets: directlyChanged) + return directlyChanged.union(indirectlyAffected) + } + + let directlyAffected = directlyAffectedTargets(targets: directlyChanged) + return directlyChanged.union(directlyAffected) + } + + private func directlyChangedTargets(changedFiles: Set) -> Set { var result = Set() for path in changedFiles { @@ -21,13 +33,18 @@ public extension WorkspaceInfo { logger.info("Changed file at \(path) appears not to belong to any target") } } - if incldueIndirectlyAffected { - let indirectlyAffected = indirectlyAffectedTargets(targets: result) - return result.union(indirectlyAffected) - } - else { - return result + + return result + } + + func directlyAffectedTargets(targets: Set) -> Set { + var result = Set() + + for targetAffected in targets { + result = result.union(dependencyStructure.affected(by: targetAffected)) } + + return result } internal func targetForFolder(_ path: Path) -> TargetIdentity? { diff --git a/Tests/SelectiveTestingTests/SelectiveTestingProjectTests.swift b/Tests/SelectiveTestingTests/SelectiveTestingProjectTests.swift index 938f59f..1b5ea3a 100644 --- a/Tests/SelectiveTestingTests/SelectiveTestingProjectTests.swift +++ b/Tests/SelectiveTestingTests/SelectiveTestingProjectTests.swift @@ -84,7 +84,9 @@ struct SelectiveTestingProjectTests { // then let result = try await tool.run() #expect(result == Set([ - testTool.mainProjectMainTarget() + testTool.mainProjectMainTarget(), + testTool.mainProjectTests(), + testTool.mainProjectUITests(), ])) } @@ -125,7 +127,31 @@ struct SelectiveTestingProjectTests { // then let result = try await tool.run() #expect(result == Set([ - testTool.mainProjectMainTarget() + testTool.mainProjectMainTarget(), + testTool.mainProjectTests(), + testTool.mainProjectUITests(), + ])) + } + + @Test + func projectTargetDependencyChange_turbo() async throws { + // given + let testTool = try IntegrationTestTool() + defer { try? testTool.tearDown() } + + let tool = try testTool.createSUT(config: nil, + basePath: "ExampleProject.xcodeproj", + turbo: true) + + // when + try testTool.changeFile(at: testTool.projectPath + "ExmapleTargetLibrary/ExampleTargetLibrary.swift") + + // then + let result = try await tool.run() + #expect(result == Set([ + testTool.mainProjectLibrary(), + testTool.mainProjectMainTarget(), + testTool.mainProjectLibraryTests(), ])) }