mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-29 10:21:01 -06:00
70eebe3521
This is part of a general effort to move all of Terraform's non-library package surface under internal in order to reinforce that these are for internal use within Terraform only. If you were previously importing packages under this prefix into an external codebase, you could pin to an earlier release tag as an interim solution until you've make a plan to achieve the same functionality some other way.
254 lines
4.2 KiB
Go
254 lines
4.2 KiB
Go
package dag
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestGraph_empty(t *testing.T) {
|
|
var g Graph
|
|
g.Add(1)
|
|
g.Add(2)
|
|
g.Add(3)
|
|
|
|
actual := strings.TrimSpace(g.String())
|
|
expected := strings.TrimSpace(testGraphEmptyStr)
|
|
if actual != expected {
|
|
t.Fatalf("bad: %s", actual)
|
|
}
|
|
}
|
|
|
|
func TestGraph_basic(t *testing.T) {
|
|
var g Graph
|
|
g.Add(1)
|
|
g.Add(2)
|
|
g.Add(3)
|
|
g.Connect(BasicEdge(1, 3))
|
|
|
|
actual := strings.TrimSpace(g.String())
|
|
expected := strings.TrimSpace(testGraphBasicStr)
|
|
if actual != expected {
|
|
t.Fatalf("bad: %s", actual)
|
|
}
|
|
}
|
|
|
|
func TestGraph_remove(t *testing.T) {
|
|
var g Graph
|
|
g.Add(1)
|
|
g.Add(2)
|
|
g.Add(3)
|
|
g.Connect(BasicEdge(1, 3))
|
|
g.Remove(3)
|
|
|
|
actual := strings.TrimSpace(g.String())
|
|
expected := strings.TrimSpace(testGraphRemoveStr)
|
|
if actual != expected {
|
|
t.Fatalf("bad: %s", actual)
|
|
}
|
|
}
|
|
|
|
func TestGraph_replace(t *testing.T) {
|
|
var g Graph
|
|
g.Add(1)
|
|
g.Add(2)
|
|
g.Add(3)
|
|
g.Connect(BasicEdge(1, 2))
|
|
g.Connect(BasicEdge(2, 3))
|
|
g.Replace(2, 42)
|
|
|
|
actual := strings.TrimSpace(g.String())
|
|
expected := strings.TrimSpace(testGraphReplaceStr)
|
|
if actual != expected {
|
|
t.Fatalf("bad: %s", actual)
|
|
}
|
|
}
|
|
|
|
func TestGraph_replaceSelf(t *testing.T) {
|
|
var g Graph
|
|
g.Add(1)
|
|
g.Add(2)
|
|
g.Add(3)
|
|
g.Connect(BasicEdge(1, 2))
|
|
g.Connect(BasicEdge(2, 3))
|
|
g.Replace(2, 2)
|
|
|
|
actual := strings.TrimSpace(g.String())
|
|
expected := strings.TrimSpace(testGraphReplaceSelfStr)
|
|
if actual != expected {
|
|
t.Fatalf("bad: %s", actual)
|
|
}
|
|
}
|
|
|
|
// This tests that connecting edges works based on custom Hashcode
|
|
// implementations for uniqueness.
|
|
func TestGraph_hashcode(t *testing.T) {
|
|
var g Graph
|
|
g.Add(&hashVertex{code: 1})
|
|
g.Add(&hashVertex{code: 2})
|
|
g.Add(&hashVertex{code: 3})
|
|
g.Connect(BasicEdge(
|
|
&hashVertex{code: 1},
|
|
&hashVertex{code: 3}))
|
|
|
|
actual := strings.TrimSpace(g.String())
|
|
expected := strings.TrimSpace(testGraphBasicStr)
|
|
if actual != expected {
|
|
t.Fatalf("bad: %s", actual)
|
|
}
|
|
}
|
|
|
|
func TestGraphHasVertex(t *testing.T) {
|
|
var g Graph
|
|
g.Add(1)
|
|
|
|
if !g.HasVertex(1) {
|
|
t.Fatal("should have 1")
|
|
}
|
|
if g.HasVertex(2) {
|
|
t.Fatal("should not have 2")
|
|
}
|
|
}
|
|
|
|
func TestGraphHasEdge(t *testing.T) {
|
|
var g Graph
|
|
g.Add(1)
|
|
g.Add(2)
|
|
g.Connect(BasicEdge(1, 2))
|
|
|
|
if !g.HasEdge(BasicEdge(1, 2)) {
|
|
t.Fatal("should have 1,2")
|
|
}
|
|
if g.HasVertex(BasicEdge(2, 3)) {
|
|
t.Fatal("should not have 2,3")
|
|
}
|
|
}
|
|
|
|
func TestGraphEdgesFrom(t *testing.T) {
|
|
var g Graph
|
|
g.Add(1)
|
|
g.Add(2)
|
|
g.Add(3)
|
|
g.Connect(BasicEdge(1, 3))
|
|
g.Connect(BasicEdge(2, 3))
|
|
|
|
edges := g.EdgesFrom(1)
|
|
|
|
expected := make(Set)
|
|
expected.Add(BasicEdge(1, 3))
|
|
|
|
s := make(Set)
|
|
for _, e := range edges {
|
|
s.Add(e)
|
|
}
|
|
|
|
if s.Intersection(expected).Len() != expected.Len() {
|
|
t.Fatalf("bad: %#v", edges)
|
|
}
|
|
}
|
|
|
|
func TestGraphEdgesTo(t *testing.T) {
|
|
var g Graph
|
|
g.Add(1)
|
|
g.Add(2)
|
|
g.Add(3)
|
|
g.Connect(BasicEdge(1, 3))
|
|
g.Connect(BasicEdge(1, 2))
|
|
|
|
edges := g.EdgesTo(3)
|
|
|
|
expected := make(Set)
|
|
expected.Add(BasicEdge(1, 3))
|
|
|
|
s := make(Set)
|
|
for _, e := range edges {
|
|
s.Add(e)
|
|
}
|
|
|
|
if s.Intersection(expected).Len() != expected.Len() {
|
|
t.Fatalf("bad: %#v", edges)
|
|
}
|
|
}
|
|
|
|
func TestGraphUpdownEdges(t *testing.T) {
|
|
// Verify that we can't inadvertently modify the internal graph sets
|
|
var g Graph
|
|
g.Add(1)
|
|
g.Add(2)
|
|
g.Add(3)
|
|
g.Connect(BasicEdge(1, 2))
|
|
g.Connect(BasicEdge(2, 3))
|
|
|
|
up := g.UpEdges(2)
|
|
if up.Len() != 1 || !up.Include(1) {
|
|
t.Fatalf("expected only an up edge of '1', got %#v", up)
|
|
}
|
|
// modify the up set
|
|
up.Add(9)
|
|
|
|
orig := g.UpEdges(2)
|
|
diff := up.Difference(orig)
|
|
if diff.Len() != 1 || !diff.Include(9) {
|
|
t.Fatalf("expected a diff of only '9', got %#v", diff)
|
|
}
|
|
|
|
down := g.DownEdges(2)
|
|
if down.Len() != 1 || !down.Include(3) {
|
|
t.Fatalf("expected only a down edge of '3', got %#v", down)
|
|
}
|
|
// modify the down set
|
|
down.Add(8)
|
|
|
|
orig = g.DownEdges(2)
|
|
diff = down.Difference(orig)
|
|
if diff.Len() != 1 || !diff.Include(8) {
|
|
t.Fatalf("expected a diff of only '8', got %#v", diff)
|
|
}
|
|
}
|
|
|
|
type hashVertex struct {
|
|
code interface{}
|
|
}
|
|
|
|
func (v *hashVertex) Hashcode() interface{} {
|
|
return v.code
|
|
}
|
|
|
|
func (v *hashVertex) Name() string {
|
|
return fmt.Sprintf("%#v", v.code)
|
|
}
|
|
|
|
const testGraphBasicStr = `
|
|
1
|
|
3
|
|
2
|
|
3
|
|
`
|
|
|
|
const testGraphEmptyStr = `
|
|
1
|
|
2
|
|
3
|
|
`
|
|
|
|
const testGraphRemoveStr = `
|
|
1
|
|
2
|
|
`
|
|
|
|
const testGraphReplaceStr = `
|
|
1
|
|
42
|
|
3
|
|
42
|
|
3
|
|
`
|
|
|
|
const testGraphReplaceSelfStr = `
|
|
1
|
|
2
|
|
2
|
|
3
|
|
3
|
|
`
|