terraform/lang/funcs/string_test.go

509 lines
9.6 KiB
Go

package funcs
import (
"fmt"
"testing"
"github.com/zclconf/go-cty/cty"
)
func TestJoin(t *testing.T) {
tests := []struct {
Sep cty.Value
Lists []cty.Value
Want cty.Value
}{
{
cty.StringVal(" "),
[]cty.Value{
cty.ListVal([]cty.Value{
cty.StringVal("Hello"),
cty.StringVal("World"),
}),
},
cty.StringVal("Hello World"),
},
{
cty.StringVal(" "),
[]cty.Value{
cty.ListVal([]cty.Value{
cty.StringVal("Hello"),
cty.StringVal("World"),
}),
cty.ListVal([]cty.Value{
cty.StringVal("Foo"),
cty.StringVal("Bar"),
}),
},
cty.StringVal("Hello World Foo Bar"),
},
{
cty.StringVal(" "),
[]cty.Value{
cty.ListValEmpty(cty.String),
},
cty.StringVal(""),
},
{
cty.StringVal(" "),
[]cty.Value{
cty.ListValEmpty(cty.String),
cty.ListValEmpty(cty.String),
cty.ListValEmpty(cty.String),
},
cty.StringVal(""),
},
{
cty.StringVal(" "),
[]cty.Value{
cty.ListValEmpty(cty.String),
cty.ListVal([]cty.Value{
cty.StringVal("Foo"),
cty.StringVal("Bar"),
}),
},
cty.StringVal("Foo Bar"),
},
{
cty.UnknownVal(cty.String),
[]cty.Value{
cty.ListVal([]cty.Value{
cty.StringVal("Hello"),
cty.StringVal("World"),
}),
},
cty.UnknownVal(cty.String),
},
{
cty.StringVal(" "),
[]cty.Value{
cty.ListVal([]cty.Value{
cty.StringVal("Hello"),
cty.UnknownVal(cty.String),
}),
},
cty.UnknownVal(cty.String),
},
{
cty.StringVal(" "),
[]cty.Value{
cty.UnknownVal(cty.List(cty.String)),
},
cty.UnknownVal(cty.String),
},
}
for _, test := range tests {
t.Run(fmt.Sprintf("Join(%#v, %#v...)", test.Sep, test.Lists), func(t *testing.T) {
got, err := Join(test.Sep, test.Lists...)
if err != nil {
t.Fatalf("unexpected error: %s", err)
}
if !got.RawEquals(test.Want) {
t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, test.Want)
}
})
}
}
func TestSort(t *testing.T) {
tests := []struct {
List cty.Value
Want cty.Value
}{
{
cty.ListValEmpty(cty.String),
cty.ListValEmpty(cty.String),
},
{
cty.ListVal([]cty.Value{
cty.StringVal("banana"),
}),
cty.ListVal([]cty.Value{
cty.StringVal("banana"),
}),
},
{
cty.ListVal([]cty.Value{
cty.StringVal("banana"),
cty.StringVal("apple"),
}),
cty.ListVal([]cty.Value{
cty.StringVal("apple"),
cty.StringVal("banana"),
}),
},
{
cty.ListVal([]cty.Value{
cty.StringVal("8"),
cty.StringVal("9"),
cty.StringVal("10"),
}),
cty.ListVal([]cty.Value{
cty.StringVal("10"), // lexicographical sort, not numeric sort
cty.StringVal("8"),
cty.StringVal("9"),
}),
},
{
cty.UnknownVal(cty.List(cty.String)),
cty.UnknownVal(cty.List(cty.String)),
},
{
cty.ListVal([]cty.Value{
cty.UnknownVal(cty.String),
}),
cty.UnknownVal(cty.List(cty.String)),
},
{
cty.ListVal([]cty.Value{
cty.UnknownVal(cty.String),
cty.StringVal("banana"),
}),
cty.UnknownVal(cty.List(cty.String)),
},
}
for _, test := range tests {
t.Run(fmt.Sprintf("Sort(%#v)", test.List), func(t *testing.T) {
got, err := Sort(test.List)
if err != nil {
t.Fatalf("unexpected error: %s", err)
}
if !got.RawEquals(test.Want) {
t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, test.Want)
}
})
}
}
func TestSplit(t *testing.T) {
tests := []struct {
Sep cty.Value
Str cty.Value
Want cty.Value
}{
{
cty.StringVal(" "),
cty.StringVal("Hello World"),
cty.ListVal([]cty.Value{
cty.StringVal("Hello"),
cty.StringVal("World"),
}),
},
{
cty.StringVal(" "),
cty.StringVal("Hello"),
cty.ListVal([]cty.Value{
cty.StringVal("Hello"),
}),
},
{
cty.StringVal(" "),
cty.StringVal(""),
cty.ListVal([]cty.Value{
cty.StringVal(""),
}),
},
{
cty.StringVal(""),
cty.StringVal(""),
cty.ListValEmpty(cty.String),
},
{
cty.UnknownVal(cty.String),
cty.StringVal("Hello World"),
cty.UnknownVal(cty.List(cty.String)),
},
{
cty.StringVal(" "),
cty.UnknownVal(cty.String),
cty.UnknownVal(cty.List(cty.String)),
},
{
cty.UnknownVal(cty.String),
cty.UnknownVal(cty.String),
cty.UnknownVal(cty.List(cty.String)),
},
}
for _, test := range tests {
t.Run(fmt.Sprintf("Split(%#v, %#v)", test.Sep, test.Str), func(t *testing.T) {
got, err := Split(test.Sep, test.Str)
if err != nil {
t.Fatalf("unexpected error: %s", err)
}
if !got.RawEquals(test.Want) {
t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, test.Want)
}
})
}
}
func TestChomp(t *testing.T) {
tests := []struct {
String cty.Value
Want cty.Value
Err bool
}{
{
cty.StringVal("hello world"),
cty.StringVal("hello world"),
false,
},
{
cty.StringVal("goodbye\ncruel\nworld"),
cty.StringVal("goodbye\ncruel\nworld"),
false,
},
{
cty.StringVal("goodbye\r\nwindows\r\nworld"),
cty.StringVal("goodbye\r\nwindows\r\nworld"),
false,
},
{
cty.StringVal("goodbye\ncruel\nworld\n"),
cty.StringVal("goodbye\ncruel\nworld"),
false,
},
{
cty.StringVal("goodbye\ncruel\nworld\n\n\n\n"),
cty.StringVal("goodbye\ncruel\nworld"),
false,
},
{
cty.StringVal("goodbye\r\nwindows\r\nworld\r\n"),
cty.StringVal("goodbye\r\nwindows\r\nworld"),
false,
},
{
cty.StringVal("goodbye\r\nwindows\r\nworld\r\n\r\n\r\n\r\n"),
cty.StringVal("goodbye\r\nwindows\r\nworld"),
false,
},
}
for _, test := range tests {
t.Run(fmt.Sprintf("chomp(%#v)", test.String), func(t *testing.T) {
got, err := Chomp(test.String)
if test.Err {
if err == nil {
t.Fatal("succeeded; want error")
}
return
} else if err != nil {
t.Fatalf("unexpected error: %s", err)
}
if !got.RawEquals(test.Want) {
t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, test.Want)
}
})
}
}
func TestIndent(t *testing.T) {
tests := []struct {
String cty.Value
Spaces cty.Value
Want cty.Value
Err bool
}{
{
cty.StringVal(`Fleas:
Adam
Had'em
E.E. Cummings`),
cty.NumberIntVal(4),
cty.StringVal("Fleas:\n Adam\n Had'em\n \n E.E. Cummings"),
false,
},
{
cty.StringVal("oneliner"),
cty.NumberIntVal(4),
cty.StringVal("oneliner"),
false,
},
{
cty.StringVal(`#!/usr/bin/env bash
date
pwd`),
cty.NumberIntVal(4),
cty.StringVal("#!/usr/bin/env bash\n date\n pwd"),
false,
},
}
for _, test := range tests {
t.Run(fmt.Sprintf("indent(%#v, %#v)", test.Spaces, test.String), func(t *testing.T) {
got, err := Indent(test.Spaces, test.String)
if test.Err {
if err == nil {
t.Fatal("succeeded; want error")
}
return
} else if err != nil {
t.Fatalf("unexpected error: %s", err)
}
if !got.RawEquals(test.Want) {
t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, test.Want)
}
})
}
}
func TestReplace(t *testing.T) {
tests := []struct {
String cty.Value
Substr cty.Value
Replace cty.Value
Want cty.Value
Err bool
}{
{ // Regular search and replace
cty.StringVal("hello"),
cty.StringVal("hel"),
cty.StringVal("bel"),
cty.StringVal("bello"),
false,
},
{ // Search string doesn't match
cty.StringVal("hello"),
cty.StringVal("nope"),
cty.StringVal("bel"),
cty.StringVal("hello"),
false,
},
{ // Regular expression
cty.StringVal("hello"),
cty.StringVal("/l/"),
cty.StringVal("L"),
cty.StringVal("heLLo"),
false,
},
{
cty.StringVal("helo"),
cty.StringVal("/(l)/"),
cty.StringVal("$1$1"),
cty.StringVal("hello"),
false,
},
{ // Bad regexp
cty.StringVal("hello"),
cty.StringVal("/(l/"),
cty.StringVal("$1$1"),
cty.UnknownVal(cty.String),
true,
},
}
for _, test := range tests {
t.Run(fmt.Sprintf("replace(%#v, %#v, %#v)", test.String, test.Substr, test.Replace), func(t *testing.T) {
got, err := Replace(test.String, test.Substr, test.Replace)
if test.Err {
if err == nil {
t.Fatal("succeeded; want error")
}
return
} else if err != nil {
t.Fatalf("unexpected error: %s", err)
}
if !got.RawEquals(test.Want) {
t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, test.Want)
}
})
}
}
func TestTitle(t *testing.T) {
tests := []struct {
String cty.Value
Want cty.Value
Err bool
}{
{
cty.StringVal("hello"),
cty.StringVal("Hello"),
false,
},
{
cty.StringVal("hello world"),
cty.StringVal("Hello World"),
false,
},
{
cty.StringVal(""),
cty.StringVal(""),
false,
},
}
for _, test := range tests {
t.Run(fmt.Sprintf("title(%#v)", test.String), func(t *testing.T) {
got, err := Title(test.String)
if test.Err {
if err == nil {
t.Fatal("succeeded; want error")
}
return
} else if err != nil {
t.Fatalf("unexpected error: %s", err)
}
if !got.RawEquals(test.Want) {
t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, test.Want)
}
})
}
}
func TestTrimSpace(t *testing.T) {
tests := []struct {
String cty.Value
Want cty.Value
Err bool
}{
{
cty.StringVal(" hello "),
cty.StringVal("hello"),
false,
},
{
cty.StringVal(""),
cty.StringVal(""),
false,
},
}
for _, test := range tests {
t.Run(fmt.Sprintf("trimspace(%#v)", test.String), func(t *testing.T) {
got, err := TrimSpace(test.String)
if test.Err {
if err == nil {
t.Fatal("succeeded; want error")
}
return
} else if err != nil {
t.Fatalf("unexpected error: %s", err)
}
if !got.RawEquals(test.Want) {
t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, test.Want)
}
})
}
}