package dag

import (
	"context"
	"testing"

	"github.com/stretchr/testify/assert"
)

type sumDagNode struct {
	val int
}

func (n *sumDagNode) Run(ctx context.Context, rs ...int) int {
	for _, r := range rs {
		n.val += r
	}

	return n.val
}

func (n *sumDagNode) Skip() {

}

func (n *sumDagNode) Error() error {
	return nil
}

func newSumDAGNode(val int) *sumDagNode {
	return &sumDagNode{
		val: val,
	}
}

func TestDAG(t *testing.T) {
	n1 := newSumDAGNode(1)
	n2 := newSumDAGNode(2)
	n3 := newSumDAGNode(3)
	n4 := newSumDAGNode(4)
	n5 := newSumDAGNode(5)

	g := NewDAG[int]()

	assert.NoError(t, g.AddEdge(n1, n2))
	assert.NoError(t, g.AddEdge(n4, n5))
	assert.NoError(t, g.AddEdge(n2, n4))
	assert.NoError(t, g.AddEdge(n1, n3))
	assert.NoError(t, g.AddEdge(n3, n4))

	g.Run(context.TODO())
	assert.Equal(t, 1, n1.val, "n1 = 1")
	assert.Equal(t, 3, n2.val, "n2 = n1 + 2")
	assert.Equal(t, 4, n3.val, "n3 = n1 + 3")
	assert.Equal(t, 11, n4.val, "n4 = n2 + n3 + 4")
	assert.Equal(t, 16, n5.val, "n5 = n4 + 5")
}
