Files
Miwa / Ensan a5e794d858 [Experimental] 削除操作についてもグラフベースに変更 (#79)
* switch to ComposingTextV2

* delete操作を実装
2024-04-09 01:01:12 +09:00

308 lines
15 KiB
Swift

//
// LookupGraphTests.swift
//
//
// Created by miwa on 2024/02/23.
//
import XCTest
import Foundation
@testable import KanaKanjiConverterModule
final class LookupGraphTests: 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 setup() -> (dicdataStore: DicdataStore, character2CharId: (Character) -> UInt8) {
let dicdataStore = DicdataStore(convertRequestOptions: requestOptions())
let character2CharId: (Character) -> UInt8 = { dicdataStore.character2charId($0.toKatakana()) }
return (dicdataStore, character2CharId)
}
func testByfixNodeIndices_しかい() throws {
let values = setup()
guard let louds = LOUDS.load("", option: requestOptions()) else {
XCTFail()
return
}
let correctGraph = CorrectGraph.build(input: [
.init(value: "", inputStyle: .systemFlickDirect),
.init(value: "", inputStyle: .systemFlickDirect),
.init(value: "", inputStyle: .systemFlickDirect)
])
let inputGraph = InputGraph.build(input: correctGraph)
var lookupGraph = LookupGraph.build(input: inputGraph, character2CharId: values.character2CharId)
let startNodeIndex = inputGraph.allowedNextIndex[0, default: IndexSet()].first(where: { lookupGraph.nodes[$0].character == "" })
XCTAssertNotNil(startNodeIndex)
let (loudsNodeIndices, _) = lookupGraph.byfixNodeIndices(in: louds, startGraphNodeIndex: startNodeIndex ?? 0)
let dicdataWithIndex = values.dicdataStore.getDicdataFromLoudstxt3(identifier: "", indices: loudsNodeIndices, option: requestOptions())
let dicdata = dicdataWithIndex.flatMapSet { $0.dicdata }
//
XCTAssertTrue(dicdata.contains {$0.word == ""})
//
XCTAssertTrue(dicdata.contains {$0.word == "鹿"})
XCTAssertTrue(dicdata.contains {$0.word == "歯科"})
//
XCTAssertTrue(dicdata.contains {$0.word == "滋賀"})
//
XCTAssertTrue(dicdata.contains {$0.word == "司会"})
XCTAssertTrue(dicdata.contains {$0.word == "視界"})
XCTAssertTrue(dicdata.contains {$0.word == "死界"})
//
XCTAssertTrue(dicdata.contains {$0.word == "市外"})
XCTAssertTrue(dicdata.contains {$0.word == "市街"})
XCTAssertTrue(dicdata.contains {$0.word == "死骸"})
// all keys
XCTAssertEqual(
dicdata.mapSet {$0.ruby}.symmetricDifference(["", "シカ", "シカイ", "シガ", "シガイ"]),
[]
)
}
func testByfixNodeIndices_みらい() throws {
let values = setup()
guard let louds = LOUDS.load("", option: requestOptions()) else {
XCTFail()
return
}
let correctGraph = CorrectGraph.build(input: [
.init(value: "", inputStyle: .systemFlickDirect),
.init(value: "", inputStyle: .systemFlickDirect),
.init(value: "", inputStyle: .systemFlickDirect)
])
let inputGraph = InputGraph.build(input: correctGraph)
var lookupGraph = LookupGraph.build(input: inputGraph, character2CharId: values.character2CharId)
let startNodeIndex = lookupGraph.allowedNextIndex[0, default: IndexSet()].first(where: { lookupGraph.nodes[$0].character == "" })
XCTAssertNotNil(startNodeIndex)
let (loudsNodeIndices, _) = lookupGraph.byfixNodeIndices(in: louds, startGraphNodeIndex: startNodeIndex ?? 0)
let dicdataWithIndex = values.dicdataStore.getDicdataFromLoudstxt3(identifier: "", indices: loudsNodeIndices, option: requestOptions())
let dicdata = dicdataWithIndex.flatMapSet { $0.dicdata }
//
XCTAssertTrue(dicdata.contains {$0.word == ""})
//
XCTAssertTrue(dicdata.contains {$0.word == "ミラ"})
//
XCTAssertTrue(dicdata.contains {$0.word == "未来"})
// all keys
XCTAssertEqual(
dicdata.mapSet {$0.ruby}.symmetricDifference(["", "ミラ", "ミライ"]),
[]
)
}
func testByfixNodeIndices_たいかく() throws {
let values = setup()
guard let louds = LOUDS.load("", option: requestOptions()) else {
XCTFail()
return
}
let correctGraph = CorrectGraph.build(input: [
.init(value: "", inputStyle: .systemFlickDirect),
.init(value: "", inputStyle: .systemFlickDirect),
.init(value: "", inputStyle: .systemFlickDirect),
.init(value: "", inputStyle: .systemFlickDirect)
])
let inputGraph = InputGraph.build(input: correctGraph)
var lookupGraph = LookupGraph.build(input: inputGraph, character2CharId: values.character2CharId)
let startNodeIndex = lookupGraph.allowedNextIndex[0, default: IndexSet()].first(where: { lookupGraph.nodes[$0].character == "" })
XCTAssertNotNil(startNodeIndex)
let (loudsNodeIndices, _) = lookupGraph.byfixNodeIndices(in: louds, startGraphNodeIndex: startNodeIndex ?? 0)
let dicdataWithIndex = values.dicdataStore.getDicdataFromLoudstxt3(identifier: "", indices: loudsNodeIndices, option: requestOptions())
let dicdata = dicdataWithIndex.flatMapSet { $0.dicdata }
//
XCTAssertTrue(dicdata.contains {$0.word == ""})
//
XCTAssertTrue(dicdata.contains {$0.word == "タイ"})
XCTAssertTrue(dicdata.contains {$0.word == "他意"})
//
XCTAssertTrue(dicdata.contains {$0.word == "対価"})
//
XCTAssertTrue(dicdata.contains {$0.word == "大河"})
//
XCTAssertTrue(dicdata.contains {$0.word == "体格"})
//
XCTAssertTrue(dicdata.contains {$0.word == "退学"})
// all keys
XCTAssertEqual(
dicdata.mapSet {$0.ruby}.symmetricDifference(["", "タイ", "タイカ", "タイガ", "タイカク", "タイガク"]),
[]
)
}
func testByfixNodeIndices_sittai() throws {
let values = setup()
guard let louds = LOUDS.load("", option: requestOptions()) else {
XCTFail()
return
}
//
let correctGraph = CorrectGraph.build(input: [
.init(value: "s", inputStyle: .systemRomanKana),
.init(value: "i", inputStyle: .systemRomanKana),
.init(value: "t", inputStyle: .systemRomanKana),
.init(value: "t", inputStyle: .systemRomanKana),
.init(value: "a", inputStyle: .systemRomanKana),
.init(value: "i", inputStyle: .systemRomanKana)
])
let inputGraph = InputGraph.build(input: correctGraph)
var lookupGraph = LookupGraph.build(input: inputGraph, character2CharId: values.character2CharId)
let startNodeIndex = lookupGraph.allowedNextIndex[0, default: IndexSet()].first(where: { lookupGraph.nodes[$0].character == "" })
XCTAssertNotNil(startNodeIndex)
let (loudsNodeIndices, _) = lookupGraph.byfixNodeIndices(in: louds, startGraphNodeIndex: startNodeIndex ?? 0)
let dicdataWithIndex = values.dicdataStore.getDicdataFromLoudstxt3(identifier: "", indices: loudsNodeIndices, option: requestOptions())
let dicdata = dicdataWithIndex.flatMapSet { $0.dicdata }
//
XCTAssertTrue(dicdata.contains {$0.word == ""})
//
XCTAssertTrue(dicdata.contains {$0.word == "知っ"})
XCTAssertTrue(dicdata.contains {$0.word == "しっ"})
//
XCTAssertTrue(dicdata.contains {$0.word == "叱咤"})
//
XCTAssertTrue(dicdata.contains {$0.word == "失態"})
// all keys
XCTAssertEqual(
dicdata.mapSet {$0.ruby}.symmetricDifference(["", "シッ", "シッタ", "シッタイ"]),
[]
)
}
func testByfixNodeIndices_sitsi() throws {
let values = setup()
guard let louds = LOUDS.load("", option: requestOptions()) else {
XCTFail()
return
}
// ts -> ta
let correctGraph = CorrectGraph.build(input: [
.init(value: "s", inputStyle: .systemRomanKana),
.init(value: "i", inputStyle: .systemRomanKana),
.init(value: "t", inputStyle: .systemRomanKana),
.init(value: "s", inputStyle: .systemRomanKana),
.init(value: "i", inputStyle: .systemRomanKana)
])
let inputGraph = InputGraph.build(input: correctGraph)
var lookupGraph = LookupGraph.build(input: inputGraph, character2CharId: values.character2CharId)
let startNodeIndex = lookupGraph.allowedNextIndex[0, default: IndexSet()].first(where: { lookupGraph.nodes[$0].character == "" })
XCTAssertNotNil(startNodeIndex)
let (loudsNodeIndices, _) = lookupGraph.byfixNodeIndices(in: louds, startGraphNodeIndex: startNodeIndex ?? 0)
let dicdataWithIndex = values.dicdataStore.getDicdataFromLoudstxt3(identifier: "", indices: loudsNodeIndices, option: requestOptions())
let dicdata = dicdataWithIndex.flatMapSet { $0.dicdata }
//
XCTAssertTrue(dicdata.contains {$0.word == ""})
// []
XCTAssertTrue(dicdata.contains {$0.word == ""})
XCTAssertTrue(dicdata.contains {$0.word == ""})
//
XCTAssertTrue(dicdata.contains {$0.word == ""})
XCTAssertTrue(dicdata.contains {$0.word == ""})
//
XCTAssertTrue(dicdata.contains {$0.word == "死体"})
XCTAssertTrue(dicdata.contains {$0.word == "肢体"})
// all keys
XCTAssertEqual(
dicdata.mapSet {$0.ruby}.symmetricDifference(["", "シツ", "シタ", "シタイ"]),
[]
)
}
func testByfixNodeIndices_たいか_add_く() throws {
let values = setup()
guard let louds = LOUDS.load("", option: requestOptions()) else {
XCTFail()
return
}
let correctGraph1 = CorrectGraph.build(input: [
.init(value: "", inputStyle: .systemFlickDirect),
.init(value: "", inputStyle: .systemFlickDirect),
.init(value: "", inputStyle: .systemFlickDirect)
])
let inputGraph1 = InputGraph.build(input: correctGraph1)
var lookupGraph1 = LookupGraph.build(input: inputGraph1, character2CharId: values.character2CharId)
let startNodeIndex1 = lookupGraph1.allowedNextIndex[0, default: IndexSet()].first(where: { lookupGraph1.nodes[$0].character == "" })
XCTAssertNotNil(startNodeIndex1)
_ = lookupGraph1.byfixNodeIndices(in: louds, startGraphNodeIndex: startNodeIndex1 ?? 0)
let correctGraph2 = CorrectGraph.build(input: [
.init(value: "", inputStyle: .systemFlickDirect),
.init(value: "", inputStyle: .systemFlickDirect),
.init(value: "", inputStyle: .systemFlickDirect),
.init(value: "", inputStyle: .systemFlickDirect) // added
])
let inputGraph2 = InputGraph.build(input: correctGraph2)
var lookupGraph2 = LookupGraph.build(input: inputGraph2, character2CharId: values.character2CharId)
let startNodeIndex2 = lookupGraph2.allowedNextIndex[0, default: IndexSet()].first(where: { lookupGraph2.nodes[$0].character == "" })
XCTAssertNotNil(startNodeIndex2)
var matchInfo: [Int: Int] = [:]
let (loudsNodeIndices2, _) = lookupGraph2.differentialByfixSearch(in: louds, cacheLookupGraph: lookupGraph1, graphNodeIndex: (startNodeIndex2 ?? 0, startNodeIndex1 ?? 0), lookupGraphMatch: &matchInfo)
let dicdataWithIndex = values.dicdataStore.getDicdataFromLoudstxt3(identifier: "", indices: loudsNodeIndices2, option: requestOptions())
let dicdata = dicdataWithIndex.flatMapSet { $0.dicdata }
//
XCTAssertTrue(dicdata.contains {$0.word == ""})
//
XCTAssertTrue(dicdata.contains {$0.word == "タイ"})
XCTAssertTrue(dicdata.contains {$0.word == "他意"})
//
XCTAssertTrue(dicdata.contains {$0.word == "対価"})
//
XCTAssertTrue(dicdata.contains {$0.word == "大河"})
//
XCTAssertTrue(dicdata.contains {$0.word == "体格"})
//
XCTAssertTrue(dicdata.contains {$0.word == "退学"})
// all keys
XCTAssertEqual(
dicdata.mapSet {$0.ruby}.symmetricDifference(["", "タイ", "タイカ", "タイガ", "タイカク", "タイガク"]),
[]
)
}
func testByfixNodeIndices_たいか_remove_く() throws {
let values = setup()
guard let louds = LOUDS.load("", option: requestOptions()) else {
XCTFail()
return
}
let correctGraph1 = CorrectGraph.build(input: [
.init(value: "", inputStyle: .systemFlickDirect),
.init(value: "", inputStyle: .systemFlickDirect),
.init(value: "", inputStyle: .systemFlickDirect)
])
let inputGraph1 = InputGraph.build(input: correctGraph1)
var lookupGraph1 = LookupGraph.build(input: inputGraph1, character2CharId: values.character2CharId)
let startNodeIndex1 = lookupGraph1.allowedNextIndex[0, default: IndexSet()].first(where: { lookupGraph1.nodes[$0].character == "" })
XCTAssertNotNil(startNodeIndex1)
_ = lookupGraph1.byfixNodeIndices(in: louds, startGraphNodeIndex: startNodeIndex1 ?? 0)
let correctGraph2 = CorrectGraph.build(input: [
.init(value: "", inputStyle: .systemFlickDirect),
.init(value: "", inputStyle: .systemFlickDirect)
])
let inputGraph2 = InputGraph.build(input: correctGraph2)
var lookupGraph2 = LookupGraph.build(input: inputGraph2, character2CharId: values.character2CharId)
let startNodeIndex2 = lookupGraph2.allowedNextIndex[0, default: IndexSet()].first(where: { lookupGraph2.nodes[$0].character == "" })
XCTAssertNotNil(startNodeIndex2)
var matchInfo: [Int: Int] = [:]
let (loudsNodeIndices2, _) = lookupGraph2.differentialByfixSearch(in: louds, cacheLookupGraph: lookupGraph1, graphNodeIndex: (startNodeIndex2 ?? 0, startNodeIndex1 ?? 0), lookupGraphMatch: &matchInfo)
let dicdataWithIndex = values.dicdataStore.getDicdataFromLoudstxt3(identifier: "", indices: loudsNodeIndices2, option: requestOptions())
let dicdata = dicdataWithIndex.flatMapSet { $0.dicdata }
//
XCTAssertTrue(dicdata.contains {$0.word == ""})
//
XCTAssertTrue(dicdata.contains {$0.word == "タイ"})
XCTAssertTrue(dicdata.contains {$0.word == "他意"})
//
XCTAssertFalse(dicdata.contains {$0.ruby == "タイカ"})
//
XCTAssertFalse(dicdata.contains {$0.ruby == "タイガ"})
// all keys
XCTAssertEqual(
dicdata.mapSet {$0.ruby}.symmetricDifference(["", "タイ"]),
[]
)
}
}