You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
envsubst/eval_test.go

229 lines
5.4 KiB
Go

package envsubst
import "testing"
// test cases sourced from tldp.org
// http://www.tldp.org/LDP/abs/html/parameter-substitution.html
func TestExpand(t *testing.T) {
var expressions = []struct {
params map[string]string
input string
output string
}{
// text-only
{
params: map[string]string{},
input: "abcdEFGH28ij",
output: "abcdEFGH28ij",
},
// length
{
params: map[string]string{"var01": "abcdEFGH28ij"},
input: "${#var01}",
output: "12",
},
// uppercase first
{
params: map[string]string{"var01": "abcdEFGH28ij"},
input: "${var01^}",
output: "AbcdEFGH28ij",
},
// uppercase
{
params: map[string]string{"var01": "abcdEFGH28ij"},
input: "${var01^^}",
output: "ABCDEFGH28IJ",
},
// lowercase first
{
params: map[string]string{"var01": "ABCDEFGH28IJ"},
input: "${var01,}",
output: "aBCDEFGH28IJ",
},
// lowercase
{
params: map[string]string{"var01": "ABCDEFGH28IJ"},
input: "${var01,,}",
output: "abcdefgh28ij",
},
// substring with position
{
params: map[string]string{"path_name": "/home/bozo/ideas/thoughts.for.today"},
input: "${path_name:11}",
output: "ideas/thoughts.for.today",
},
// substring with position and length
{
params: map[string]string{"path_name": "/home/bozo/ideas/thoughts.for.today"},
input: "${path_name:11:5}",
output: "ideas",
},
// default not used
{
params: map[string]string{"var": "abc"},
input: "${var=xyz}",
output: "abc",
},
// default used
{
params: map[string]string{},
input: "${var=xyz}",
output: "xyz",
},
{
params: map[string]string{"default_var": "foo"},
input: "something ${var=${default_var}}",
output: "something foo",
},
{
params: map[string]string{"default_var": "foo1"},
input: `foo: ${var=${default_var}-suffix}`,
output: "foo: foo1-suffix",
},
{
params: map[string]string{"default_var": "foo1"},
input: `foo: ${var=prefix${default_var}-suffix}`,
output: "foo: prefixfoo1-suffix",
},
{
params: map[string]string{},
input: "${var:=xyz}",
output: "xyz",
},
// replace suffix
{
params: map[string]string{"stringZ": "abcABC123ABCabc"},
input: "${stringZ/%abc/XYZ}",
output: "abcABC123ABCXYZ",
},
// replace prefix
{
params: map[string]string{"stringZ": "abcABC123ABCabc"},
input: "${stringZ/#abc/XYZ}",
output: "XYZABC123ABCabc",
},
// replace all
{
params: map[string]string{"stringZ": "abcABC123ABCabc"},
input: "${stringZ//abc/xyz}",
output: "xyzABC123ABCxyz",
},
// replace first
{
params: map[string]string{"stringZ": "abcABC123ABCabc"},
input: "${stringZ/abc/xyz}",
output: "xyzABC123ABCabc",
},
// delete shortest match prefix
{
params: map[string]string{"filename": "bash.string.txt"},
input: "${filename#*.}",
output: "string.txt",
},
{
params: map[string]string{"filename": "path/to/file"},
input: "${filename#*/}",
output: "to/file",
},
{
params: map[string]string{"filename": "/path/to/file"},
input: "${filename#*/}",
output: "path/to/file",
},
// delete longest match prefix
{
params: map[string]string{"filename": "bash.string.txt"},
input: "${filename##*.}",
output: "txt",
},
{
params: map[string]string{"filename": "path/to/file"},
input: "${filename##*/}",
output: "file",
},
{
params: map[string]string{"filename": "/path/to/file"},
input: "${filename##*/}",
output: "file",
},
// delete shortest match suffix
{
params: map[string]string{"filename": "bash.string.txt"},
input: "${filename%.*}",
output: "bash.string",
},
// delete longest match suffix
{
params: map[string]string{"filename": "bash.string.txt"},
input: "${filename%%.*}",
output: "bash",
},
// nested parameters
{
params: map[string]string{"var01": "abcdEFGH28ij"},
input: "${var=${var01^^}}",
output: "ABCDEFGH28IJ",
},
// escaped
{
params: map[string]string{"var01": "abcdEFGH28ij"},
input: "$${var01}",
output: "${var01}",
},
{
params: map[string]string{"var01": "abcdEFGH28ij"},
input: "some text ${var01}$${var$${var01}$var01${var01}",
output: "some text abcdEFGH28ij${var${var01}$var01abcdEFGH28ij",
},
{
params: map[string]string{"default_var": "foo"},
input: "something $${var=${default_var}}",
output: "something ${var=foo}",
},
// some common escaping use cases
{
params: map[string]string{"stringZ": "foo/bar"},
input: `${stringZ/\//-}`,
output: "foo-bar",
},
{
params: map[string]string{"stringZ": "foo/bar/baz"},
input: `${stringZ//\//-}`,
output: "foo-bar-baz",
},
// escape outside of expansion shouldn't be processed
{
params: map[string]string{"default_var": "foo"},
input: "\\\\something ${var=${default_var}}",
output: "\\\\something foo",
},
// substitute with a blank string
{
params: map[string]string{"stringZ": "foo.bar"},
input: `${stringZ/./}`,
output: "foobar",
},
}
for _, expr := range expressions {
t.Run(expr.input, func(t *testing.T) {
t.Logf(expr.input)
output, err := Eval(expr.input, func(s string) string {
return expr.params[s]
})
if err != nil {
t.Errorf("Want %q expanded but got error %q", expr.input, err)
}
if output != expr.output {
t.Errorf("Want %q expanded to %q, got %q",
expr.input,
expr.output,
output)
}
})
}
}