218 lines
3.9 KiB
Go
218 lines
3.9 KiB
Go
|
package schema
|
||
|
|
||
|
import (
|
||
|
"reflect"
|
||
|
"testing"
|
||
|
)
|
||
|
|
||
|
func TestSetAdd(t *testing.T) {
|
||
|
s := &Set{F: testSetInt}
|
||
|
s.Add(1)
|
||
|
s.Add(5)
|
||
|
s.Add(25)
|
||
|
|
||
|
expected := []interface{}{1, 25, 5}
|
||
|
actual := s.List()
|
||
|
if !reflect.DeepEqual(actual, expected) {
|
||
|
t.Fatalf("bad: %#v", actual)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestSetAdd_negative(t *testing.T) {
|
||
|
// Since we don't allow negative hashes, this should just hash to the
|
||
|
// same thing...
|
||
|
s := &Set{F: testSetInt}
|
||
|
s.Add(-1)
|
||
|
s.Add(1)
|
||
|
|
||
|
expected := []interface{}{-1}
|
||
|
actual := s.List()
|
||
|
if !reflect.DeepEqual(actual, expected) {
|
||
|
t.Fatalf("bad: %#v", actual)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestSetContains(t *testing.T) {
|
||
|
s := &Set{F: testSetInt}
|
||
|
s.Add(5)
|
||
|
s.Add(-5)
|
||
|
|
||
|
if s.Contains(2) {
|
||
|
t.Fatal("should not contain")
|
||
|
}
|
||
|
if !s.Contains(5) {
|
||
|
t.Fatal("should contain")
|
||
|
}
|
||
|
if !s.Contains(-5) {
|
||
|
t.Fatal("should contain")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestSetDifference(t *testing.T) {
|
||
|
s1 := &Set{F: testSetInt}
|
||
|
s2 := &Set{F: testSetInt}
|
||
|
|
||
|
s1.Add(1)
|
||
|
s1.Add(5)
|
||
|
|
||
|
s2.Add(5)
|
||
|
s2.Add(25)
|
||
|
|
||
|
difference := s1.Difference(s2)
|
||
|
difference.Add(2)
|
||
|
|
||
|
expected := []interface{}{1, 2}
|
||
|
actual := difference.List()
|
||
|
if !reflect.DeepEqual(actual, expected) {
|
||
|
t.Fatalf("bad: %#v", actual)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestSetIntersection(t *testing.T) {
|
||
|
s1 := &Set{F: testSetInt}
|
||
|
s2 := &Set{F: testSetInt}
|
||
|
|
||
|
s1.Add(1)
|
||
|
s1.Add(5)
|
||
|
|
||
|
s2.Add(5)
|
||
|
s2.Add(25)
|
||
|
|
||
|
intersection := s1.Intersection(s2)
|
||
|
intersection.Add(2)
|
||
|
|
||
|
expected := []interface{}{2, 5}
|
||
|
actual := intersection.List()
|
||
|
if !reflect.DeepEqual(actual, expected) {
|
||
|
t.Fatalf("bad: %#v", actual)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestSetUnion(t *testing.T) {
|
||
|
s1 := &Set{F: testSetInt}
|
||
|
s2 := &Set{F: testSetInt}
|
||
|
|
||
|
s1.Add(1)
|
||
|
s1.Add(5)
|
||
|
|
||
|
s2.Add(5)
|
||
|
s2.Add(25)
|
||
|
|
||
|
union := s1.Union(s2)
|
||
|
union.Add(2)
|
||
|
|
||
|
expected := []interface{}{1, 2, 25, 5}
|
||
|
actual := union.List()
|
||
|
if !reflect.DeepEqual(actual, expected) {
|
||
|
t.Fatalf("bad: %#v", actual)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func testSetInt(v interface{}) int {
|
||
|
return v.(int)
|
||
|
}
|
||
|
|
||
|
func TestHashResource_nil(t *testing.T) {
|
||
|
resource := &Resource{
|
||
|
Schema: map[string]*Schema{
|
||
|
"name": {
|
||
|
Type: TypeString,
|
||
|
Optional: true,
|
||
|
},
|
||
|
},
|
||
|
}
|
||
|
f := HashResource(resource)
|
||
|
|
||
|
idx := f(nil)
|
||
|
if idx != 0 {
|
||
|
t.Fatalf("Expected 0 when hashing nil, given: %d", idx)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestHashEqual(t *testing.T) {
|
||
|
nested := &Resource{
|
||
|
Schema: map[string]*Schema{
|
||
|
"foo": {
|
||
|
Type: TypeString,
|
||
|
Optional: true,
|
||
|
},
|
||
|
},
|
||
|
}
|
||
|
root := &Resource{
|
||
|
Schema: map[string]*Schema{
|
||
|
"bar": {
|
||
|
Type: TypeString,
|
||
|
Optional: true,
|
||
|
},
|
||
|
"nested": {
|
||
|
Type: TypeSet,
|
||
|
Optional: true,
|
||
|
Elem: nested,
|
||
|
},
|
||
|
},
|
||
|
}
|
||
|
n1 := map[string]interface{}{"foo": "bar"}
|
||
|
n2 := map[string]interface{}{"foo": "baz"}
|
||
|
|
||
|
r1 := map[string]interface{}{
|
||
|
"bar": "baz",
|
||
|
"nested": NewSet(HashResource(nested), []interface{}{n1}),
|
||
|
}
|
||
|
r2 := map[string]interface{}{
|
||
|
"bar": "qux",
|
||
|
"nested": NewSet(HashResource(nested), []interface{}{n2}),
|
||
|
}
|
||
|
r3 := map[string]interface{}{
|
||
|
"bar": "baz",
|
||
|
"nested": NewSet(HashResource(nested), []interface{}{n2}),
|
||
|
}
|
||
|
r4 := map[string]interface{}{
|
||
|
"bar": "qux",
|
||
|
"nested": NewSet(HashResource(nested), []interface{}{n1}),
|
||
|
}
|
||
|
s1 := NewSet(HashResource(root), []interface{}{r1})
|
||
|
s2 := NewSet(HashResource(root), []interface{}{r2})
|
||
|
s3 := NewSet(HashResource(root), []interface{}{r3})
|
||
|
s4 := NewSet(HashResource(root), []interface{}{r4})
|
||
|
|
||
|
cases := []struct {
|
||
|
name string
|
||
|
set *Set
|
||
|
compare *Set
|
||
|
expected bool
|
||
|
}{
|
||
|
{
|
||
|
name: "equal",
|
||
|
set: s1,
|
||
|
compare: s1,
|
||
|
expected: true,
|
||
|
},
|
||
|
{
|
||
|
name: "not equal",
|
||
|
set: s1,
|
||
|
compare: s2,
|
||
|
expected: false,
|
||
|
},
|
||
|
{
|
||
|
name: "outer equal, should still not be equal",
|
||
|
set: s1,
|
||
|
compare: s3,
|
||
|
expected: false,
|
||
|
},
|
||
|
{
|
||
|
name: "inner equal, should still not be equal",
|
||
|
set: s1,
|
||
|
compare: s4,
|
||
|
expected: false,
|
||
|
},
|
||
|
}
|
||
|
for _, tc := range cases {
|
||
|
t.Run(tc.name, func(t *testing.T) {
|
||
|
actual := tc.set.HashEqual(tc.compare)
|
||
|
if tc.expected != actual {
|
||
|
t.Fatalf("expected %t, got %t", tc.expected, actual)
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
}
|