Wrote some Slice tests
This commit is contained in:
		@@ -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)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user