diff --git a/macSKK/StateMachine.swift b/macSKK/StateMachine.swift index 70abc094..b07862ea 100644 --- a/macSKK/StateMachine.swift +++ b/macSKK/StateMachine.swift @@ -494,6 +494,10 @@ class StateMachine { if okuri == nil { // 一度変換候補選択に遷移してからキャンセルで戻ると送り仮名ありになっている if romaji.isEmpty { state.inputMethod = .composing(composing.moveCursorRight()) + } else if text.isEmpty { + // 未確定ローマ字しかないときは入力前に戻す (.cancelと同じ) + // AquaSKKとほぼ同じだがAquaSKKはカーソル移動も機能するのでreturn falseになってそう + state.inputMethod = .normal } else { state.inputMethod = .composing(ComposingState(isShift: isShift, text: text, okuri: okuri, romaji: "")) } @@ -504,6 +508,10 @@ class StateMachine { if okuri == nil { // 一度変換候補選択に遷移してからキャンセルで戻ると送り仮名ありになっている if romaji.isEmpty { state.inputMethod = .composing(composing.moveCursorFirst()) + } else if text.isEmpty { + // 未確定ローマ字しかないときは入力前に戻す (.cancelと同じ) + // AquaSKKとほぼ同じだがAquaSKKはカーソル移動も機能するのでreturn falseになってそう + state.inputMethod = .normal } else { // 未確定ローマ字があるときはローマ字を消す (AquaSKKと同じ) state.inputMethod = .composing(ComposingState(isShift: isShift, text: text, okuri: okuri, romaji: "")) @@ -515,6 +523,10 @@ class StateMachine { if okuri == nil { // 一度変換候補選択に遷移してからキャンセルで戻ると送り仮名ありになっている if romaji.isEmpty { state.inputMethod = .composing(composing.moveCursorLast()) + } else if text.isEmpty { + // 未確定ローマ字しかないときは入力前に戻す (.cancelと同じ) + // AquaSKKとほぼ同じだがAquaSKKはカーソル移動も機能するのでreturn falseになってそう + state.inputMethod = .normal } else { state.inputMethod = .composing(ComposingState(isShift: isShift, text: text, okuri: okuri, romaji: "")) } diff --git a/macSKKTests/StateMachineTests.swift b/macSKKTests/StateMachineTests.swift index 9534a736..8764a448 100644 --- a/macSKKTests/StateMachineTests.swift +++ b/macSKKTests/StateMachineTests.swift @@ -1134,14 +1134,17 @@ final class StateMachineTests: XCTestCase { wait(for: [expectation], timeout: 1.0) } - func testHandleComposingLeftRomajiOnly() { + func testHandleComposingCursorRomajiOnly() { let expectation = XCTestExpectation() - stateMachine.inputMethodEvent.collect(5).sink { events in + stateMachine.inputMethodEvent.collect(8).sink { events in XCTAssertEqual(events[0], .markedText(MarkedText([.plain("k")]))) XCTAssertEqual(events[1], .markedText(MarkedText([]))) XCTAssertEqual(events[2], .markedText(MarkedText([.plain("s")]))) - XCTAssertEqual(events[3], .markedText(MarkedText([.plain("sh")]))) - XCTAssertEqual(events[4], .markedText(MarkedText([]))) + XCTAssertEqual(events[3], .markedText(MarkedText([]))) + XCTAssertEqual(events[4], .markedText(MarkedText([.plain("t")]))) + XCTAssertEqual(events[5], .markedText(MarkedText([]))) + XCTAssertEqual(events[6], .markedText(MarkedText([.plain("n")]))) + XCTAssertEqual(events[7], .markedText(MarkedText([]))) expectation.fulfill() }.store(in: &cancellables) XCTAssertTrue(stateMachine.handle(printableKeyEventAction(character: "k"))) @@ -1149,9 +1152,17 @@ final class StateMachineTests: XCTestCase { XCTAssertEqual(stateMachine.state.inputMethod, .normal, "ローマ字のみで左矢印キーが押されたら未入力に戻す") XCTAssertFalse(stateMachine.handle(Action(keyEvent: .left, originalEvent: nil, cursorPosition: .zero))) XCTAssertTrue(stateMachine.handle(printableKeyEventAction(character: "s"))) - XCTAssertTrue(stateMachine.handle(printableKeyEventAction(character: "h"))) - XCTAssertTrue(stateMachine.handle(Action(keyEvent: .left, originalEvent: nil, cursorPosition: .zero))) - XCTAssertEqual(stateMachine.state.inputMethod, .normal) + XCTAssertTrue(stateMachine.handle(Action(keyEvent: .right, originalEvent: nil, cursorPosition: .zero))) + XCTAssertEqual(stateMachine.state.inputMethod, .normal, "ローマ字のみで右矢印キーが押されたら未入力に戻す") + XCTAssertFalse(stateMachine.handle(Action(keyEvent: .right, originalEvent: nil, cursorPosition: .zero))) + XCTAssertTrue(stateMachine.handle(printableKeyEventAction(character: "t"))) + XCTAssertTrue(stateMachine.handle(Action(keyEvent: .ctrlA, originalEvent: nil, cursorPosition: .zero))) + XCTAssertEqual(stateMachine.state.inputMethod, .normal, "ローマ字のみでCtrl-Aが押されたら未入力に戻す") + XCTAssertFalse(stateMachine.handle(Action(keyEvent: .ctrlA, originalEvent: nil, cursorPosition: .zero))) + XCTAssertTrue(stateMachine.handle(printableKeyEventAction(character: "n"))) + XCTAssertTrue(stateMachine.handle(Action(keyEvent: .ctrlE, originalEvent: nil, cursorPosition: .zero))) + XCTAssertEqual(stateMachine.state.inputMethod, .normal, "ローマ字のみでCtrl-Eが押されたら未入力に戻す") + XCTAssertFalse(stateMachine.handle(Action(keyEvent: .ctrlE, originalEvent: nil, cursorPosition: .zero))) wait(for: [expectation], timeout: 1.0) }