in Sources/Commands/GenerateLinuxMain.swift [42:124]
func generate() throws {
// Create the module struct from input.
//
// This converts the input test suite into a structure that
// is more suitable for generating linux test entries.
let modulesBuilder = ModulesBuilder()
for suite in testSuites {
modulesBuilder.add(suite.tests)
}
let modules = modulesBuilder.build().sorted(by: { $0.name < $1.name })
// Generate manifest file for each test module we got from XCTest discovery.
for module in modules {
guard let target = graph.reachableTargets.first(where: { $0.c99name == module.name }) else {
print("warning: did not find target '\(module.name)'")
continue
}
assert(target.type == .test, "Unexpected target type \(target.type) for \(target)")
// Write the manifest file for this module.
let testManifest = target.sources.root.appending(component: "XCTestManifests.swift")
let stream = try LocalFileOutputByteStream(testManifest)
stream <<< "#if !canImport(ObjectiveC)" <<< "\n"
stream <<< "import XCTest" <<< "\n"
for klass in module.classes.lazy.sorted(by: { $0.name < $1.name }) {
stream <<< "\n"
stream <<< "extension " <<< klass.name <<< " {" <<< "\n"
stream <<< indent(4) <<< "// DO NOT MODIFY: This is autogenerated, use:\n"
stream <<< indent(4) <<< "// `swift test --generate-linuxmain`\n"
stream <<< indent(4) <<< "// to regenerate.\n"
stream <<< indent(4) <<< "static let __allTests__\(klass.name) = [" <<< "\n"
for method in klass.methods {
stream <<< indent(8) <<< "(\"\(method)\", \(method))," <<< "\n"
}
stream <<< indent(4) <<< "]" <<< "\n"
stream <<< "}" <<< "\n"
}
stream <<<
"""
public func __allTests() -> [XCTestCaseEntry] {
return [
"""
for klass in module.classes {
stream <<< indent(8) <<< "testCase(" <<< klass.name <<< ".__allTests__\(klass.name))," <<< "\n"
}
stream <<< """
]
}
#endif
"""
stream.flush()
}
/// Write LinuxMain.swift file.
guard let testTarget = graph.reachableProducts.first(where: { $0.type == .test })?.targets.first else {
throw Error.noTestTargets
}
guard let linuxMainFileName = SwiftTarget.testManifestNames.first(where: { $0.lowercased().hasPrefix("linux") }) else {
throw InternalError("Unknown linux main file name")
}
let linuxMain = testTarget.sources.root.parentDirectory.appending(components: linuxMainFileName)
let stream = try LocalFileOutputByteStream(linuxMain)
stream <<< "import XCTest" <<< "\n\n"
for module in modules {
stream <<< "import " <<< module.name <<< "\n"
}
stream <<< "\n"
stream <<< "var tests = [XCTestCaseEntry]()" <<< "\n"
for module in modules {
stream <<< "tests += \(module.name).__allTests()" <<< "\n"
}
stream <<< "\n"
stream <<< "XCTMain(tests)" <<< "\n"
stream.flush()
}