func generate()

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()
    }