aboutsummaryrefslogtreecommitdiff
path: root/pkg/pointer/mycology_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/pointer/mycology_test.go')
-rw-r--r--pkg/pointer/mycology_test.go67
1 files changed, 67 insertions, 0 deletions
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
+}