@@ -240,6 +240,94 @@ class KeyHandlerBopomofoTests: XCTestCase {
240240 XCTAssertFalse ( result)
241241 }
242242
243+ func testIcuTransformAppendsPrintableInputAndBuildsCandidates( ) {
244+ let input = KeyHandlerInput (
245+ inputText: " a " , keyCode: 0 , charCode: charCode ( " a " ) , flags: [ ] , isVerticalMode: false )
246+ var state : InputState = InputState . IcuTransform ( string: " " , candidates: [ ] )
247+ let result = handler. handle ( input: input, state: state) { newState in
248+ state = newState
249+ } errorCallback: {
250+ XCTFail ( " ICU transform input should not fail " )
251+ }
252+
253+ XCTAssertTrue ( result)
254+ XCTAssertTrue ( state is InputState . IcuTransform , " \( state) " )
255+ guard let state = state as? InputState . IcuTransform else {
256+ return
257+ }
258+ XCTAssertEqual ( state. string, " a " )
259+ XCTAssertTrue ( state. candidates. contains ( " あ " ) )
260+ XCTAssertTrue ( state. candidates. contains ( " ア " ) )
261+ XCTAssertFalse ( state. candidates. contains ( " a " ) )
262+ }
263+
264+ func testIcuTransformDeletesLastCharacterAndRefreshesCandidates( ) {
265+ let input = KeyHandlerInput (
266+ inputText: " " , keyCode: 0 , charCode: 8 , flags: [ ] , isVerticalMode: false )
267+ var state : InputState = InputState . IcuTransform ( string: " ka " , candidates: [ ] )
268+ let result = handler. handle ( input: input, state: state) { newState in
269+ state = newState
270+ } errorCallback: {
271+ XCTFail ( " ICU transform delete should not fail " )
272+ }
273+
274+ XCTAssertTrue ( result)
275+ XCTAssertTrue ( state is InputState . IcuTransform , " \( state) " )
276+ guard let state = state as? InputState . IcuTransform else {
277+ return
278+ }
279+ XCTAssertEqual ( state. string, " k " )
280+ XCTAssertTrue ( state. candidates. contains ( " κ " ) )
281+ XCTAssertFalse ( state. candidates. contains ( " か " ) )
282+ }
283+
284+ func testIcuTransformDeleteEmptyStringReportsError( ) {
285+ let input = KeyHandlerInput (
286+ inputText: " " , keyCode: 0 , charCode: 8 , flags: [ ] , isVerticalMode: false )
287+ var state : InputState = InputState . IcuTransform ( string: " " , candidates: [ ] )
288+ var didReportError = false
289+ let result = handler. handle ( input: input, state: state) { newState in
290+ state = newState
291+ } errorCallback: {
292+ didReportError = true
293+ }
294+
295+ XCTAssertTrue ( result)
296+ XCTAssertTrue ( didReportError)
297+ XCTAssertEqual ( ( state as? InputState . IcuTransform) ? . string, " " )
298+ }
299+
300+ func testIcuTransformEscapeCancelsInput( ) {
301+ let input = KeyHandlerInput (
302+ inputText: " " , keyCode: 0 , charCode: 27 , flags: [ ] , isVerticalMode: false )
303+ var state : InputState = InputState . IcuTransform ( string: " ka " , candidates: [ ] )
304+ let result = handler. handle ( input: input, state: state) { newState in
305+ state = newState
306+ } errorCallback: {
307+ XCTFail ( " ICU transform escape should not fail " )
308+ }
309+
310+ XCTAssertTrue ( result)
311+ XCTAssertTrue ( state is InputState . Empty , " \( state) " )
312+ }
313+
314+ func testIcuTransformIgnoresNonPrintableInput( ) {
315+ let input = KeyHandlerInput (
316+ inputText: " " , keyCode: 0 , charCode: 0 , flags: [ ] , isVerticalMode: false )
317+ var state : InputState = InputState . IcuTransform ( string: " ka " , candidates: [ ] )
318+ var didChangeState = false
319+ let result = handler. handle ( input: input, state: state) { newState in
320+ state = newState
321+ didChangeState = true
322+ } errorCallback: {
323+ XCTFail ( " ICU transform non-printable input should not fail " )
324+ }
325+
326+ XCTAssertTrue ( result)
327+ XCTAssertFalse ( didChangeState)
328+ XCTAssertEqual ( ( state as? InputState . IcuTransform) ? . string, " ka " )
329+ }
330+
243331 func testIgnoreCapslock( ) {
244332 let input = KeyHandlerInput (
245333 inputText: " A " , keyCode: 0 , charCode: 0 , flags: . capsLock, isVerticalMode: false )
@@ -2857,96 +2945,6 @@ extension KeyHandlerBopomofoTests {
28572945
28582946extension KeyHandlerBopomofoTests {
28592947
2860- func testIrohaKanaInput( ) {
2861- var state : InputState = InputState . IrohaKana ( code: " " )
2862-
2863- let inputA = KeyHandlerInput (
2864- inputText: " a " , keyCode: 0 , charCode: charCode ( " a " ) , flags: [ ] ,
2865- isVerticalMode: false )
2866-
2867- handler. handle ( input: inputA, state: state) { newState in
2868- state = newState
2869- } errorCallback: {
2870- }
2871-
2872- XCTAssertTrue ( state is InputState . IrohaKana )
2873- if let s = state as? InputState . IrohaKana {
2874- XCTAssertEqual ( s. code, " a " )
2875- }
2876-
2877- let inputEnter = KeyHandlerInput (
2878- inputText: " \r " , keyCode: KeyCode . enter. rawValue, charCode: 13 , flags: [ ] ,
2879- isVerticalMode: false )
2880- var irohaCandidate : InputState . IrohaKanaCandidates ?
2881- handler. handle ( input: inputEnter, state: state) { newState in
2882- if let s = newState as? InputState . IrohaKanaCandidates {
2883- irohaCandidate = s
2884- }
2885- state = newState
2886- } errorCallback: {
2887- }
2888-
2889- XCTAssertNotNil ( irohaCandidate)
2890- XCTAssertEqual ( irohaCandidate? . candidate ( at: 0 ) , " あ " )
2891- }
2892-
2893- func testIrohaKanaBackspace( ) {
2894- var state : InputState = InputState . IrohaKana ( code: " a " )
2895- let inputDelete = KeyHandlerInput (
2896- inputText: " " , keyCode: KeyCode . delete. rawValue, charCode: 8 , flags: [ ] ,
2897- isVerticalMode: false )
2898- handler. handle ( input: inputDelete, state: state) { newState in
2899- state = newState
2900- } errorCallback: {
2901- }
2902- XCTAssertTrue ( state is InputState . IrohaKana )
2903- if let s = state as? InputState . IrohaKana {
2904- XCTAssertEqual ( s. code, " " )
2905- }
2906- }
2907-
2908- func testIrohaKanaCancel( ) {
2909- var state : InputState = InputState . IrohaKana ( code: " a " )
2910- let inputEsc = KeyHandlerInput (
2911- inputText: " " , keyCode: 27 , charCode: 27 , flags: [ ] ,
2912- isVerticalMode: false )
2913- handler. handle ( input: inputEsc, state: state) { newState in
2914- state = newState
2915- } errorCallback: {
2916- }
2917- XCTAssertTrue ( state is InputState . Empty )
2918- }
2919-
2920- func testIrohaKanaCandidateGeneration( ) {
2921- var state : InputState = InputState . IrohaKana ( code: " kyou " )
2922- let inputEnter = KeyHandlerInput (
2923- inputText: " \r " , keyCode: KeyCode . enter. rawValue, charCode: 13 , flags: [ ] ,
2924- isVerticalMode: false )
2925- handler. handle ( input: inputEnter, state: state) { newState in
2926- state = newState
2927- } errorCallback: {
2928- }
2929- XCTAssertTrue ( state is InputState . IrohaKanaCandidates )
2930- if let s = state as? InputState . IrohaKanaCandidates {
2931- XCTAssertEqual ( s. code, " kyou " )
2932- XCTAssertTrue ( s. candidates. contains ( " 今日 " ) )
2933- XCTAssertTrue ( s. candidates. contains ( " きょう " ) )
2934- }
2935- }
2936-
2937- func testIrohaKanaCandidateCancel( ) {
2938- var state : InputState = InputState . IrohaKanaCandidates (
2939- code: " kyou " , candidates: [ " きょう " , " 今日 " ] )
2940- let inputEsc = KeyHandlerInput (
2941- inputText: " " , keyCode: 27 , charCode: 27 , flags: [ ] ,
2942- isVerticalMode: false )
2943- handler. handle ( input: inputEsc, state: state) { newState in
2944- state = newState
2945- } errorCallback: {
2946- }
2947- XCTAssertTrue ( state is InputState . EmptyIgnoringPreviousState )
2948- }
2949-
29502948 func testInputBufferThenBacktickThenEsc( ) {
29512949 // Type something in the buffer, then press ` to enter choosing punctuation list, then ESC to return to inputting state
29522950 var state : InputState = InputState . Empty ( )
0 commit comments