Add some tests
This commit is contained in:
parent
979e7aa33e
commit
6c23c75906
187
expr_test.go
Normal file
187
expr_test.go
Normal file
@ -0,0 +1,187 @@
|
|||||||
|
package salix
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestAdd(t *testing.T) {
|
||||||
|
res := execStr(t, `#(3 + 1)`, nil)
|
||||||
|
if res != "4" {
|
||||||
|
t.Errorf("Expected 4, got %s", res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSub(t *testing.T) {
|
||||||
|
res := execStr(t, `#(3 - 1)`, nil)
|
||||||
|
if res != "2" {
|
||||||
|
t.Errorf("Expected 2, got %s", res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMul(t *testing.T) {
|
||||||
|
res := execStr(t, `#(3 * 2)`, nil)
|
||||||
|
if res != "6" {
|
||||||
|
t.Errorf("Expected 6, got %s", res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDiv(t *testing.T) {
|
||||||
|
res := execStr(t, `#(8 / 4)`, nil)
|
||||||
|
if res != "2" {
|
||||||
|
t.Errorf("Expected 2, got %s", res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMod(t *testing.T) {
|
||||||
|
res := execStr(t, `#(4 % 4)`, nil)
|
||||||
|
if res != "0" {
|
||||||
|
t.Errorf("Expected 0, got %s", res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestEq(t *testing.T) {
|
||||||
|
res := execStr(t, `#("x" == "y")`, nil)
|
||||||
|
if res != "false" {
|
||||||
|
t.Errorf("Expected false, got %s", res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGEq(t *testing.T) {
|
||||||
|
res := execStr(t, `#(2 >= 2)`, nil)
|
||||||
|
if res != "true" {
|
||||||
|
t.Errorf("Expected true, got %s", res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGt(t *testing.T) {
|
||||||
|
res := execStr(t, `#(len("hi") > 2)`, nil)
|
||||||
|
if res != "false" {
|
||||||
|
t.Errorf("Expected false, got %s", res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLEq(t *testing.T) {
|
||||||
|
res := execStr(t, `#(4 <= 4)`, nil)
|
||||||
|
if res != "true" {
|
||||||
|
t.Errorf("Expected true, got %s", res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLt(t *testing.T) {
|
||||||
|
res := execStr(t, `#(4 < 4)`, nil)
|
||||||
|
if res != "false" {
|
||||||
|
t.Errorf("Expected false, got %s", res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAnd(t *testing.T) {
|
||||||
|
res := execStr(t, `#(true && false)`, nil)
|
||||||
|
if res != "false" {
|
||||||
|
t.Errorf("Expected false, got %s", res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestOr(t *testing.T) {
|
||||||
|
res := execStr(t, `#(true || false)`, nil)
|
||||||
|
if res != "true" {
|
||||||
|
t.Errorf("Expected true, got %s", res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestInString(t *testing.T) {
|
||||||
|
res := execStr(t, `#("h" in "hello")`, nil)
|
||||||
|
if res != "true" {
|
||||||
|
t.Errorf("Expected true, got %s", res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestInSlice(t *testing.T) {
|
||||||
|
res := execStr(t, `#(5 in slice) #(6 in slice)`, map[string]any{"slice": []int{1, 2, 3, 4, 5}})
|
||||||
|
if res != "true false" {
|
||||||
|
t.Errorf("Expected %q, got %q", "true false", res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestInMap(t *testing.T) {
|
||||||
|
res := execStr(t, `#(3.4234 in map)`, map[string]any{"map": map[float32]uint{3.4234: 0}})
|
||||||
|
if res != "true" {
|
||||||
|
t.Errorf("Expected %q, got %q", "true", res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestParenExpr(t *testing.T) {
|
||||||
|
res := execStr(t, `#(5 - 4.0 - 3 - 2) #(5 - (4.0 - 3) - 2)`, nil)
|
||||||
|
if res != "-4 2" {
|
||||||
|
t.Errorf("Expected %q, got %q", "4 -2", res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCoalescing(t *testing.T) {
|
||||||
|
res := execStr(t, `#(hello | "nothing") #(x | "nothing")`, map[string]any{"hello": "world"})
|
||||||
|
if res != "world nothing" {
|
||||||
|
t.Errorf("Expected %q, got %q", "world nothing", res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestTernary(t *testing.T) {
|
||||||
|
res := execStr(t, `#(2.0 == 2.0 ? "equal" : "non-equal") #(2.0 == 2.5 ? "equal" : "non-equal")`, nil)
|
||||||
|
if res != "equal non-equal" {
|
||||||
|
t.Errorf("Expected %q, got %q", "equal non-equal", res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNot(t *testing.T) {
|
||||||
|
res := execStr(t, `#(!true)`, nil)
|
||||||
|
if res != "false" {
|
||||||
|
t.Errorf("Expected %q, got %q", "false", res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestIndex(t *testing.T) {
|
||||||
|
res := execStr(t, `#(x[0]) #(y["hello"])`, map[string]any{
|
||||||
|
"x": []int{0, 1, 2},
|
||||||
|
"y": map[string]string{"hello": "world"},
|
||||||
|
})
|
||||||
|
if res != "0 world" {
|
||||||
|
t.Errorf("Expected %q, got %q", "equal non-equal", res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFuncCall(t *testing.T) {
|
||||||
|
res := execStr(t, `#(len(3.0))`, nil)
|
||||||
|
if res != "-1" {
|
||||||
|
t.Errorf("Expected %q, got %q", "-1", res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAssignment(t *testing.T) {
|
||||||
|
res := execStr(t, `#(x = 4)#(x)`, nil)
|
||||||
|
if res != "4" {
|
||||||
|
t.Errorf("Expected %q, got %q", "4", res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMethodCall(t *testing.T) {
|
||||||
|
res := execStr(t, `#(t.String())`, map[string]any{
|
||||||
|
"t": time.Date(2023, time.April, 26, 0, 0, 0, 0, time.UTC),
|
||||||
|
})
|
||||||
|
if res != "2023-04-26 00:00:00 +0000 UTC" {
|
||||||
|
t.Errorf("Expected %q, got %q", "2023-04-26 00:00:00 +0000 UTC", res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func execStr(t *testing.T, tmplStr string, vars map[string]any) string {
|
||||||
|
t.Helper()
|
||||||
|
tmpl, err := New().ParseString("test", tmplStr)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
sb := &strings.Builder{}
|
||||||
|
err = tmpl.WithVarMap(vars).Execute(sb)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
return sb.String()
|
||||||
|
}
|
4
salix.go
4
salix.go
@ -103,6 +103,10 @@ func (t Template) Execute(w io.Writer) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (t *Template) execute(w io.Writer, nodes []ast.Node, local map[string]any) error {
|
func (t *Template) execute(w io.Writer, nodes []ast.Node, local map[string]any) error {
|
||||||
|
if local == nil {
|
||||||
|
local = map[string]any{}
|
||||||
|
}
|
||||||
|
|
||||||
for i := 0; i < len(nodes); i++ {
|
for i := 0; i < len(nodes); i++ {
|
||||||
switch node := nodes[i].(type) {
|
switch node := nodes[i].(type) {
|
||||||
case ast.Text:
|
case ast.Text:
|
||||||
|
90
tag_test.go
Normal file
90
tag_test.go
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
package salix
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestIf(t *testing.T) {
|
||||||
|
const tmplStr = `#if(weather.Temp > 30):
|
||||||
|
<p>It's a hot day!</p>
|
||||||
|
#elif(weather.Temp < 0):
|
||||||
|
<p>It's freezing!</p>
|
||||||
|
#else:
|
||||||
|
<p>The temperature is #(weather.Temp)</p>
|
||||||
|
#!if`
|
||||||
|
|
||||||
|
type weather struct {
|
||||||
|
Temp int
|
||||||
|
}
|
||||||
|
|
||||||
|
res := execStr(t, tmplStr, map[string]any{
|
||||||
|
"weather": weather{Temp: 40},
|
||||||
|
})
|
||||||
|
res = strings.TrimSpace(res)
|
||||||
|
if res != "<p>It's a hot day!</p>" {
|
||||||
|
t.Errorf("Expected %q, got %q", "<p>It's a hot day!</p>", res)
|
||||||
|
}
|
||||||
|
|
||||||
|
res = execStr(t, tmplStr, map[string]any{
|
||||||
|
"weather": weather{Temp: -1},
|
||||||
|
})
|
||||||
|
res = strings.TrimSpace(res)
|
||||||
|
if res != "<p>It's freezing!</p>" {
|
||||||
|
t.Errorf("Expected %q, got %q", "<p>It's freezing!</p>", res)
|
||||||
|
}
|
||||||
|
|
||||||
|
res = execStr(t, tmplStr, map[string]any{
|
||||||
|
"weather": weather{Temp: 25},
|
||||||
|
})
|
||||||
|
res = strings.TrimSpace(res)
|
||||||
|
if res != "<p>The temperature is 25</p>" {
|
||||||
|
t.Errorf("Expected %q, got %q", "<p>The temperature is 25</p>", res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFor(t *testing.T) {
|
||||||
|
const tmplStr = `#for(item in items):
|
||||||
|
#(item)
|
||||||
|
#!for`
|
||||||
|
|
||||||
|
res := execStr(t, tmplStr, map[string]any{
|
||||||
|
"items": []any{1.2, 3, "Hello", 4 + 2i, "-2", false, nil},
|
||||||
|
})
|
||||||
|
|
||||||
|
expected := `1.2
|
||||||
|
3
|
||||||
|
Hello
|
||||||
|
(4+2i)
|
||||||
|
-2
|
||||||
|
false
|
||||||
|
<nil>
|
||||||
|
`
|
||||||
|
|
||||||
|
if res != expected {
|
||||||
|
t.Errorf("Expected %q, got %q", expected, res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestForTwoArgs(t *testing.T) {
|
||||||
|
const tmplStr = `#for(i, item in items):
|
||||||
|
#(i) #(item)
|
||||||
|
#!for`
|
||||||
|
|
||||||
|
res := execStr(t, tmplStr, map[string]any{
|
||||||
|
"items": []any{1.2, 3, "Hello", 4 + 2i, "-2", false, nil},
|
||||||
|
})
|
||||||
|
|
||||||
|
expected := `0 1.2
|
||||||
|
1 3
|
||||||
|
2 Hello
|
||||||
|
3 (4+2i)
|
||||||
|
4 -2
|
||||||
|
5 false
|
||||||
|
6 <nil>
|
||||||
|
`
|
||||||
|
|
||||||
|
if res != expected {
|
||||||
|
t.Errorf("Expected %q, got %q", expected, res)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user