Files
AzooKeyKanaKanjiConverter/Tests/KanaKanjiConverterModuleTests/ComposingTextTests.swift
Miwa 59cde2a2ca Merge pull request #224 from azooKey/refactor/remove_complicated_boundary_checker
refactor: 特定のローマ字かな変換テーブルを前提にした複雑な境界チェックを廃止する
2025-07-21 17:33:47 +09:00

213 lines
9.6 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// ComposingTextTests.swift
// KanaKanjiConverterModuleTests
//
// Created by ensan on 2022/12/18.
// Copyright © 2022 ensan. All rights reserved.
//
@testable import KanaKanjiConverterModule
import XCTest
final class ComposingTextTests: XCTestCase {
func sequentialInput(_ composingText: inout ComposingText, sequence: String, inputStyle: InputStyle) {
for char in sequence {
composingText.insertAtCursorPosition(String(char), inputStyle: inputStyle)
}
}
func testIsEmpty() throws {
var c = ComposingText()
XCTAssertTrue(c.isEmpty)
c.insertAtCursorPosition("", inputStyle: .direct)
XCTAssertFalse(c.isEmpty)
c.stopComposition()
XCTAssertTrue(c.isEmpty)
}
func testInsertAtCursorPosition() throws {
//
do {
var c = ComposingText()
c.insertAtCursorPosition("", inputStyle: .direct)
XCTAssertEqual(c.input, [ComposingText.InputElement(character: "", inputStyle: .direct)])
XCTAssertEqual(c.convertTarget, "")
XCTAssertEqual(c.convertTargetCursorPosition, 1)
c.insertAtCursorPosition("", inputStyle: .direct)
XCTAssertEqual(c, ComposingText(convertTargetCursorPosition: 2, input: [.init(character: "", inputStyle: .direct), .init(character: "", inputStyle: .direct)], convertTarget: "あん"))
}
//
do {
let inputStyle = InputStyle.roman2kana
var c = ComposingText()
c.insertAtCursorPosition("a", inputStyle: inputStyle)
XCTAssertEqual(c.input, [ComposingText.InputElement(character: "a", inputStyle: inputStyle)])
XCTAssertEqual(c.convertTarget, "")
XCTAssertEqual(c.convertTargetCursorPosition, 1)
c.insertAtCursorPosition("k", inputStyle: inputStyle)
XCTAssertEqual(c, ComposingText(convertTargetCursorPosition: 2, input: [.init(character: "a", inputStyle: inputStyle), .init(character: "k", inputStyle: inputStyle)], convertTarget: "あk"))
c.insertAtCursorPosition("i", inputStyle: inputStyle)
XCTAssertEqual(c, ComposingText(convertTargetCursorPosition: 2, input: [.init(character: "a", inputStyle: inputStyle), .init(character: "k", inputStyle: inputStyle), .init(character: "i", inputStyle: inputStyle)], convertTarget: "あき"))
}
//
do {
let inputStyle = InputStyle.roman2kana
var c = ComposingText()
c.insertAtCursorPosition("akafa", inputStyle: inputStyle)
XCTAssertEqual(c.input, [
ComposingText.InputElement(character: "a", inputStyle: inputStyle),
ComposingText.InputElement(character: "k", inputStyle: inputStyle),
ComposingText.InputElement(character: "a", inputStyle: inputStyle),
ComposingText.InputElement(character: "f", inputStyle: inputStyle),
ComposingText.InputElement(character: "a", inputStyle: inputStyle)
])
XCTAssertEqual(c.convertTarget, "あかふぁ")
XCTAssertEqual(c.convertTargetCursorPosition, 4)
}
// ()
do {
var c = ComposingText()
sequentialInput(&c, sequence: "itte", inputStyle: .roman2kana)
XCTAssertEqual(c.input, [
ComposingText.InputElement(character: "i", inputStyle: .roman2kana),
ComposingText.InputElement(character: "t", inputStyle: .roman2kana),
ComposingText.InputElement(character: "t", inputStyle: .roman2kana),
ComposingText.InputElement(character: "e", inputStyle: .roman2kana)
])
XCTAssertEqual(c.convertTarget, "いって")
XCTAssertEqual(c.convertTargetCursorPosition, 3)
}
// ()
do {
var c = ComposingText()
sequentialInput(&c, sequence: "anta", inputStyle: .roman2kana)
XCTAssertEqual(c.input, [
ComposingText.InputElement(character: "a", inputStyle: .roman2kana),
ComposingText.InputElement(character: "n", inputStyle: .roman2kana),
ComposingText.InputElement(character: "t", inputStyle: .roman2kana),
ComposingText.InputElement(character: "a", inputStyle: .roman2kana)
])
XCTAssertEqual(c.convertTarget, "あんた")
XCTAssertEqual(c.convertTargetCursorPosition, 3)
}
//
do {
var c = ComposingText()
c.insertAtCursorPosition("a", inputStyle: .direct)
XCTAssertEqual(c.input, [ComposingText.InputElement(character: "a", inputStyle: .direct)])
XCTAssertEqual(c.convertTarget, "a")
XCTAssertEqual(c.convertTargetCursorPosition, 1)
c.insertAtCursorPosition("k", inputStyle: .roman2kana)
XCTAssertEqual(c, ComposingText(convertTargetCursorPosition: 2, input: [.init(character: "a", inputStyle: .direct), .init(character: "k", inputStyle: .roman2kana)], convertTarget: "ak"))
c.insertAtCursorPosition("i", inputStyle: .roman2kana)
XCTAssertEqual(c, ComposingText(convertTargetCursorPosition: 2, input: [.init(character: "a", inputStyle: .direct), .init(character: "k", inputStyle: .roman2kana), .init(character: "i", inputStyle: .roman2kana)], convertTarget: "aき"))
}
}
func testDeleteForward() throws {
//
do {
var c = ComposingText()
c.insertAtCursorPosition("あいうえお", inputStyle: .direct) // |
_ = c.moveCursorFromCursorPosition(count: -3) // |
//
c.deleteForwardFromCursorPosition(count: 1) // |
XCTAssertEqual(c.input, [
ComposingText.InputElement(character: "", inputStyle: .direct),
ComposingText.InputElement(character: "", inputStyle: .direct),
ComposingText.InputElement(character: "", inputStyle: .direct),
ComposingText.InputElement(character: "", inputStyle: .direct)
])
XCTAssertEqual(c.convertTarget, "あいえお")
XCTAssertEqual(c.convertTargetCursorPosition, 2)
}
//
do {
var c = ComposingText()
c.insertAtCursorPosition("akafa", inputStyle: .roman2kana) // |
_ = c.moveCursorFromCursorPosition(count: -1) // |
//
c.deleteForwardFromCursorPosition(count: 1) //
XCTAssertEqual(c.input, [
ComposingText.InputElement(character: "a", inputStyle: .roman2kana),
ComposingText.InputElement(character: "k", inputStyle: .roman2kana),
ComposingText.InputElement(character: "a", inputStyle: .roman2kana),
ComposingText.InputElement(character: "", inputStyle: .direct)
])
XCTAssertEqual(c.convertTarget, "あかふ")
XCTAssertEqual(c.convertTargetCursorPosition, 3)
}
}
func testDifferenceSuffix() throws {
do {
var c1 = ComposingText()
c1.insertAtCursorPosition("hasir", inputStyle: .roman2kana)
var c2 = ComposingText()
c2.insertAtCursorPosition("hasiru", inputStyle: .roman2kana)
XCTAssertEqual(c2.differenceSuffix(to: c1).deletedInput, 0)
XCTAssertEqual(c2.differenceSuffix(to: c1).addedInput, 1)
}
do {
var c1 = ComposingText()
c1.insertAtCursorPosition("tukatt", inputStyle: .roman2kana)
var c2 = ComposingText()
c2.insertAtCursorPosition("tukatte", inputStyle: .roman2kana)
XCTAssertEqual(c2.differenceSuffix(to: c1).deletedInput, 0)
XCTAssertEqual(c2.differenceSuffix(to: c1).addedInput, 1)
}
}
func testIndexMap() throws {
do {
var c = ComposingText()
sequentialInput(&c, sequence: "kyouhaiitenkida", inputStyle: .roman2kana)
let map = c.inputIndexToSurfaceIndexMap()
XCTAssertEqual(map[0], 0) // ""
XCTAssertEqual(map[1], nil) // k
XCTAssertEqual(map[2], nil) // y
XCTAssertEqual(map[3], 2) // o
XCTAssertEqual(map[4], 3) // u
XCTAssertEqual(map[5], nil) // h
XCTAssertEqual(map[6], 4) // a
XCTAssertEqual(map[7], 5) // i
XCTAssertEqual(map[8], 6) // i
XCTAssertEqual(map[9], nil) // t
XCTAssertEqual(map[10], 7) // e
XCTAssertEqual(map[11], nil) // n
XCTAssertEqual(map[12], nil) // k
XCTAssertEqual(map[13], 9) // i
XCTAssertEqual(map[14], nil) // d
XCTAssertEqual(map[15], 10) // a
}
do {
var c = ComposingText()
sequentialInput(&c, sequence: "sakujoshori", inputStyle: .roman2kana)
let map = c.inputIndexToSurfaceIndexMap()
let reversedMap = (0 ..< c.convertTarget.count + 1).compactMap {
if map.values.contains($0) {
String(c.convertTarget.prefix($0))
} else {
nil
}
}
XCTAssertFalse(reversedMap.contains("さくじ"))
XCTAssertFalse(reversedMap.contains("さくじょし"))
}
}
}