treerack/context_test.go

99 lines
1.6 KiB
Go
Raw Normal View History

2017-11-05 03:28:36 +01:00
package treerack
import (
"bytes"
"errors"
"io"
"testing"
)
type failingReader struct {
input []byte
failIndex int
index int
}
func (fr *failingReader) Read(p []byte) (int, error) {
if fr.index == fr.failIndex {
return 0, errors.New("test error")
}
if len(fr.input) <= fr.index {
return 0, io.EOF
}
available := fr.input[fr.index:]
copy(p[:1], available)
fr.index++
return 1, nil
}
func TestFailingRead(t *testing.T) {
s := &Syntax{}
if err := s.AnyChar("A", None); err != nil {
t.Error(err)
return
}
t.Run("reader error", func(t *testing.T) {
r := &failingReader{}
if _, err := s.Parse(r); err == nil {
t.Error("failed to fail")
}
})
t.Run("invalid unicode", func(t *testing.T) {
r := bytes.NewBuffer([]byte{255, 255})
if _, err := s.Parse(r); err == nil {
t.Error("failed to fail")
}
})
t.Run("fail during finalize", func(t *testing.T) {
r := &failingReader{
input: []byte("aa"),
failIndex: 1,
}
s = &Syntax{}
if err := s.Class("a", Root, false, []rune("a"), nil); err != nil {
t.Error(err)
}
if _, err := s.Parse(r); err == nil {
t.Error("failed to fail")
}
})
}
func TestPendingWithinCap(t *testing.T) {
c := newContext(bytes.NewBuffer(nil))
t.Run("parse", func(t *testing.T) {
for i := 0; i < 16; i++ {
c.markPending(0, i)
}
for i := 0; i < 16; i++ {
if !c.pending(0, i) {
t.Error("failed to mark pending")
}
}
})
c.resetPending()
t.Run("parse", func(t *testing.T) {
for i := 0; i < 16; i++ {
c.markBuildPending(0, i, 0)
}
for i := 0; i < 16; i++ {
if !c.buildPending(0, i, 0) {
t.Error("failed to mark build pending")
}
}
})
}