// Copyright 2023 schukai GmbH
// SPDX-License-Identifier: AGPL-3.0

package document

import "testing"

func TestParseList(t *testing.T) {

	obj := newTree[int]()
	ptr := obj

	list := []int{3, 4, 4, 6, 1, 2}
	for _, i := range list {

		currentLevel := ptr.getLevel()

		if currentLevel == i {
			ptr = ptr.appendAndGet()
			continue
		}

		if currentLevel < i {
			ptr = ptr.down(i)
		} else {
			ptr = ptr.up(i)
		}

	}

	if ptr.getLevel() != 2 {
		t.Error("ptr.getLevel() != 6")
	}

	count := 0
	obj.recursiveIterate(func(t *Tree[int]) {
		count++
	})

	if count != 8 {
		t.Error("count != 7")
	}

}
func TestParseList2(t *testing.T) {

	obj := newTree[int]()
	ptr := obj

	list := []int{1, 2, 3, 2, 3, 2, 3}
	for _, i := range list {

		currentLevel := ptr.getLevel()

		if currentLevel == i {
			ptr = ptr.appendAndGet()
			continue
		}

		if currentLevel < i {
			ptr = ptr.down(i)
			continue
		}

		ptr = ptr.up(i)
		ptr = ptr.appendAndGet()

	}

	if ptr.getLevel() != 3 {
		t.Error("ptr.getLevel() != 3")
	}

	count := 0
	obj.recursiveIterate(func(t *Tree[int]) {
		count++
	})

	if count != 8 {
		t.Error("count != 8")
	}

}

func TestRecursiveIterator(t *testing.T) {

	obj := newTree[int]()

	sub := newTree[int]()
	sub.addChild(newTree[int]())

	obj.addChild(sub)

	count := 0
	obj.recursiveIterate(func(t *Tree[int]) {
		count++
	})

	if count != 3 {
		t.Error("count != 3")
	}

}

func TestGetGuaranteedChild2(t *testing.T) {
	obj := newTree[int]()
	if obj.down(6).getLevel() != 6 {
		t.Error("obj.getGuaranteedNode(6).getLevel() != 6")
	}

}

func TestGetGuaranteedChild(t *testing.T) {

	obj := newTree[int]()

	c1 := newTree[int]()
	c11 := newTree[int]()
	c111 := newTree[int]()
	c1111 := newTree[int]()
	c1112 := newTree[int]()

	c111.addChild(c1111)
	c111.addChild(c1112)

	c11.addChild(c111)

	c1.addChild(c11)
	obj.addChild(c1)

	if obj.down(1).getLevel() != 1 {
		t.Error("obj.getGuaranteedNode(1).getLevel() != 1")
	}

	if obj.down(2).getLevel() != 2 {
		t.Error("obj.getGuaranteedNode(2).getLevel() != 2")
	}

	if obj.down(3).getLevel() != 3 {
		t.Error("obj.getGuaranteedNode(3).getLevel() != 3")
	}

	if obj.down(6).getLevel() != 6 {
		t.Error("obj.getGuaranteedNode(6).getLevel() != 6")
	}

}

func TestTreeAddChild(t *testing.T) {

	tree := newTree[int]()

	tree.addChild(newTree[int]())
	tree.addChild(newTree[int]())
	tree.addChild(newTree[int]())

	if len(tree.getChildren()) != 3 {
		t.Error("Tree.getChildren() != 3")
	}

}

func TestTreeAddChildren(t *testing.T) {

	obj := newTree[int]()

	obj.addChildren([]*Tree[int]{newTree[int](), newTree[int](), newTree[int]()})

	if len(obj.getChildren()) != 3 {
		t.Error("Tree.getChildren() != 3")
	}

}

func TestTreeGetParent(t *testing.T) {

	obj := newTree[int]()

	obj.addChild(newTree[int]())

	if obj.getChildren()[0].getParent() != obj {
		t.Error("Tree.getChildren()[0].getParent() != obj")
	}

}

func TestTreeGetRoot(t *testing.T) {

	obj := newTree[int]()

	sub := newTree[int]()
	sub.addChild(newTree[int]())

	obj.addChild(sub)

	if obj.getChildren()[0].getChildren()[0].getRoot() != obj {
		t.Error("Tree.getChildren()[0].getChildren()[0].getRoot() != obj")
	}

}

//func TestTreeGetSubTree(t *testing.T) {
//
//	obj := newTree()
//
//	sub := newTree()
//	sub.addChild(newTree())
//
//	obj.addChild(sub)
//
//	if len(obj.getChildren()[0].getSubTree()) != 1 {
//		t.Error("Tree.getChildren()[0].getSubTree() != 1")
//	}
//
//}