// p4rse, Copyright 2026, Will Hawkins // // This file is part of p4rse. // // This file is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . import Foundation import Testing typealias Accessor = @convention(c) ( _ outValue: UnsafeMutableRawPointer, _ type: UnsafeRawPointer, _ hint: UnsafeRawPointer?, _ reserved: UInt ) -> CBool typealias TestContentRecord = ( kind: UInt32, reserved1: UInt32, accessor: Accessor?, context: UInt, reserved2: UInt ) func findPathEnv() -> [URL]? { for (key, value) in ProcessInfo().environment { if key == "PATH" { return value.split(separator: ":").map { URL(filePath: "\($0)") } } } return .none } func findInPath(_ what: String) -> URL? { guard let bin_paths = findPathEnv() else { return .none } let fm = FileManager() for bin_path in bin_paths { let sought = bin_path.appending(path: what) if fm.fileExists(atPath: sought.path) { return sought } } return .none } func swiftPath() -> URL? { return findInPath("swift") } func swiftRun(withArgs args: [String]) throws -> String? { let path = swiftPath()! let child = Process() let so = Pipe() let se = Pipe() child.standardOutput = so child.executableURL = path child.arguments = [ "run", "--ignore-lock" /* --ignore-lock needs to be early because it is a "location option". */, "--skip-build", ] + args try! child.run() let output = switch child.standardOutput { case let so as Pipe: String(data: try! so.fileHandleForReading.readToEnd()!, encoding: String.Encoding.ascii) default: Optional.none } return output } func swiftCliTestRunner(_ arg_gen: () -> [String], _ expected: String) async throws { let args = arg_gen() let run_output = try! swiftRun(withArgs: args) #expect(run_output == expected) } @attached(peer) public macro CliTest() = #externalMacro(module: "Macros", type: "CliTestDeclarationMacro")