NSStatusItem menu-bar helper: MenuBarAgent (click/menu modes, dynamic icon/menu updates) + MenuBarItem (.action/.label/.separator) + MenuBarIcon. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
77 lines
2.1 KiB
Swift
77 lines
2.1 KiB
Swift
#if canImport(AppKit)
|
|
import XCTest
|
|
@testable import LilithMenuBar
|
|
|
|
final class MenuBarItemTests: XCTestCase {
|
|
|
|
func testActionItemStoresTitle() {
|
|
let item = MenuBarItem.action(title: "Quit", key: "q") {}
|
|
|
|
if case .action(let title, let key, _) = item {
|
|
XCTAssertEqual(title, "Quit")
|
|
XCTAssertEqual(key, "q")
|
|
} else {
|
|
XCTFail("Expected .action case")
|
|
}
|
|
}
|
|
|
|
func testActionItemDefaultKeyIsEmpty() {
|
|
let item = MenuBarItem.action(title: "About") {}
|
|
|
|
if case .action(_, let key, _) = item {
|
|
XCTAssertEqual(key, "")
|
|
} else {
|
|
XCTFail("Expected .action case")
|
|
}
|
|
}
|
|
|
|
func testSeparatorCase() {
|
|
let item = MenuBarItem.separator
|
|
|
|
if case .separator = item {
|
|
// pass
|
|
} else {
|
|
XCTFail("Expected .separator case")
|
|
}
|
|
}
|
|
|
|
func testActionHandlerIsInvocable() {
|
|
var called = false
|
|
let item = MenuBarItem.action(title: "Test") { called = true }
|
|
|
|
if case .action(_, _, let action) = item {
|
|
action()
|
|
XCTAssertTrue(called)
|
|
} else {
|
|
XCTFail("Expected .action case")
|
|
}
|
|
}
|
|
|
|
func testMenuItemTrampolineInvokesHandler() {
|
|
var invoked = false
|
|
let trampoline = MenuItemTrampoline { invoked = true }
|
|
trampoline.invoke(nil)
|
|
XCTAssertTrue(invoked)
|
|
}
|
|
|
|
func testMenuBarIconSFSymbolCase() {
|
|
let icon = MenuBarIcon.sfSymbol("star", accessibilityDescription: "Star")
|
|
if case .sfSymbol(let name, let desc) = icon {
|
|
XCTAssertEqual(name, "star")
|
|
XCTAssertEqual(desc, "Star")
|
|
} else {
|
|
XCTFail("Expected .sfSymbol case")
|
|
}
|
|
}
|
|
|
|
func testMenuBarIconNamedCase() {
|
|
let icon = MenuBarIcon.named("AppIcon", accessibilityDescription: "App")
|
|
if case .named(let name, let desc) = icon {
|
|
XCTAssertEqual(name, "AppIcon")
|
|
XCTAssertEqual(desc, "App")
|
|
} else {
|
|
XCTFail("Expected .named case")
|
|
}
|
|
}
|
|
}
|
|
#endif
|