Merge pull request #227 from azooKey/feat/mapped_input_style

feat: `.mapped(id)`を新たな入力スタイルとして導入し、カスタムローマ字かな変換テーブルに対応
This commit is contained in:
Miwa
2025-07-23 23:35:36 +09:00
committed by GitHub
parent 6192a8817e
commit d8b06e9367
18 changed files with 1126 additions and 414 deletions

View File

@ -140,7 +140,7 @@ final class ComposingTextTests: XCTestCase {
ComposingText.InputElement(character: "a", inputStyle: .roman2kana),
ComposingText.InputElement(character: "k", inputStyle: .roman2kana),
ComposingText.InputElement(character: "a", inputStyle: .roman2kana),
ComposingText.InputElement(character: "", inputStyle: .direct)
ComposingText.InputElement(character: "", inputStyle: .frozen)
])
XCTAssertEqual(c.convertTarget, "あかふ")
XCTAssertEqual(c.convertTargetCursorPosition, 3)

View File

@ -0,0 +1,28 @@
@testable import KanaKanjiConverterModule
import XCTest
final class InputStyleManagerTests: XCTestCase {
func testCustomTableLoading() throws {
let url = FileManager.default.temporaryDirectory.appendingPathComponent("custom.tsv")
try "a\t\nka\t\n".write(to: url, atomically: true, encoding: .utf8)
let table = InputStyleManager.shared.table(for: .custom(url))
XCTAssertEqual(table.toHiragana(currentText: [], added: "a"), Array(""))
XCTAssertEqual(table.toHiragana(currentText: ["k"], added: "a"), Array(""))
}
func testCustomTableLoadingWithBlankLines() throws {
let url = FileManager.default.temporaryDirectory.appendingPathComponent("custom.tsv")
try "a\t\n\n\nka\t\n".write(to: url, atomically: true, encoding: .utf8)
let table = InputStyleManager.shared.table(for: .custom(url))
XCTAssertEqual(table.toHiragana(currentText: [], added: "a"), Array(""))
XCTAssertEqual(table.toHiragana(currentText: ["k"], added: "a"), Array(""))
}
func testCustomTableLoadingWithCommentLines() throws {
let url = FileManager.default.temporaryDirectory.appendingPathComponent("custom.tsv")
try "a\t\n# here is comment\nka\t\n".write(to: url, atomically: true, encoding: .utf8)
let table = InputStyleManager.shared.table(for: .custom(url))
XCTAssertEqual(table.toHiragana(currentText: [], added: "a"), Array(""))
XCTAssertEqual(table.toHiragana(currentText: ["k"], added: "a"), Array(""))
}
}

View File

@ -3,24 +3,25 @@ import XCTest
final class Roman2KanaTests: XCTestCase {
func testToHiragana() throws {
let table = InputStyleManager.shared.table(for: .defaultRomanToKana)
// xtsu ->
XCTAssertEqual(Roman2Kana.toHiragana(currentText: Array(""), added: "x"), Array("x"))
XCTAssertEqual(Roman2Kana.toHiragana(currentText: Array("x"), added: "t"), Array("xt"))
XCTAssertEqual(Roman2Kana.toHiragana(currentText: Array("xt"), added: "s"), Array("xts"))
XCTAssertEqual(Roman2Kana.toHiragana(currentText: Array("xts"), added: "u"), Array(""))
XCTAssertEqual(table.toHiragana(currentText: Array(""), added: "x"), Array("x"))
XCTAssertEqual(table.toHiragana(currentText: Array("x"), added: "t"), Array("xt"))
XCTAssertEqual(table.toHiragana(currentText: Array("xt"), added: "s"), Array("xts"))
XCTAssertEqual(table.toHiragana(currentText: Array("xts"), added: "u"), Array(""))
// kanto ->
XCTAssertEqual(Roman2Kana.toHiragana(currentText: Array(""), added: "k"), Array("k"))
XCTAssertEqual(Roman2Kana.toHiragana(currentText: Array("k"), added: "a"), Array(""))
XCTAssertEqual(Roman2Kana.toHiragana(currentText: Array(""), added: "n"), Array("かn"))
XCTAssertEqual(Roman2Kana.toHiragana(currentText: Array("かn"), added: "t"), Array("かんt"))
XCTAssertEqual(Roman2Kana.toHiragana(currentText: Array("かんt"), added: "o"), Array("かんと"))
XCTAssertEqual(table.toHiragana(currentText: Array(""), added: "k"), Array("k"))
XCTAssertEqual(table.toHiragana(currentText: Array("k"), added: "a"), Array(""))
XCTAssertEqual(table.toHiragana(currentText: Array(""), added: "n"), Array("かn"))
XCTAssertEqual(table.toHiragana(currentText: Array("かn"), added: "t"), Array("かんt"))
XCTAssertEqual(table.toHiragana(currentText: Array("かんt"), added: "o"), Array("かんと"))
// zl ->
XCTAssertEqual(Roman2Kana.toHiragana(currentText: Array(""), added: "z"), Array("z"))
XCTAssertEqual(Roman2Kana.toHiragana(currentText: Array("z"), added: "l"), Array(""))
XCTAssertEqual(table.toHiragana(currentText: Array(""), added: "z"), Array("z"))
XCTAssertEqual(table.toHiragana(currentText: Array("z"), added: "l"), Array(""))
// TT -> TT
XCTAssertEqual(Roman2Kana.toHiragana(currentText: Array("T"), added: "T"), Array("TT"))
XCTAssertEqual(table.toHiragana(currentText: Array("T"), added: "T"), Array("TT"))
}
}

