Files
AzooKeyKanaKanjiConverter/Tests/KanaKanjiConverterModuleTests/TemporalLearningMemoryTrieTests.swift
2025-06-01 21:44:31 +09:00

57 lines
2.7 KiB
Swift

@testable import KanaKanjiConverterModule
import XCTest
final class TemporalLearningMemoryTrieTests: XCTestCase {
static let resourceURL = Bundle.module.resourceURL!.appendingPathComponent("DictionaryMock", isDirectory: true)
static func loadCharMap() -> [Character: UInt8] {
let chidURL = resourceURL.appendingPathComponent("louds/charID.chid", isDirectory: false)
let string = try! String(contentsOf: chidURL, encoding: .utf8)
return Dictionary(uniqueKeysWithValues: string.enumerated().map { ($0.element, UInt8($0.offset)) })
}
func chars(for string: String) -> [UInt8] {
LearningManager.keyToChars(string, char2UInt8: Self.loadCharMap())!
}
func testMemorizeAndMatch() throws {
var trie = TemporalLearningMemoryTrie()
let element1 = DicdataElement(word: "テスト", ruby: "テスト", cid: CIDData..cid, mid: MIDData..mid, value: -10)
let element2 = DicdataElement(word: "テスター", ruby: "テスター", cid: CIDData..cid, mid: MIDData..mid, value: -12)
trie.memorize(dicdataElement: element1, chars: chars(for: element1.ruby))
trie.memorize(dicdataElement: element2, chars: chars(for: element2.ruby))
let result1 = trie.perfectMatch(chars: chars(for: element1.ruby))
XCTAssertEqual(result1.count, 1)
XCTAssertEqual(result1.first?.word, element1.word)
XCTAssertTrue(result1.first?.metadata.contains(.isLearned) ?? false)
let result2 = trie.throughMatch(chars: chars(for: element2.ruby), depth: (element2.ruby.count - 1)..<element2.ruby.count)
XCTAssertEqual(result2.map { $0.word }, [element2.word])
let prefixResult = trie.prefixMatch(chars: chars(for: "テス"))
XCTAssertEqual(Set(prefixResult.map { $0.word }), Set([element1.word, element2.word]))
}
func testMemorizeUpdateCountAndForget() throws {
var trie = TemporalLearningMemoryTrie()
let element = DicdataElement(word: "テスター", ruby: "テスター", cid: CIDData..cid, mid: MIDData..mid, value: -10)
let charIDs = chars(for: element.ruby)
trie.memorize(dicdataElement: element, chars: charIDs)
var stored = trie.perfectMatch(chars: charIDs).first!
let adjust1 = stored.adjust
trie.memorize(dicdataElement: element, chars: charIDs)
stored = trie.perfectMatch(chars: charIDs).first!
let adjust2 = stored.adjust
XCTAssertGreaterThan(adjust2, adjust1)
XCTAssertEqual(trie.perfectMatch(chars: charIDs).count, 1)
XCTAssertTrue(trie.forget(dicdataElement: stored, chars: charIDs))
XCTAssertTrue(trie.perfectMatch(chars: charIDs).isEmpty)
}
}