From 202a699747474233d2b0280e2d6d94884a1f1bc7 Mon Sep 17 00:00:00 2001 From: Lawrence Chen Date: Mon, 23 Mar 2026 19:10:33 -0700 Subject: [PATCH 1/3] Add regression test for workspace insertion --- cmuxTests/WorkspaceUnitTests.swift | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/cmuxTests/WorkspaceUnitTests.swift b/cmuxTests/WorkspaceUnitTests.swift index 32cd30b2..2cfedc94 100644 --- a/cmuxTests/WorkspaceUnitTests.swift +++ b/cmuxTests/WorkspaceUnitTests.swift @@ -334,6 +334,21 @@ final class WorkspaceCreationPlacementTests: XCTestCase { XCTAssertEqual(insertedIndex, baselineCount) } + func testAddWorkspaceAfterCurrentOverrideAppendsAfterLastSelectedWorkspace() { + let manager = TabManager() + _ = manager.tabs[0] + _ = manager.addWorkspace() + _ = manager.addWorkspace() + let fourth = manager.addWorkspace() + let baselineOrder = manager.tabs.map(\.id) + + manager.selectWorkspace(fourth) + let inserted = manager.addWorkspace(placementOverride: .afterCurrent) + + XCTAssertEqual(manager.tabs.map(\.id).filter { $0 != inserted.id }, baselineOrder) + XCTAssertEqual(manager.tabs.last?.id, inserted.id) + } + private func makeManagerWithThreeWorkspaces() -> TabManager { let manager = TabManager() _ = manager.addWorkspace() From 1c45915a867f9a6a01bc7a6ab8d5fc99572ec326 Mon Sep 17 00:00:00 2001 From: Lawrence Chen Date: Mon, 23 Mar 2026 19:10:33 -0700 Subject: [PATCH 2/3] Avoid crash in workspace insert index --- Sources/TabManager.swift | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/Sources/TabManager.swift b/Sources/TabManager.swift index 96fc3349..273cc43a 100644 --- a/Sources/TabManager.swift +++ b/Sources/TabManager.swift @@ -2003,17 +2003,28 @@ class TabManager: ObservableObject { placementOverride: NewWorkspacePlacement? = nil ) -> Int { let placement = placementOverride ?? WorkspacePlacementSettings.current() - let pinnedCount = snapshot.tabs.filter { $0.isPinned }.count - let selectedIndex = snapshot.selectedTabId.flatMap { tabId in - snapshot.tabs.firstIndex(where: { $0.id == tabId }) + let tabs = snapshot.tabs + var pinnedCount = 0 + var selectedIndex: Int? + var selectedIsPinned = false + let selectedTabId = snapshot.selectedTabId + + for (index, tab) in tabs.enumerated() { + if tab.isPinned { + pinnedCount += 1 + } + if selectedIndex == nil, tab.id == selectedTabId { + selectedIndex = index + selectedIsPinned = tab.isPinned + } } - let selectedIsPinned = selectedIndex.map { snapshot.tabs[$0].isPinned } ?? false + return WorkspacePlacementSettings.insertionIndex( placement: placement, selectedIndex: selectedIndex, selectedIsPinned: selectedIsPinned, pinnedCount: pinnedCount, - totalCount: snapshot.tabs.count + totalCount: tabs.count ) } From 4f5a3174e615694b081781602d5e89f0daaa145f Mon Sep 17 00:00:00 2001 From: Lawrence Chen Date: Mon, 23 Mar 2026 19:16:39 -0700 Subject: [PATCH 3/3] Clarify workspace insertion regression test --- cmuxTests/WorkspaceUnitTests.swift | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cmuxTests/WorkspaceUnitTests.swift b/cmuxTests/WorkspaceUnitTests.swift index 2cfedc94..efe4f768 100644 --- a/cmuxTests/WorkspaceUnitTests.swift +++ b/cmuxTests/WorkspaceUnitTests.swift @@ -336,7 +336,10 @@ final class WorkspaceCreationPlacementTests: XCTestCase { func testAddWorkspaceAfterCurrentOverrideAppendsAfterLastSelectedWorkspace() { let manager = TabManager() - _ = manager.tabs[0] + guard !manager.tabs.isEmpty else { + XCTFail("Expected TabManager to initialise with at least one workspace") + return + } _ = manager.addWorkspace() _ = manager.addWorkspace() let fourth = manager.addWorkspace()