vise/go/vm/vm_test.go

131 lines
2.6 KiB
Go
Raw Normal View History

2023-03-31 11:52:04 +02:00
package vm
import (
"context"
"fmt"
"testing"
2023-03-31 11:59:55 +02:00
"text/template"
"bytes"
2023-03-31 11:52:04 +02:00
2023-03-31 11:59:55 +02:00
"git.defalsify.org/festive/resource"
2023-03-31 11:52:04 +02:00
"git.defalsify.org/festive/state"
)
type TestResource struct {
}
2023-03-31 11:59:55 +02:00
func getOne(input []byte, ctx context.Context) (string, error) {
return "one", nil
}
func getTwo(input []byte, ctx context.Context) (string, error) {
return "two", nil
}
2023-03-31 11:52:04 +02:00
func (r *TestResource) Get(sym string) (string, error) {
switch sym {
case "foo":
return "inky pinky blinky clyde", nil
case "bar":
2023-03-31 11:59:55 +02:00
return "inky pinky {{.one}} blinky {{.two}} clyde", nil
2023-03-31 11:52:04 +02:00
}
return "", fmt.Errorf("unknown symbol %s", sym)
}
func (r *TestResource) Render(sym string, values map[string]string) (string, error) {
v, err := r.Get(sym)
2023-03-31 11:59:55 +02:00
if err != nil {
return "", err
}
2023-03-31 14:24:14 +02:00
tp, err := template.New("tester").Option("missingkey=error").Parse(v)
2023-03-31 11:59:55 +02:00
if err != nil {
return "", err
}
b := bytes.NewBuffer([]byte{})
2023-03-31 14:24:14 +02:00
err = tp.Execute(b, values)
2023-03-31 11:59:55 +02:00
if err != nil {
return "", err
}
return b.String(), err
}
func (r *TestResource) FuncFor(sym string) (resource.EntryFunc, error) {
switch sym {
case "one":
return getOne, nil
case "two":
return getTwo, nil
}
return nil, fmt.Errorf("invalid function: '%s'", sym)
2023-03-31 11:52:04 +02:00
}
func TestRun(t *testing.T) {
2023-03-31 14:06:59 +02:00
st := state.NewState(5)
2023-03-31 11:52:04 +02:00
rs := TestResource{}
2023-03-31 16:03:54 +02:00
b := []byte{0x00, 0x01, 0x03}
b = append(b, []byte("foo")...)
r, _, err := Run(b, st, &rs, context.TODO())
2023-03-31 11:52:04 +02:00
if err != nil {
t.Errorf("error on valid opcode: %v", err)
}
b = []byte{0x01, 0x02}
2023-03-31 16:03:54 +02:00
r, _, err = Run(b, st, &rs, context.TODO())
2023-03-31 11:52:04 +02:00
if err == nil {
t.Errorf("no error on invalid opcode")
}
_ = r
}
2023-03-31 11:59:55 +02:00
2023-03-31 14:24:14 +02:00
func TestRunLoad(t *testing.T) {
2023-03-31 14:06:59 +02:00
st := state.NewState(5)
2023-03-31 16:03:54 +02:00
st.Down("barbarbar")
2023-03-31 11:59:55 +02:00
rs := TestResource{}
sym := "one"
ins := append([]byte{uint8(len(sym))}, []byte(sym)...)
2023-03-31 16:03:54 +02:00
ins = append(ins, 0x0a)
2023-03-31 11:59:55 +02:00
var err error
2023-03-31 16:03:54 +02:00
st, _, err = RunLoad(ins, st, &rs, context.TODO())
2023-03-31 11:59:55 +02:00
if err != nil {
t.Error(err)
}
m, err := st.Get()
if err != nil {
t.Error(err)
}
r, err := rs.Render("foo", m)
if err != nil {
t.Error(err)
}
expect := "inky pinky blinky clyde"
if r != expect {
t.Errorf("Expected %v, got %v", []byte(expect), []byte(r))
}
r, err = rs.Render("bar", m)
if err == nil {
t.Errorf("expected error for render of bar: %v" ,err)
}
sym = "two"
ins = append([]byte{uint8(len(sym))}, []byte(sym)...)
2023-03-31 16:03:54 +02:00
ins = append(ins, 0)
st, _, err = RunLoad(ins, st, &rs, context.TODO())
2023-03-31 11:59:55 +02:00
if err != nil {
t.Error(err)
}
m, err = st.Get()
if err != nil {
t.Error(err)
}
r, err = rs.Render("bar", m)
if err != nil {
t.Error(err)
}
expect = "inky pinky one blinky two clyde"
if r != expect {
t.Errorf("Expected %v, got %v", expect, r)
}
}