mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-23 07:33:32 -06:00
cb2e9119aa
Signed-off-by: namgyalangmo <75657887+namgyalangmo@users.noreply.github.com>
164 lines
2.7 KiB
Go
164 lines
2.7 KiB
Go
// Copyright (c) The OpenTofu Authors
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
// Copyright (c) 2023 HashiCorp, Inc.
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
package dag
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
)
|
|
|
|
func TestSetDifference(t *testing.T) {
|
|
cases := []struct {
|
|
Name string
|
|
A, B []interface{}
|
|
Expected []interface{}
|
|
}{
|
|
{
|
|
"same",
|
|
[]interface{}{1, 2, 3},
|
|
[]interface{}{3, 1, 2},
|
|
[]interface{}{},
|
|
},
|
|
|
|
{
|
|
"A has extra elements",
|
|
[]interface{}{1, 2, 3},
|
|
[]interface{}{3, 2},
|
|
[]interface{}{1},
|
|
},
|
|
|
|
{
|
|
"B has extra elements",
|
|
[]interface{}{1, 2, 3},
|
|
[]interface{}{3, 2, 1, 4},
|
|
[]interface{}{},
|
|
},
|
|
{
|
|
"B is nil",
|
|
[]interface{}{1, 2, 3},
|
|
nil,
|
|
[]interface{}{1, 2, 3},
|
|
},
|
|
}
|
|
|
|
for i, tc := range cases {
|
|
t.Run(fmt.Sprintf("%d-%s", i, tc.Name), func(t *testing.T) {
|
|
one := make(Set)
|
|
two := make(Set)
|
|
expected := make(Set)
|
|
for _, v := range tc.A {
|
|
one.Add(v)
|
|
}
|
|
for _, v := range tc.B {
|
|
two.Add(v)
|
|
}
|
|
if tc.B == nil {
|
|
two = nil
|
|
}
|
|
for _, v := range tc.Expected {
|
|
expected.Add(v)
|
|
}
|
|
|
|
actual := one.Difference(two)
|
|
match := actual.Intersection(expected)
|
|
if match.Len() != expected.Len() {
|
|
t.Fatalf("bad: %#v", actual.List())
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestSetFilter(t *testing.T) {
|
|
cases := []struct {
|
|
Input []interface{}
|
|
Expected []interface{}
|
|
}{
|
|
{
|
|
[]interface{}{1, 2, 3},
|
|
[]interface{}{1, 2, 3},
|
|
},
|
|
|
|
{
|
|
[]interface{}{4, 5, 6},
|
|
[]interface{}{4},
|
|
},
|
|
|
|
{
|
|
[]interface{}{7, 8, 9},
|
|
[]interface{}{},
|
|
},
|
|
}
|
|
|
|
for i, tc := range cases {
|
|
t.Run(fmt.Sprintf("%d-%#v", i, tc.Input), func(t *testing.T) {
|
|
input := make(Set)
|
|
expected := make(Set)
|
|
for _, v := range tc.Input {
|
|
input.Add(v)
|
|
}
|
|
for _, v := range tc.Expected {
|
|
expected.Add(v)
|
|
}
|
|
|
|
actual := input.Filter(func(v interface{}) bool {
|
|
return v.(int) < 5
|
|
})
|
|
match := actual.Intersection(expected)
|
|
if match.Len() != expected.Len() {
|
|
t.Fatalf("bad: %#v", actual.List())
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestSetCopy(t *testing.T) {
|
|
a := make(Set)
|
|
a.Add(1)
|
|
a.Add(2)
|
|
|
|
b := a.Copy()
|
|
b.Add(3)
|
|
|
|
diff := b.Difference(a)
|
|
|
|
if diff.Len() != 1 {
|
|
t.Fatalf("expected single diff value, got %#v", diff)
|
|
}
|
|
|
|
if !diff.Include(3) {
|
|
t.Fatalf("diff does not contain 3, got %#v", diff)
|
|
}
|
|
|
|
}
|
|
|
|
func makeSet(n int) Set {
|
|
ret := make(Set, n)
|
|
for i := 0; i < n; i++ {
|
|
ret.Add(i)
|
|
}
|
|
return ret
|
|
}
|
|
|
|
func BenchmarkSetIntersection_100_100000(b *testing.B) {
|
|
small := makeSet(100)
|
|
large := makeSet(100000)
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
small.Intersection(large)
|
|
}
|
|
}
|
|
|
|
func BenchmarkSetIntersection_100000_100(b *testing.B) {
|
|
small := makeSet(100)
|
|
large := makeSet(100000)
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
large.Intersection(small)
|
|
}
|
|
}
|