163 lines
4.4 KiB
Go
163 lines
4.4 KiB
Go
package tree
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func Test_AddChild(t *testing.T) {
|
|
rootNode := &Node{Name: "root", Parent: nil, Type:RootNode}
|
|
childNode := &Node{Name: "url child", Type: URLNode}
|
|
urlNode := &Node{Name: "url", Type: URLNode}
|
|
folderNode := &Node{Type: FolderNode, Name: "folder child"}
|
|
subFolderNode := &Node{Type: FolderNode, Name: "sub-folder"}
|
|
tagNode := &Node{Type: TagNode, Name: "tag child"}
|
|
|
|
AddChild(folderNode, subFolderNode)
|
|
AddChild(subFolderNode, urlNode)
|
|
AddChild(rootNode, childNode)
|
|
|
|
t.Run("skip duplicate children", func(t *testing.T){
|
|
AddChild(rootNode, childNode)
|
|
assert.Equal(t, 1, len(rootNode.Children))
|
|
|
|
})
|
|
|
|
t.Run("[first child] parent has the child", func(t *testing.T) {
|
|
found := false
|
|
|
|
for _, child := range rootNode.Children {
|
|
t.Log(child)
|
|
if child == childNode {
|
|
found = true
|
|
}
|
|
}
|
|
|
|
if !found {
|
|
t.Errorf("child not found")
|
|
}
|
|
})
|
|
|
|
t.Run("[first child] child sees the parent", func(t *testing.T) {
|
|
if childNode.Parent != rootNode {
|
|
t.Error("child does not see the parent")
|
|
}
|
|
})
|
|
|
|
t.Run("[new child] child sees brothers", func(t *testing.T) {
|
|
AddChild(rootNode, folderNode)
|
|
AddChild(rootNode, tagNode)
|
|
|
|
if len(rootNode.Children) < 3 {
|
|
t.Error("child does not see brothers")
|
|
}
|
|
|
|
if len(rootNode.Children) > 3 {
|
|
t.Errorf("child sees too many brothers, expected %v, got %v", 3, len(rootNode.Children))
|
|
}
|
|
})
|
|
|
|
t.Run("nested url node", func(t *testing.T){
|
|
assert.Equal(t, rootNode, urlNode.Parent.Parent.Parent)
|
|
})
|
|
|
|
parents := urlNode.GetFolderParents()
|
|
var parentFolderNames []string
|
|
for _, p := range parents {
|
|
parentFolderNames = append(parentFolderNames, p.Name)
|
|
}
|
|
|
|
assert.ElementsMatch(t, parentFolderNames, []string{"folder child", "sub-folder"})
|
|
|
|
}
|
|
|
|
func TestFindNode(t *testing.T){
|
|
rootNode := &Node{Name: "root", Parent: nil, Type:RootNode}
|
|
childNode := &Node{Name: "child", Type: URLNode}
|
|
childNode2 := &Node{Type: FolderNode, Name: "second child"}
|
|
childNode3 := &Node{Type: TagNode, Name: "third child"}
|
|
|
|
AddChild(rootNode, childNode)
|
|
AddChild(rootNode, childNode2)
|
|
AddChild(childNode2, childNode3)
|
|
|
|
result := FindNode(childNode3, rootNode)
|
|
assert.True(t, result)
|
|
|
|
result = FindNode(childNode2, rootNode)
|
|
assert.True(t, result)
|
|
|
|
result = FindNode(childNode, rootNode)
|
|
assert.True(t, result)
|
|
|
|
result = FindNode(rootNode, rootNode)
|
|
assert.True(t, result)
|
|
|
|
t.Run("find nodes by name", func(t *testing.T){
|
|
result := FindNodeByName("third child", rootNode)
|
|
assert.True(t, result)
|
|
|
|
result = FindNodeByName("second child", rootNode)
|
|
assert.True(t, result)
|
|
|
|
result = FindNodeByName("child", rootNode)
|
|
assert.True(t, result)
|
|
|
|
result = FindNodeByName("root", rootNode)
|
|
assert.True(t, result)
|
|
|
|
assert.False(t, FindNodeByName("not existing", rootNode))
|
|
})
|
|
}
|
|
|
|
// implicitly tests getParentTags and getParentFolders
|
|
func TestGetTags(t *testing.T) {
|
|
rootNode := &Node{Name: "root", Parent: nil, Type:RootNode}
|
|
|
|
urlNode := &Node{Name: "child", Type: URLNode}
|
|
|
|
tagNode1 := &Node{Type: TagNode, Name: "tag1"}
|
|
tagNode2 := &Node{Type: TagNode, Name: "tag2"}
|
|
folderNode := &Node{Type: FolderNode, Name: "folder1"}
|
|
|
|
// camel case
|
|
cmFolderNode := &Node{Type: FolderNode, Name: "SomeFolder"}
|
|
|
|
// space in folder name
|
|
spFolderNode := &Node{Type: FolderNode, Name: "Folder With Space"}
|
|
|
|
AddChild(rootNode, tagNode1)
|
|
AddChild(rootNode, tagNode2)
|
|
AddChild(rootNode, folderNode)
|
|
AddChild(rootNode, cmFolderNode)
|
|
AddChild(rootNode, spFolderNode)
|
|
|
|
AddChild(folderNode, urlNode)
|
|
AddChild(cmFolderNode, urlNode)
|
|
AddChild(spFolderNode, urlNode)
|
|
|
|
AddChild(tagNode1, urlNode)
|
|
AddChild(tagNode2, urlNode)
|
|
|
|
PrintTree(rootNode)
|
|
|
|
|
|
|
|
tags := urlNode.getTags()
|
|
assert.ElementsMatch(t, []string{"tag1", "tag2", "folder1", "SomeFolder", "Folder With Space"}, tags, "node tags mismatch")
|
|
}
|
|
|
|
func Test_GetRoot(t *testing.T) {
|
|
root := &Node{Type: RootNode, Name: "root"}
|
|
fold := &Node{Type: FolderNode, Name: "folder"}
|
|
AddChild(root, fold)
|
|
subfold := &Node{Type:FolderNode, Name: "sub-folder"}
|
|
AddChild(fold, subfold)
|
|
url := &Node{Type: URLNode, Name: "url"}
|
|
AddChild(subfold, url)
|
|
|
|
foundRoot := url.GetRoot()
|
|
assert.Equal(t, root, foundRoot)
|
|
}
|