Files
clipbored/tests/clipboredtests/AppDelegateTests.swift

141 lines
5.0 KiB
Swift
Raw Permalink Normal View History

2026-06-30 01:12:19 -07:00
import AppKit
import XCTest
@testable import ClipBored
final class AppDelegateTests: XCTestCase {
2026-06-30 02:25:52 -07:00
func testPresentationPlanMapsDockPreferenceToActivationPolicy() {
let dockless = AppDelegate.presentationPlan(
showMenuBarIcon: true,
showDockIcon: false,
changedSurface: nil
)
XCTAssertTrue(dockless.showMenuBarIcon)
XCTAssertFalse(dockless.showDockIcon)
XCTAssertEqual(dockless.activationPolicy, .accessory)
let dockVisible = AppDelegate.presentationPlan(
showMenuBarIcon: true,
showDockIcon: true,
changedSurface: nil
)
XCTAssertTrue(dockVisible.showMenuBarIcon)
XCTAssertTrue(dockVisible.showDockIcon)
XCTAssertEqual(dockVisible.activationPolicy, .regular)
}
func testPresentationPlanKeepsOneVisibleEntryPoint() {
let hidingMenuBar = AppDelegate.presentationPlan(
showMenuBarIcon: false,
showDockIcon: false,
changedSurface: .menuBar
)
XCTAssertFalse(hidingMenuBar.showMenuBarIcon)
XCTAssertTrue(hidingMenuBar.showDockIcon)
XCTAssertEqual(hidingMenuBar.activationPolicy, .regular)
let hidingDock = AppDelegate.presentationPlan(
showMenuBarIcon: false,
showDockIcon: false,
changedSurface: .dock
)
XCTAssertTrue(hidingDock.showMenuBarIcon)
XCTAssertFalse(hidingDock.showDockIcon)
XCTAssertEqual(hidingDock.activationPolicy, .accessory)
}
2026-06-30 01:12:19 -07:00
func testStatusItemMenuRoutingSeparatesLeftAndRightClick() {
XCTAssertFalse(AppDelegate.shouldOpenStatusMenu(eventType: .leftMouseUp, modifierFlags: []))
XCTAssertTrue(AppDelegate.shouldOpenStatusMenu(eventType: .rightMouseUp, modifierFlags: []))
XCTAssertTrue(AppDelegate.shouldOpenStatusMenu(eventType: .leftMouseUp, modifierFlags: .control))
XCTAssertTrue(AppDelegate.shouldOpenStatusMenu(eventType: .otherMouseUp, modifierFlags: []))
XCTAssertFalse(AppDelegate.shouldOpenStatusMenu(eventType: .leftMouseDragged, modifierFlags: .control))
}
func testStatusMenuIncludesStateRowsAndBoundedActions() {
let settingsTitle = "Settings\u{2026}"
let presentation = AppDelegate.statusMenuPresentation(
historyCount: 42,
isCapturePaused: false,
captureStatus: "Captured text from Safari.",
pasteStatus: "",
shortcutStatus: "",
accessibilityStatus: "",
launchAtLoginStatus: ""
)
let menu = AppDelegate.makeStatusMenu(
presentation: presentation,
isCapturePaused: false,
openShortcut: AppConfiguration.defaultOpenShortcut,
settingsShortcut: AppConfiguration.defaultSettingsShortcut,
target: nil
)
XCTAssertEqual(
menu.items.map { $0.isSeparatorItem ? "-" : $0.title },
[
"ClipBored",
"Capture Running - 42 clips",
"Captured text from Safari.",
"-",
"Show Clipboard",
settingsTitle,
"-",
"Pause Capture",
"-",
"Quit ClipBored"
]
)
let showClipboard = menu.items.first { $0.title == "Show Clipboard" }
XCTAssertEqual(showClipboard?.keyEquivalent, "v")
XCTAssertTrue(showClipboard?.keyEquivalentModifierMask.contains(.command) == true)
XCTAssertTrue(showClipboard?.keyEquivalentModifierMask.contains(.option) == true)
let settings = menu.items.first { $0.title == settingsTitle }
XCTAssertEqual(settings?.keyEquivalent, ",")
XCTAssertTrue(settings?.keyEquivalentModifierMask.contains(.command) == true)
}
func testStatusMenuPausedStateTakesPriorityOverOlderCaptureStatus() {
let presentation = AppDelegate.statusMenuPresentation(
historyCount: 1,
isCapturePaused: true,
captureStatus: "Captured link from Safari.",
pasteStatus: "Copied",
shortcutStatus: "",
accessibilityStatus: "",
launchAtLoginStatus: ""
)
let menu = AppDelegate.makeStatusMenu(
presentation: presentation,
isCapturePaused: true,
openShortcut: AppConfiguration.defaultOpenShortcut,
settingsShortcut: AppConfiguration.defaultSettingsShortcut,
target: nil
)
XCTAssertEqual(presentation.summary, "Capture Paused - 1 clip")
XCTAssertEqual(presentation.detail, "Capture is paused.")
XCTAssertEqual(menu.items.first { $0.title == "Resume Capture" }?.state, .on)
XCTAssertNil(menu.items.first { $0.title == "Pause Capture" })
}
func testStatusMenuPresentationTruncatesLongStatusText() {
let presentation = AppDelegate.statusMenuPresentation(
historyCount: 2000,
isCapturePaused: false,
captureStatus: "Skipped:\n" + String(repeating: "A very long ignored source application name ", count: 4),
pasteStatus: "",
shortcutStatus: "",
accessibilityStatus: "",
launchAtLoginStatus: ""
)
XCTAssertEqual(presentation.summary, "Capture Running - 2000 clips")
XCTAssertNotNil(presentation.detail)
XCTAssertLessThanOrEqual(presentation.detail?.count ?? 0, 68)
XCTAssertTrue(presentation.detail?.hasSuffix("...") == true)
XCTAssertFalse(presentation.detail?.contains("\n") == true)
}
}