205 lines
4.0 KiB
Go
205 lines
4.0 KiB
Go
|
package cty
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"strings"
|
||
|
"testing"
|
||
|
)
|
||
|
|
||
|
func TestTypeTestConformance(t *testing.T) {
|
||
|
tests := []struct {
|
||
|
Receiver Type
|
||
|
Given Type
|
||
|
Conforms bool
|
||
|
}{
|
||
|
{
|
||
|
Receiver: Number,
|
||
|
Given: Number,
|
||
|
Conforms: true,
|
||
|
},
|
||
|
{
|
||
|
Receiver: Number,
|
||
|
Given: String,
|
||
|
Conforms: false,
|
||
|
},
|
||
|
{
|
||
|
Receiver: Number,
|
||
|
Given: DynamicPseudoType,
|
||
|
Conforms: true,
|
||
|
},
|
||
|
{
|
||
|
Receiver: DynamicPseudoType,
|
||
|
Given: DynamicPseudoType,
|
||
|
Conforms: true,
|
||
|
},
|
||
|
{
|
||
|
Receiver: DynamicPseudoType,
|
||
|
Given: Number,
|
||
|
Conforms: false,
|
||
|
},
|
||
|
{
|
||
|
Receiver: List(Number),
|
||
|
Given: List(Number),
|
||
|
Conforms: true,
|
||
|
},
|
||
|
{
|
||
|
Receiver: List(Number),
|
||
|
Given: Map(Number),
|
||
|
Conforms: false,
|
||
|
},
|
||
|
{
|
||
|
Receiver: List(Number),
|
||
|
Given: List(DynamicPseudoType),
|
||
|
Conforms: true,
|
||
|
},
|
||
|
{
|
||
|
Receiver: List(Number),
|
||
|
Given: List(String),
|
||
|
Conforms: false,
|
||
|
},
|
||
|
{
|
||
|
Receiver: Map(Number),
|
||
|
Given: Map(Number),
|
||
|
Conforms: true,
|
||
|
},
|
||
|
{
|
||
|
Receiver: Map(Number),
|
||
|
Given: Set(Number),
|
||
|
Conforms: false,
|
||
|
},
|
||
|
{
|
||
|
Receiver: List(Number),
|
||
|
Given: Map(DynamicPseudoType),
|
||
|
Conforms: false,
|
||
|
},
|
||
|
{
|
||
|
Receiver: Map(Number),
|
||
|
Given: Map(DynamicPseudoType),
|
||
|
Conforms: true,
|
||
|
},
|
||
|
{
|
||
|
Receiver: Map(Number),
|
||
|
Given: Map(String),
|
||
|
Conforms: false,
|
||
|
},
|
||
|
{
|
||
|
Receiver: Set(Number),
|
||
|
Given: Set(Number),
|
||
|
Conforms: true,
|
||
|
},
|
||
|
{
|
||
|
Receiver: Set(Number),
|
||
|
Given: List(Number),
|
||
|
Conforms: false,
|
||
|
},
|
||
|
{
|
||
|
Receiver: Set(Number),
|
||
|
Given: List(DynamicPseudoType),
|
||
|
Conforms: false,
|
||
|
},
|
||
|
{
|
||
|
Receiver: Set(Number),
|
||
|
Given: Set(DynamicPseudoType),
|
||
|
Conforms: true,
|
||
|
},
|
||
|
{
|
||
|
Receiver: Set(Number),
|
||
|
Given: Set(String),
|
||
|
Conforms: false,
|
||
|
},
|
||
|
{
|
||
|
Receiver: EmptyObject,
|
||
|
Given: EmptyObject,
|
||
|
Conforms: true,
|
||
|
},
|
||
|
{
|
||
|
Receiver: EmptyObject,
|
||
|
Given: Object(map[string]Type{"name": String}),
|
||
|
Conforms: false,
|
||
|
},
|
||
|
{
|
||
|
Receiver: Object(map[string]Type{"name": String}),
|
||
|
Given: EmptyObject,
|
||
|
Conforms: false,
|
||
|
},
|
||
|
{
|
||
|
Receiver: Object(map[string]Type{"name": String}),
|
||
|
Given: Object(map[string]Type{"name": String}),
|
||
|
Conforms: true,
|
||
|
},
|
||
|
{
|
||
|
Receiver: Object(map[string]Type{"name": Number}),
|
||
|
Given: Object(map[string]Type{"name": String}),
|
||
|
Conforms: false,
|
||
|
},
|
||
|
{
|
||
|
Receiver: Object(map[string]Type{"name": Number}),
|
||
|
Given: Object(map[string]Type{"name": String, "number": Number}),
|
||
|
Conforms: false,
|
||
|
},
|
||
|
{
|
||
|
Receiver: EmptyTuple,
|
||
|
Given: EmptyTuple,
|
||
|
Conforms: true,
|
||
|
},
|
||
|
{
|
||
|
Receiver: EmptyTuple,
|
||
|
Given: Tuple([]Type{String}),
|
||
|
Conforms: false,
|
||
|
},
|
||
|
{
|
||
|
Given: Tuple([]Type{String}),
|
||
|
Receiver: EmptyTuple,
|
||
|
Conforms: false,
|
||
|
},
|
||
|
{
|
||
|
Receiver: Tuple([]Type{String}),
|
||
|
Given: Tuple([]Type{String}),
|
||
|
Conforms: true,
|
||
|
},
|
||
|
{
|
||
|
Receiver: Tuple([]Type{String}),
|
||
|
Given: Tuple([]Type{Number}),
|
||
|
Conforms: false,
|
||
|
},
|
||
|
{
|
||
|
Receiver: Tuple([]Type{String, Number}),
|
||
|
Given: Tuple([]Type{String, Number}),
|
||
|
Conforms: true,
|
||
|
},
|
||
|
{
|
||
|
Receiver: Tuple([]Type{String}),
|
||
|
Given: Tuple([]Type{String, Number}),
|
||
|
Conforms: false,
|
||
|
},
|
||
|
{
|
||
|
Receiver: Tuple([]Type{String, Number}),
|
||
|
Given: Tuple([]Type{String}),
|
||
|
Conforms: false,
|
||
|
},
|
||
|
}
|
||
|
|
||
|
for _, test := range tests {
|
||
|
t.Run(fmt.Sprintf("(%#v).TestConformance(%#v)", test.Receiver, test.Given), func(t *testing.T) {
|
||
|
errs := test.Receiver.TestConformance(test.Given)
|
||
|
if test.Conforms {
|
||
|
if errs != nil {
|
||
|
errStrs := make([]string, 0, len(errs))
|
||
|
for _, err := range errs {
|
||
|
if pathErr, ok := err.(PathError); ok {
|
||
|
errStrs = append(errStrs, fmt.Sprintf("at %#v: %s", pathErr.Path, pathErr))
|
||
|
} else {
|
||
|
errStrs = append(errStrs, err.Error())
|
||
|
}
|
||
|
}
|
||
|
t.Errorf("(%#v).TestConformance(%#v): unexpected errors\n%s", test.Receiver, test.Given, strings.Join(errStrs, "\n"))
|
||
|
}
|
||
|
} else {
|
||
|
if errs == nil {
|
||
|
t.Errorf("(%#v).TestConformance(%#v): expected errors, but got none", test.Receiver, test.Given)
|
||
|
}
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
}
|