Files
needLe/dotnet/MaigoLabs.NeedLe.Tests/Indexer/TrieTests.cs
T
2026-01-01 03:40:41 +08:00

67 lines
2.2 KiB
C#

using MaigoLabs.NeedLe.Common;
using MaigoLabs.NeedLe.Common.Extensions;
using MaigoLabs.NeedLe.Indexer.Trie;
namespace MaigoLabs.NeedLe.Tests.Indexer;
#region GraftTriePaths
public sealed class GraftTriePaths_GraftsPathsAccordingToNormalizationRulesTest : NeedleTestBase
{
[Fact]
public void Execute()
{
// Build a trie with tokens containing normalized forms
var trie = TrieBuilder.BuildTrie([
(0, "sya".ToCodePoints()), // normalized form of "sha"
(1, "tu".ToCodePoints()), // normalized form of "tsu"
]);
// Graft paths so that "sha" -> "sya" and "tsu" -> "tu"
TrieBuilder.GraftTriePaths(trie, [
("sha".ToCodePoints().ToArray(), "sya".ToCodePoints().ToArray()),
("tsu".ToCodePoints().ToArray(), "tu".ToCodePoints().ToArray()),
]);
// Now we should be able to traverse using both the original and grafted paths
var syaNode = trie.Traverse("sya".ToCodePoints().ToArray());
var shaNode = trie.Traverse("sha".ToCodePoints().ToArray());
Assert.NotNull(syaNode);
Assert.NotNull(shaNode);
Assert.Same(syaNode, shaNode); // Both paths should lead to the same node
var tuNode = trie.Traverse("tu".ToCodePoints().ToArray());
var tsuNode = trie.Traverse("tsu".ToCodePoints().ToArray());
Assert.NotNull(tuNode);
Assert.NotNull(tsuNode);
Assert.Same(tuNode, tsuNode);
}
}
public sealed class GraftTriePaths_HandlesChainedGraftRulesTest : NeedleTestBase
{
[Fact]
public void Execute()
{
var trie = TrieBuilder.BuildTrie([
(0, "o".ToCodePoints()), // normalized vowel
]);
// Chain: "ou" -> "o", "oo" -> "o"
TrieBuilder.GraftTriePaths(trie, [
("ou".ToCodePoints().ToArray(), "o".ToCodePoints().ToArray()),
("oo".ToCodePoints().ToArray(), "o".ToCodePoints().ToArray()),
]);
var oNode = trie.Traverse("o".ToCodePoints().ToArray());
var ouNode = trie.Traverse("ou".ToCodePoints().ToArray());
var ooNode = trie.Traverse("oo".ToCodePoints().ToArray());
Assert.NotNull(oNode);
Assert.Same(oNode, ouNode);
Assert.Same(oNode, ooNode);
}
}
#endregion