native macOS codings agent orchestrator prowl.onev.cat
Something went wrong. Try again.
Swift
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202import Foundationimport Testing
@testable import Prowl
struct CanvasSelectionStateTests { private let tab1 = TerminalTabID(rawValue: UUID(uuidString: "00000000-0000-0000-0000-000000000001")!) private let tab2 = TerminalTabID(rawValue: UUID(uuidString: "00000000-0000-0000-0000-000000000002")!) private let tab3 = TerminalTabID(rawValue: UUID(uuidString: "00000000-0000-0000-0000-000000000003")!)
@Test func focusSingleSetsPrimaryAndClearsSelectionMode() { var state = CanvasSelectionState()
state.focusSingle(tab1)
#expect(state.mode == .idle) #expect(state.primaryTabID == tab1) #expect(state.selectedTabIDs == [tab1]) #expect(state.selectionOrder == [tab1]) }
@Test func toggleSelectionEntersSelectionModeAndAppendsOrder() { var state = CanvasSelectionState()
state.toggleSelection(tab1) state.toggleSelection(tab2)
#expect(state.mode == .selecting) #expect(state.primaryTabID == tab2) #expect(state.selectedTabIDs == [tab1, tab2]) #expect(state.selectionOrder == [tab1, tab2]) }
@Test func togglingSelectedPrimaryPromotesPreviousSelection() { var state = CanvasSelectionState() state.toggleSelection(tab1) state.toggleSelection(tab2) state.toggleSelection(tab3)
state.toggleSelection(tab3)
#expect(state.mode == .selecting) #expect(state.primaryTabID == tab2) #expect(state.selectedTabIDs == [tab1, tab2]) #expect(state.selectionOrder == [tab1, tab2]) }
@Test func togglingLastSelectedCardClearsState() { var state = CanvasSelectionState() state.toggleSelection(tab1)
state.toggleSelection(tab1)
#expect(state.mode == .idle) #expect(state.primaryTabID == nil) #expect(state.selectedTabIDs.isEmpty) #expect(state.selectionOrder.isEmpty) }
@Test func broadcastInteractionLeavesSelectionSetButExitsSelectionMode() { var state = CanvasSelectionState() state.toggleSelection(tab1) state.toggleSelection(tab2)
state.beginBroadcastInteractionIfNeeded()
#expect(state.mode == .idle) #expect(state.primaryTabID == tab2) #expect(state.selectedTabIDs == [tab1, tab2]) }
@Test func setPrimaryPromotesFollowerWithoutClearingSelection() { var state = CanvasSelectionState() state.toggleSelection(tab1) state.toggleSelection(tab2) state.toggleSelection(tab3) state.beginBroadcastInteractionIfNeeded()
state.setPrimary(tab1)
#expect(state.primaryTabID == tab1) #expect(state.selectedTabIDs == [tab1, tab2, tab3]) #expect(state.selectionOrder == [tab2, tab3, tab1]) }
@Test func setPrimaryIgnoresUnselectedTab() { var state = CanvasSelectionState() state.toggleSelection(tab1) state.toggleSelection(tab2)
state.setPrimary(tab3)
#expect(state.primaryTabID == tab2) #expect(state.selectedTabIDs == [tab1, tab2]) }
@Test func selectAllSelectsEveryTabAndKeepsExistingPrimary() { var state = CanvasSelectionState() state.focusSingle(tab2)
state.selectAll([tab1, tab2, tab3])
#expect(state.selectedTabIDs == [tab1, tab2, tab3]) #expect(state.primaryTabID == tab2) #expect(state.selectionOrder.last == tab2) #expect(state.mode == .idle) }
@Test func selectAllFromEmptyPicksLastTab() { var state = CanvasSelectionState()
state.selectAll([tab1, tab2, tab3])
#expect(state.selectedTabIDs == [tab1, tab2, tab3]) #expect(state.primaryTabID == tab3) }
@Test func pruneDropsMissingTabsAndPreservesNewestVisiblePrimary() { var state = CanvasSelectionState() state.toggleSelection(tab1) state.toggleSelection(tab2) state.toggleSelection(tab3)
state.prune(to: [tab1, tab2])
#expect(state.primaryTabID == tab2) #expect(state.selectedTabIDs == [tab1, tab2]) #expect(state.selectionOrder == [tab1, tab2]) }
@Test func pruneAutoAdvancingMovesPrimaryToForwardNeighborWhenClosed() { var state = CanvasSelectionState() state.focusSingle(tab2)
state.pruneAutoAdvancingPrimary( previousOrder: [tab1, tab2, tab3], currentOrder: [tab1, tab3] )
#expect(state.primaryTabID == tab3) #expect(state.selectedTabIDs == [tab3]) #expect(state.mode == .idle) }
@Test func pruneAutoAdvancingFallsBackToBackwardNeighborWhenLastClosed() { var state = CanvasSelectionState() state.focusSingle(tab3)
state.pruneAutoAdvancingPrimary( previousOrder: [tab1, tab2, tab3], currentOrder: [tab1, tab2] )
#expect(state.primaryTabID == tab2) #expect(state.selectedTabIDs == [tab2]) }
@Test func pruneAutoAdvancingClearsWhenAllCardsClosed() { var state = CanvasSelectionState() state.focusSingle(tab1)
state.pruneAutoAdvancingPrimary( previousOrder: [tab1], currentOrder: [] )
#expect(state.primaryTabID == nil) #expect(state.selectedTabIDs.isEmpty) }
@Test func pruneAutoAdvancingKeepsPrimaryWhenSurviving() { var state = CanvasSelectionState() state.focusSingle(tab2)
state.pruneAutoAdvancingPrimary( previousOrder: [tab1, tab2, tab3], currentOrder: [tab2, tab3] )
#expect(state.primaryTabID == tab2) #expect(state.selectedTabIDs == [tab2]) }
@Test func pruneAutoAdvancingPromotesRemainingBroadcastSelection() { var state = CanvasSelectionState() state.toggleSelection(tab1) state.toggleSelection(tab2) state.toggleSelection(tab3)
state.pruneAutoAdvancingPrimary( previousOrder: [tab1, tab2, tab3], currentOrder: [tab1, tab2] )
// Primary (tab3) closed while broadcasting. `prune` should promote the // newest surviving broadcast member instead of auto-advancing to a // non-selected neighbor. #expect(state.primaryTabID == tab2) #expect(state.selectedTabIDs == [tab1, tab2]) }}