-
-
Notifications
You must be signed in to change notification settings - Fork 509
/
TargetGeneratorTests.swift
160 lines (137 loc) · 6.87 KB
/
TargetGeneratorTests.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
import Basic
import Foundation
import XcodeProj
import XCTest
@testable import TuistGenerator
final class TargetGeneratorTests: XCTestCase {
var path: AbsolutePath!
var subject: TargetGenerator!
var pbxproj: PBXProj!
var pbxProject: PBXProject!
var fileElements: ProjectFileElements!
override func setUp() {
super.setUp()
path = AbsolutePath("/test")
pbxproj = PBXProj()
pbxProject = createPbxProject(pbxproj: pbxproj)
fileElements = ProjectFileElements([:], playgrounds: MockPlaygrounds())
subject = TargetGenerator()
}
func test_generateTarget_productName() throws {
// Given
let target = Target.test(name: "MyFramework",
product: .framework,
actions: [
TargetAction(name: "pre",
order: .pre,
tool: "echo",
arguments: ["pre1", "pre2"]),
TargetAction(name: "post",
order: .post,
tool: "echo",
path: "/tmp",
arguments: ["post1", "post2"],
inputFileListPaths: ["/tmp/b"],
outputFileListPaths: ["/tmp/d"]),
])
let project = Project.test(path: path, targets: [target])
let graph = Graph.test()
let groups = ProjectGroups.generate(project: project,
pbxproj: pbxproj,
sourceRootPath: path,
playgrounds: MockPlaygrounds())
try fileElements.generateProjectFiles(project: project,
graph: graph,
groups: groups,
pbxproj: pbxproj,
sourceRootPath: path)
// When
let generatedTarget = try subject.generateTarget(target: target,
pbxproj: pbxproj,
pbxProject: pbxProject,
projectSettings: Settings.test(),
groups: groups,
fileElements: fileElements,
path: path,
sourceRootPath: path,
options: GenerationOptions(),
graph: graph)
// Then
XCTAssertEqual(generatedTarget.name, "MyFramework")
XCTAssertEqual(generatedTarget.productNameWithExtension(), "MyFramework.framework")
XCTAssertEqual(generatedTarget.productType, .framework)
guard
let preBuildPhase = generatedTarget.buildPhases.first(where: { $0.name() == "pre" }),
let postBuildPhase = generatedTarget.buildPhases.first(where: { $0.name() == "post" }) else {
XCTFail("Failed to generate target with build phases pre and post")
return
}
XCTAssertEqual(preBuildPhase.inputFileListPaths, [])
XCTAssertEqual(preBuildPhase.outputFileListPaths, [])
XCTAssertEqual(postBuildPhase.inputFileListPaths, ["/tmp/b"])
XCTAssertEqual(postBuildPhase.outputFileListPaths, ["/tmp/d"])
}
func test_generateTargetDependencies() throws {
// Given
let targetA = Target.test(name: "TargetA")
let targetB = Target.test(name: "TargetB")
let nativeTargetA = createNativeTarget(for: targetA)
let nativeTargetB = createNativeTarget(for: targetB)
let graph = createGraph(project: .test(path: path),
dependencies: [
(target: targetA, dependencies: [targetB]),
(target: targetB, dependencies: []),
])
// When
try subject.generateTargetDependencies(path: path,
targets: [targetA, targetB],
nativeTargets: [
"TargetA": nativeTargetA,
"TargetB": nativeTargetB,
],
graph: graph)
// Then
XCTAssertEqual(nativeTargetA.dependencies.map(\.name), [
"TargetB",
])
}
// MARK: - Helpers
private func createTargetNodes(project: Project,
dependencies: [(target: Target, dependencies: [Target])]) -> [TargetNode] {
let nodesCache = Dictionary(uniqueKeysWithValues: dependencies.map {
($0.target.name, TargetNode(project: project,
target: $0.target,
dependencies: []))
})
dependencies.forEach {
let node = nodesCache[$0.target.name]!
node.dependencies = $0.dependencies.map { nodesCache[$0.name]! }
}
return dependencies.map { nodesCache[$0.target.name]! }
}
private func createGraph(project: Project,
dependencies: [(target: Target, dependencies: [Target])]) -> Graph {
let targetNodes = createTargetNodes(project: project, dependencies: dependencies)
let cache = GraphLoaderCache()
let graph = Graph.test(cache: cache)
targetNodes.forEach { cache.add(targetNode: $0) }
return graph
}
private func createNativeTarget(for target: Target) -> PBXNativeTarget {
let nativeTarget = PBXNativeTarget(name: target.name)
pbxproj.add(object: nativeTarget)
return nativeTarget
}
private func createPbxProject(pbxproj: PBXProj) -> PBXProject {
let configList = XCConfigurationList(buildConfigurations: [])
pbxproj.add(object: configList)
let mainGroup = PBXGroup()
pbxproj.add(object: mainGroup)
let pbxProject = PBXProject(name: "Project",
buildConfigurationList: configList,
compatibilityVersion: "0",
mainGroup: mainGroup)
pbxproj.add(object: pbxProject)
return pbxProject
}
}