import XCTest @testable import iPodderX /// The keyboard map. A wrong letter here loses a shortcut silently -- the key does nothing and /// nothing says why -- so the map is worth checking even though driving the keys is not. final class KeysTests: XCTestCase { func testTheKeysAreThePagesKeys() { // Straight from web/src/player.ts: j and n forward, k and p back. XCTAssertEqual(Keys.action(for: "j", afterG: false), .nextItem) XCTAssertEqual(Keys.action(for: "n", afterG: false), .nextItem) XCTAssertEqual(Keys.action(for: "k", afterG: false), .previousItem) XCTAssertEqual(Keys.action(for: "p", afterG: false), .previousItem) XCTAssertEqual(Keys.action(for: "J", afterG: false), .nextFeed) XCTAssertEqual(Keys.action(for: "K", afterG: false), .previousFeed) XCTAssertEqual(Keys.action(for: "o", afterG: false), .play) XCTAssertEqual(Keys.action(for: "m", afterG: false), .toggleRead) XCTAssertEqual(Keys.action(for: "s", afterG: false), .togglePin) XCTAssertEqual(Keys.action(for: "v", afterG: false), .openOriginal) XCTAssertEqual(Keys.action(for: "A", afterG: false), .readAll) XCTAssertEqual(Keys.action(for: "r", afterG: false), .refresh) XCTAssertEqual(Keys.action(for: "[", afterG: false), .toggleSidebar) XCTAssertEqual(Keys.action(for: "?", afterG: false), .shortcuts) XCTAssertEqual(Keys.action(for: " ", afterG: false), .playPause) XCTAssertEqual(Keys.action(for: UIKeyCommand.inputLeftArrow, afterG: false), .back15) XCTAssertEqual(Keys.action(for: UIKeyCommand.inputRightArrow, afterG: false), .forward30) } /// The g pairs, and the two letters that mean different things depending on the g. func testAPairMeansSomethingElse() { XCTAssertEqual(Keys.action(for: "a", afterG: true), .go(.all)) XCTAssertEqual(Keys.action(for: "d", afterG: true), .go(.directory)) XCTAssertEqual(Keys.action(for: "l", afterG: true), .go(.listening)) // p is Previous item on its own and Popular after g; s is Pin, then Settings. XCTAssertEqual(Keys.action(for: "p", afterG: false), .previousItem) XCTAssertEqual(Keys.action(for: "p", afterG: true), .go(.popular)) XCTAssertEqual(Keys.action(for: "s", afterG: false), .togglePin) XCTAssertEqual(Keys.action(for: "s", afterG: true), .go(.settings)) XCTAssertEqual(Keys.action(for: "g", afterG: false), .startPair) // A letter that is no part of a pair still does its own thing after a g. XCTAssertEqual(Keys.action(for: "j", afterG: true), .nextItem) } func testEveryKeyIsRegisteredAsACommand() { let registered = Set(Keys.commands(#selector(getter: UIView.tag)).compactMap(\.input)) for key in Keys.single.keys { XCTAssertTrue(registered.contains(key), "\(key) is mapped but never registered") } for key in Keys.paired.keys { XCTAssertTrue(registered.contains(key), "\(key) is a pair but never registered") } XCTAssertTrue(registered.contains(" "), "space is not registered") } /// The window matches the page's: a second key counts for a second and a half after the g. func testThePairWindowMatchesThePage() { XCTAssertEqual(Keys.pairWindow, 1.5) } }