summaryrefslogtreecommitdiff
path: root/pointer_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'pointer_test.go')
-rw-r--r--pointer_test.go86
1 files changed, 86 insertions, 0 deletions
diff --git a/pointer_test.go b/pointer_test.go
new file mode 100644
index 0000000..e8076d7
--- /dev/null
+++ b/pointer_test.go
@@ -0,0 +1,86 @@
+package parsec
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/require"
+)
+
+func TestPointer(t *testing.T) {
+ p := Pointer{"fooo", 0}
+
+ t.Run("Advances", func(t *testing.T) {
+ p2 := p.Advance(2)
+ require.Equal(t, Pointer{"fooo", 2}, p2)
+ require.Equal(t, Pointer{"fooo", 0}, p)
+ require.Equal(t, Pointer{"fooo", 3}, p2.Advance(1))
+ })
+
+ t.Run("Get", func(t *testing.T) {
+ require.Equal(t, "fooo", p.Get())
+ require.Equal(t, "ooo", p.Advance(1).Get())
+ })
+
+ t.Run("Remaining", func(t *testing.T) {
+ require.Equal(t, 4, p.Remaining())
+ require.Equal(t, 0, p.Advance(4).Remaining())
+ require.Equal(t, 0, p.Advance(10).Remaining())
+ })
+
+ t.Run("Next takes one character", func(t *testing.T) {
+ s, p2 := p.Next()
+ require.Equal(t, p.Advance(1), p2)
+ require.Equal(t, 'f', s)
+ })
+
+ t.Run("Next handles EOF", func(t *testing.T) {
+ s, p2 := p.Advance(5).Next()
+ require.Equal(t, p.Advance(5), p2)
+ require.Equal(t, EOF, s)
+ })
+
+ t.Run("HasPrefix", func(t *testing.T) {
+ require.True(t, p.HasPrefix("fo"))
+ require.False(t, p.HasPrefix("ooo"))
+ require.True(t, p.Advance(1).HasPrefix("ooo"))
+ require.False(t, p.Advance(1).HasPrefix("oooo"))
+ })
+
+ t.Run("Accept", func(t *testing.T) {
+ s, p2 := p.Accept("abcdef")
+ require.Equal(t, "f", s)
+ require.Equal(t, p.Advance(1), p2)
+
+ s, p2 = p.Accept("ooooo")
+ require.Equal(t, "", s)
+ require.Equal(t, p.Advance(0), p2)
+
+ s, p2 = p.Advance(4).Accept("ooooo")
+ require.Equal(t, "", s)
+ require.Equal(t, p.Advance(4), p2)
+ })
+
+ t.Run("AcceptRun", func(t *testing.T) {
+ s, p2 := p.AcceptRun("f")
+ require.Equal(t, "f", s)
+ require.Equal(t, p.Advance(1), p2)
+
+ s, p3 := p.AcceptRun("fo")
+ require.Equal(t, "fooo", s)
+ require.Equal(t, p.Advance(4), p3)
+
+ s, p4 := p3.AcceptRun("fo")
+ require.Equal(t, "", s)
+ require.Equal(t, p.Advance(4), p4)
+ })
+
+ t.Run("AcceptUntil", func(t *testing.T) {
+ s, p2 := p.AcceptUntil("o")
+ require.Equal(t, "f", s)
+ require.Equal(t, p.Advance(1), p2)
+
+ s, p3 := p2.AcceptRun("o")
+ require.Equal(t, "ooo", s)
+ require.Equal(t, p.Advance(4), p3)
+ })
+}