@@ -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 )
0 commit comments