Separate parsing status from actual errors

This commit is contained in:
2024-09-11 10:25:45 -06:00
parent c1eae9fa34
commit d0460e71e3
3 changed files with 140 additions and 109 deletions

View File

@ -7,6 +7,7 @@ import (
"git.codemonkeysoftware.net/b/gigaparsec"
"git.codemonkeysoftware.net/b/gigaparsec/cursor"
"github.com/shoenig/test"
"github.com/shoenig/test/must"
"pgregory.net/rapid"
)
@ -23,17 +24,17 @@ func hasPrefix(prefix []byte) func([]byte) bool {
}
func TestSlice(t *testing.T) {
assertParseFails := func(t rapid.TB, input []byte, p gigaparsec.Parser[byte, []byte]) (parseErr gigaparsec.ParseError) {
assertParseFails := func(t rapid.TB, input []byte, p gigaparsec.Parser[byte, []byte]) {
t.Helper()
start := gigaparsec.MakeState(cursor.NewSlice(input))
consumed, result, err := p(start)
test.ErrorAs(t, err, &parseErr, test.Sprint("expected ParseError"))
test.False(t, consumed, test.Sprint("expected consumed to be false"))
test.SliceEmpty(t, result.Value, test.Sprint("expected result value to be empty"))
result, err := p(start)
must.NoError(t, err)
failed, consumed, _ := result.Failed()
test.True(t, failed)
test.False(t, consumed)
if t.Failed() {
t.FailNow()
}
return parseErr
}
t.Run("fails with wrong contents", rapid.MakeCheck(func(t *rapid.T) {
@ -55,11 +56,13 @@ func TestSlice(t *testing.T) {
s := input[:sLen]
start := gigaparsec.MakeState(cursor.NewSlice(input))
consumed, result, err := gigaparsec.Slice(s)(start)
test.NoError(t, err)
test.True(t, consumed, test.Sprint("expected consumed to be true"))
test.SliceEqOp(t, s, result.Value)
test.EqOp(t, uint64(len(s)), result.State.Pos())
result, err := gigaparsec.Slice(s)(start)
must.NoError(t, err)
succeeded, consumed, value, next, _ := result.Succeeded()
test.True(t, succeeded)
test.True(t, consumed)
test.SliceEqOp(t, s, value)
test.EqOp(t, uint64(len(s)), next.Pos())
}))
}