WIP: add clipboard stack workflow
This commit is contained in:
@@ -159,8 +159,10 @@ final class ClipboardPanelControllerTests: XCTestCase {
|
||||
}
|
||||
|
||||
func testModifiedShortcutsMapToPlainTextActions() {
|
||||
XCTAssertEqual(ClipboardPanelController.modifiedShortcutAction(forKeyCode: 1, modifiers: [.command, .shift]), .toggleStack)
|
||||
XCTAssertEqual(ClipboardPanelController.modifiedShortcutAction(forKeyCode: 8, modifiers: [.command, .shift]), .copyPlainText)
|
||||
XCTAssertEqual(ClipboardPanelController.modifiedShortcutAction(forKeyCode: 9, modifiers: [.command, .shift]), .pastePlainText)
|
||||
XCTAssertEqual(ClipboardPanelController.modifiedShortcutAction(forKeyCode: 36, modifiers: [.command, .shift]), .pasteStackNext)
|
||||
}
|
||||
|
||||
func testModifiedShortcutsRequireCommandShiftOnly() {
|
||||
|
||||
@@ -304,6 +304,69 @@ final class ClipboardPanelViewModelTests: XCTestCase {
|
||||
XCTAssertEqual(store.items.first?.useCount, 1)
|
||||
}
|
||||
|
||||
func testStackPastesQueuedItemsInOrderAndConsumesThem() {
|
||||
let settings = makeSettings()
|
||||
let cacheService = makeCacheService()
|
||||
let store = makeStore(settings: settings, cacheService: cacheService)
|
||||
let first = makeTextItem("first stacked clip", createdAt: Date(timeIntervalSince1970: 100))
|
||||
let second = makeTextItem("second stacked clip", createdAt: Date(timeIntervalSince1970: 200))
|
||||
store.upsert(first)
|
||||
store.upsert(second)
|
||||
store.flushPersistenceForTesting()
|
||||
|
||||
let viewModel = ClipboardPanelViewModel(store: store, settings: settings, cacheService: cacheService)
|
||||
waitForVisibleItems(in: viewModel, count: 2)
|
||||
|
||||
viewModel.selectItem(at: 1)
|
||||
viewModel.toggleSelectedStackMembership()
|
||||
viewModel.selectItem(at: 0)
|
||||
viewModel.toggleSelectedStackMembership()
|
||||
|
||||
XCTAssertEqual(viewModel.stackCount, 2)
|
||||
XCTAssertEqual(viewModel.statusMessage, "Added to Stack")
|
||||
|
||||
viewModel.pasteNextStackItem()
|
||||
store.flushPersistenceForTesting()
|
||||
|
||||
XCTAssertEqual(NSPasteboard.general.string(forType: .string), "first stacked clip")
|
||||
XCTAssertEqual(viewModel.statusMessage, "Copied from Stack")
|
||||
XCTAssertEqual(viewModel.stackCount, 1)
|
||||
XCTAssertEqual(store.items.first(where: { $0.id == first.id })?.useCount, 1)
|
||||
|
||||
viewModel.copyNextStackItem()
|
||||
store.flushPersistenceForTesting()
|
||||
|
||||
XCTAssertEqual(NSPasteboard.general.string(forType: .string), "second stacked clip")
|
||||
XCTAssertEqual(viewModel.statusMessage, "Copied from Stack")
|
||||
XCTAssertEqual(viewModel.stackCount, 0)
|
||||
}
|
||||
|
||||
func testStackToggleAndClearUpdateCount() {
|
||||
let settings = makeSettings()
|
||||
let cacheService = makeCacheService()
|
||||
let store = makeStore(settings: settings, cacheService: cacheService)
|
||||
store.upsert(makeTextItem("stack toggle clip", createdAt: Date(timeIntervalSince1970: 100)))
|
||||
store.flushPersistenceForTesting()
|
||||
|
||||
let viewModel = ClipboardPanelViewModel(store: store, settings: settings, cacheService: cacheService)
|
||||
waitForVisibleItems(in: viewModel, count: 1)
|
||||
|
||||
viewModel.toggleSelectedStackMembership()
|
||||
XCTAssertEqual(viewModel.stackCount, 1)
|
||||
XCTAssertEqual(viewModel.statusMessage, "Added to Stack")
|
||||
XCTAssertTrue(viewModel.isItemStacked(at: 0))
|
||||
|
||||
viewModel.toggleSelectedStackMembership()
|
||||
XCTAssertEqual(viewModel.stackCount, 0)
|
||||
XCTAssertEqual(viewModel.statusMessage, "Removed from Stack")
|
||||
XCTAssertFalse(viewModel.isItemStacked(at: 0))
|
||||
|
||||
viewModel.toggleSelectedStackMembership()
|
||||
viewModel.clearStack()
|
||||
XCTAssertEqual(viewModel.stackCount, 0)
|
||||
XCTAssertEqual(viewModel.statusMessage, "Cleared Stack")
|
||||
}
|
||||
|
||||
func testUpdateSelectedTextRefreshesVisibleItemAndSearch() {
|
||||
let settings = makeSettings()
|
||||
let cacheService = makeCacheService()
|
||||
|
||||
@@ -184,8 +184,8 @@ final class ClipboardPanelViewTests: XCTestCase {
|
||||
fixture.store.upsert(makeTextItem("Plain text", store: fixture.store))
|
||||
drainMainQueue()
|
||||
|
||||
XCTAssertEqual(fixture.view.debugFirstCardVisibleActionLabels, ["Paste", "Copy", "Pin", "Edit", "Delete"])
|
||||
XCTAssertEqual(fixture.view.debugFirstCardVisibleActionRailWidth, 154)
|
||||
XCTAssertEqual(fixture.view.debugFirstCardVisibleActionLabels, ["Paste", "Copy", "Pin", "Add to Stack", "Edit", "Delete"])
|
||||
XCTAssertEqual(fixture.view.debugFirstCardVisibleActionRailWidth, 182)
|
||||
XCTAssertFalse(fixture.view.debugFirstCardFooterDetailIsHidden)
|
||||
XCTAssertTrue(fixture.view.debugFirstCardHeaderBadgeIsHidden)
|
||||
|
||||
@@ -194,8 +194,8 @@ final class ClipboardPanelViewTests: XCTestCase {
|
||||
|
||||
fixture.viewModel.selectFirstItem()
|
||||
XCTAssertEqual(fixture.viewModel.visibleItems.first?.kind, .file)
|
||||
XCTAssertEqual(fixture.view.debugFirstCardVisibleActionLabels, ["Paste", "Copy", "Pin", "Preview", "Open", "Reveal", "Delete"])
|
||||
XCTAssertEqual(fixture.view.debugFirstCardVisibleActionRailWidth, 210)
|
||||
XCTAssertEqual(fixture.view.debugFirstCardVisibleActionLabels, ["Paste", "Copy", "Pin", "Add to Stack", "Preview", "Open", "Reveal", "Delete"])
|
||||
XCTAssertEqual(fixture.view.debugFirstCardVisibleActionRailWidth, 238)
|
||||
XCTAssertFalse(fixture.view.debugFirstCardFooterDetailIsHidden)
|
||||
XCTAssertTrue(fixture.view.debugFirstCardHeaderBadgeIsHidden)
|
||||
}
|
||||
@@ -333,7 +333,7 @@ final class ClipboardPanelViewTests: XCTestCase {
|
||||
|
||||
XCTAssertEqual(
|
||||
fixture.view.debugFirstCardMenuTitles,
|
||||
["Paste", "Copy", "Edit", "Pin", "Add to Collection", "-", "Open", "Reveal in Finder", "-", "Delete"]
|
||||
["Paste", "Copy", "Add to Stack", "Edit", "Pin", "Add to Collection", "-", "Open", "Reveal in Finder", "-", "Delete"]
|
||||
)
|
||||
XCTAssertEqual(
|
||||
fixture.view.debugFirstCardCollectionMenuTitles,
|
||||
@@ -349,10 +349,27 @@ final class ClipboardPanelViewTests: XCTestCase {
|
||||
|
||||
XCTAssertEqual(
|
||||
fixture.view.debugFirstCardMenuTitles,
|
||||
["Paste", "Copy", "Paste Plain Text", "Copy Plain Text", "Quick Look", "Pin", "Add to Collection", "-", "Open", "Reveal in Finder", "-", "Delete"]
|
||||
["Paste", "Copy", "Paste Plain Text", "Copy Plain Text", "Add to Stack", "Quick Look", "Pin", "Add to Collection", "-", "Open", "Reveal in Finder", "-", "Delete"]
|
||||
)
|
||||
}
|
||||
|
||||
func testStackedCardsExposeStackManagementActions() {
|
||||
let fixture = makePanelFixture()
|
||||
fixture.store.upsert(makeTextItem("Stackable text", store: fixture.store))
|
||||
drainMainQueue()
|
||||
fixture.window.contentView?.layoutSubtreeIfNeeded()
|
||||
|
||||
fixture.viewModel.toggleSelectedStackMembership()
|
||||
drainMainQueue()
|
||||
fixture.window.contentView?.layoutSubtreeIfNeeded()
|
||||
|
||||
XCTAssertEqual(
|
||||
fixture.view.debugFirstCardMenuTitles,
|
||||
["Paste", "Copy", "Remove from Stack", "Paste Stack Next", "Copy Stack Next", "Clear Stack", "Edit", "Pin", "Add to Collection", "-", "Open", "Reveal in Finder", "-", "Delete"]
|
||||
)
|
||||
XCTAssertEqual(fixture.view.debugFirstCardVisibleActionLabels, ["Paste", "Copy", "Pin", "Remove from Stack", "Edit", "Delete"])
|
||||
}
|
||||
|
||||
func testCollectionMenuOffersExistingCustomCollections() {
|
||||
let fixture = makePanelFixture()
|
||||
var existing = makeTextItem("Existing client note", store: fixture.store)
|
||||
|
||||
Reference in New Issue
Block a user