import Commander
import Testing
@testable import PeekabooCLI
@Suite("Commander Binder Program Resolution (MCP + Window)")
struct CommanderBinderMCPWindowTests {
@Test("Commander program resolves MCP serve options")
@MainActor
func commanderResolvesMcpServe() throws {
let descriptors = CommanderRegistryBuilder.buildDescriptors()
let program = Program(descriptors: descriptors.map(\.metadata))
let invocation = try program.resolve(argv: [
"peekaboo",
"mcp",
"serve",
"--transport", "http",
"--port", "9090"
])
let values = invocation.parsedValues
#expect(values.options["transport"] == ["http"])
#expect(values.options["port"] == ["9090"])
}
@Test("Commander program resolves window close options")
@MainActor
func commanderResolvesWindowClose() throws {
let descriptors = CommanderRegistryBuilder.buildDescriptors()
let program = Program(descriptors: descriptors.map(\.metadata))
let invocation = try program.resolve(argv: [
"peekaboo",
"window",
"close",
"--app", "Safari",
"--window-title", "Inbox"
])
let values = invocation.parsedValues
#expect(values.options["app"] == ["Safari"])
#expect(values.options["windowTitle"] == ["Inbox"])
}
@Test("Commander program resolves window move options")
@MainActor
func commanderResolvesWindowMove() throws {
let descriptors = CommanderRegistryBuilder.buildDescriptors()
let program = Program(descriptors: descriptors.map(\.metadata))
let invocation = try program.resolve(argv: [
"peekaboo",
"window",
"move",
"--app", "Notes",
"--x", "120",
"--y", "240"
])
let values = invocation.parsedValues
#expect(values.options["app"] == ["Notes"])
#expect(values.options["x"] == ["120"])
#expect(values.options["y"] == ["240"])
}
@Test("Commander program resolves window focus options")
@MainActor
func commanderResolvesWindowFocus() throws {
let descriptors = CommanderRegistryBuilder.buildDescriptors()
let program = Program(descriptors: descriptors.map(\.metadata))
let invocation = try program.resolve(argv: [
"peekaboo",
"window",
"focus",
"--app", "Safari",
"--window-title", "Inbox",
"--space-switch",
"--bring-to-current-space"
])
let values = invocation.parsedValues
#expect(values.options["app"] == ["Safari"])
#expect(values.options["windowTitle"] == ["Inbox"])
#expect(values.flags.contains("spaceSwitch"))
#expect(values.flags.contains("bringToCurrentSpace"))
}
@Test("Commander program resolves app launch options")
@MainActor
func commanderResolvesAppLaunch() throws {
let descriptors = CommanderRegistryBuilder.buildDescriptors()
let program = Program(descriptors: descriptors.map(\.metadata))
let invocation = try program.resolve(argv: [
"peekaboo",
"app",
"launch",
"\"Visual Studio Code\"",
"--bundle-id", "com.microsoft.VSCode",
"--wait-until-ready"
])
let values = invocation.parsedValues
#expect(values.positional == ["\"Visual Studio Code\""])
#expect(values.options["bundleId"] == ["com.microsoft.VSCode"])
#expect(values.flags.contains("waitUntilReady"))
}
@Test("Commander program resolves app quit options")
@MainActor
func commanderResolvesAppQuit() throws {
let descriptors = CommanderRegistryBuilder.buildDescriptors()
let program = Program(descriptors: descriptors.map(\.metadata))
let invocation = try program.resolve(argv: [
"peekaboo",
"app",
"quit",
"--all",
"--except", "Finder,Terminal",
"--force"
])
let values = invocation.parsedValues
#expect(values.flags.contains("all"))
#expect(values.options["except"] == ["Finder,Terminal"])
#expect(values.flags.contains("force"))
}
@Test("Commander program resolves menu click options")
@MainActor
func commanderResolvesMenuClick() throws {
let descriptors = CommanderRegistryBuilder.buildDescriptors()
let program = Program(descriptors: descriptors.map(\.metadata))
let invocation = try program.resolve(argv: [
"peekaboo",
"menu",
"click",
"--app", "Safari",
"--path", "File > New",
"--no-auto-focus"
])
let values = invocation.parsedValues
#expect(values.options["app"] == ["Safari"])
#expect(values.options["path"] == ["File > New"])
#expect(values.flags.contains("noAutoFocus"))
}
@Test("Commander program resolves permissions default subcommand")
@MainActor
func commanderResolvesPermissionsDefault() throws {
let descriptors = CommanderRegistryBuilder.buildDescriptors()
let program = Program(descriptors: descriptors.map(\.metadata))
let invocation = try program.resolve(argv: [
"peekaboo",
"permissions",
"--json"
])
#expect(invocation.path == ["permissions", "status"])
#expect(invocation.parsedValues.flags.contains("jsonOutput"))
}
@Test("Commander program resolves tools command options")
@MainActor
func commanderResolvesToolsCommand() throws {
let descriptors = CommanderRegistryBuilder.buildDescriptors()
let program = Program(descriptors: descriptors.map(\.metadata))
let invocation = try program.resolve(argv: [
"peekaboo",
"tools",
"--no-sort",
"--verbose"
])
let values = invocation.parsedValues
#expect(values.flags.contains("noSort"))
#expect(values.flags.contains("verbose"))
}
}