From 0e78f3ba3306800d854b13809830cb933249f0cb Mon Sep 17 00:00:00 2001 From: Julien Dessaux Date: Tue, 28 Sep 2021 21:51:08 +0200 Subject: Added mycology unit tests --- pkg/interpreter/mycology_test.go | 32 +++++++++++++++++++ pkg/pointer/mycology_test.go | 67 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 pkg/interpreter/mycology_test.go create mode 100644 pkg/pointer/mycology_test.go diff --git a/pkg/interpreter/mycology_test.go b/pkg/interpreter/mycology_test.go new file mode 100644 index 0000000..49f837c --- /dev/null +++ b/pkg/interpreter/mycology_test.go @@ -0,0 +1,32 @@ +package interpreter + +import ( + "fmt" + "os" + "testing" + + "git.adyxax.org/adyxax/gofunge98/pkg/field" + "git.adyxax.org/adyxax/gofunge98/pkg/pointer" + "github.com/stretchr/testify/require" +) + +func TestMycology(t *testing.T) { + file, err := os.Open("../../mycology/mycology.b98") + if err != nil { + t.Skip("mycology test suite not found, skipping") + } + + f, err := field.Load(file) + require.NoError(t, err) + p := pointer.NewPointer() + p.Argv = []string{"../../mycology/mycology.b98"} + // TODO test expected output + output := "" + p.CharacterOutput = func(c int) { + output += fmt.Sprintf("%c", c) + } + i := NewInterpreter(f, p) + + v := i.Run() + require.Equal(t, 15, v) +} diff --git a/pkg/pointer/mycology_test.go b/pkg/pointer/mycology_test.go new file mode 100644 index 0000000..0fec52f --- /dev/null +++ b/pkg/pointer/mycology_test.go @@ -0,0 +1,67 @@ +package pointer + +import ( + "fmt" + "os" + "testing" + + "git.adyxax.org/adyxax/gofunge98/pkg/field" + "github.com/stretchr/testify/require" +) + +func TestMycology(t *testing.T) { + file, err := os.Open("../../mycology/mycology.b98") + if err != nil { + t.Skip("mycology test suite not found, skipping") + } + + f, err := field.Load(file) + require.NoError(t, err) + p := NewPointer() + p.Argv = []string{"../../mycology/mycology.b98"} + output := "" + // TODO test expected output + p.CharacterOutput = func(c int) { + output += fmt.Sprintf("%c", c) + } + i := NewInterpreter(f, p) + + v := i.Run() + require.Equal(t, 15, v) +} + +type Interpreter struct { + f *field.Field + p *Pointer +} + +func NewInterpreter(f *field.Field, p *Pointer) *Interpreter { + return &Interpreter{f: f, p: p} +} + +func (i *Interpreter) Run() int { + for i.p != nil { + if v := i.step(); v != nil { + return *v + } + } + return 0 +} + +func (i *Interpreter) step() *int { + var prev *Pointer = nil + for p := i.p; p != nil; p = p.Next { + done, v := p.Exec(i.f) + if v != nil { + return v + } + if done { + if prev == nil { + i.p = p.Next + } else { + prev.Next = p.Next + } + } + } + return nil +} -- cgit v1.2.3