Began implementing the Instruction Pointer
This commit is contained in:
parent
ae7f4d5acf
commit
46170dd5b7
3 changed files with 72 additions and 0 deletions
10
pkg/pointer/delta.go
Normal file
10
pkg/pointer/delta.go
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
package pointer
|
||||||
|
|
||||||
|
type Delta struct {
|
||||||
|
x int
|
||||||
|
y int
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewDelta(x, y int) *Delta {
|
||||||
|
return &Delta{x: x, y: y}
|
||||||
|
}
|
21
pkg/pointer/pointer.go
Normal file
21
pkg/pointer/pointer.go
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
package pointer
|
||||||
|
|
||||||
|
import "git.adyxax.org/adyxax/gofunge/pkg/field"
|
||||||
|
|
||||||
|
type Pointer struct {
|
||||||
|
x int
|
||||||
|
y int
|
||||||
|
delta *Delta
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewPointer() *Pointer {
|
||||||
|
return &Pointer{delta: NewDelta(1, 0)}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p Pointer) ForkPointer() *Pointer {
|
||||||
|
return &p // p is already a copy
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Pointer) Step(f field.Field) {
|
||||||
|
p.x, p.y = f.Step(p.x, p.y, p.delta.x, p.delta.y)
|
||||||
|
}
|
41
pkg/pointer/pointer_test.go
Normal file
41
pkg/pointer/pointer_test.go
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
package pointer
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"git.adyxax.org/adyxax/gofunge/pkg/field"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestNewPointer(t *testing.T) {
|
||||||
|
require.Equal(t, NewPointer(), &Pointer{delta: &Delta{1, 0}})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestForkPointer(t *testing.T) {
|
||||||
|
file, err := os.Open("../field/test_data/hello.b98")
|
||||||
|
require.NoError(t, err, "Failed to open file")
|
||||||
|
defer file.Close()
|
||||||
|
f, err := field.Load(file)
|
||||||
|
require.NoError(t, err)
|
||||||
|
p := NewPointer()
|
||||||
|
p2 := p.ForkPointer()
|
||||||
|
// We check that p2 is a real copy
|
||||||
|
p.Step(*f)
|
||||||
|
p2.Step(*f)
|
||||||
|
require.Equal(t, p, &Pointer{x: 1, y: 0, delta: &Delta{1, 0}})
|
||||||
|
require.Equal(t, p2, &Pointer{x: 1, y: 0, delta: &Delta{1, 0}})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestStep(t *testing.T) { // Step is thoroughly tested in the field package
|
||||||
|
defaultPointer := NewPointer()
|
||||||
|
// File of one char
|
||||||
|
file, err := os.Open("../field/test_data/minimal.b98")
|
||||||
|
require.NoError(t, err, "Failed to open file")
|
||||||
|
defer file.Close()
|
||||||
|
f, err := field.Load(file)
|
||||||
|
require.NoError(t, err)
|
||||||
|
p := NewPointer()
|
||||||
|
p.Step(*f)
|
||||||
|
require.Equal(t, defaultPointer, p)
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue