| // Copyright 2022 The Tint Authors. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package template_test |
| |
| import ( |
| "bytes" |
| "testing" |
| |
| "dawn.googlesource.com/dawn/tools/src/template" |
| "github.com/google/go-cmp/cmp" |
| ) |
| |
| func check(t *testing.T, content, expected string, fns template.Functions) { |
| t.Helper() |
| w := &bytes.Buffer{} |
| if err := template.FromString("template", content).Run(w, nil, fns); err != nil { |
| t.Errorf("Template.Run() failed with %v", err) |
| return |
| } |
| got := w.String() |
| if diff := cmp.Diff(expected, got); diff != "" { |
| t.Errorf("output was not as expected. Diff:\n%v", diff) |
| } |
| } |
| |
| func TestContains(t *testing.T) { |
| tmpl := ` |
| {{ Contains "hello world" "hello"}} |
| {{ Contains "hello world" "fish"}} |
| ` |
| expected := ` |
| true |
| false |
| ` |
| check(t, tmpl, expected, nil) |
| } |
| |
| func TestEvalSingleParameter(t *testing.T) { |
| tmpl := ` |
| pre-eval |
| {{ Eval "T" 123 }} |
| {{ Eval "T" "cat" }} |
| post-eval |
| |
| pre-define |
| {{- define "T"}} |
| . is {{.}} |
| {{- end }} |
| post-define |
| ` |
| expected := ` |
| pre-eval |
| |
| . is 123 |
| |
| . is cat |
| post-eval |
| |
| pre-define |
| post-define |
| ` |
| check(t, tmpl, expected, nil) |
| } |
| |
| func TestEvalParameterPairs(t *testing.T) { |
| tmpl := ` |
| pre-eval |
| {{ Eval "T" "number" 123 "animal" "cat" }} |
| post-eval |
| |
| pre-define |
| {{- define "T"}} |
| .number is {{.number}} |
| .animal is {{.animal}} |
| {{- end }} |
| post-define |
| ` |
| expected := ` |
| pre-eval |
| |
| .number is 123 |
| .animal is cat |
| post-eval |
| |
| pre-define |
| post-define |
| ` |
| check(t, tmpl, expected, nil) |
| } |
| |
| func TestHasPrefix(t *testing.T) { |
| tmpl := ` |
| {{ HasPrefix "hello world" "hello"}} |
| {{ HasPrefix "hello world" "world"}} |
| ` |
| expected := ` |
| true |
| false |
| ` |
| check(t, tmpl, expected, nil) |
| } |
| |
| func TestIterate(t *testing.T) { |
| tmpl := ` |
| {{- range $i := Iterate 5}} |
| {{$i}} |
| {{- end}} |
| ` |
| expected := ` |
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| ` |
| check(t, tmpl, expected, nil) |
| } |
| |
| func TestMap(t *testing.T) { |
| tmpl := ` |
| {{- $m := Map }} |
| {{- $m.Put "one" 1 }} |
| {{- $m.Put "two" 2 }} |
| one: {{ $m.Get "one" }} |
| two: {{ $m.Get "two" }} |
| ` |
| expected := ` |
| one: 1 |
| two: 2 |
| ` |
| check(t, tmpl, expected, nil) |
| } |
| |
| func TestPascalCase(t *testing.T) { |
| tmpl := ` |
| {{ PascalCase "hello world" }} |
| {{ PascalCase "hello_world" }} |
| ` |
| expected := ` |
| HelloWorld |
| HelloWorld |
| ` |
| check(t, tmpl, expected, nil) |
| } |
| |
| func TestSplit(t *testing.T) { |
| tmpl := ` |
| {{- range $i, $s := Split "cat_says_meow" "_" }} |
| {{$i}}: '{{$s}}' |
| {{- end }} |
| ` |
| expected := ` |
| 0: 'cat' |
| 1: 'says' |
| 2: 'meow' |
| ` |
| check(t, tmpl, expected, nil) |
| } |
| |
| func TestTitle(t *testing.T) { |
| tmpl := ` |
| {{Title "hello world"}} |
| ` |
| expected := ` |
| Hello World |
| ` |
| check(t, tmpl, expected, nil) |
| } |
| |
| func TrimLeft(t *testing.T) { |
| tmpl := ` |
| '{{TrimLeft "hello world", "hel"}}' |
| ` |
| expected := ` |
| 'o world' |
| ` |
| check(t, tmpl, expected, nil) |
| } |
| |
| func TrimPrefix(t *testing.T) { |
| tmpl := ` |
| '{{TrimLeft "hello world", "hel"}}' |
| '{{TrimLeft "hello world", "heo"}}' |
| ` |
| expected := ` |
| 'o world' |
| 'hello world' |
| ` |
| check(t, tmpl, expected, nil) |
| } |
| |
| func TrimRight(t *testing.T) { |
| tmpl := ` |
| '{{TrimRight "hello world", "wld"}}' |
| ` |
| expected := ` |
| 'hello wor' |
| ` |
| check(t, tmpl, expected, nil) |
| } |
| |
| func TrimSuffix(t *testing.T) { |
| tmpl := ` |
| '{{TrimRight "hello world", "rld"}}' |
| '{{TrimRight "hello world", "wld"}}' |
| ` |
| expected := ` |
| 'hello wo' |
| 'hello world' |
| ` |
| check(t, tmpl, expected, nil) |
| } |