| // Copyright (c) HashiCorp, Inc. |
| // SPDX-License-Identifier: MPL-2.0 |
| |
| package funcs |
| |
| import ( |
| "fmt" |
| "testing" |
| |
| "github.com/zclconf/go-cty/cty" |
| ) |
| |
| 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 TestStrContains(t *testing.T) { |
| tests := []struct { |
| String cty.Value |
| Substr cty.Value |
| Want cty.Value |
| Err bool |
| }{ |
| { |
| cty.StringVal("hello"), |
| cty.StringVal("hel"), |
| cty.BoolVal(true), |
| false, |
| }, |
| { |
| cty.StringVal("hello"), |
| cty.StringVal("lo"), |
| cty.BoolVal(true), |
| false, |
| }, |
| { |
| cty.StringVal("hello1"), |
| cty.StringVal("1"), |
| cty.BoolVal(true), |
| false, |
| }, |
| { |
| cty.StringVal("hello1"), |
| cty.StringVal("heo"), |
| cty.BoolVal(false), |
| false, |
| }, |
| { |
| cty.StringVal("hello1"), |
| cty.NumberIntVal(1), |
| cty.UnknownVal(cty.Bool), |
| true, |
| }, |
| } |
| |
| for _, test := range tests { |
| t.Run(fmt.Sprintf("includes(%#v, %#v)", test.String, test.Substr), func(t *testing.T) { |
| got, err := StrContains(test.String, test.Substr) |
| |
| 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 StrContains(str, substr cty.Value) (cty.Value, error) { |
| return StrContainsFunc.Call([]cty.Value{str, substr}) |
| } |