1
1
Fork 0
mirror of https://github.com/mcuadros/ascode synced 2024-05-09 09:06:32 +02:00
ascode/starlark/types/value_test.go
2021-04-06 19:34:30 +02:00

138 lines
2.9 KiB
Go

package types
import (
"testing"
"go.starlark.net/starlark"
"github.com/stretchr/testify/assert"
"github.com/zclconf/go-cty/cty"
)
func TestMustValue(t *testing.T) {
dict := starlark.NewDict(1)
dict.SetKey(starlark.String("foo"), starlark.MakeInt(42))
testCases := []struct {
v starlark.Value
cty cty.Type
value cty.Value
native interface{}
}{
{
starlark.String("foo"),
cty.String,
cty.StringVal("foo"),
"foo",
},
{
starlark.MakeInt(42),
cty.Number,
cty.NumberIntVal(42),
int64(42),
},
{
starlark.Float(42),
cty.Number,
cty.NumberFloatVal(42),
42.,
},
{
starlark.Bool(true),
cty.Bool,
cty.True,
true,
},
{
starlark.NewList([]starlark.Value{starlark.String("foo")}),
cty.List(cty.NilType),
cty.ListVal([]cty.Value{cty.StringVal("foo")}),
[]interface{}{"foo"},
},
{
dict,
cty.Map(cty.NilType),
cty.MapVal(map[string]cty.Value{"foo": cty.NumberIntVal(42)}),
map[string]interface{}{"foo": int64(42)},
},
}
for _, tc := range testCases {
value := MustValue(tc.v)
assert.Equal(t, value.Type().Cty(), tc.cty)
assert.Equal(t, value.Starlark(), tc.v)
assert.Equal(t, value.Cty(), tc.value)
assert.Equal(t, value.Interface(), tc.native)
}
}
func TestValuesSet(t *testing.T) {
values := NewValues()
val := values.Set("foo", MustValue(starlark.MakeInt(42)))
assert.Equal(t, val.Name, "foo")
assert.Equal(t, val.Interface(), int64(42))
val = values.Set("foo", MustValue(starlark.MakeInt(84)))
assert.Equal(t, val.Interface(), int64(84))
}
func TestValuesGet(t *testing.T) {
values := NewValues()
values.Set("foo", MustValue(starlark.MakeInt(42)))
values.Set("foo", MustValue(starlark.MakeInt(42*2)))
val := values.Get("foo")
assert.Equal(t, val.Interface(), int64(42*2))
val.Value = MustValue(starlark.MakeInt(42 * 3))
val = values.Get("foo")
assert.Equal(t, val.Interface(), int64(42*3))
}
func TestValuesHash(t *testing.T) {
a := NewValues()
a.Set("foo", MustValue(starlark.MakeInt(42)))
a.Set("bar", MustValue(starlark.MakeInt(42*32)))
hashA, err := a.Hash()
assert.NoError(t, err)
assert.Equal(t, hashA, uint32(0x98f6840f))
b := NewValues()
b.Set("bar", MustValue(starlark.MakeInt(42*32)))
b.Set("foo", MustValue(starlark.MakeInt(42)))
hashB, err := b.Hash()
assert.NoError(t, err)
assert.Equal(t, hashA, hashB)
}
func TestValuesToStringDict(t *testing.T) {
a := NewValues()
a.Set("foo", MustValue(starlark.MakeInt(42)))
a.Set("bar", MustValue(starlark.MakeInt(42*32)))
dict := make(starlark.StringDict, 0)
a.ToStringDict(dict)
assert.Len(t, dict, 2)
}
func TestValuesForEach(t *testing.T) {
a := NewValues()
a.Set("foo", MustValue(starlark.MakeInt(42)))
a.Set("bar", MustValue(starlark.MakeInt(42*32)))
var result []string
a.ForEach(func(v *NamedValue) error {
result = append(result, v.Name)
return nil
})
assert.Equal(t, result, []string{"bar", "foo"})
}