@@ -13,6 +13,7 @@ import TestSupport
13
13
import PackageDescription
14
14
import PackageGraph
15
15
import PackageModel
16
+ import SourceControl
16
17
@testable import Xcodeproj
17
18
import Utility
18
19
import XCTest
@@ -76,7 +77,7 @@ class GenerateXcodeprojTests: XCTestCase {
76
77
let options = XcodeprojOptions ( xcconfigOverrides: AbsolutePath ( " /doesntexist " ) )
77
78
do {
78
79
_ = try xcodeProject ( xcodeprojPath: AbsolutePath . root. appending ( component: " xcodeproj " ) ,
79
- graph: graph, extraDirs: [ ] , options: options, fileSystem: fileSystem, diagnostics: diagnostics)
80
+ graph: graph, extraDirs: [ ] , extraFiles : [ ] , options: options, fileSystem: fileSystem, diagnostics: diagnostics)
80
81
XCTFail ( " Project generation should have failed " )
81
82
} catch ProjectGenerationError . xcconfigOverrideNotFound( let path) {
82
83
XCTAssertEqual ( options. xcconfigOverrides, path)
@@ -94,16 +95,144 @@ class GenerateXcodeprojTests: XCTestCase {
94
95
XCTAssertFalse ( diagnostics. hasErrors)
95
96
96
97
_ = try xcodeProject ( xcodeprojPath: AbsolutePath . root. appending ( component: " xcodeproj " ) ,
97
- graph: graph, extraDirs: [ ] , options: XcodeprojOptions ( ) , fileSystem: fileSystem, diagnostics: diagnostics,
98
+ graph: graph, extraDirs: [ ] , extraFiles : [ ] , options: XcodeprojOptions ( ) , fileSystem: fileSystem, diagnostics: diagnostics,
98
99
warningStream: warningStream)
99
100
100
101
let warnings = warningStream. bytes. asReadableString
101
102
XCTAssertTrue ( warnings. contains ( " warning: Target ' \( moduleName) ' conflicts with required framework filenames, rename this target to avoid conflicts. " ) )
102
103
}
103
104
105
+ func testGenerateXcodeprojWithoutGitRepo( ) {
106
+ mktmpdir { dstdir in
107
+
108
+ let packagePath = dstdir. appending ( component: " Foo " )
109
+ let modulePath = packagePath. appending ( components: " Sources " , " DummyModule " )
110
+ try makeDirectories ( modulePath)
111
+ try localFileSystem. writeFileContents ( modulePath. appending ( component: " dummy.swift " ) , bytes: " dummy_data " )
112
+ try localFileSystem. writeFileContents ( packagePath. appending ( component: " a.txt " ) , bytes: " dummy_data " )
113
+
114
+ let diagnostics = DiagnosticsEngine ( )
115
+ let graph = loadMockPackageGraph ( [ packagePath. asString: Package ( name: " Foo " ) ] , root: packagePath. asString, diagnostics: diagnostics, in: localFileSystem)
116
+ XCTAssertFalse ( diagnostics. hasErrors)
117
+
118
+ let projectName = " DummyProjectName "
119
+ let outpath = Xcodeproj . buildXcodeprojPath ( outputDir: dstdir, projectName: projectName)
120
+ let project = try Xcodeproj . generate ( projectName: projectName, xcodeprojPath: outpath, graph: graph, options: XcodeprojOptions ( ) , diagnostics: diagnostics)
121
+
122
+ XCTAssertFalse ( project. mainGroup. subitems. contains { $0. path == " a.txt " } )
123
+ }
124
+ }
125
+
126
+ func testGenerateXcodeprojWithDotFiles( ) {
127
+ mktmpdir { dstdir in
128
+
129
+ let packagePath = dstdir. appending ( component: " Foo " )
130
+ let modulePath = packagePath. appending ( components: " Sources " , " DummyModule " )
131
+ try makeDirectories ( modulePath)
132
+ try localFileSystem. writeFileContents ( modulePath. appending ( component: " dummy.swift " ) , bytes: " dummy_data " )
133
+ try localFileSystem. writeFileContents ( packagePath. appending ( component: " .a.txt " ) , bytes: " dummy_data " )
134
+
135
+ initGitRepo ( packagePath, addFile: false )
136
+
137
+ let diagnostics = DiagnosticsEngine ( )
138
+ let graph = loadMockPackageGraph ( [ packagePath. asString: Package ( name: " Foo " ) ] , root: packagePath. asString, diagnostics: diagnostics, in: localFileSystem)
139
+ XCTAssertFalse ( diagnostics. hasErrors)
140
+
141
+ let projectName = " DummyProjectName "
142
+ let outpath = Xcodeproj . buildXcodeprojPath ( outputDir: dstdir, projectName: projectName)
143
+ let project = try Xcodeproj . generate ( projectName: projectName, xcodeprojPath: outpath, graph: graph, options: XcodeprojOptions ( ) , diagnostics: diagnostics)
144
+
145
+ XCTAssertFalse ( project. mainGroup. subitems. contains { $0. path == " .a.txt " } )
146
+ }
147
+ }
148
+
149
+ func testGenerateXcodeprojWithRootFiles( ) {
150
+ mktmpdir { dstdir in
151
+
152
+ let packagePath = dstdir. appending ( component: " Foo " )
153
+ let modulePath = packagePath. appending ( components: " Sources " , " DummyModule " )
154
+ try makeDirectories ( modulePath)
155
+ try localFileSystem. writeFileContents ( modulePath. appending ( component: " dummy.swift " ) , bytes: " dummy_data " )
156
+ try localFileSystem. writeFileContents ( packagePath. appending ( component: " a.txt " ) , bytes: " dummy_data " )
157
+
158
+ initGitRepo ( packagePath, addFile: false )
159
+
160
+ let diagnostics = DiagnosticsEngine ( )
161
+ let graph = loadMockPackageGraph ( [ packagePath. asString: Package ( name: " Foo " ) ] , root: packagePath. asString, diagnostics: diagnostics, in: localFileSystem)
162
+ XCTAssertFalse ( diagnostics. hasErrors)
163
+
164
+ let projectName = " DummyProjectName "
165
+ let outpath = Xcodeproj . buildXcodeprojPath ( outputDir: dstdir, projectName: projectName)
166
+ let project = try Xcodeproj . generate ( projectName: projectName, xcodeprojPath: outpath, graph: graph, options: XcodeprojOptions ( ) , diagnostics: diagnostics)
167
+
168
+ XCTAssertTrue ( project. mainGroup. subitems. contains { $0. path == " a.txt " } )
169
+ }
170
+ }
171
+
172
+ func testGenerateXcodeprojWithNonSourceFilesInSourceDirectories( ) {
173
+ mktmpdir { dstdir in
174
+
175
+ let packagePath = dstdir. appending ( component: " Foo " )
176
+ let modulePath = packagePath. appending ( components: " Sources " , " DummyModule " )
177
+ try makeDirectories ( modulePath)
178
+ try localFileSystem. writeFileContents ( modulePath. appending ( component: " dummy.swift " ) , bytes: " dummy_data " )
179
+ try localFileSystem. writeFileContents ( modulePath. appending ( component: " a.txt " ) , bytes: " dummy_data " )
180
+
181
+ initGitRepo ( packagePath, addFile: false )
182
+
183
+ let diagnostics = DiagnosticsEngine ( )
184
+ let graph = loadMockPackageGraph ( [ packagePath. asString: Package ( name: " Foo " ) ] , root: packagePath. asString, diagnostics: diagnostics, in: localFileSystem)
185
+ XCTAssertFalse ( diagnostics. hasErrors)
186
+
187
+ let projectName = " DummyProjectName "
188
+ let outpath = Xcodeproj . buildXcodeprojPath ( outputDir: dstdir, projectName: projectName)
189
+ let project = try Xcodeproj . generate ( projectName: projectName, xcodeprojPath: outpath, graph: graph, options: XcodeprojOptions ( ) , diagnostics: diagnostics)
190
+
191
+ let sources = project. mainGroup. subitems [ 1 ] as? Xcode . Group
192
+ let dummyModule = sources? . subitems [ 0 ] as? Xcode . Group
193
+ let aTxt = dummyModule? . subitems [ 0 ]
194
+
195
+ XCTAssertEqual ( aTxt? . path, " a.txt " )
196
+ }
197
+ }
198
+
199
+ func testGenerateXcodeprojWithFilesIgnoredByGit( ) {
200
+ mktmpdir { dstdir in
201
+
202
+ let packagePath = dstdir. appending ( component: " Foo " )
203
+ let modulePath = packagePath. appending ( components: " Sources " , " DummyModule " )
204
+
205
+ try makeDirectories ( modulePath)
206
+ try localFileSystem. writeFileContents ( modulePath. appending ( component: " dummy.swift " ) , bytes: " dummy_data " )
207
+
208
+ initGitRepo ( packagePath, addFile: false )
209
+ // Add a .gitignore
210
+ try localFileSystem. writeFileContents ( packagePath. appending ( component: " .gitignore " ) , bytes: " ignored_file " )
211
+ try localFileSystem. writeFileContents ( modulePath. appending ( component: " ignored_file " ) , bytes: " dummy_data " )
212
+ try localFileSystem. writeFileContents ( packagePath. appending ( component: " ignored_file " ) , bytes: " dummy_data " )
213
+
214
+ let diagnostics = DiagnosticsEngine ( )
215
+ let graph = loadMockPackageGraph ( [ packagePath. asString: Package ( name: " Foo " ) ] , root: packagePath. asString, diagnostics: diagnostics, in: localFileSystem)
216
+ XCTAssertFalse ( diagnostics. hasErrors)
217
+
218
+ let projectName = " DummyProjectName "
219
+ let outpath = Xcodeproj . buildXcodeprojPath ( outputDir: dstdir, projectName: projectName)
220
+ let project = try Xcodeproj . generate ( projectName: projectName, xcodeprojPath: outpath, graph: graph, options: XcodeprojOptions ( ) , diagnostics: diagnostics)
221
+
222
+ let sources = project. mainGroup. subitems [ 1 ] as? Xcode . Group
223
+ let dummyModule = sources? . subitems [ 0 ] as? Xcode . Group
224
+
225
+ XCTAssertEqual ( dummyModule? . subitems. count, 1 )
226
+ XCTAssertFalse ( project. mainGroup. subitems. contains { $0. path == " ignored_file " } )
227
+ }
228
+ }
229
+
104
230
static var allTests = [
105
231
( " testXcodebuildCanParseIt " , testXcodebuildCanParseIt) ,
106
232
( " testXcconfigOverrideValidatesPath " , testXcconfigOverrideValidatesPath) ,
107
233
( " testGenerateXcodeprojWithInvalidModuleNames " , testGenerateXcodeprojWithInvalidModuleNames) ,
234
+ ( " testGenerateXcodeprojWithRootFiles " , testGenerateXcodeprojWithRootFiles) ,
235
+ ( " testGenerateXcodeprojWithNonSourceFilesInSourceDirectories " , testGenerateXcodeprojWithNonSourceFilesInSourceDirectories) ,
236
+ ( " testGenerateXcodeprojWithFilesIgnoredByGit " , testGenerateXcodeprojWithFilesIgnoredByGit) ,
108
237
]
109
238
}
0 commit comments