feat: add tests for typo

This commit is contained in:
ensan-hcl
2025-07-14 13:55:31 -07:00
parent b9bd88a247
commit 58e18f2a88
4 changed files with 137 additions and 82 deletions

View File

@ -7,7 +7,7 @@
//
import Foundation
import KanaKanjiConverterModuleWithDefaultDictionary
@testable import KanaKanjiConverterModuleWithDefaultDictionary
import XCTest
final class ConverterTests: XCTestCase {
@ -17,9 +17,10 @@ final class ConverterTests: XCTestCase {
}
}
func requestOptions() -> ConvertRequestOptions {
func requestOptions(needTypoCorrection: Bool = false) -> ConvertRequestOptions {
.withDefaultDictionary(
N_best: 10,
needTypoCorrection: needTypoCorrection,
requireJapanesePrediction: false,
requireEnglishPrediction: false,
keyboardLanguage: .ja_JP,
@ -56,19 +57,21 @@ final class ConverterTests: XCTestCase {
}
func testRoman2KanaFullConversion() async throws {
do {
let converter = await KanaKanjiConverter()
var c = ComposingText()
c.insertAtCursorPosition("azuーkiーhasinjidainokiーboーdoapuridesu", inputStyle: .roman2kana)
let results = await converter.requestCandidates(c, options: requestOptions())
XCTAssertEqual(results.mainResults.first?.text, "azooKeyは新時代のキーボードアプリです")
}
do {
let converter = await KanaKanjiConverter()
var c = ComposingText()
c.insertAtCursorPosition("youshoukikaratenisusuieiyakyuushourinjikenpounadosamazamanasupoーtuwokeikennsinagarasodatishougakkouzidaiharosanzerusukinkounitaizaisiteorigoruhuyatenisuwonaratteita", inputStyle: .roman2kana)
let results = await converter.requestCandidates(c, options: requestOptions())
XCTAssertEqual(results.mainResults.first?.text, "幼少期からテニス水泳野球少林寺拳法など様々なスポーツを経験しながら育ち小学校時代はロサンゼルス近郊に滞在しておりゴルフやテニスを習っていた")
for needTypoCorrection in [true, false] {
do {
let converter = await KanaKanjiConverter()
var c = ComposingText()
c.insertAtCursorPosition("azuーkiーhasinjidainokiーboーdoapuridesu", inputStyle: .roman2kana)
let results = await converter.requestCandidates(c, options: requestOptions(needTypoCorrection: needTypoCorrection))
XCTAssertEqual(results.mainResults.first?.text, "azooKeyは新時代のキーボードアプリです")
}
do {
let converter = await KanaKanjiConverter()
var c = ComposingText()
c.insertAtCursorPosition("youshoukikaratenisusuieiyakyuushourinjikenpounadosamazamanasupoーtuwokeikennsinagarasodatishougakkouzidaiharosanzerusukinkounitaizaisiteorigoruhuyatenisuwonaratteita", inputStyle: .roman2kana)
let results = await converter.requestCandidates(c, options: requestOptions(needTypoCorrection: needTypoCorrection))
XCTAssertEqual(results.mainResults.first?.text, "幼少期からテニス水泳野球少林寺拳法など様々なスポーツを経験しながら育ち小学校時代はロサンゼルス近郊に滞在しておりゴルフやテニスを習っていた")
}
}
}
@ -171,72 +174,103 @@ final class ConverterTests: XCTestCase {
//
func testMustCases() async throws {
//
do {
let cases: [(input: String, expect: String)] = [
("つかっている", "使っている"),
("しんだどうぶつ", "死んだ動物"),
("けいさん", "計算"),
("azooKeyをつかう", "azooKeyを使う"),
("じどうAIそうじゅう。", "自動AI操縦。"),
("1234567890123456789012", "1234567890123456789012")
]
//
do {
let cases: [(input: String, expect: String)] = [
("つかっている", "使っている"),
("しんだどうぶつ", "死んだ動物"),
("けいさん", "計算"),
("azooKeyをつかう", "azooKeyを使う"),
("じどうAIそうじゅう。", "自動AI操縦。"),
("1234567890123456789012", "1234567890123456789012")
]
// full input
var options = requestOptions()
options.requireJapanesePrediction = false
for (input, expect) in cases {
let converter = await KanaKanjiConverter()
var c = ComposingText()
sequentialInput(&c, sequence: input, inputStyle: .direct)
// full input
var options = requestOptions()
options.requireJapanesePrediction = false
for (input, expect) in cases {
let converter = await KanaKanjiConverter()
var c = ComposingText()
sequentialInput(&c, sequence: input, inputStyle: .direct)
let results = await converter.requestCandidates(c, options: options)
XCTAssertEqual(results.mainResults.first?.text, expect)
}
// gradual input
for (input, expect) in cases {
let converter = await KanaKanjiConverter()
var c = ComposingText()
for char in input {
c.insertAtCursorPosition(String(char), inputStyle: .direct)
let results = await converter.requestCandidates(c, options: options)
XCTAssertEqual(results.mainResults.first?.text, expect)
}
// gradual input
for (input, expect) in cases {
let converter = await KanaKanjiConverter()
var c = ComposingText()
for char in input {
c.insertAtCursorPosition(String(char), inputStyle: .direct)
let results = await converter.requestCandidates(c, options: options)
if c.input.count == input.count {
XCTAssertEqual(results.mainResults.first?.text, expect)
}
if c.input.count == input.count {
XCTAssertEqual(results.mainResults.first?.text, expect)
}
}
}
//
do {
let cases: [(input: String, expect: String)] = [
("tukatteiru", "使っている"),
("sindadoubutu", "死んだ動物"),
("keisann", "計算")
]
}
//
do {
let cases: [(input: String, expect: String)] = [
("tukatteiru", "使っている"),
("sindadoubutu", "死んだ動物"),
("keisann", "計算")
]
// full input
var options = requestOptions()
options.requireJapanesePrediction = false
for (input, expect) in cases {
let converter = await KanaKanjiConverter()
var c = ComposingText()
sequentialInput(&c, sequence: input, inputStyle: .roman2kana)
// full input
var options = requestOptions()
options.requireJapanesePrediction = false
for (input, expect) in cases {
let converter = await KanaKanjiConverter()
var c = ComposingText()
sequentialInput(&c, sequence: input, inputStyle: .roman2kana)
let results = await converter.requestCandidates(c, options: options)
XCTAssertEqual(results.mainResults.first?.text, expect)
}
// gradual input
for (input, expect) in cases {
let converter = await KanaKanjiConverter()
var c = ComposingText()
for char in input {
c.insertAtCursorPosition(String(char), inputStyle: .roman2kana)
let results = await converter.requestCandidates(c, options: options)
XCTAssertEqual(results.mainResults.first?.text, expect)
}
// gradual input
for (input, expect) in cases {
let converter = await KanaKanjiConverter()
var c = ComposingText()
for char in input {
c.insertAtCursorPosition(String(char), inputStyle: .roman2kana)
let results = await converter.requestCandidates(c, options: options)
if c.input.count == input.count {
XCTAssertEqual(results.mainResults.first?.text, expect)
}
if c.input.count == input.count {
XCTAssertEqual(results.mainResults.first?.text, expect)
}
}
}
}
// typo
do {
let cases: [(input: String, expect: String)] = [
("たいかくせい", "大学生"),
("きみのことかすき", "君のことが好き"),
("おへんとうをもつていく", "お弁当を持っていく"),
]
// full input
var options = requestOptions(needTypoCorrection: true)
options.requireJapanesePrediction = false
for (input, expect) in cases {
let converter = await KanaKanjiConverter()
var c = ComposingText()
sequentialInput(&c, sequence: input, inputStyle: .direct)
let results = await converter.requestCandidates(c, options: options)
XCTAssertEqual(results.mainResults.first?.text, expect)
}
// gradual input
for (input, expect) in cases {
let converter = await KanaKanjiConverter()
var c = ComposingText()
for char in input {
c.insertAtCursorPosition(String(char), inputStyle: .direct)
let results = await converter.requestCandidates(c, options: options)
if c.input.count == input.count {
XCTAssertEqual(results.mainResults.first?.text, expect)
}
}
}
}
}
//