Wrote some Slice tests
This commit is contained in:
parent
727426d704
commit
ef74691415
@ -48,6 +48,13 @@ func (s State[T]) Pos() uint64 {
|
|||||||
return s.cursor.Pos()
|
return s.cursor.Pos()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Parse[In, Out any](p Parser[In, Out], c cursor.Cursor[In]) (result Out, err error) {
|
||||||
|
st := State[In]{cursor: c}
|
||||||
|
var reply Result[In, Out]
|
||||||
|
_, reply, err = p(st)
|
||||||
|
return reply.Value, err
|
||||||
|
}
|
||||||
|
|
||||||
type Parser[In, Out any] func(State[In]) (consumed bool, reply Result[In, Out], err error)
|
type Parser[In, Out any] func(State[In]) (consumed bool, reply Result[In, Out], err error)
|
||||||
|
|
||||||
func Return[In, Out any](value Out) Parser[In, Out] {
|
func Return[In, Out any](value Out) Parser[In, Out] {
|
||||||
|
2
go.mod
2
go.mod
@ -8,3 +8,5 @@ require (
|
|||||||
)
|
)
|
||||||
|
|
||||||
require github.com/google/go-cmp v0.6.0 // indirect
|
require github.com/google/go-cmp v0.6.0 // indirect
|
||||||
|
|
||||||
|
replace github.com/shoenig/test v1.10.0 => ../shoenig-test
|
||||||
|
52
parser_test.go
Normal file
52
parser_test.go
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
package gigaparsec_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"git.codemonkeysoftware.net/b/gigaparsec"
|
||||||
|
"git.codemonkeysoftware.net/b/gigaparsec/cursor"
|
||||||
|
"github.com/shoenig/test"
|
||||||
|
"pgregory.net/rapid"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Todo(t *testing.T) {
|
||||||
|
t.Errorf("TODO")
|
||||||
|
}
|
||||||
|
|
||||||
|
func notP[T any](pred func(T) bool) func(T) bool {
|
||||||
|
return func(x T) bool { return !pred(x) }
|
||||||
|
}
|
||||||
|
|
||||||
|
func hasPrefix(prefix []byte) func([]byte) bool {
|
||||||
|
return func(b []byte) bool { return bytes.HasPrefix(b, prefix) }
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSlice(t *testing.T) {
|
||||||
|
t.Run("fails with wrong contents", rapid.MakeCheck(func(t *rapid.T) {
|
||||||
|
s := rapid.SliceOfN(rapid.Byte(), 1, -1).Draw(t, "s")
|
||||||
|
input := rapid.SliceOfN(rapid.Byte(), len(s), -1).
|
||||||
|
Filter(notP(hasPrefix(s))).Draw(t, "input")
|
||||||
|
out, err := gigaparsec.Parse(gigaparsec.Slice(s), cursor.NewSlice(input))
|
||||||
|
test.ErrorAs(t, err, &gigaparsec.ParseError{})
|
||||||
|
test.SliceEmpty(t, out)
|
||||||
|
}))
|
||||||
|
t.Run("fails at end of input", rapid.MakeCheck(func(t *rapid.T) {
|
||||||
|
s := rapid.SliceOfN(rapid.Byte(), 1, -1).Draw(t, "s")
|
||||||
|
inputLen := rapid.IntRange(0, len(s)-1).Draw(t, "inputLen")
|
||||||
|
input := s[:inputLen]
|
||||||
|
out, err := gigaparsec.Parse(gigaparsec.Slice(s), cursor.NewSlice(input))
|
||||||
|
test.ErrorAs(t, err, &gigaparsec.ParseError{})
|
||||||
|
test.SliceEmpty(t, out)
|
||||||
|
}))
|
||||||
|
t.Run("fails when read fails", Todo)
|
||||||
|
t.Run("succeeds when contents match", rapid.MakeCheck(func(t *rapid.T) {
|
||||||
|
input := rapid.SliceOfN(rapid.Byte(), 1, -1).Draw(t, "input")
|
||||||
|
sLen := rapid.IntRange(0, len(input)).Draw(t, "sLen")
|
||||||
|
s := input[:sLen]
|
||||||
|
out, err := gigaparsec.Parse(gigaparsec.Slice(s), cursor.NewSlice(input))
|
||||||
|
test.NoError(t, err)
|
||||||
|
test.SliceEqOp(t, s, out)
|
||||||
|
}))
|
||||||
|
t.Run("next state has correct position", Todo)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user