WIP implement high-level pagination test
This commit is contained in:
parent
0831a4ea53
commit
5f04698d0a
@ -12,13 +12,15 @@ import (
|
|||||||
func main() {
|
func main() {
|
||||||
var dir string
|
var dir string
|
||||||
var root string
|
var root string
|
||||||
|
var size uint
|
||||||
flag.StringVar(&dir, "d", ".", "resource dir to read from")
|
flag.StringVar(&dir, "d", ".", "resource dir to read from")
|
||||||
|
flag.UintVar(&size, "s", 0, "max size of output")
|
||||||
flag.StringVar(&root, "root", "root", "entry point symbol")
|
flag.StringVar(&root, "root", "root", "entry point symbol")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
fmt.Fprintf(os.Stderr, "starting session at symbol '%s' using resource dir: %s\n", root, dir)
|
fmt.Fprintf(os.Stderr, "starting session at symbol '%s' using resource dir: %s\n", root, dir)
|
||||||
|
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
en := engine.NewDefaultEngine(dir)
|
en := engine.NewSizedEngine(dir, uint32(size))
|
||||||
err := engine.Loop(&en, root, ctx, os.Stdin, os.Stdout)
|
err := engine.Loop(&en, root, ctx, os.Stdin, os.Stdout)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintf(os.Stderr, "loop exited with error: %v", err)
|
fmt.Fprintf(os.Stderr, "loop exited with error: %v", err)
|
||||||
|
@ -10,5 +10,15 @@ func NewDefaultEngine(dir string) Engine {
|
|||||||
st := state.NewState(0)
|
st := state.NewState(0)
|
||||||
rs := resource.NewFsResource(dir)
|
rs := resource.NewFsResource(dir)
|
||||||
ca := cache.NewCache()
|
ca := cache.NewCache()
|
||||||
return NewEngine(&st, &rs, ca)
|
return NewEngine(Config{}, &st, &rs, ca)
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewSizedEngine(dir string, size uint32) Engine {
|
||||||
|
st := state.NewState(0)
|
||||||
|
rs := resource.NewFsResource(dir)
|
||||||
|
ca := cache.NewCache()
|
||||||
|
cfg := Config{
|
||||||
|
OutputSize: size,
|
||||||
|
}
|
||||||
|
return NewEngine(cfg, &st, &rs, ca)
|
||||||
}
|
}
|
||||||
|
@ -7,15 +7,17 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
|
|
||||||
"git.defalsify.org/festive/cache"
|
"git.defalsify.org/festive/cache"
|
||||||
|
"git.defalsify.org/festive/render"
|
||||||
"git.defalsify.org/festive/resource"
|
"git.defalsify.org/festive/resource"
|
||||||
"git.defalsify.org/festive/state"
|
"git.defalsify.org/festive/state"
|
||||||
"git.defalsify.org/festive/vm"
|
"git.defalsify.org/festive/vm"
|
||||||
)
|
)
|
||||||
|
|
||||||
//type Config struct {
|
type Config struct {
|
||||||
|
OutputSize uint32
|
||||||
// FlagCount uint32
|
// FlagCount uint32
|
||||||
// CacheSize uint32
|
// CacheSize uint32
|
||||||
//}
|
}
|
||||||
|
|
||||||
// Engine is an execution engine that handles top-level errors when running user inputs against currently exposed bytecode.
|
// Engine is an execution engine that handles top-level errors when running user inputs against currently exposed bytecode.
|
||||||
type Engine struct {
|
type Engine struct {
|
||||||
@ -26,12 +28,16 @@ type Engine struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NewEngine creates a new Engine
|
// NewEngine creates a new Engine
|
||||||
func NewEngine(st *state.State, rs resource.Resource, ca cache.Memory) Engine {
|
func NewEngine(cfg Config, st *state.State, rs resource.Resource, ca cache.Memory) Engine {
|
||||||
|
var szr *render.Sizer
|
||||||
|
if cfg.OutputSize > 0 {
|
||||||
|
szr = render.NewSizer(cfg.OutputSize)
|
||||||
|
}
|
||||||
engine := Engine{
|
engine := Engine{
|
||||||
st: st,
|
st: st,
|
||||||
rs: rs,
|
rs: rs,
|
||||||
ca: ca,
|
ca: ca,
|
||||||
vm: vm.NewVm(st, rs, ca, nil),
|
vm: vm.NewVm(st, rs, ca, szr),
|
||||||
}
|
}
|
||||||
return engine
|
return engine
|
||||||
}
|
}
|
||||||
|
@ -75,7 +75,7 @@ func TestEngineInit(t *testing.T) {
|
|||||||
rs := NewFsWrapper(dataDir, &st)
|
rs := NewFsWrapper(dataDir, &st)
|
||||||
ca := cache.NewCache().WithCacheSize(1024)
|
ca := cache.NewCache().WithCacheSize(1024)
|
||||||
|
|
||||||
en := NewEngine(&st, &rs, ca)
|
en := NewEngine(Config{}, &st, &rs, ca)
|
||||||
err := en.Init("root", ctx)
|
err := en.Init("root", ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
@ -114,7 +114,9 @@ func TestEngineInit(t *testing.T) {
|
|||||||
|
|
||||||
it has more lines
|
it has more lines
|
||||||
0:to foo
|
0:to foo
|
||||||
1:go bar`
|
1:go bar
|
||||||
|
2:see long`
|
||||||
|
|
||||||
if !bytes.Equal(b, []byte(expect)) {
|
if !bytes.Equal(b, []byte(expect)) {
|
||||||
t.Fatalf("expected\n\t%s\ngot:\n\t%s\n", expect, b)
|
t.Fatalf("expected\n\t%s\ngot:\n\t%s\n", expect, b)
|
||||||
}
|
}
|
||||||
@ -127,7 +129,7 @@ func TestEngineExecInvalidInput(t *testing.T) {
|
|||||||
rs := NewFsWrapper(dataDir, &st)
|
rs := NewFsWrapper(dataDir, &st)
|
||||||
ca := cache.NewCache().WithCacheSize(1024)
|
ca := cache.NewCache().WithCacheSize(1024)
|
||||||
|
|
||||||
en := NewEngine(&st, &rs, ca)
|
en := NewEngine(Config{}, &st, &rs, ca)
|
||||||
err := en.Init("root", ctx)
|
err := en.Init("root", ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
@ -20,7 +20,7 @@ func TestLoopCorrect(t *testing.T) {
|
|||||||
rs := resource.NewFsResource(dataDir)
|
rs := resource.NewFsResource(dataDir)
|
||||||
ca := cache.NewCache().WithCacheSize(1024)
|
ca := cache.NewCache().WithCacheSize(1024)
|
||||||
|
|
||||||
en := NewEngine(&st, &rs, ca)
|
en := NewEngine(Config{}, &st, &rs, ca)
|
||||||
err := en.Init("root", ctx)
|
err := en.Init("root", ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
@ -38,7 +38,6 @@ func(szr *Sizer) Set(key string, size uint16) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func(szr *Sizer) Check(s string) (uint32, bool) {
|
func(szr *Sizer) Check(s string) (uint32, bool) {
|
||||||
log.Printf("sizercheck %s", s)
|
|
||||||
l := uint32(len(s))
|
l := uint32(len(s))
|
||||||
if szr.outputSize > 0 {
|
if szr.outputSize > 0 {
|
||||||
if l > szr.outputSize {
|
if l > szr.outputSize {
|
||||||
@ -84,7 +83,6 @@ func(szr *Sizer) GetAt(values map[string]string, idx uint16) (map[string]string,
|
|||||||
c := szr.crsrs[idx]
|
c := szr.crsrs[idx]
|
||||||
v = v[c:]
|
v = v[c:]
|
||||||
nl := strings.Index(v, "\n")
|
nl := strings.Index(v, "\n")
|
||||||
log.Printf("k %v v %v c %v nl %v", k, v, c, nl)
|
|
||||||
if nl > 0 {
|
if nl > 0 {
|
||||||
v = v[:nl]
|
v = v[:nl]
|
||||||
}
|
}
|
||||||
|
31
go/testdata/testdata.go
vendored
31
go/testdata/testdata.go
vendored
@ -66,10 +66,12 @@ func foo() error {
|
|||||||
b := []byte{}
|
b := []byte{}
|
||||||
b = vm.NewLine(b, vm.MOUT, []string{"0", "to foo"}, nil, nil)
|
b = vm.NewLine(b, vm.MOUT, []string{"0", "to foo"}, nil, nil)
|
||||||
b = vm.NewLine(b, vm.MOUT, []string{"1", "go bar"}, nil, nil)
|
b = vm.NewLine(b, vm.MOUT, []string{"1", "go bar"}, nil, nil)
|
||||||
|
b = vm.NewLine(b, vm.MOUT, []string{"2", "see long"}, nil, nil)
|
||||||
b = vm.NewLine(b, vm.LOAD, []string{"inky"}, []byte{20}, nil)
|
b = vm.NewLine(b, vm.LOAD, []string{"inky"}, []byte{20}, nil)
|
||||||
b = vm.NewLine(b, vm.HALT, nil, nil, nil)
|
b = vm.NewLine(b, vm.HALT, nil, nil, nil)
|
||||||
b = vm.NewLine(b, vm.INCMP, []string{"0", "_"}, nil, nil)
|
b = vm.NewLine(b, vm.INCMP, []string{"0", "_"}, nil, nil)
|
||||||
b = vm.NewLine(b, vm.INCMP, []string{"1", "baz"}, nil, nil)
|
b = vm.NewLine(b, vm.INCMP, []string{"1", "baz"}, nil, nil)
|
||||||
|
b = vm.NewLine(b, vm.INCMP, []string{"2", "long"}, nil, nil)
|
||||||
//b = vm.NewLine(b, vm.CATCH, []string{"_catch"}, []byte{1}, []uint8{1})
|
//b = vm.NewLine(b, vm.CATCH, []string{"_catch"}, []byte{1}, []uint8{1})
|
||||||
|
|
||||||
data := make(map[string]string)
|
data := make(map[string]string)
|
||||||
@ -106,6 +108,33 @@ func baz() error {
|
|||||||
return out("baz", b, tpl, nil)
|
return out("baz", b, tpl, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func long() error {
|
||||||
|
b := []byte{}
|
||||||
|
b = vm.NewLine(b, vm.LOAD, []string{"longdata"}, []byte{0x00}, nil)
|
||||||
|
b = vm.NewLine(b, vm.MAP, []string{"longdata"}, nil, nil)
|
||||||
|
b = vm.NewLine(b, vm.MOUT, []string{"0", "back"}, nil, nil)
|
||||||
|
b = vm.NewLine(b, vm.MNEXT, []string{"00", "nexxt"}, nil, nil)
|
||||||
|
b = vm.NewLine(b, vm.MPREV, []string{"11", "prevv"}, nil, nil)
|
||||||
|
b = vm.NewLine(b, vm.HALT, nil, nil, nil)
|
||||||
|
b = vm.NewLine(b, vm.INCMP, []string{"0", "_"}, nil, nil)
|
||||||
|
|
||||||
|
tpl := `data
|
||||||
|
{{.longdata}}`
|
||||||
|
|
||||||
|
data := make(map[string]string)
|
||||||
|
data["longdata"] = `INKY 12
|
||||||
|
PINKY 5555
|
||||||
|
BLINKY 3t7
|
||||||
|
CLYDE 11
|
||||||
|
TINKYWINKY 22
|
||||||
|
DIPSY 666
|
||||||
|
LALA 111
|
||||||
|
POO 222
|
||||||
|
`
|
||||||
|
|
||||||
|
return out("long", b, tpl, data)
|
||||||
|
}
|
||||||
|
|
||||||
func defaultCatch() error {
|
func defaultCatch() error {
|
||||||
b := []byte{}
|
b := []byte{}
|
||||||
b = vm.NewLine(b, vm.MOUT, []string{"0", "back"}, nil, nil)
|
b = vm.NewLine(b, vm.MOUT, []string{"0", "back"}, nil, nil)
|
||||||
@ -123,7 +152,7 @@ func generate() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
fns := []genFunc{root, foo, bar, baz, defaultCatch}
|
fns := []genFunc{root, foo, bar, baz, long, defaultCatch}
|
||||||
for _, fn := range fns {
|
for _, fn := range fns {
|
||||||
err = fn()
|
err = fn()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -209,7 +209,6 @@ func(vm *Vm) RunLoad(b []byte, ctx context.Context) ([]byte, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return b, err
|
return b, err
|
||||||
}
|
}
|
||||||
|
|
||||||
r, err := refresh(sym, vm.rs, ctx)
|
r, err := refresh(sym, vm.rs, ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return b, err
|
return b, err
|
||||||
|
Loading…
Reference in New Issue
Block a user