package render

import (
	"fmt"
	"testing"
)

func TestRemoveUnexistedArgBlockRender(t *testing.T) {
	r := newTemplateRender()
	r.registerRender(newRemoveUnexistedArgBlockRender())

	test := func(in, r1, r2 string) {
		out := r.doRender(in, map[string]string{
			"tikv-count": "random",
		})
		if out != r1 {
			t.Fatal(fmt.Errorf("result of existed `%v` != expected `%v`", out, r1))
		}
		out = r.doRender(in, map[string]string{})
		if out != r2 {
			t.Fatal(fmt.Errorf("result of unexisted `%v` != expected `%v`", out, r2))
		}
	}

	sb := "{{!exist begin!tikv-count}}"
	ss := "this content will be removed if arg 'tikv-count' not exists"
	se := "{{!exist end!tikv-count}}"

	test(sb+ss+se, ss, "")
	test("abc"+sb+ss+se+"xyz", "abc"+ss+"xyz", "abcxyz")
	test("abc\n"+sb+ss+se+"xyz\n", "abc\n"+ss+"xyz\n", "abc\nxyz\n")
	test("abc\n"+sb+"\n"+ss+"\n"+se+"\n"+"xyz\n", "abc\n"+ss+"\n"+"xyz\n", "abc\nxyz\n")

	sb = "{{ ! exist\t begin ! tikv-count }}"
	ss = " this content will be removed if arg 'tikv-count' not exists\t\n"
	se = "{{ ! exist\t end ! tikv-count }}"

	test(sb+ss+se, ss, "")
	test("abc"+sb+ss+se+"xyz", "abc"+ss+"xyz", "abcxyz")
	test("abc\n"+sb+ss+se+"xyz\n", "abc\n"+ss+"xyz\n", "abc\nxyz\n")
	test("abc\n"+sb+"\n"+ss+"\n"+se+"\n"+"xyz\n", "abc\n"+ss+"\n"+"xyz\n", "abc\nxyz\n")

	sb = "    {{ ! exist\t begin ! tikv-count }}"
	ss = " this content will be removed if arg 'tikv-count' not exists\n"
	se = "    {{ ! exist\t end ! tikv-count }}"

	test(sb+ss+se, ss, "")
	test("abc"+sb+ss+se+"xyz", "abc"+ss+"xyz", "abcxyz")
	test("abc\n"+sb+ss+se+"xyz\n", "abc\n"+ss+"xyz\n", "abc\nxyz\n")
	test("abc\n"+sb+"\n"+ss+"\n"+se+"\n"+"xyz\n", "abc\n"+ss+"\n"+"xyz\n", "abc\nxyz\n")
}

func TestReplaceArgByValRender(t *testing.T) {
	r := newTemplateRender()
	r.registerRender(newReplaceArgByValRender())

	val := "4444"

	test := func(in, res string) {
		out := r.doRender(in, map[string]string{
			"tikv-count": val,
		})
		if out != res {
			t.Fatal(fmt.Errorf("result `%v` != expected `%v`", out, res))
		}
		out = r.doRender(in, map[string]string{})
		if out != in {
			t.Fatal(fmt.Errorf("result `%v` != expected (unchanged) `%v`", out, in))
		}
	}

	sb := "random prefix"
	ss := "{{!tikv-count}}"
	se := "random suffix"

	test(sb+ss+se, sb+val+se)
	test("abc"+sb+ss+se+"xyz", "abc"+sb+val+se+"xyz")
	test("abc\n"+sb+ss+se+"xyz\n", "abc\n"+sb+val+se+"xyz\n")
	test("abc\n"+sb+"\n"+ss+"\n"+se+"\n"+"xyz\n", "abc\n"+sb+"\n"+val+"\n"+se+"\n"+"xyz\n")

	sb = "random prefix"
	ss = "{{ ! tikv-count }}"
	se = "random suffix"

	test(sb+ss+se, sb+val+se)
	test("abc"+sb+ss+se+"xyz", "abc"+sb+val+se+"xyz")
	test("abc\n"+sb+ss+se+"xyz\n", "abc\n"+sb+val+se+"xyz\n")
	test("abc\n"+sb+"\n"+ss+"\n"+se+"\n"+"xyz\n", "abc\n"+sb+"\n"+val+"\n"+se+"\n"+"xyz\n")
}

func TestUnfoldTemplateRender(t *testing.T) {
	r := newTemplateRender()
	r.registerRender(newUnfoldTemplateRender())

	val := "raaaaaaaaadom content\nanother line\n"

	test := func(in, res string) {
		out := r.doRender(in, map[string]string{
			"another-template": val,
		})
		if out != res {
			t.Fatal(fmt.Errorf("result `%v` != expected `%v`", out, res))
		}
		out = r.doRender(in, map[string]string{})
		if out != in {
			t.Fatal(fmt.Errorf("result `%v` != expected (unchanged) `%v`", out, in))
		}
	}

	sb := "random prefix"
	ss := "{{!template:another-template}}"
	se := "random suffix"

	test(sb+ss+se, sb+val+se)
	test("abc"+sb+ss+se+"xyz", "abc"+sb+val+se+"xyz")
	test("abc\n"+sb+ss+se+"xyz\n", "abc\n"+sb+val+se+"xyz\n")
	test("abc\n"+sb+"\n"+ss+"\n"+se+"\n"+"xyz\n", "abc\n"+sb+"\n"+val+se+"\n"+"xyz\n")

	sb = "random prefix"
	ss = "{{ ! template : another-template }}\n"
	se = "random suffix"

	test(sb+ss+se, sb+val+se)
	test("abc"+sb+ss+se+"xyz", "abc"+sb+val+se+"xyz")
	test("abc\n"+sb+ss+se+"xyz\n", "abc\n"+sb+val+se+"xyz\n")
	test("abc\n"+sb+"\n"+ss+"\n"+se+"\n"+"xyz\n", "abc\n"+sb+"\n"+val+se+"\n"+"xyz\n")
}
