// Copyright 2022 The Dawn & Tint Authors
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this
//    list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice,
//    this list of conditions and the following disclaimer in the documentation
//    and/or other materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its
//    contributors may be used to endorse or promote products derived from
//    this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

package template_test

import (
	"bytes"
	"testing"

	"dawn.googlesource.com/dawn/tools/src/oswrapper"
	"dawn.googlesource.com/dawn/tools/src/template"
	"github.com/stretchr/testify/require"
)

func check(t *testing.T, content, expected string, fns template.Functions) {
	t.Helper()
	w := &bytes.Buffer{}
	err := template.FromString("template", content).Run(w, nil, fns)
	require.NoError(t, err, "Template.Run() failed with %v", err)
	got := w.String()
	require.Equal(t, expected, got, "Got unexpected diff")
}

func TestFromFile(t *testing.T) {
	fileContent := `
{{ Contains "hello world" "hello"}}
{{ Contains "hello world" "fish"}}
`
	filePath := "file.tmpl"

	osw := oswrapper.CreateFSTestOSWrapper()
	osw.WriteFile(filePath, []byte(fileContent), 0644)

	expectedTemplate := template.FromString(filePath, fileContent)

	actualTemplate, err := template.FromFile(filePath, osw)
	require.NoError(t, err, "Error creating template from file")
	require.Equal(t, expectedTemplate, actualTemplate)
}

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)
}
