diff options
author | Julien Dessaux | 2021-09-22 00:31:53 +0200 |
---|---|---|
committer | Julien Dessaux | 2021-09-22 00:31:53 +0200 |
commit | 21cbac676962af4df351fd184fdf24b4cc7e6651 (patch) | |
tree | fcbf63f202b8d4cb3860a8c1b550cf8e77b9967c /pkg/stack | |
parent | Simplified instruction pointer delta handling (diff) | |
download | gofunge98-21cbac676962af4df351fd184fdf24b4cc7e6651.tar.gz gofunge98-21cbac676962af4df351fd184fdf24b4cc7e6651.tar.bz2 gofunge98-21cbac676962af4df351fd184fdf24b4cc7e6651.zip |
Continued implementing the stack stack
Diffstat (limited to 'pkg/stack')
-rw-r--r-- | pkg/stack/stack-stack.go | 1 | ||||
-rw-r--r-- | pkg/stack/stack-stack_test.go | 102 |
2 files changed, 103 insertions, 0 deletions
diff --git a/pkg/stack/stack-stack.go b/pkg/stack/stack-stack.go index db5a405..adc41c6 100644 --- a/pkg/stack/stack-stack.go +++ b/pkg/stack/stack-stack.go @@ -17,6 +17,7 @@ func NewStackStack() *StackStack { } func (ss *StackStack) Begin(p *pointer.Pointer) { + ss.height++ soss := ss.head n := soss.Pop() np := n diff --git a/pkg/stack/stack-stack_test.go b/pkg/stack/stack-stack_test.go new file mode 100644 index 0000000..6c0c47f --- /dev/null +++ b/pkg/stack/stack-stack_test.go @@ -0,0 +1,102 @@ +package stack + +import ( + "os" + "testing" + + "git.adyxax.org/adyxax/gofunge/pkg/field" + "git.adyxax.org/adyxax/gofunge/pkg/pointer" + "github.com/stretchr/testify/require" +) + +func TestBegin(t *testing.T) { + t.Run("empty", func(t *testing.T) { + expected := NewStackStack() + expected.head = &Stack{data: make([]int, 0), next: expected.head} + expected.head.next.Push(0) + expected.head.next.Push(0) + expected.height++ + ss := NewStackStack() + p := pointer.NewPointer() + ss.Begin(p) + require.Equal(t, expected, ss) + x, y := p.GetStorageOffset() + require.Equal(t, 1, x) + require.Equal(t, 0, y) + // Let's push another one + expected.head = &Stack{data: make([]int, 0), next: expected.head} + expected.head.next.Push(1) + expected.head.next.Push(0) + expected.height++ + ss.Begin(p) + require.Equal(t, expected, ss) + x, y = p.GetStorageOffset() + require.Equal(t, 1, x) + require.Equal(t, 0, y) + }) + t.Run("negative", func(t *testing.T) { + expected := NewStackStack() + expected.head = &Stack{size: 5, height: 5, data: make([]int, 5), next: expected.head} + expected.head.next.Push(0) + expected.head.next.Push(0) + expected.height++ + p := pointer.NewPointer() + file, err := os.Open("../field/test_data/hello.b98") + require.NoError(t, err, "Failed to open file") + f, err := field.Load(file) + p.Step(*f) + ss := NewStackStack() + ss.head.Push(-5) + ss.Begin(p) + require.Equal(t, expected, ss) + x, y := p.GetStorageOffset() + require.Equal(t, 2, x) + require.Equal(t, 0, y) + }) + t.Run("ask to copy more than we have", func(t *testing.T) { + expected := NewStackStack() + expected.head = &Stack{size: 34, height: 34, data: make([]int, 34), next: expected.head} + expected.head.data[33] = 18 + expected.head.next.Push(18) + expected.head.next.Push(2) + expected.head.next.Push(3) + expected.height++ + p := pointer.NewPointer() + p.SetStorageOffset(2, 3) + file, err := os.Open("../field/test_data/hello.b98") + require.NoError(t, err, "Failed to open file") + f, err := field.Load(file) + p.Step(*f) + ss := NewStackStack() + ss.head.Push(18) + ss.head.Push(34) + ss.Begin(p) + require.Equal(t, expected, ss) + x, y := p.GetStorageOffset() + require.Equal(t, 2, x) + require.Equal(t, 0, y) + }) + t.Run("normal", func(t *testing.T) { + expected := NewStackStack() + expected.head = &Stack{size: 4, height: 4, data: []int{12, 14, -2, 5}, next: expected.head} + expected.head.next.Push(7) + expected.head.next.Push(12) + expected.head.next.Push(14) + expected.head.next.Push(-2) + expected.head.next.Push(5) + expected.head.next.Push(36) + expected.head.next.Push(42) + expected.height++ + p := pointer.NewPointer() + p.SetStorageOffset(36, 42) + ss := NewStackStack() + ss.head.Push(7) + ss.head.Push(12) + ss.head.Push(14) + ss.head.Push(-2) + ss.head.Push(5) + ss.head.Push(4) + ss.Begin(p) + require.Equal(t, expected, ss) + }) +} |