296 lines
6.7 KiB
Go
296 lines
6.7 KiB
Go
// Copyright Earl Warren <contact@earl-warren.org>
|
|
// Copyright Loïc Dachary <loic@dachary.org>
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package generic
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"testing"
|
|
|
|
"code.forgejo.org/f3/gof3/v3/id"
|
|
"code.forgejo.org/f3/gof3/v3/kind"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestNodeInit(t *testing.T) {
|
|
node := NewNode()
|
|
assert.NotNil(t, node)
|
|
}
|
|
|
|
func TestNewNodeFromID(t *testing.T) {
|
|
{
|
|
i := "nodeID"
|
|
node := NewNodeFromID(i)
|
|
assert.Equal(t, id.NewNodeID(i), node.GetID())
|
|
}
|
|
{
|
|
i := 123
|
|
node := NewNodeFromID(i)
|
|
assert.Equal(t, id.NewNodeID(fmt.Sprintf("%d", i)), node.GetID())
|
|
}
|
|
}
|
|
|
|
func TestNodeIsNil(t *testing.T) {
|
|
node := NewNode()
|
|
assert.True(t, node.GetIsNil())
|
|
|
|
node.SetIsNil(false)
|
|
assert.False(t, node.GetIsNil())
|
|
|
|
node.SetIsNil(true)
|
|
assert.True(t, node.GetIsNil())
|
|
|
|
var nilNode *Node
|
|
assert.True(t, nilNode.GetIsNil())
|
|
}
|
|
|
|
func TestNodeEquals(t *testing.T) {
|
|
ctx := context.Background()
|
|
tree := newTestTree()
|
|
one := tree.Factory(ctx, kindTestNodeLevelOne)
|
|
one.(*testNodeLevelOne).v = 1
|
|
assert.True(t, one.Equals(ctx, one))
|
|
two := tree.Factory(ctx, kindTestNodeLevelOne)
|
|
two.(*testNodeLevelOne).v = 2
|
|
assert.False(t, one.Equals(ctx, two))
|
|
}
|
|
|
|
func TestNodeParent(t *testing.T) {
|
|
node := NewNode()
|
|
assert.True(t, node.GetParent().GetIsNil())
|
|
parent := NewNode()
|
|
node.SetParent(parent)
|
|
assert.True(t, parent == node.GetParent())
|
|
}
|
|
|
|
func TestNodeKind(t *testing.T) {
|
|
node := NewNode()
|
|
assert.EqualValues(t, kind.KindNil, node.GetKind())
|
|
kind := kind.Kind("something")
|
|
node.SetKind(kind)
|
|
assert.True(t, kind == node.GetKind())
|
|
}
|
|
|
|
func TestNodeMappedID(t *testing.T) {
|
|
node := NewNode()
|
|
node.SetDriver(NewNullDriver())
|
|
assert.EqualValues(t, id.NilID, node.GetMappedID())
|
|
mapped := id.NewNodeID("mapped")
|
|
node.SetMappedID(mapped)
|
|
assert.True(t, mapped == node.GetMappedID())
|
|
}
|
|
|
|
func TestNodeNewFormat(t *testing.T) {
|
|
node := NewNode()
|
|
node.SetDriver(NewNullDriver())
|
|
|
|
assert.Panics(t, func() { node.NewFormat() })
|
|
}
|
|
|
|
func TestChildren(t *testing.T) {
|
|
parent := NewNode()
|
|
assert.Empty(t, parent.GetChildren())
|
|
|
|
id1 := id.NewNodeID("one")
|
|
child1 := NewNode()
|
|
child1.SetID(id1)
|
|
parent.SetChild(child1)
|
|
|
|
id2 := id.NewNodeID("two")
|
|
child2 := NewNode()
|
|
child2.SetID(id2)
|
|
parent.SetChild(child2)
|
|
|
|
children := parent.GetChildren()
|
|
assert.Len(t, children, 2)
|
|
assert.Equal(t, children[0].GetID(), id1)
|
|
assert.Equal(t, children[1].GetID(), id2)
|
|
|
|
nodeChildren := parent.GetNodeChildren()
|
|
assert.Len(t, nodeChildren, 2)
|
|
delete(nodeChildren, id1)
|
|
parent.SetChildren(nodeChildren)
|
|
nodeChildren = parent.GetNodeChildren()
|
|
assert.Len(t, nodeChildren, 1)
|
|
}
|
|
|
|
func TestNodeID(t *testing.T) {
|
|
node := NewNode()
|
|
assert.EqualValues(t, id.NilID, node.GetID())
|
|
i := id.NewNodeID("1234")
|
|
node.SetID(i)
|
|
assert.True(t, i == node.GetID())
|
|
}
|
|
|
|
func TestNodeTree(t *testing.T) {
|
|
node := NewNode()
|
|
assert.Nil(t, node.GetTree())
|
|
tree := NewTree(newTestOptions())
|
|
node.SetTree(tree)
|
|
assert.True(t, tree == node.GetTree())
|
|
}
|
|
|
|
type driverChildren struct {
|
|
NullDriver
|
|
}
|
|
|
|
func (o *driverChildren) ListPage(cxt context.Context, page int) ChildrenSlice {
|
|
node := o.GetNode()
|
|
tree := node.GetTree()
|
|
count := tree.GetPageSize()
|
|
if page > 1 {
|
|
count = 1
|
|
}
|
|
|
|
offset := (page - 1) * tree.GetPageSize()
|
|
children := NewChildrenSlice(0)
|
|
for i := 0; i < count; i++ {
|
|
child := tree.GetSelf().Factory(cxt, kind.KindNil)
|
|
child.SetID(id.NewNodeID(i + offset))
|
|
children = append(children, child)
|
|
}
|
|
|
|
return children
|
|
}
|
|
|
|
type driverTreeChildren struct {
|
|
NullTreeDriver
|
|
}
|
|
|
|
func (o *driverTreeChildren) Factory(ctx context.Context, kind kind.Kind) NodeDriverInterface {
|
|
return &driverChildren{}
|
|
}
|
|
|
|
type treeChildren struct {
|
|
Tree
|
|
}
|
|
|
|
func newTreeChildren() TreeInterface {
|
|
tree := &treeChildren{}
|
|
tree.Init(tree, newTestOptions())
|
|
treeDriver := &driverTreeChildren{}
|
|
treeDriver.Init()
|
|
tree.SetDriver(treeDriver)
|
|
tree.Register(kind.KindNil, func(ctx context.Context, kind kind.Kind) NodeInterface {
|
|
node := NewNode()
|
|
node.SetIsNil(false)
|
|
return node
|
|
})
|
|
return tree
|
|
}
|
|
|
|
func TestNodeListPage(t *testing.T) {
|
|
tree := newTreeChildren()
|
|
|
|
ctx := context.Background()
|
|
node := tree.Factory(ctx, kind.KindNil)
|
|
|
|
children := node.ListPage(context.Background(), int(1))
|
|
assert.NotNil(t, children)
|
|
assert.EqualValues(t, tree.GetPageSize(), len(children))
|
|
|
|
children = node.ListPage(context.Background(), int(2))
|
|
assert.NotNil(t, children)
|
|
assert.EqualValues(t, 1, len(children))
|
|
}
|
|
|
|
func TestNodeList(t *testing.T) {
|
|
tree := newTreeChildren()
|
|
|
|
ctx := context.Background()
|
|
node := tree.Factory(ctx, kind.KindNil)
|
|
children := node.List(ctx)
|
|
assert.EqualValues(t, tree.GetPageSize()+1, len(children))
|
|
|
|
idThree := id.NewNodeID("3")
|
|
childThree := node.GetChild(idThree)
|
|
assert.False(t, childThree.GetIsNil())
|
|
assert.EqualValues(t, idThree, childThree.GetID())
|
|
node.DeleteChild(idThree)
|
|
childThree = node.GetChild(idThree)
|
|
assert.True(t, childThree.GetIsNil())
|
|
}
|
|
|
|
type nodeGetIDFromName struct {
|
|
Node
|
|
name string
|
|
}
|
|
|
|
func (o *nodeGetIDFromName) GetIDFromName(ctx context.Context, name string) id.NodeID {
|
|
for _, child := range o.GetChildren() {
|
|
if child.(*nodeGetIDFromName).name == name {
|
|
return child.GetID()
|
|
}
|
|
}
|
|
return id.NilID
|
|
}
|
|
|
|
func newNodeGetIDFromName(i, name string) NodeInterface {
|
|
node := &nodeGetIDFromName{}
|
|
node.Init(node)
|
|
node.SetIsNil(false)
|
|
node.SetID(id.NewNodeID(i))
|
|
node.name = name
|
|
return node
|
|
}
|
|
|
|
func TestNodeGetIDFromName(t *testing.T) {
|
|
i := "1243"
|
|
name := "NAME"
|
|
node := newNodeGetIDFromName(i, name)
|
|
|
|
ctx := context.Background()
|
|
parent := newNodeGetIDFromName("parent", "PARENT")
|
|
parent.SetChild(node)
|
|
|
|
r := parent.GetIDFromName(ctx, "OTHERNAME")
|
|
assert.EqualValues(t, id.NilID, r)
|
|
|
|
r = parent.GetIDFromName(ctx, name)
|
|
assert.True(t, r == id.NewNodeID(i))
|
|
}
|
|
|
|
func TestNodePath(t *testing.T) {
|
|
{
|
|
path := NilNode.GetCurrentPath()
|
|
assert.True(t, path.Empty())
|
|
pathString := path.PathString()
|
|
assert.True(t, pathString.Empty())
|
|
assert.EqualValues(t, "", pathString.Join())
|
|
}
|
|
|
|
root := NewNode()
|
|
root.SetIsNil(false)
|
|
root.SetKind(kind.KindRoot)
|
|
|
|
level1 := NewNode()
|
|
level1.SetIsNil(false)
|
|
level1.SetParent(root)
|
|
id1 := id.NewNodeID("1")
|
|
level1.SetID(id1)
|
|
|
|
level2 := NewNode()
|
|
level2.SetIsNil(false)
|
|
level2.SetParent(level1)
|
|
id2 := id.NewNodeID("2")
|
|
level2.SetID(id2)
|
|
|
|
{
|
|
p := level2.GetCurrentPath()
|
|
assert.False(t, p.Empty())
|
|
if assert.EqualValues(t, 3, p.Length()) {
|
|
assert.True(t, root == p.First(), p.First().(NodeInterface).GetID())
|
|
rest := p.RemoveFirst()
|
|
assert.True(t, level1 == rest.First(), p.First().(NodeInterface).GetID())
|
|
rest = rest.RemoveFirst()
|
|
assert.True(t, level2 == rest.First(), p.First().(NodeInterface).GetID())
|
|
}
|
|
pathString := p.PathString()
|
|
assert.False(t, pathString.Empty())
|
|
assert.EqualValues(t, 3, len(pathString.Elements()))
|
|
assert.EqualValues(t, "/1/2", pathString.Join())
|
|
}
|
|
}
|