diff --git a/Apps/Keyty/Sources/Keyty/Domain/Keyboard/KeyboardModifierKey.swift b/Apps/Keyty/Sources/Keyty/Domain/Keyboard/KeyboardModifierKey.swift index 4cf5df1..2993444 100644 --- a/Apps/Keyty/Sources/Keyty/Domain/Keyboard/KeyboardModifierKey.swift +++ b/Apps/Keyty/Sources/Keyty/Domain/Keyboard/KeyboardModifierKey.swift @@ -24,6 +24,15 @@ extension KeyboardModifierKey { enum Location: CaseIterable, Hashable { case left case right + + var canonicalDisplayOrderIndex: Int { + switch self { + case .left: + return 0 + case .right: + return 1 + } + } } } diff --git a/Apps/Keyty/Sources/Keyty/Domain/Keyboard/KeyboardModifierKeyKind.swift b/Apps/Keyty/Sources/Keyty/Domain/Keyboard/KeyboardModifierKeyKind.swift index 1f59285..2b63b72 100644 --- a/Apps/Keyty/Sources/Keyty/Domain/Keyboard/KeyboardModifierKeyKind.swift +++ b/Apps/Keyty/Sources/Keyty/Domain/Keyboard/KeyboardModifierKeyKind.swift @@ -16,6 +16,10 @@ extension KeyboardModifierKey { case option case control + /// Modifier order guidance from Apple style guide: + /// https://support.apple.com/guide/applestyleguide/k-apsgf9067ae8/1.0/web/1.0 + static let canonicalDisplayOrder: [Self] = [.control, .option, .shift, .command] + var glyph: String { switch self { case .command: return UnicodeToken.command.string @@ -65,5 +69,9 @@ extension KeyboardModifierKey { case (.control, .right): return .controlRight } } + + var canonicalDisplayOrderIndex: Int { + Self.canonicalDisplayOrder.firstIndex(of: self) ?? Self.canonicalDisplayOrder.endIndex + } } } diff --git a/Apps/Keyty/Sources/Keyty/Features/Visualizers/Keyboard/KeycapEventCoordinator.swift b/Apps/Keyty/Sources/Keyty/Features/Visualizers/Keyboard/KeycapEventCoordinator.swift index 457d9ba..c7ec10a 100644 --- a/Apps/Keyty/Sources/Keyty/Features/Visualizers/Keyboard/KeycapEventCoordinator.swift +++ b/Apps/Keyty/Sources/Keyty/Features/Visualizers/Keyboard/KeycapEventCoordinator.swift @@ -282,7 +282,17 @@ private extension KeycapEventCoordinator { } private func ordered(items: [Item]) -> [Item] { - let modifiers = items.filter { $0.identity.isModifier } + let modifiers = items + .filter { $0.identity.isModifier } + .sorted { + ( + $0.identity.modifierKind?.canonicalDisplayOrderIndex ?? Int.max, + $0.identity.modifierLocation?.canonicalDisplayOrderIndex ?? Int.max + ) < ( + $1.identity.modifierKind?.canonicalDisplayOrderIndex ?? Int.max, + $1.identity.modifierLocation?.canonicalDisplayOrderIndex ?? Int.max + ) + } let others = items.filter { !$0.identity.isModifier } return modifiers + others } diff --git a/Apps/Keyty/Sources/Keyty/Features/Visualizers/Keyboard/KeycapItemFactory.swift b/Apps/Keyty/Sources/Keyty/Features/Visualizers/Keyboard/KeycapItemFactory.swift index c43d1b9..ebb4ce1 100644 --- a/Apps/Keyty/Sources/Keyty/Features/Visualizers/Keyboard/KeycapItemFactory.swift +++ b/Apps/Keyty/Sources/Keyty/Features/Visualizers/Keyboard/KeycapItemFactory.swift @@ -30,7 +30,6 @@ enum KeycapPreviewSample { /// `KeycapIdentity`, so per-key-type theming applies uniformly across every branch. enum KeycapItemFactory { private static let mouseIconHeight: CGFloat = 44 - private static let orderedModifiers: [KeyboardModifierKey.Kind] = [.command, .shift, .option, .control] private static let orderedModifierLocations: [KeyboardModifierKey.Location] = [.left, .right] static func keycapItems(for keystroke: StandardKeyEvent, palette: KeycapThemePalette) -> [KeycapItem] { @@ -156,7 +155,7 @@ enum KeycapItemFactory { let currentModifierKeys = KeyboardModifierKey.keys(in: currentFlags) let releasedModifierKeys = KeyboardModifierKey.keys(in: releasedFlags) - for modifier in Self.orderedModifiers { + for modifier in KeyboardModifierKey.Kind.canonicalDisplayOrder { let modifierKeys = Self.orderedModifierKeys( for: modifier, currentModifierKeys: currentModifierKeys, diff --git a/Apps/Keyty/Tests/KeytyTests/Domain/Keyboard/KeyboardModifierKeyKindTests.swift b/Apps/Keyty/Tests/KeytyTests/Domain/Keyboard/KeyboardModifierKeyKindTests.swift index 90a8aa6..d163fdc 100644 --- a/Apps/Keyty/Tests/KeytyTests/Domain/Keyboard/KeyboardModifierKeyKindTests.swift +++ b/Apps/Keyty/Tests/KeytyTests/Domain/Keyboard/KeyboardModifierKeyKindTests.swift @@ -11,6 +11,13 @@ import XCTest @testable import Keyty final class KeyboardModifierKeyKindTests: XCTestCase { + func testCanonicalDisplayOrderMatchesAppleMenuOrder() { + XCTAssertEqual( + KeyboardModifierKey.Kind.canonicalDisplayOrder, + [.control, .option, .shift, .command] + ) + } + func testFlagMapsKindToAggregateModifierFlag() { XCTAssertEqual(KeyboardModifierKey.Kind.command.flag, .command) XCTAssertEqual(KeyboardModifierKey.Kind.shift.flag, .shift) diff --git a/Apps/Keyty/Tests/KeytyTests/Features/Visualizers/Keyboard/Keycaps/KeycapEventCoordinatorTests.swift b/Apps/Keyty/Tests/KeytyTests/Features/Visualizers/Keyboard/Keycaps/KeycapEventCoordinatorTests.swift index 2ff8965..c820667 100644 --- a/Apps/Keyty/Tests/KeytyTests/Features/Visualizers/Keyboard/Keycaps/KeycapEventCoordinatorTests.swift +++ b/Apps/Keyty/Tests/KeytyTests/Features/Visualizers/Keyboard/Keycaps/KeycapEventCoordinatorTests.swift @@ -87,7 +87,42 @@ final class KeycapEventCoordinatorTests: XCTestCase { XCTAssertEqual(appendedGroups.count, 1) XCTAssertEqual(updatedGroups.count, 1) - XCTAssertEqual(updatedGroups[0].map(\.identity), [.modifier(.leftCommand), .modifier(.leftShift)]) + XCTAssertEqual(updatedGroups[0].map(\.identity), [.modifier(.leftShift), .modifier(.leftCommand)]) + } + + func testFlagsChangedReordersModifiersIntoCanonicalDisplayOrder() { + let coordinator = KeycapEventCoordinator() + var updatedGroups: [[TestItem]] = [] + + coordinator.handleFlagsChanged( + currentTrackedFlags: [.command], + releasedTrackedFlags: [], + buildItems: { _, _ in + [TestItem(identity: .modifier(.leftCommand))] + }, + appendGroup: { _ in TestGroupView() }, + updateGroup: { _, items in + updatedGroups.append(items) + } + ) + + coordinator.handleFlagsChanged( + currentTrackedFlags: [.command, .shift], + releasedTrackedFlags: [], + buildItems: { _, _ in + [ + TestItem(identity: .modifier(.leftCommand)), + TestItem(identity: .modifier(.leftShift)), + ] + }, + appendGroup: { _ in TestGroupView() }, + updateGroup: { _, items in + updatedGroups.append(items) + } + ) + + XCTAssertEqual(updatedGroups.count, 1) + XCTAssertEqual(updatedGroups[0].map(\.identity), [.modifier(.leftShift), .modifier(.leftCommand)]) } func testTrackedKeyUpdateDoesNotAppendLaterModifierToExistingKeyGroup() { @@ -315,10 +350,10 @@ final class KeycapEventCoordinatorTests: XCTestCase { ) XCTAssertEqual(appendedGroups.count, 2) - XCTAssertEqual(appendedGroups[0].map(\.identity), [.modifier(.leftCommand), .modifier(.leftShift)]) - XCTAssertEqual(updatedGroups[0].map(\.identity), [.modifier(.leftCommand), .modifier(.leftShift), .keyCode(29)]) - XCTAssertEqual(updatedGroups[1].map(\.identity), [.modifier(.leftCommand), .modifier(.leftShift), .keyCode(29)]) - XCTAssertEqual(appendedGroups[1].map(\.identity), [.modifier(.leftCommand), .modifier(.leftShift), .keyCode(18)]) + XCTAssertEqual(appendedGroups[0].map(\.identity), [.modifier(.leftShift), .modifier(.leftCommand)]) + XCTAssertEqual(updatedGroups[0].map(\.identity), [.modifier(.leftShift), .modifier(.leftCommand), .keyCode(29)]) + XCTAssertEqual(updatedGroups[1].map(\.identity), [.modifier(.leftShift), .modifier(.leftCommand), .keyCode(29)]) + XCTAssertEqual(appendedGroups[1].map(\.identity), [.modifier(.leftShift), .modifier(.leftCommand), .keyCode(18)]) } func testStandaloneItemAbsorbsExistingModifierGroup() { @@ -353,9 +388,9 @@ final class KeycapEventCoordinatorTests: XCTestCase { ) XCTAssertEqual(appendedGroups.count, 1) - XCTAssertEqual(appendedGroups[0].map(\.identity), [.modifier(.leftCommand), .modifier(.leftShift)]) + XCTAssertEqual(appendedGroups[0].map(\.identity), [.modifier(.leftShift), .modifier(.leftCommand)]) XCTAssertEqual(updatedGroups.count, 1) - XCTAssertEqual(updatedGroups[0].map(\.identity), [.modifier(.leftCommand), .modifier(.leftShift), .mouse(.leftButton)]) + XCTAssertEqual(updatedGroups[0].map(\.identity), [.modifier(.leftShift), .modifier(.leftCommand), .mouse(.leftButton)]) } func testMouseButtonReleaseUpdatesExistingChordGroup() { diff --git a/Apps/Keyty/Tests/KeytyTests/Features/Visualizers/Keyboard/Keycaps/KeycapItemFactoryTests.swift b/Apps/Keyty/Tests/KeytyTests/Features/Visualizers/Keyboard/Keycaps/KeycapItemFactoryTests.swift index 968b96a..7b416d2 100644 --- a/Apps/Keyty/Tests/KeytyTests/Features/Visualizers/Keyboard/Keycaps/KeycapItemFactoryTests.swift +++ b/Apps/Keyty/Tests/KeytyTests/Features/Visualizers/Keyboard/Keycaps/KeycapItemFactoryTests.swift @@ -51,6 +51,20 @@ final class KeycapItemFactoryTests: XCTestCase { XCTAssertEqual(items.map(\.layoutHints.alignment), [.right, .left]) } + func testModifierItemsFollowCanonicalDisplayOrder() { + let items = KeycapItemFactory.modifierItems( + currentFlags: [.command, .option, .shift], + releasedFlags: [], + palette: Self.makePalette() + ) + + XCTAssertEqual(items.map(\.identity), [ + .modifier(.leftOption), + .modifier(.leftShift), + .modifier(.leftCommand), + ]) + } + func testModifierItemsUseInwardAlignmentForNonCommandModifierKeys() { let items = KeycapItemFactory.modifierItems( currentFlags: NSEvent.ModifierFlags.shift.addingRawMasks( diff --git a/Apps/Keyty/Tests/KeytyTests/Features/Visualizers/Keyboard/Keycaps/__Snapshots__/KeyboardVisualizerGroupViewSnapshotTests/testRendersAppleBlackCommandShiftKKeycaps.apple-black-command-shift-k-keycaps.png b/Apps/Keyty/Tests/KeytyTests/Features/Visualizers/Keyboard/Keycaps/__Snapshots__/KeyboardVisualizerGroupViewSnapshotTests/testRendersAppleBlackCommandShiftKKeycaps.apple-black-command-shift-k-keycaps.png index f0c28d5..874fd70 100644 Binary files a/Apps/Keyty/Tests/KeytyTests/Features/Visualizers/Keyboard/Keycaps/__Snapshots__/KeyboardVisualizerGroupViewSnapshotTests/testRendersAppleBlackCommandShiftKKeycaps.apple-black-command-shift-k-keycaps.png and b/Apps/Keyty/Tests/KeytyTests/Features/Visualizers/Keyboard/Keycaps/__Snapshots__/KeyboardVisualizerGroupViewSnapshotTests/testRendersAppleBlackCommandShiftKKeycaps.apple-black-command-shift-k-keycaps.png differ diff --git a/Apps/Keyty/Tests/KeytyTests/Services/EventPipeline/EventTransformerKeystrokeTests.swift b/Apps/Keyty/Tests/KeytyTests/Services/EventPipeline/EventTransformerKeystrokeTests.swift index 40902a0..2cf3f02 100644 --- a/Apps/Keyty/Tests/KeytyTests/Services/EventPipeline/EventTransformerKeystrokeTests.swift +++ b/Apps/Keyty/Tests/KeytyTests/Services/EventPipeline/EventTransformerKeystrokeTests.swift @@ -6,138 +6,134 @@ // SPDX-License-Identifier: BSD-3-Clause // -// NOTE: These tests assume a US-English layout and may break under other locales. -// The correct modifier ordering is Control-Option-Shift-Command (as shown in Apple menus). - import Carbon import XCTest @testable import Keyty final class EventTransformerKeystrokeTests: XCTestCase { - var keystroke: StandardKeyEvent! - var keyboardLayout: TISInputSource! + var transformer: EventTransformer! func transform(_ event: StandardKeyEvent) -> String { - EventTransformer(keyboardLayout: self.keyboardLayout).transform(.keystroke(event)) + self.transformer.transform(.keystroke(event)) } override func setUpWithError() throws { try super.setUpWithError() - self.keyboardLayout = try TestKeyboardLayouts.requireUSEnglish() + self.transformer = EventTransformer(keyboardLayout: try TestKeyboardLayouts.requireUSEnglish()) } } // MARK: - Numbers extension EventTransformerKeystrokeTests { - func test_KCKeystroke_convertsCtrlNumberToNumber() { - self.keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.digit7.rawValue, modifiers: TestModifierFlags.control, characters: "7", charactersIgnoringModifiers: "7") - XCTAssertEqual(self.transform(self.keystroke), KeyboardGlyphCatalog.control + "7") + func test_convertsCtrlNumberToNumber() { + let keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.digit7.rawValue, modifiers: TestModifierFlags.control, characters: "7", charactersIgnoringModifiers: "7") + XCTAssertEqual(self.transform(keystroke), KeyboardGlyphCatalog.control + "7") } - func test_KCKeystroke_convertsShiftNumberToShiftNumber() { - self.keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.digit7.rawValue, modifiers: TestModifierFlags.shift, characters: "&", charactersIgnoringModifiers: "&") - XCTAssertEqual(self.transform(self.keystroke), KeyboardGlyphCatalog.shift + "7") + func test_convertsShiftNumberToShiftNumber() { + let keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.digit7.rawValue, modifiers: TestModifierFlags.shift, characters: "&", charactersIgnoringModifiers: "&") + XCTAssertEqual(self.transform(keystroke), KeyboardGlyphCatalog.shift + "7") } - func test_KCKeystroke_convertsCtrlShiftNumberToNumber() { - self.keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.digit7.rawValue, modifiers: TestModifierFlags.controlShift, characters: "7", charactersIgnoringModifiers: "&") - XCTAssertEqual(self.transform(self.keystroke), KeyboardGlyphCatalog.control + KeyboardGlyphCatalog.shift + "7") + func test_convertsCtrlShiftNumberToNumber() { + let keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.digit7.rawValue, modifiers: TestModifierFlags.controlShift, characters: "7", charactersIgnoringModifiers: "&") + XCTAssertEqual(self.transform(keystroke), KeyboardGlyphCatalog.control + KeyboardGlyphCatalog.shift + "7") } - func test_KCKeystroke_convertsCmdNumberToNumber() { - self.keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.digit7.rawValue, modifiers: TestModifierFlags.command, characters: "7", charactersIgnoringModifiers: "7") - XCTAssertEqual(self.transform(self.keystroke), KeyboardGlyphCatalog.command + "7") + func test_convertsCmdNumberToNumber() { + let keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.digit7.rawValue, modifiers: TestModifierFlags.command, characters: "7", charactersIgnoringModifiers: "7") + XCTAssertEqual(self.transform(keystroke), KeyboardGlyphCatalog.command + "7") } - func test_KCKeystroke_convertsCmdShiftNumberToNumber() { - self.keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.digit7.rawValue, modifiers: TestModifierFlags.commandShift, characters: "7", charactersIgnoringModifiers: "&") - XCTAssertEqual(self.transform(self.keystroke), KeyboardGlyphCatalog.shift + KeyboardGlyphCatalog.command + "7") + func test_convertsCmdShiftNumberToNumber() { + let keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.digit7.rawValue, modifiers: TestModifierFlags.commandShift, characters: "7", charactersIgnoringModifiers: "&") + XCTAssertEqual(self.transform(keystroke), KeyboardGlyphCatalog.shift + KeyboardGlyphCatalog.command + "7") } - func test_KCKeystroke_convertsCmdOptNumberToNumber() { - self.keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.digit7.rawValue, modifiers: TestModifierFlags.commandOption, characters: "¶", charactersIgnoringModifiers: "7") - XCTAssertEqual(self.transform(self.keystroke), KeyboardGlyphCatalog.option + KeyboardGlyphCatalog.command + "7") + func test_convertsCmdOptNumberToNumber() { + let keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.digit7.rawValue, modifiers: TestModifierFlags.commandOption, characters: "¶", charactersIgnoringModifiers: "7") + XCTAssertEqual(self.transform(keystroke), KeyboardGlyphCatalog.option + KeyboardGlyphCatalog.command + "7") } - func test_KCKeystroke_convertsShiftOptionNumberToNumber() { - self.keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.digit7.rawValue, modifiers: TestModifierFlags.optionShift, characters: "»", charactersIgnoringModifiers: "7") - XCTAssertEqual(self.transform(self.keystroke), KeyboardGlyphCatalog.option + KeyboardGlyphCatalog.shift + "7") + func test_convertsShiftOptionNumberToNumber() { + let keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.digit7.rawValue, modifiers: TestModifierFlags.optionShift, characters: "»", charactersIgnoringModifiers: "7") + XCTAssertEqual(self.transform(keystroke), KeyboardGlyphCatalog.option + KeyboardGlyphCatalog.shift + "7") } - func test_KCKeystroke_convertsCmdOptShiftNumberToShiftedNumber() { - self.keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.digit7.rawValue, modifiers: TestModifierFlags.commandOptionShift, characters: "‡", charactersIgnoringModifiers: "&") - XCTAssertEqual(self.transform(self.keystroke), KeyboardGlyphCatalog.option + KeyboardGlyphCatalog.shift + KeyboardGlyphCatalog.command + "7") + func test_convertsCmdOptShiftNumberToShiftedNumber() { + let keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.digit7.rawValue, modifiers: TestModifierFlags.commandOptionShift, characters: "‡", charactersIgnoringModifiers: "&") + XCTAssertEqual(self.transform(keystroke), KeyboardGlyphCatalog.option + KeyboardGlyphCatalog.shift + KeyboardGlyphCatalog.command + "7") } } // MARK: - Letters extension EventTransformerKeystrokeTests { - func test_KCKeystroke_convertsCtrlLetterToUppercaseLetter() { - self.keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.a.rawValue, modifiers: TestModifierFlags.control, characters: "^A", charactersIgnoringModifiers: "a") - XCTAssertEqual(self.transform(self.keystroke), KeyboardGlyphCatalog.control + "A") + func test_convertsCtrlLetterToUppercaseLetter() { + let keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.a.rawValue, modifiers: TestModifierFlags.control, characters: "^A", charactersIgnoringModifiers: "a") + XCTAssertEqual(self.transform(keystroke), KeyboardGlyphCatalog.control + "A") } - func test_KCKeystroke_convertsCtrlShiftLetterToLetter() { - self.keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.a.rawValue, modifiers: TestModifierFlags.controlShift, characters: "^A", charactersIgnoringModifiers: "a") - XCTAssertEqual(self.transform(self.keystroke), KeyboardGlyphCatalog.control + KeyboardGlyphCatalog.shift + "A") + func test_convertsCtrlShiftLetterToLetter() { + let keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.a.rawValue, modifiers: TestModifierFlags.controlShift, characters: "^A", charactersIgnoringModifiers: "a") + XCTAssertEqual(self.transform(keystroke), KeyboardGlyphCatalog.control + KeyboardGlyphCatalog.shift + "A") } - func test_KCKeystroke_convertsCtrlShiftCmdLetterToLetter() { - self.keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.a.rawValue, modifiers: TestModifierFlags.controlCommandShift, characters: "^A", charactersIgnoringModifiers: "A") - XCTAssertEqual(self.transform(self.keystroke), KeyboardGlyphCatalog.control + KeyboardGlyphCatalog.shift + KeyboardGlyphCatalog.command + "A") + func test_convertsCtrlShiftCmdLetterToLetter() { + let keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.a.rawValue, modifiers: TestModifierFlags.controlCommandShift, characters: "^A", charactersIgnoringModifiers: "A") + XCTAssertEqual(self.transform(keystroke), KeyboardGlyphCatalog.control + KeyboardGlyphCatalog.shift + KeyboardGlyphCatalog.command + "A") } - func test_KCKeystroke_convertsCtrlOptLetterToUppercaseLetter() { - self.keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.a.rawValue, modifiers: TestModifierFlags.controlOption, characters: "^A", charactersIgnoringModifiers: "a") - XCTAssertEqual(self.transform(self.keystroke), KeyboardGlyphCatalog.control + KeyboardGlyphCatalog.option + "A") + func test_convertsCtrlOptLetterToUppercaseLetter() { + let keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.a.rawValue, modifiers: TestModifierFlags.controlOption, characters: "^A", charactersIgnoringModifiers: "a") + XCTAssertEqual(self.transform(keystroke), KeyboardGlyphCatalog.control + KeyboardGlyphCatalog.option + "A") } - func test_KCKeystroke_convertsCtrlOptShiftLetterToLetter() { - self.keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.a.rawValue, modifiers: TestModifierFlags.controlOptionShift, characters: "^A", charactersIgnoringModifiers: "A") - XCTAssertEqual(self.transform(self.keystroke), KeyboardGlyphCatalog.control + KeyboardGlyphCatalog.option + KeyboardGlyphCatalog.shift + "A") + func test_convertsCtrlOptShiftLetterToLetter() { + let keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.a.rawValue, modifiers: TestModifierFlags.controlOptionShift, characters: "^A", charactersIgnoringModifiers: "A") + XCTAssertEqual(self.transform(keystroke), KeyboardGlyphCatalog.control + KeyboardGlyphCatalog.option + KeyboardGlyphCatalog.shift + "A") } - func test_KCKeystroke_displaysOptLetterByDefault() { - self.keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.u.rawValue, modifiers: TestModifierFlags.option, characters: "", charactersIgnoringModifiers: "u") - XCTAssertEqual(self.transform(self.keystroke), KeyboardGlyphCatalog.option + "U") + func test_displaysOptLetterByDefault() { + let keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.u.rawValue, modifiers: TestModifierFlags.option, characters: "", charactersIgnoringModifiers: "u") + XCTAssertEqual(self.transform(keystroke), KeyboardGlyphCatalog.option + "U") } } // MARK: - Function Row extension EventTransformerKeystrokeTests { - func test_KCKeystroke_convertsFnF1ToBrightnessDecrease() { - self.keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.brightnessDown.rawValue, modifiers: TestModifierFlags.function, characters: "", charactersIgnoringModifiers: "") - XCTAssertEqual(self.transform(self.keystroke), UnicodeToken.brightnessDown.string) + func test_convertsFnF1ToBrightnessDecrease() { + let keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.brightnessDown.rawValue, modifiers: TestModifierFlags.function, characters: "", charactersIgnoringModifiers: "") + XCTAssertEqual(self.transform(keystroke), UnicodeToken.brightnessDown.string) } - func test_KCKeystroke_convertsFnF2ToBrightnessIncrease() { - self.keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.brightnessUp.rawValue, modifiers: TestModifierFlags.function, characters: "", charactersIgnoringModifiers: "") - XCTAssertEqual(self.transform(self.keystroke), UnicodeToken.brightnessUp.string) + func test_convertsFnF2ToBrightnessIncrease() { + let keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.brightnessUp.rawValue, modifiers: TestModifierFlags.function, characters: "", charactersIgnoringModifiers: "") + XCTAssertEqual(self.transform(keystroke), UnicodeToken.brightnessUp.string) } - func test_KCKeystroke_convertsFnF3ToMissionControl() { - self.keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.missionControl.rawValue, modifiers: TestModifierFlags.function, characters: "", charactersIgnoringModifiers: "") - XCTAssertEqual(self.transform(self.keystroke), UnicodeToken.missionControl.string) + func test_convertsFnF3ToMissionControl() { + let keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.missionControl.rawValue, modifiers: TestModifierFlags.function, characters: "", charactersIgnoringModifiers: "") + XCTAssertEqual(self.transform(keystroke), UnicodeToken.missionControl.string) } - func test_KCKeystroke_convertsFnF4ToLauncher() { - self.keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.launchpad.rawValue, modifiers: TestModifierFlags.function, characters: "", charactersIgnoringModifiers: "") - XCTAssertEqual(self.transform(self.keystroke), UnicodeToken.launchpad.string) + func test_convertsFnF4ToLauncher() { + let keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.launchpad.rawValue, modifiers: TestModifierFlags.function, characters: "", charactersIgnoringModifiers: "") + XCTAssertEqual(self.transform(keystroke), UnicodeToken.launchpad.string) } } // MARK: - JIS layout extension EventTransformerKeystrokeTests { - func test_KCKeystroke_convertsEisuKey() { - self.keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.eisu.rawValue, modifiers: [], characters: "", charactersIgnoringModifiers: "") - XCTAssertEqual(self.transform(self.keystroke), KeyboardSpecialKey.eisu.displayText) + func test_convertsEisuKey() { + let keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.eisu.rawValue, modifiers: [], characters: "", charactersIgnoringModifiers: "") + XCTAssertEqual(self.transform(keystroke), KeyboardSpecialKey.eisu.displayText) } - func test_KCKeystroke_convertsKanaKey() { - self.keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.kana.rawValue, modifiers: [], characters: "", charactersIgnoringModifiers: "") - XCTAssertEqual(self.transform(self.keystroke), KeyboardSpecialKey.kana.displayText) + func test_convertsKanaKey() { + let keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.kana.rawValue, modifiers: [], characters: "", charactersIgnoringModifiers: "") + XCTAssertEqual(self.transform(keystroke), KeyboardSpecialKey.kana.displayText) } } @@ -145,8 +141,8 @@ extension EventTransformerKeystrokeTests { extension EventTransformerKeystrokeTests { func test_optionShiftNumberDisplaysExplicitModifiers() { - self.keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.digit7.rawValue, modifiers: TestModifierFlags.optionShift, characters: "»", charactersIgnoringModifiers: "7") - XCTAssertEqual(self.transform(self.keystroke), KeyboardGlyphCatalog.option + KeyboardGlyphCatalog.shift + "7") + let keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.digit7.rawValue, modifiers: TestModifierFlags.optionShift, characters: "»", charactersIgnoringModifiers: "7") + XCTAssertEqual(self.transform(keystroke), KeyboardGlyphCatalog.option + KeyboardGlyphCatalog.shift + "7") } } @@ -154,50 +150,50 @@ extension EventTransformerKeystrokeTests { extension EventTransformerKeystrokeTests { func test_tabKey() { - self.keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.tab.rawValue, modifiers: TestModifierFlags.none, characters: "\t", charactersIgnoringModifiers: "\t") - XCTAssertEqual(self.transform(self.keystroke), KeyboardGlyphCatalog.tab) + let keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.tab.rawValue, modifiers: TestModifierFlags.none, characters: "\t", charactersIgnoringModifiers: "\t") + XCTAssertEqual(self.transform(keystroke), KeyboardGlyphCatalog.tab) } func test_returnAndKeypadEnterUseDifferentSymbols() { - self.keystroke = TestKeystrokes.make( + let returnKey = TestKeystrokes.make( keyCode: KeyboardKeyCode.returnKey.rawValue, modifiers: TestModifierFlags.none, characters: "\r", charactersIgnoringModifiers: "\r" ) - XCTAssertEqual(self.transform(self.keystroke), UnicodeToken.returnKey.string) + XCTAssertEqual(self.transform(returnKey), UnicodeToken.returnKey.string) - self.keystroke = TestKeystrokes.make( + let keypadEnter = TestKeystrokes.make( keyCode: KeyboardKeyCode.keypadEnter.rawValue, modifiers: TestModifierFlags.none, characters: "\r", charactersIgnoringModifiers: "\r" ) - XCTAssertEqual(self.transform(self.keystroke), UnicodeToken.keypadEnter.string) + XCTAssertEqual(self.transform(keypadEnter), UnicodeToken.keypadEnter.string) } func test_deleteAndForwardDeleteUseDifferentSymbols() { - self.keystroke = TestKeystrokes.make( + let deleteKey = TestKeystrokes.make( keyCode: KeyboardKeyCode.delete.rawValue, modifiers: TestModifierFlags.none, characters: UnicodeToken.delete.string, charactersIgnoringModifiers: UnicodeToken.delete.string ) - XCTAssertEqual(self.transform(self.keystroke), UnicodeToken.delete.string) + XCTAssertEqual(self.transform(deleteKey), UnicodeToken.delete.string) - self.keystroke = TestKeystrokes.make( + let forwardDelete = TestKeystrokes.make( keyCode: KeyboardKeyCode.forwardDelete.rawValue, modifiers: TestModifierFlags.none, characters: UnicodeToken.forwardDelete.string, charactersIgnoringModifiers: UnicodeToken.forwardDelete.string ) - XCTAssertEqual(self.transform(self.keystroke), UnicodeToken.forwardDelete.string) + XCTAssertEqual(self.transform(forwardDelete), UnicodeToken.forwardDelete.string) } func test_shiftTab() { let ch = TestKeyboardCharacters.backTab - self.keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.tab.rawValue, modifiers: TestModifierFlags.shift, characters: ch, charactersIgnoringModifiers: ch) - XCTAssertEqual(self.transform(self.keystroke), KeyboardGlyphCatalog.backTab) + let keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.tab.rawValue, modifiers: TestModifierFlags.shift, characters: ch, charactersIgnoringModifiers: ch) + XCTAssertEqual(self.transform(keystroke), KeyboardGlyphCatalog.backTab) } func test_arrowKeysUseFilledTriangleSymbols() { @@ -209,31 +205,31 @@ extension EventTransformerKeystrokeTests { ] for (keyCode, expected) in cases { - self.keystroke = TestKeystrokes.make( + let keystroke = TestKeystrokes.make( keyCode: keyCode.rawValue, modifiers: TestModifierFlags.none, characters: expected, charactersIgnoringModifiers: expected ) - XCTAssertEqual(self.transform(self.keystroke), expected) + XCTAssertEqual(self.transform(keystroke), expected) } } func test_insertFunctionKeyDisplaysInsertForHelpKeyCode() { let ch = TestKeyboardCharacters.functionKeyCharacter(NSInsertFunctionKey) - self.keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.help.rawValue, modifiers: [], characters: ch, charactersIgnoringModifiers: ch) - XCTAssertEqual(self.transform(self.keystroke), KeyboardSpecialKey.insert.displayText) + let keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.help.rawValue, modifiers: [], characters: ch, charactersIgnoringModifiers: ch) + XCTAssertEqual(self.transform(keystroke), KeyboardSpecialKey.insert.displayText) } func test_helpFunctionKeyDisplaysHelpForHelpKeyCode() { let ch = TestKeyboardCharacters.functionKeyCharacter(NSHelpFunctionKey) - self.keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.help.rawValue, modifiers: [], characters: ch, charactersIgnoringModifiers: ch) - XCTAssertEqual(self.transform(self.keystroke), UnicodeToken.questionMark.string + UnicodeToken.enclosingCircle.string) + let keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.help.rawValue, modifiers: [], characters: ch, charactersIgnoringModifiers: ch) + XCTAssertEqual(self.transform(keystroke), UnicodeToken.questionMark.string + UnicodeToken.enclosingCircle.string) } func test_helpKeyCodeWithoutSemanticCharactersDefaultsToInsert() { - self.keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.help.rawValue, modifiers: [], characters: "", charactersIgnoringModifiers: "") - XCTAssertEqual(self.transform(self.keystroke), KeyboardSpecialKey.insert.displayText) + let keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.help.rawValue, modifiers: [], characters: "", charactersIgnoringModifiers: "") + XCTAssertEqual(self.transform(keystroke), KeyboardSpecialKey.insert.displayText) } } @@ -242,27 +238,27 @@ extension EventTransformerKeystrokeTests { extension EventTransformerKeystrokeTests { func test_optionShiftUp() { let ch = TestKeyboardCharacters.functionKeyCharacter(NSUpArrowFunctionKey) - self.keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.upArrow.rawValue, modifiers: TestModifierFlags.functionOptionShiftNumericPad, characters: ch, charactersIgnoringModifiers: ch) + let keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.upArrow.rawValue, modifiers: TestModifierFlags.functionOptionShiftNumericPad, characters: ch, charactersIgnoringModifiers: ch) XCTAssertEqual( - self.transform(self.keystroke), + self.transform(keystroke), KeyboardGlyphCatalog.option + KeyboardGlyphCatalog.shift + UnicodeToken.upArrow.string ) } func test_optionUSpecialCase() { - self.keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.u.rawValue, modifiers: TestModifierFlags.option, characters: "", charactersIgnoringModifiers: "u") - XCTAssertEqual(self.transform(self.keystroke), KeyboardGlyphCatalog.option + "U") + let keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.u.rawValue, modifiers: TestModifierFlags.option, characters: "", charactersIgnoringModifiers: "u") + XCTAssertEqual(self.transform(keystroke), KeyboardGlyphCatalog.option + "U") } func test_optionESpecialCase() { - self.keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.e.rawValue, modifiers: TestModifierFlags.option, characters: "", charactersIgnoringModifiers: "e") - XCTAssertEqual(self.transform(self.keystroke), KeyboardGlyphCatalog.option + "E") + let keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.e.rawValue, modifiers: TestModifierFlags.option, characters: "", charactersIgnoringModifiers: "e") + XCTAssertEqual(self.transform(keystroke), KeyboardGlyphCatalog.option + "E") } func test_optionBacktickSpecialCase() { - self.keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.grave.rawValue, modifiers: TestModifierFlags.option, characters: "", charactersIgnoringModifiers: "`") - XCTAssertEqual(self.transform(self.keystroke), KeyboardGlyphCatalog.option + "`") + let keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.grave.rawValue, modifiers: TestModifierFlags.option, characters: "", charactersIgnoringModifiers: "`") + XCTAssertEqual(self.transform(keystroke), KeyboardGlyphCatalog.option + "`") } } @@ -270,8 +266,7 @@ extension EventTransformerKeystrokeTests { extension EventTransformerKeystrokeTests { func test_commandßDisplaysCommandß() { - self.keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.minus.rawValue, modifiers: TestModifierFlags.command, characters: "ß", charactersIgnoringModifiers: "ß") - XCTAssertEqual(self.transform(self.keystroke), KeyboardGlyphCatalog.command + "ß") + let keystroke = TestKeystrokes.make(keyCode: KeyboardKeyCode.minus.rawValue, modifiers: TestModifierFlags.command, characters: "ß", charactersIgnoringModifiers: "ß") + XCTAssertEqual(self.transform(keystroke), KeyboardGlyphCatalog.command + "ß") } - }