91 lines
2.0 KiB
Go
91 lines
2.0 KiB
Go
package ds
|
|
|
|
import "testing"
|
|
|
|
func TestTrieInsertSearch(t *testing.T) {
|
|
tr := NewTrie()
|
|
words := []string{"apple", "app", "april", "banana"}
|
|
for _, w := range words {
|
|
tr.Insert(w)
|
|
}
|
|
for _, w := range words {
|
|
if !tr.Search(w) {
|
|
t.Fatalf("Search(%q) 应为 true", w)
|
|
}
|
|
}
|
|
if tr.Search("appl") {
|
|
t.Fatal("Search(\"appl\") 应为 false")
|
|
}
|
|
if tr.Search("apples") {
|
|
t.Fatal("Search(\"apples\") 应为 false")
|
|
}
|
|
}
|
|
|
|
func TestTrieStartsWith(t *testing.T) {
|
|
tr := NewTrie()
|
|
for _, w := range []string{"apple", "app", "april"} {
|
|
tr.Insert(w)
|
|
}
|
|
if !tr.StartsWith("app") {
|
|
t.Fatal("StartsWith(\"app\") 应为 true")
|
|
}
|
|
if !tr.StartsWith("ap") {
|
|
t.Fatal("StartsWith(\"ap\") 应为 true")
|
|
}
|
|
if tr.StartsWith("b") {
|
|
t.Fatal("StartsWith(\"b\") 应为 false")
|
|
}
|
|
}
|
|
|
|
func TestTrieDelete(t *testing.T) {
|
|
tr := NewTrie()
|
|
tr.Insert("apple")
|
|
tr.Insert("app")
|
|
// 删 apple,app 应保留(共享前缀节点不能被回收)
|
|
if !tr.Delete("apple") {
|
|
t.Fatal("Delete(\"apple\") 应成功")
|
|
}
|
|
if tr.Search("apple") {
|
|
t.Fatal("Delete 后 Search(\"apple\") 应为 false")
|
|
}
|
|
if !tr.Search("app") {
|
|
t.Fatal("Search(\"app\") 仍应为 true (共享前缀)")
|
|
}
|
|
if !tr.StartsWith("app") {
|
|
t.Fatal("StartsWith(\"app\") 仍应为 true")
|
|
}
|
|
|
|
// 删不存在的单词
|
|
if tr.Delete("xyz") {
|
|
t.Fatal("Delete(\"xyz\") 应返回 false")
|
|
}
|
|
|
|
// 删最后一个单词,根的对应子树应被完全回收
|
|
tr.Delete("app")
|
|
if tr.Search("app") {
|
|
t.Fatal("Delete(\"app\") 后应搜不到")
|
|
}
|
|
}
|
|
|
|
func TestTrieDeleteNonWordPrefix(t *testing.T) {
|
|
tr := NewTrie()
|
|
tr.Insert("apple")
|
|
// "appl" 是前缀但不是完整单词,Delete 应返回 false
|
|
if tr.Delete("appl") {
|
|
t.Fatal("Delete(\"appl\") 非完整单词,应返回 false")
|
|
}
|
|
if !tr.Search("apple") {
|
|
t.Fatal("apple 不应受影响")
|
|
}
|
|
}
|
|
|
|
func TestTrieEmpty(t *testing.T) {
|
|
tr := NewTrie()
|
|
if tr.Search("anything") {
|
|
t.Fatal("空 Trie Search 应为 false")
|
|
}
|
|
if tr.StartsWith("a") {
|
|
t.Fatal("空 Trie StartsWith 应为 false")
|
|
}
|
|
}
|