View File

@ -75,6 +75,29 @@ final class ConverterTests: XCTestCase {
}
}
func testAzikFullConversion() async throws {
for needTypoCorrection in [true, false] {
do {
let converter = await KanaKanjiConverter()
var c = ComposingText()
// -> , sk -> , dq , kf -> , ds:
c.insertAtCursorPosition("azukihaskzidqnokfbodoapurids", inputStyle: .mapped(id: .defaultAZIK))
XCTAssertEqual(c.convertTarget, "あずーきーはしんじだいのきーぼーどあぷりです")
let results = await converter.requestCandidates(c, options: requestOptions(needTypoCorrection: needTypoCorrection))
XCTAssertEqual(results.mainResults.first?.text, "azooKeyは新時代のキーボードアプリです")
}
do {
let converter = await KanaKanjiConverter()
var c = ComposingText()
// yp -> , xp -> , kf -> , kr -> , kyh -> , rk -> , kd -> , pp -> , -> , kw -> , gr -> , -> , kp -> , dq -> , sz -> , kk -> , tq -> , zq -> , tw ->
c.insertAtCursorPosition("ypxpkfkrtenisusuieiyakyhxprkzikdppnadosamazamanasupotuwokwkdsinagrsodatixpgakpzidqharoszzerusukkkpnitqzqsiteorigoruhuyatenisuwonaratwta", inputStyle: .mapped(id: .defaultAZIK))
XCTAssertEqual(c.convertTarget, "ようしょうきからてにすすいえいやきゅうしょうりんじけんぽうなどさまざまなすぽーつをけいけんしながらそだちしょうがっこうじだいはろさんぜるすきんこうにたいざいしておりごるふやてにすをならっていた")
let results = await converter.requestCandidates(c, options: requestOptions(needTypoCorrection: needTypoCorrection))
XCTAssertEqual(results.mainResults.first?.text, "幼少期からテニス水泳野球少林寺拳法など様々なスポーツを経験しながら育ち小学校時代はロサンゼルス近郊に滞在しておりゴルフやテニスを習っていた")
}
}
}
// 1
// memo:
func testGradualConversion() async throws {

View File

@ -331,7 +331,7 @@ final class DicdataStoreTests: XCTestCase {
}
func testPossibleNexts() throws {
let possibleNexts = DicdataStore.possibleNexts
let possibleNexts = InputStyleManager.shared.table(for: .defaultRomanToKana).possibleNexts
XCTAssertEqual(Set(possibleNexts["f", default: []]).symmetricDifference(["ファ", "フィ", "", "フェ", "フォ", "フャ", "フュ", "フョ", "フゥ", "ッf"]), [])
XCTAssertEqual(Set(possibleNexts["xy", default: []]).symmetricDifference(["", "", ""]), [])
XCTAssertEqual(possibleNexts["", default: []], [])

View File

@ -24,18 +24,6 @@ final class CharacterUtilsTests: XCTestCase {
XCTAssertFalse(CharacterUtils.isKogana("!"))
}
func testIsRomanLetter() throws {
XCTAssertTrue(CharacterUtils.isRomanLetter("a"))
XCTAssertTrue(CharacterUtils.isRomanLetter("A"))
XCTAssertTrue(CharacterUtils.isRomanLetter("b"))
XCTAssertFalse(CharacterUtils.isRomanLetter(""))
XCTAssertFalse(CharacterUtils.isRomanLetter("'"))
XCTAssertFalse(CharacterUtils.isRomanLetter(""))
XCTAssertFalse(CharacterUtils.isRomanLetter(""))
XCTAssertFalse(CharacterUtils.isRomanLetter("!"))
}
func testIsDakuten() throws {
XCTAssertTrue(CharacterUtils.isDakuten(""))
XCTAssertTrue(CharacterUtils.isDakuten(""))