From ed73caf599f51773391811971622a1aa97952e60 Mon Sep 17 00:00:00 2001 From: Liam White Date: Fri, 27 Dec 2024 03:09:38 -0800 Subject: [PATCH] Improve peek and add input tests (#9) --- core/input.go | 4 +- core/input_test.go | 99 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 core/input_test.go diff --git a/core/input.go b/core/input.go index 1c47f38..5eef279 100644 --- a/core/input.go +++ b/core/input.go @@ -41,11 +41,11 @@ func NewInput(s string) Input { } func (i *input) Peek(n int) (s string, ok bool) { - if i.index+n > len(i.s) { + if i.index+n > len(i.s) || i.index+n < 0 { return } if n < 0 { - return i.s[i.index:], true + return i.s[i.index+n : i.index], true } return i.s[i.index : i.index+n], true } diff --git a/core/input_test.go b/core/input_test.go new file mode 100644 index 0000000..7c82240 --- /dev/null +++ b/core/input_test.go @@ -0,0 +1,99 @@ +// Copyright 2024 Liam White +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package core_test + +import ( + "testing" + + . "github.com/liamawhite/parse/core" + "github.com/stretchr/testify/assert" +) + +const input = `Some words +and some more words +and even more words` + +func TestInput(t *testing.T) { + i := NewInput(input) + start := i.Checkpoint() + + t.Run("Peek forward", func(t *testing.T) { + s, ok := i.Peek(10) + assert.True(t, ok) + assert.Equal(t, "Some words", s) + }) + t.Run("Peek forward single", func(t *testing.T) { + s, ok := i.Peek(1) + assert.True(t, ok) + assert.Equal(t, "S", s) + }) + t.Run("Peek zero", func(t *testing.T) { + s, ok := i.Peek(0) + assert.True(t, ok) + assert.Equal(t, "", s) + }) + t.Run("Peek backward single", func(t *testing.T) { + i.Take(1) + s, ok := i.Peek(-1) + assert.True(t, ok) + assert.Equal(t, "S", s) + i.Restore(start) + }) + t.Run("Peek backward", func(t *testing.T) { + i.Take(10) // need to move the index so we can peek backwards + s, ok := i.Peek(-10) + assert.True(t, ok) + assert.Equal(t, "Some words", s) + i.Restore(start) + }) + t.Run("Peek backward beyond start", func(t *testing.T) { + s, ok := i.Peek(-5) + assert.False(t, ok) + assert.Equal(t, "", s) + }) + t.Run("Peek forward beyond end", func(t *testing.T) { + s, ok := i.Peek(100) + assert.False(t, ok) + assert.Equal(t, "", s) + }) + t.Run("Take forward", func(t *testing.T) { + s, ok := i.Take(10) + assert.True(t, ok) + assert.Equal(t, "Some words", s) + i.Restore(start) + }) + t.Run("Take forward single", func(t *testing.T) { + s, ok := i.Take(1) + assert.True(t, ok) + assert.Equal(t, "S", s) + i.Restore(start) + }) + t.Run("Take forward zero", func(t *testing.T) { + s, ok := i.Take(0) + assert.True(t, ok) + assert.Equal(t, "", s) + }) + t.Run("Take forward beyond end", func(t *testing.T) { + s, ok := i.Take(100) + assert.False(t, ok) + assert.Equal(t, "", s) + }) + t.Run("Take backward fails", func(t *testing.T) { + s, ok := i.Take(-1) + assert.False(t, ok) + assert.Equal(t, "", s) + }) + +}