Files
AzooKeyKanaKanjiConverter/Tests/KanaKanjiConverterModuleWithDefaultDictionaryTests/ExperimentalTests/extension Kana2Kanji+InputGraph.swift
2024-03-18 01:05:03 +09:00

251 lines
12 KiB
Swift

//
// extension Kana2Kanji+InputGraph.swift
//
//
// Created by miwa on 2024/02/23.
//
import Foundation
@testable import KanaKanjiConverterModule
import XCTest
extension Kana2Kanji {
struct Result {
var endNode: ConvertGraph.LatticeNode
var correctGraph: CorrectGraph
var inputGraph: InputGraph
var convertGraph: ConvertGraph
}
func _experimental_all(_ inputData: ComposingText, option: ConvertRequestOptions) -> Result {
//
print(#file, "start")
let correctGraph = CorrectGraph.build(input: inputData.input)
let inputGraph = InputGraph.build(input: correctGraph)
// convertGraph
print(#file, "lookup", inputGraph)
let convertGraph = self.dicdataStore.buildConvertGraph(inputGraph: inputGraph, option: option)
print(#file, "convert")
let result = convertGraph.convertAll(option: option, dicdataStore: self.dicdataStore)
return Result(endNode: result, correctGraph: correctGraph, inputGraph: inputGraph, convertGraph: convertGraph)
}
func _experimental_additional(
composingText: ComposingText,
additionalInputsStartIndex: Int,
previousResult: consuming Result,
option: ConvertRequestOptions
) -> Result {
//
print(#file, "start")
var insertedIndexSet = IndexSet()
for i in additionalInputsStartIndex ..< composingText.input.endIndex {
insertedIndexSet.formUnion(previousResult.correctGraph.update(with: composingText.input[i], index: i, input: composingText.input))
}
// FIXME: inputGraph
let inputGraph = InputGraph.build(input: previousResult.correctGraph)
// TODO:
// convertGraph
print(#file, "lookup", previousResult.inputGraph)
let convertGraph = self.dicdataStore.buildConvertGraph(inputGraph: inputGraph, option: option)
print(#file, "convert")
let result = convertGraph.convertAll(option: option, dicdataStore: self.dicdataStore)
return Result(endNode: result, correctGraph: previousResult.correctGraph, inputGraph: inputGraph, convertGraph: convertGraph)
}
}
private extension ConvertGraph.LatticeNode {
func joinedPrevs() -> [String] {
var result: [String] = []
for prev in self.prevs {
var words = [self.data.word, prev.data.word]
var curPrev: (any RegisteredNodeProtocol) = prev
while let newPrev = curPrev.prev {
words.append(newPrev.data.word)
curPrev = newPrev
}
result.append(words.reversed().joined())
}
return result
}
}
final class ExperimentalConversionTests: XCTestCase {
func requestOptions() -> ConvertRequestOptions {
.withDefaultDictionary(requireJapanesePrediction: false, requireEnglishPrediction: false, keyboardLanguage: .ja_JP, learningType: .nothing, memoryDirectoryURL: URL(fileURLWithPath: ""), sharedContainerURL: URL(fileURLWithPath: ""), metadata: .init(appVersionString: "Test"))
}
func testBuildConvertGraph_たいかく() throws {
let dicdataStore = DicdataStore(requestOptions: requestOptions())
var c = ComposingText()
c.insertAtCursorPosition("たいかく", inputStyle: .direct)
let correctGraph = CorrectGraph.build(input: c.input)
let inputGraph = InputGraph.build(input: consume correctGraph)
let convertGraph = dicdataStore.buildConvertGraph(inputGraph: inputGraph, option: requestOptions())
XCTAssertEqual(
convertGraph.nodes.first {
$0.latticeNodes.contains(where: {$0.data.word == ""})
}?.latticeNodes.mapSet {$0.data.ruby}
.symmetricDifference(["", "タイ", "タイカ", "タイガ", "タイカク", "タイガク"]),
[]
)
}
func testConversion_たい() throws {
let dicdataStore = DicdataStore(requestOptions: requestOptions())
let kana2kanji = Kana2Kanji(dicdataStore: dicdataStore)
var c = ComposingText()
c.insertAtCursorPosition("たい", inputStyle: .direct)
let result = kana2kanji._experimental_all(c, option: requestOptions())
XCTAssertTrue(result.endNode.joinedPrevs().contains("タイ")) //
XCTAssertTrue(result.endNode.joinedPrevs().contains("")) //
}
func testConversion_いか() throws {
let dicdataStore = DicdataStore(requestOptions: requestOptions())
let kana2kanji = Kana2Kanji(dicdataStore: dicdataStore)
var c = ComposingText()
c.insertAtCursorPosition("いか", inputStyle: .direct)
let result = kana2kanji._experimental_all(c, option: requestOptions())
XCTAssertTrue(result.endNode.joinedPrevs().contains("以下")) //
XCTAssertTrue(result.endNode.joinedPrevs().contains("伊賀")) //
}
func testConversion_かかく() throws {
let dicdataStore = DicdataStore(requestOptions: requestOptions())
let kana2kanji = Kana2Kanji(dicdataStore: dicdataStore)
var c = ComposingText()
c.insertAtCursorPosition("かかく", inputStyle: .direct)
let result = kana2kanji._experimental_all(c, option: requestOptions())
XCTAssertTrue(result.endNode.joinedPrevs().contains("価格")) //
XCTAssertTrue(result.endNode.joinedPrevs().contains("科学")) //
XCTAssertTrue(result.endNode.joinedPrevs().contains("画角")) //
XCTAssertTrue(result.endNode.joinedPrevs().contains("雅楽")) //
}
func testConversion_たいか() throws {
let dicdataStore = DicdataStore(requestOptions: requestOptions())
let kana2kanji = Kana2Kanji(dicdataStore: dicdataStore)
var c = ComposingText()
c.insertAtCursorPosition("たいか", inputStyle: .direct)
let result = kana2kanji._experimental_all(c, option: requestOptions())
XCTAssertTrue(result.endNode.joinedPrevs().contains("対価")) //
XCTAssertTrue(result.endNode.joinedPrevs().contains("大河")) //
}
func testConversion_たいかく() throws {
let dicdataStore = DicdataStore(requestOptions: requestOptions())
let kana2kanji = Kana2Kanji(dicdataStore: dicdataStore)
var c = ComposingText()
c.insertAtCursorPosition("たいかく", inputStyle: .direct)
let result = kana2kanji._experimental_all(c, option: requestOptions())
XCTAssertTrue(result.endNode.joinedPrevs().contains("体格")) //
XCTAssertTrue(result.endNode.joinedPrevs().contains("退学")) //
}
func testConversion_むらさき() throws {
let dicdataStore = DicdataStore(requestOptions: requestOptions())
let kana2kanji = Kana2Kanji(dicdataStore: dicdataStore)
var c = ComposingText()
c.insertAtCursorPosition("むらさき", inputStyle: .direct)
let result = kana2kanji._experimental_all(c, option: requestOptions())
XCTAssertTrue(result.endNode.joinedPrevs().contains("")) //
}
func testBuildConvertGraph_youshouki() throws {
let dicdataStore = DicdataStore(requestOptions: requestOptions())
var c = ComposingText()
c.insertAtCursorPosition("youshouki", inputStyle: .roman2kana)
let correctGraph = CorrectGraph.build(input: c.input)
let inputGraph = InputGraph.build(input: consume correctGraph)
let convertGraph = dicdataStore.buildConvertGraph(inputGraph: inputGraph, option: requestOptions())
XCTAssertEqual(
convertGraph.nodes.first {
$0.latticeNodes.contains(where: {$0.data.word == ""})
}?.latticeNodes.mapSet {$0.data.ruby}
.symmetricDifference(["", "ヨウ", "ヨウシ", "ヨウショ", "ヨウショウ", "ヨウショウキ"]),
[]
)
}
func testConversion_youshouki() throws {
let dicdataStore = DicdataStore(requestOptions: requestOptions())
let kana2kanji = Kana2Kanji(dicdataStore: dicdataStore)
var c = ComposingText()
c.insertAtCursorPosition("youshouki", inputStyle: .roman2kana)
let result = kana2kanji._experimental_all(c, option: requestOptions())
XCTAssertTrue(result.endNode.joinedPrevs().contains("幼少期")) //
}
func testConversion_みらいえいが() throws {
let dicdataStore = DicdataStore(requestOptions: requestOptions())
let kana2kanji = Kana2Kanji(dicdataStore: dicdataStore)
do {
var c = ComposingText()
c.insertAtCursorPosition("みらいえいが", inputStyle: .direct)
let result = kana2kanji._experimental_all(c, option: requestOptions())
XCTAssertTrue(result.endNode.joinedPrevs().contains("未来映画"))
}
do {
var c = ComposingText()
c.insertAtCursorPosition("miraieiga", inputStyle: .roman2kana)
let result = kana2kanji._experimental_all(c, option: requestOptions())
XCTAssertTrue(result.endNode.joinedPrevs().contains("未来映画"))
}
}
func testConversion() throws {
let dicdataStore = DicdataStore(requestOptions: requestOptions())
let kana2kanji = Kana2Kanji(dicdataStore: dicdataStore)
do {
var c = ComposingText()
c.insertAtCursorPosition("sitta", inputStyle: .roman2kana)
let result = kana2kanji._experimental_all(c, option: requestOptions())
XCTAssertTrue(result.endNode.joinedPrevs().contains("知った"))
}
do {
var c = ComposingText()
c.insertAtCursorPosition("unda", inputStyle: .roman2kana)
let result = kana2kanji._experimental_all(c, option: requestOptions())
XCTAssertTrue(result.endNode.joinedPrevs().contains("産んだ"))
}
do {
var c = ComposingText()
c.insertAtCursorPosition("ixtsuta", inputStyle: .roman2kana)
let result = kana2kanji._experimental_all(c, option: requestOptions())
XCTAssertTrue(result.endNode.joinedPrevs().contains("言った"))
}
do {
var c = ComposingText()
c.insertAtCursorPosition("its", inputStyle: .roman2kana)
let result = kana2kanji._experimental_all(c, option: requestOptions())
XCTAssertTrue(result.endNode.joinedPrevs().contains("いた"))
}
do {
var c = ComposingText()
c.insertAtCursorPosition("itsi", inputStyle: .roman2kana)
let result = kana2kanji._experimental_all(c, option: requestOptions())
XCTAssertTrue(result.endNode.joinedPrevs().contains("痛い"))
}
}
func testConversion_incremental_たい() throws {
let dicdataStore = DicdataStore(requestOptions: requestOptions())
let kana2kanji = Kana2Kanji(dicdataStore: dicdataStore)
var c = ComposingText()
c.insertAtCursorPosition("たい", inputStyle: .direct)
let firstResult = kana2kanji._experimental_all(c, option: requestOptions())
XCTAssertTrue(firstResult.endNode.joinedPrevs().contains("タイ")) //
XCTAssertTrue(firstResult.endNode.joinedPrevs().contains("")) //
c.insertAtCursorPosition("", inputStyle: .direct)
let secondResult = kana2kanji._experimental_additional(
composingText: c,
additionalInputsStartIndex: 2,
previousResult: firstResult,
option: requestOptions()
)
XCTAssertTrue(secondResult.endNode.joinedPrevs().contains("太鼓")) //
XCTAssertTrue(secondResult.endNode.joinedPrevs().contains("太古")) //
}
}