vise/engine/engine_test.go

188 lines
3.6 KiB
Go
Raw Permalink Normal View History

2023-04-01 11:58:02 +02:00
package engine
import (
"bytes"
"context"
2023-04-01 15:47:03 +02:00
"fmt"
"io/ioutil"
2023-04-01 11:58:02 +02:00
"path"
"testing"
"git.grassecon.net/kamikazechaser/vise/cache"
"git.grassecon.net/kamikazechaser/vise/resource"
"git.grassecon.net/kamikazechaser/vise/state"
"git.grassecon.net/kamikazechaser/vise/testdata"
2023-04-02 10:07:53 +02:00
)
var (
dataGenerated bool = false
dataDir string = testdata.DataDir
2023-04-01 11:58:02 +02:00
)
type FsWrapper struct {
*resource.FsResource
2023-04-01 15:47:03 +02:00
st *state.State
2023-04-01 11:58:02 +02:00
}
func NewFsWrapper(path string, st *state.State) FsWrapper {
rs := resource.NewFsResource(path)
wr := FsWrapper{
&rs,
2023-04-01 11:58:02 +02:00
st,
}
wr.AddLocalFunc("one", wr.one)
wr.AddLocalFunc("inky", wr.inky)
wr.AddLocalFunc("pinky", wr.pinky)
return wr
2023-04-01 11:58:02 +02:00
}
func (fs FsWrapper) one(sym string, input []byte, ctx context.Context) (resource.Result, error) {
return resource.Result{
Content: "one",
}, nil
2023-04-01 15:47:03 +02:00
}
func (fs FsWrapper) inky(sym string, input []byte, ctx context.Context) (resource.Result, error) {
return resource.Result{
Content: "tinkywinky",
}, nil
}
func (fs FsWrapper) pinky(sym string, input []byte, ctx context.Context) (resource.Result, error) {
r := fmt.Sprintf("xyzzy: %x", input)
return resource.Result{
Content: r,
}, nil
2023-04-13 01:38:33 +02:00
}
func (fs FsWrapper) GetCode(sym string) ([]byte, error) {
2023-04-01 15:47:03 +02:00
sym += ".bin"
fp := path.Join(fs.Path, sym)
r, err := ioutil.ReadFile(fp)
return r, err
2023-04-01 11:58:02 +02:00
}
2023-04-02 10:07:53 +02:00
func generateTestData(t *testing.T) {
if dataGenerated {
return
}
var err error
dataDir, err = testdata.Generate()
if err != nil {
t.Fatal(err)
}
}
2023-04-01 11:58:02 +02:00
func TestEngineInit(t *testing.T) {
var err error
2023-04-02 10:07:53 +02:00
generateTestData(t)
2023-04-01 11:58:02 +02:00
ctx := context.TODO()
st := state.NewState(17)
rs := NewFsWrapper(dataDir, &st)
ca := cache.NewCache().WithCacheSize(1024)
en := NewEngine(Config{
Root: "root",
}, &st, &rs, ca, ctx)
2023-04-17 07:35:36 +02:00
_, err = en.Init(ctx)
if err != nil {
t.Fatal(err)
}
2023-04-01 11:58:02 +02:00
w := bytes.NewBuffer(nil)
_, err = en.WriteResult(w, ctx)
2023-04-01 11:58:02 +02:00
if err != nil {
t.Fatal(err)
}
b := w.Bytes()
expect_str := `hello world
1:do the foo
2:go to the bar`
if !bytes.Equal(b, []byte(expect_str)) {
t.Fatalf("expected:\n\t%s\ngot:\n\t%s\n", expect_str, b)
2023-04-01 11:58:02 +02:00
}
2023-04-02 10:07:53 +02:00
input := []byte("1")
2023-04-06 11:08:40 +02:00
_, err = en.Exec(input, ctx)
2023-04-01 15:47:03 +02:00
if err != nil {
t.Fatal(err)
}
r, _ := st.Where()
2023-04-02 10:07:53 +02:00
if r != "foo" {
t.Fatalf("expected where-string 'foo', got %s", r)
}
w = bytes.NewBuffer(nil)
_, err = en.WriteResult(w, ctx)
if err != nil {
t.Fatal(err)
}
b = w.Bytes()
expect := `this is in foo
it has more lines
0:to foo
1:go bar
2:see long`
if !bytes.Equal(b, []byte(expect)) {
t.Fatalf("expected\n\t%s\ngot:\n\t%s\n", expect, b)
2023-04-01 15:47:03 +02:00
}
2023-04-01 11:58:02 +02:00
}
2023-04-06 13:41:36 +02:00
func TestEngineExecInvalidInput(t *testing.T) {
generateTestData(t)
ctx := context.TODO()
st := state.NewState(17)
2023-04-06 13:41:36 +02:00
rs := NewFsWrapper(dataDir, &st)
ca := cache.NewCache().WithCacheSize(1024)
en := NewEngine(Config{
2023-04-16 09:51:16 +02:00
Root: "root",
}, &st, &rs, ca, ctx)
2023-04-17 07:35:36 +02:00
var err error
_, err = en.Init(ctx)
2023-04-06 13:41:36 +02:00
if err != nil {
t.Fatal(err)
}
_, err = en.Exec([]byte("_foo"), ctx)
if err == nil {
t.Fatalf("expected fail on invalid input")
}
}
func TestEngineResumeTerminated(t *testing.T) {
generateTestData(t)
ctx := context.TODO()
st := state.NewState(17)
rs := NewFsWrapper(dataDir, &st)
ca := cache.NewCache().WithCacheSize(1024)
en := NewEngine(Config{
Root: "root",
}, &st, &rs, ca, ctx)
2023-04-17 07:35:36 +02:00
var err error
_, err = en.Init(ctx)
if err != nil {
t.Fatal(err)
}
_, err = en.Exec([]byte("1"), ctx)
if err != nil {
t.Fatal(err)
}
_, err = en.Exec([]byte("1"), ctx)
if err != nil {
t.Fatal(err)
}
location, idx := st.Where()
if location != "root" {
t.Fatalf("expected 'root', got %s", location)
}
if idx != 0 {
t.Fatalf("expected idx '0', got %v", idx)
}
}