mirror of
https://gitea.com/Lydanne/buildx.git
synced 2025-05-18 17:37:46 +08:00

These functions help with dealing with path inputs and using parts of them to configure targets. Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
200 lines
4.3 KiB
Go
200 lines
4.3 KiB
Go
package hclparser
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
"github.com/zclconf/go-cty/cty"
|
|
)
|
|
|
|
func TestIndexOf(t *testing.T) {
|
|
type testCase struct {
|
|
input cty.Value
|
|
key cty.Value
|
|
want cty.Value
|
|
wantErr bool
|
|
}
|
|
tests := map[string]testCase{
|
|
"index 0": {
|
|
input: cty.TupleVal([]cty.Value{cty.StringVal("one"), cty.NumberIntVal(2.0), cty.NumberIntVal(3), cty.StringVal("four")}),
|
|
key: cty.StringVal("one"),
|
|
want: cty.NumberIntVal(0),
|
|
},
|
|
"index 3": {
|
|
input: cty.TupleVal([]cty.Value{cty.StringVal("one"), cty.NumberIntVal(2.0), cty.NumberIntVal(3), cty.StringVal("four")}),
|
|
key: cty.StringVal("four"),
|
|
want: cty.NumberIntVal(3),
|
|
},
|
|
"index -1": {
|
|
input: cty.TupleVal([]cty.Value{cty.StringVal("one"), cty.NumberIntVal(2.0), cty.NumberIntVal(3), cty.StringVal("four")}),
|
|
key: cty.StringVal("3"),
|
|
wantErr: true,
|
|
},
|
|
}
|
|
|
|
for name, test := range tests {
|
|
name, test := name, test
|
|
t.Run(name, func(t *testing.T) {
|
|
got, err := indexOfFunc().Call([]cty.Value{test.input, test.key})
|
|
if test.wantErr {
|
|
require.Error(t, err)
|
|
} else {
|
|
require.NoError(t, err)
|
|
require.Equal(t, test.want, got)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestBasename(t *testing.T) {
|
|
type testCase struct {
|
|
input cty.Value
|
|
want cty.Value
|
|
wantErr bool
|
|
}
|
|
tests := map[string]testCase{
|
|
"empty": {
|
|
input: cty.StringVal(""),
|
|
want: cty.StringVal("."),
|
|
},
|
|
"slash": {
|
|
input: cty.StringVal("/"),
|
|
want: cty.StringVal("/"),
|
|
},
|
|
"simple": {
|
|
input: cty.StringVal("/foo/bar"),
|
|
want: cty.StringVal("bar"),
|
|
},
|
|
"simple no slash": {
|
|
input: cty.StringVal("foo/bar"),
|
|
want: cty.StringVal("bar"),
|
|
},
|
|
"dot": {
|
|
input: cty.StringVal("/foo/bar."),
|
|
want: cty.StringVal("bar."),
|
|
},
|
|
"dotdot": {
|
|
input: cty.StringVal("/foo/bar.."),
|
|
want: cty.StringVal("bar.."),
|
|
},
|
|
"dotdotdot": {
|
|
input: cty.StringVal("/foo/bar..."),
|
|
want: cty.StringVal("bar..."),
|
|
},
|
|
}
|
|
|
|
for name, test := range tests {
|
|
name, test := name, test
|
|
t.Run(name, func(t *testing.T) {
|
|
got, err := basenameFunc().Call([]cty.Value{test.input})
|
|
if test.wantErr {
|
|
require.Error(t, err)
|
|
} else {
|
|
require.NoError(t, err)
|
|
require.Equal(t, test.want, got)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestDirname(t *testing.T) {
|
|
type testCase struct {
|
|
input cty.Value
|
|
want cty.Value
|
|
wantErr bool
|
|
}
|
|
tests := map[string]testCase{
|
|
"empty": {
|
|
input: cty.StringVal(""),
|
|
want: cty.StringVal("."),
|
|
},
|
|
"slash": {
|
|
input: cty.StringVal("/"),
|
|
want: cty.StringVal("/"),
|
|
},
|
|
"simple": {
|
|
input: cty.StringVal("/foo/bar"),
|
|
want: cty.StringVal("/foo"),
|
|
},
|
|
"simple no slash": {
|
|
input: cty.StringVal("foo/bar"),
|
|
want: cty.StringVal("foo"),
|
|
},
|
|
"dot": {
|
|
input: cty.StringVal("/foo/bar."),
|
|
want: cty.StringVal("/foo"),
|
|
},
|
|
"dotdot": {
|
|
input: cty.StringVal("/foo/bar.."),
|
|
want: cty.StringVal("/foo"),
|
|
},
|
|
"dotdotdot": {
|
|
input: cty.StringVal("/foo/bar..."),
|
|
want: cty.StringVal("/foo"),
|
|
},
|
|
}
|
|
|
|
for name, test := range tests {
|
|
name, test := name, test
|
|
t.Run(name, func(t *testing.T) {
|
|
got, err := dirnameFunc().Call([]cty.Value{test.input})
|
|
if test.wantErr {
|
|
require.Error(t, err)
|
|
} else {
|
|
require.NoError(t, err)
|
|
require.Equal(t, test.want, got)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestSanitize(t *testing.T) {
|
|
type testCase struct {
|
|
input cty.Value
|
|
want cty.Value
|
|
}
|
|
tests := map[string]testCase{
|
|
"empty": {
|
|
input: cty.StringVal(""),
|
|
want: cty.StringVal(""),
|
|
},
|
|
"simple": {
|
|
input: cty.StringVal("foo/bar"),
|
|
want: cty.StringVal("foo_bar"),
|
|
},
|
|
"simple no slash": {
|
|
input: cty.StringVal("foobar"),
|
|
want: cty.StringVal("foobar"),
|
|
},
|
|
"dot": {
|
|
input: cty.StringVal("foo/bar."),
|
|
want: cty.StringVal("foo_bar_"),
|
|
},
|
|
"dotdot": {
|
|
input: cty.StringVal("foo/bar.."),
|
|
want: cty.StringVal("foo_bar__"),
|
|
},
|
|
"dotdotdot": {
|
|
input: cty.StringVal("foo/bar..."),
|
|
want: cty.StringVal("foo_bar___"),
|
|
},
|
|
"utf8": {
|
|
input: cty.StringVal("foo/🍕bar"),
|
|
want: cty.StringVal("foo__bar"),
|
|
},
|
|
"symbols": {
|
|
input: cty.StringVal("foo/bar!@(ba+z)"),
|
|
want: cty.StringVal("foo_bar___ba_z_"),
|
|
},
|
|
}
|
|
|
|
for name, test := range tests {
|
|
name, test := name, test
|
|
t.Run(name, func(t *testing.T) {
|
|
got, err := sanitizeFunc().Call([]cty.Value{test.input})
|
|
require.NoError(t, err)
|
|
require.Equal(t, test.want, got)
|
|
})
|
|
}
|
|
}
|