native macOS codings agent orchestrator prowl.onev.cat
Something went wrong. Try again.
Swift
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217import Testing
@testable import Prowl
@MainActorstruct TerminalTabManagerTests { @Test func customTitleOverridesDisplayTitleWithoutFreezingLiveTitle() { let manager = TerminalTabManager() let tabId = manager.createTab(title: "shell", icon: nil)
manager.setCustomTitle(tabId, title: " build ") manager.updateTitle(tabId, title: "npm test")
#expect(manager.tabs.first?.title == "npm test") #expect(manager.tabs.first?.customTitle == "build") #expect(manager.tabs.first?.displayTitle == "build") }
@Test func clearingCustomTitleRestoresLiveShellTitle() { let manager = TerminalTabManager() let tabId = manager.createTab(title: "shell", icon: nil)
manager.setCustomTitle(tabId, title: "build") manager.updateTitle(tabId, title: "npm test") manager.setCustomTitle(tabId, title: " ")
#expect(manager.tabs.first?.customTitle == nil) #expect(manager.tabs.first?.displayTitle == "npm test") }
@Test func updateTitleReportsDisplayTitleChange() { let manager = TerminalTabManager() let tabId = manager.createTab(title: "shell", icon: nil)
#expect(manager.updateTitle(tabId, title: "npm test") == true) #expect(manager.updateTitle(tabId, title: "npm test") == false) }
@Test func updateTitleReportsNoChangeWhenMaskedByCustomTitle() { let manager = TerminalTabManager() let tabId = manager.createTab(title: "shell", icon: nil) manager.setCustomTitle(tabId, title: "build")
// Live title moves but the custom title still masks the visible display. #expect(manager.updateTitle(tabId, title: "npm test") == false) #expect(manager.tabs.first?.displayTitle == "build") }
@Test func updateTitleReportsNoChangeForLockedTab() { let manager = TerminalTabManager() let tabId = manager.createTab(title: "RUN SCRIPT", icon: "play.fill", isTitleLocked: true)
#expect(manager.updateTitle(tabId, title: "npm run dev") == false) }
@Test func setCustomTitleReportsDisplayTitleChange() { let manager = TerminalTabManager() let tabId = manager.createTab(title: "shell", icon: nil)
#expect(manager.setCustomTitle(tabId, title: "build") == true) #expect(manager.setCustomTitle(tabId, title: "build") == false) // Clearing the custom title restores the live title, another visible change. #expect(manager.setCustomTitle(tabId, title: " ") == true) #expect(manager.tabs.first?.displayTitle == "shell") }
@Test func customTitleIgnoresLockedTabs() { let manager = TerminalTabManager() let tabId = manager.createTab(title: "RUN SCRIPT", icon: "play.fill", isTitleLocked: true)
manager.setCustomTitle(tabId, title: "build")
#expect(manager.tabs.first?.customTitle == nil) #expect(manager.tabs.first?.displayTitle == "RUN SCRIPT") }
@Test func editingTabIDIsDroppedWhenTabCloses() { let manager = TerminalTabManager() let tabId = manager.createTab(title: "one", icon: nil)
manager.beginTabRename(tabId) manager.closeTab(tabId)
#expect(manager.editingTabID == nil) }
@Test func createTabInsertsAfterSelection() { let manager = TerminalTabManager() let first = manager.createTab(title: "one", icon: nil) let second = manager.createTab(title: "two", icon: nil) manager.selectTab(first) let third = manager.createTab(title: "three", icon: nil) let ids = manager.tabs.map(\.id) #expect(ids == [first, third, second]) }
@Test func closeTabSelectsAdjacent() { let manager = TerminalTabManager() let first = manager.createTab(title: "one", icon: nil) let second = manager.createTab(title: "two", icon: nil) let third = manager.createTab(title: "three", icon: nil) manager.selectTab(second) manager.closeTab(second) #expect(manager.tabs.map(\.id) == [first, third]) #expect(manager.selectedTabId == first) }
@Test func closeToRightRemovesTrailingTabs() { let manager = TerminalTabManager() let first = manager.createTab(title: "one", icon: nil) let second = manager.createTab(title: "two", icon: nil) let third = manager.createTab(title: "three", icon: nil) manager.closeToRight(of: second) #expect(manager.tabs.map(\.id) == [first, second]) #expect(manager.tabs.contains { $0.id == third } == false) }
@Test func closeOthersLeavesSingleTab() { let manager = TerminalTabManager() let first = manager.createTab(title: "one", icon: nil) let second = manager.createTab(title: "two", icon: nil) _ = manager.createTab(title: "three", icon: nil) manager.closeOthers(keeping: second) #expect(manager.tabs.map(\.id) == [second]) #expect(manager.selectedTabId == second) #expect(manager.tabs.contains { $0.id == first } == false) }
@Test func reorderTabsUsesProvidedOrder() { let manager = TerminalTabManager() let first = manager.createTab(title: "one", icon: nil) let second = manager.createTab(title: "two", icon: nil) let third = manager.createTab(title: "three", icon: nil) manager.reorderTabs([third, first, second]) #expect(manager.tabs.map(\.id) == [third, first, second]) }
@Test func updateDirtyUpdatesTabState() { let manager = TerminalTabManager() let tabId = manager.createTab(title: "one", icon: nil) manager.updateDirty(tabId, isDirty: true) #expect(manager.tabs.first?.isDirty == true) manager.updateDirty(tabId, isDirty: false) #expect(manager.tabs.first?.isDirty == false) }
@Test func overrideIconLocksAndSetsIcon() { let manager = TerminalTabManager() let tabId = manager.createTab(title: "one", icon: "terminal") manager.overrideIcon(tabId, icon: "sparkles") #expect(manager.tabs.first?.icon == "sparkles") #expect(manager.tabs.first?.iconLock == .user) }
@Test func updateIconRespectsLock() { let manager = TerminalTabManager() let tabId = manager.createTab(title: "one", icon: "terminal") manager.overrideIcon(tabId, icon: "sparkles") manager.updateIcon(tabId, icon: "terminal") #expect(manager.tabs.first?.icon == "sparkles") }
@Test func clearIconOverrideUnlocksIcon() { let manager = TerminalTabManager() let tabId = manager.createTab(title: "one", icon: "terminal") manager.overrideIcon(tabId, icon: "sparkles") manager.clearIconOverride(tabId) #expect(manager.tabs.first?.iconLock == .auto) manager.updateIcon(tabId, icon: "play.fill") #expect(manager.tabs.first?.icon == "play.fill") }
@Test func setScriptIconAppliesAndFlags() { let manager = TerminalTabManager() let tabId = manager.createTab(title: "one", icon: "terminal") manager.setScriptIcon(tabId, icon: "play.fill") #expect(manager.tabs.first?.icon == "play.fill") #expect(manager.tabs.first?.iconLock == .script) }
@Test func updateIconYieldsToScriptLock() { let manager = TerminalTabManager() let tabId = manager.createTab(title: "one", icon: "terminal") manager.setScriptIcon(tabId, icon: "play.fill") manager.updateIcon(tabId, icon: "@asset:Npm") #expect(manager.tabs.first?.icon == "play.fill") }
@Test func userOverrideSupersedesScriptLock() { let manager = TerminalTabManager() let tabId = manager.createTab(title: "one", icon: "terminal") manager.setScriptIcon(tabId, icon: "play.fill") manager.overrideIcon(tabId, icon: "sparkles") #expect(manager.tabs.first?.icon == "sparkles") #expect(manager.tabs.first?.iconLock == .user) }
@Test func setScriptIconYieldsToUserLock() { let manager = TerminalTabManager() let tabId = manager.createTab(title: "one", icon: "terminal") manager.overrideIcon(tabId, icon: "sparkles") manager.setScriptIcon(tabId, icon: "play.fill") #expect(manager.tabs.first?.icon == "sparkles") #expect(manager.tabs.first?.iconLock == .user) }
@Test func clearIconOverrideReleasesScriptLock() { let manager = TerminalTabManager() let tabId = manager.createTab(title: "one", icon: "terminal") manager.setScriptIcon(tabId, icon: "play.fill") manager.clearIconOverride(tabId) #expect(manager.tabs.first?.iconLock == .auto) manager.updateIcon(tabId, icon: "@asset:Npm") #expect(manager.tabs.first?.icon == "@asset:Npm") }}