-
-
Notifications
You must be signed in to change notification settings - Fork 17
Expand file tree
/
Copy pathXcodeProjectParserLiveTests.swift
More file actions
106 lines (97 loc) · 5.54 KB
/
XcodeProjectParserLiveTests.swift
File metadata and controls
106 lines (97 loc) · 5.54 KB
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
@testable import XcodeProject
@testable import XcodeProjectParserLive
import FileSystemLive
import XCTest
final class XcodeProjectParserLiveTests: XCTestCase {
func testParsesProjectName() throws {
let parser = XcodeProjectParserLive(fileSystem: FileSystemMock())
let xcodeProject = try parser.parseProject(at: URL.Mock.exampleXcodeProject)
XCTAssertEqual(xcodeProject.name, "Example.xcodeproj")
}
func testParsesTargets() throws {
let parser = XcodeProjectParserLive(fileSystem: FileSystemMock())
let xcodeProject = try parser.parseProject(at: URL.Mock.exampleXcodeProject)
let exampleTarget = xcodeProject.targets.first { $0.name == "Example" }
let exampleTestsTarget = xcodeProject.targets.first { $0.name == "ExampleTests" }
let exampleUITestsTarget = xcodeProject.targets.first { $0.name == "ExampleUITests" }
XCTAssertNotNil(exampleTarget)
XCTAssertNotNil(exampleTestsTarget)
XCTAssertNotNil(exampleUITestsTarget)
}
func testParsesTargetPackageProductDependencies() throws {
let parser = XcodeProjectParserLive(fileSystem: FileSystemMock())
let xcodeProject = try parser.parseProject(at: URL.Mock.exampleXcodeProject)
let exampleTarget = xcodeProject.targets.first { $0.name == "Example" }
let packageProductDependencies = exampleTarget?.packageProductDependencies ?? []
XCTAssertTrue(packageProductDependencies.contains("Runestone"))
XCTAssertTrue(packageProductDependencies.contains("TreeSitterJSONRunestone"))
XCTAssertTrue(packageProductDependencies.contains("TreeSitterJavaScriptRunestone"))
XCTAssertTrue(packageProductDependencies.contains("ExampleLibraryA"))
XCTAssertTrue(packageProductDependencies.contains("ExampleLibraryB"))
}
func testSwiftPackageCount() throws {
// The example project contains 5 Swift packages:
// 2 remote and 3 local (2 of which are nested in group)
let parser = XcodeProjectParserLive(fileSystem: FileSystemLive())
let xcodeProject = try parser.parseProject(at: URL.Mock.exampleXcodeProject)
XCTAssertEqual(xcodeProject.swiftPackages.count, 5)
}
func testParsesLocalSwiftPackage() throws {
let parser = XcodeProjectParserLive(fileSystem: FileSystemMock())
let xcodeProject = try parser.parseProject(at: URL.Mock.exampleXcodeProject)
let swiftPackage = xcodeProject.swiftPackages.first { $0.name == "ExamplePackageA" }
XCTAssertNotNil(swiftPackage)
if case let .local(parameters) = swiftPackage {
XCTAssertEqual(parameters.name, "ExamplePackageA")
let fileURLHasPackageSwiftSuffix = parameters.fileURL.absoluteString.hasSuffix("ExamplePackageA/Package.swift")
XCTAssertTrue(fileURLHasPackageSwiftSuffix, "Expected file URL to end with the package name and Package.swift")
} else {
XCTFail("Expected ExamplePackageA to be a local package")
}
}
func testParsesLocalSwiftPackageInNestedGroupDirectory() throws {
let parser = XcodeProjectParserLive(fileSystem: FileSystemLive())
let xcodeProject = try parser.parseProject(at: URL.Mock.exampleXcodeProject)
let swiftPackage = xcodeProject.swiftPackages.first { $0.name == "ExamplePackageB" }
XCTAssertNotNil(swiftPackage)
if case let .local(parameters) = swiftPackage {
XCTAssertEqual(parameters.name, "ExamplePackageB")
let fileURLHasPackageSwiftSuffix = parameters.fileURL.absoluteString.hasSuffix("NestedPackages/ExamplePackageB/Package.swift")
XCTAssertTrue(fileURLHasPackageSwiftSuffix, "Expected file URL to end with the package name and Package.swift")
} else {
XCTFail("Expected ExamplePackageB to be a local package")
}
}
func testParsesRemoteSwiftPackageWithSingleProduct() throws {
let parser = XcodeProjectParserLive(fileSystem: FileSystemMock())
let xcodeProject = try parser.parseProject(at: URL.Mock.exampleXcodeProject)
let swiftPackage = xcodeProject.swiftPackages.first { $0.name == "Runestone" }
XCTAssertNotNil(swiftPackage)
if case let .remote(parameters) = swiftPackage {
XCTAssertEqual(parameters.name, "Runestone")
XCTAssertEqual(parameters.repositoryURL, URL(string: "https://github.com/simonbs/Runestone"))
XCTAssertEqual(parameters.products, ["Runestone"])
} else {
XCTFail("Expected Runestone to be a remote package")
}
}
func testParsesRemoteSwiftPackageWithMultipleProducts() throws {
let parser = XcodeProjectParserLive(fileSystem: FileSystemMock())
let xcodeProject = try parser.parseProject(at: URL.Mock.exampleXcodeProject)
let swiftPackage = xcodeProject.swiftPackages.first { $0.name == "TreeSitterLanguages" }
XCTAssertNotNil(swiftPackage)
if case let .remote(parameters) = swiftPackage {
XCTAssertEqual(parameters.name, "TreeSitterLanguages")
XCTAssertEqual(parameters.repositoryURL, URL(string: "git@github.com:simonbs/TreeSitterLanguages.git"))
XCTAssertTrue(parameters.products.contains("TreeSitterJSONRunestone"))
XCTAssertTrue(parameters.products.contains("TreeSitterJavaScriptRunestone"))
} else {
XCTFail("Expected TreeSitterLanguages to be a remote package")
}
}
}
private extension URL {
enum Mock {
static let exampleXcodeProject = Bundle.module.url(forResource: "Example/Example", withExtension: "xcodeproj")!
}
}