WIP: add shelf range navigation keys
This commit is contained in:
@@ -172,6 +172,21 @@ final class ClipboardPanelControllerTests: XCTestCase {
|
||||
XCTAssertFalse(ClipboardPanelController.searchFieldPreviewShortcut(forKeyCode: 36, modifiers: [], searchText: ""))
|
||||
}
|
||||
|
||||
func testNavigationShortcutsMapToShelfMovement() {
|
||||
XCTAssertEqual(ClipboardPanelController.navigationShortcutAction(forKeyCode: 115, modifiers: []), .first)
|
||||
XCTAssertEqual(ClipboardPanelController.navigationShortcutAction(forKeyCode: 119, modifiers: []), .last)
|
||||
XCTAssertEqual(ClipboardPanelController.navigationShortcutAction(forKeyCode: 124, modifiers: []), .next)
|
||||
XCTAssertEqual(ClipboardPanelController.navigationShortcutAction(forKeyCode: 121, modifiers: []), .pageNext)
|
||||
XCTAssertEqual(ClipboardPanelController.navigationShortcutAction(forKeyCode: 116, modifiers: []), .pagePrevious)
|
||||
XCTAssertEqual(ClipboardPanelController.navigationShortcutAction(forKeyCode: 123, modifiers: []), .previous)
|
||||
}
|
||||
|
||||
func testNavigationShortcutsRequireNoModifiers() {
|
||||
XCTAssertNil(ClipboardPanelController.navigationShortcutAction(forKeyCode: 124, modifiers: .command))
|
||||
XCTAssertNil(ClipboardPanelController.navigationShortcutAction(forKeyCode: 121, modifiers: .shift))
|
||||
XCTAssertNil(ClipboardPanelController.navigationShortcutAction(forKeyCode: 35, modifiers: []))
|
||||
}
|
||||
|
||||
func testCommandActionShortcutsMapToSelectedClipActions() {
|
||||
XCTAssertEqual(ClipboardPanelController.commandShortcutAction(forKeyCode: 8, modifiers: .command), .copy)
|
||||
XCTAssertEqual(ClipboardPanelController.commandShortcutAction(forKeyCode: 5, modifiers: .command), .showInClipboard)
|
||||
|
||||
@@ -475,6 +475,23 @@ final class ClipboardPanelViewModelTests: XCTestCase {
|
||||
XCTAssertEqual(viewModel.selectedItem?.payload, "newer")
|
||||
}
|
||||
|
||||
func testSelectLastItemSelectsLastVisibleItem() {
|
||||
let settings = makeSettings()
|
||||
let cacheService = makeCacheService()
|
||||
let store = makeStore(settings: settings, cacheService: cacheService)
|
||||
store.upsert(makeTextItem("older", createdAt: Date(timeIntervalSince1970: 100)))
|
||||
store.upsert(makeTextItem("newer", createdAt: Date(timeIntervalSince1970: 200)))
|
||||
store.flushPersistenceForTesting()
|
||||
|
||||
let viewModel = ClipboardPanelViewModel(store: store, settings: settings, cacheService: cacheService)
|
||||
waitForVisibleItems(in: viewModel, count: 2)
|
||||
|
||||
viewModel.selectFirstItem()
|
||||
viewModel.selectLastItem()
|
||||
|
||||
XCTAssertEqual(viewModel.selectedItem?.payload, "older")
|
||||
}
|
||||
|
||||
func testSelectFirstItemPrefersLatestOnSubsequentUpdates() {
|
||||
let settings = makeSettings()
|
||||
let cacheService = makeCacheService()
|
||||
|
||||
@@ -340,6 +340,54 @@ final class ClipboardPanelViewTests: XCTestCase {
|
||||
XCTAssertEqual(fixture.viewModel.selectedItem?.payload, "https://example.com/read")
|
||||
}
|
||||
|
||||
func testFocusedCardsSupportShelfNavigationKeys() {
|
||||
let fixture = makePanelFixture()
|
||||
fixture.window.setFrame(NSRect(x: 0, y: 0, width: 620, height: 520), display: true)
|
||||
|
||||
for index in 0..<8 {
|
||||
fixture.store.upsert(makeTextItem("Keyboard navigation item \(index)", store: fixture.store))
|
||||
drainMainQueue()
|
||||
}
|
||||
fixture.window.contentView?.layoutSubtreeIfNeeded()
|
||||
fixture.viewModel.selectFirstItem()
|
||||
drainMainQueue()
|
||||
fixture.window.contentView?.layoutSubtreeIfNeeded()
|
||||
|
||||
let pageStep = fixture.view.debugVisibleCardPageStep
|
||||
XCTAssertGreaterThan(pageStep, 1)
|
||||
XCTAssertTrue(fixture.view.debugFocusCard(at: 0))
|
||||
|
||||
fixture.view.debugPressFocusedResponderKeyCode(124)
|
||||
drainMainQueue()
|
||||
XCTAssertEqual(fixture.viewModel.selectedIndex, 1)
|
||||
XCTAssertEqual(fixture.view.debugKeyboardFocusedCardIndexes, [1])
|
||||
|
||||
fixture.view.debugPressFocusedResponderKeyCode(121)
|
||||
drainMainQueue()
|
||||
XCTAssertEqual(fixture.viewModel.selectedIndex, min(7, 1 + pageStep))
|
||||
XCTAssertEqual(fixture.view.debugKeyboardFocusedCardIndexes, [fixture.viewModel.selectedIndex])
|
||||
|
||||
fixture.view.debugPressFocusedResponderKeyCode(119)
|
||||
drainMainQueue()
|
||||
XCTAssertEqual(fixture.viewModel.selectedIndex, 7)
|
||||
XCTAssertEqual(fixture.view.debugKeyboardFocusedCardIndexes, [7])
|
||||
|
||||
fixture.view.debugPressFocusedResponderKeyCode(116)
|
||||
drainMainQueue()
|
||||
XCTAssertEqual(fixture.viewModel.selectedIndex, max(0, 7 - pageStep))
|
||||
XCTAssertEqual(fixture.view.debugKeyboardFocusedCardIndexes, [fixture.viewModel.selectedIndex])
|
||||
|
||||
fixture.view.debugPressFocusedResponderKeyCode(115)
|
||||
drainMainQueue()
|
||||
XCTAssertEqual(fixture.viewModel.selectedIndex, 0)
|
||||
XCTAssertEqual(fixture.view.debugKeyboardFocusedCardIndexes, [0])
|
||||
|
||||
fixture.view.debugPressFocusedResponderKeyCode(123)
|
||||
drainMainQueue()
|
||||
XCTAssertEqual(fixture.viewModel.selectedIndex, 0)
|
||||
XCTAssertEqual(fixture.view.debugKeyboardFocusedCardIndexes, [0])
|
||||
}
|
||||
|
||||
func testCardHeaderUsesKindSymbolBadgeWhenSourceIconIsUnavailable() {
|
||||
let fixture = makePanelFixture()
|
||||
fixture.store.upsert(makeItem(kind: .url, text: "https://example.com", store: fixture.store))
|
||||
|
||||
Reference in New Issue
Block a user