summaryrefslogtreecommitdiff
path: root/combinator_test.go
diff options
context:
space:
mode:
authorAdam Scarr <adam@vektah.net>2017-08-13 15:28:43 +1000
committerAdam Scarr <adam@vektah.net>2017-08-13 15:28:43 +1000
commit79b7cc082cac1904b87bbe7996df5a8824f7c2d8 (patch)
tree6f97bfaf20629a77fc2a847fa82b0bcb5a5cc2af /combinator_test.go
parente30b92276464f1a7cbd9e3772f315c990fac2073 (diff)
Add one byte prediction to Any()
Diffstat (limited to 'combinator_test.go')
-rw-r--r--combinator_test.go35
1 files changed, 35 insertions, 0 deletions
diff --git a/combinator_test.go b/combinator_test.go
index 50b7010..1c95eba 100644
--- a/combinator_test.go
+++ b/combinator_test.go
@@ -61,6 +61,41 @@ func TestAny(t *testing.T) {
require.Equal(t, Result{}, node)
require.Equal(t, 0, p2.Pos)
})
+
+ t.Run("branch prediction", func(t *testing.T) {
+ p := Any("hello", Seq("{", Cut(), "world", "}"), Seq("[", Cut(), "a", "]"))
+ // warm up the predictor
+ _, _ = Run(p, "hello")
+ _, _ = Run(p, "{world}")
+
+ t.Run("matches", func(t *testing.T) {
+ node, ps := runParser("hello world!", p)
+ require.Equal(t, "hello", node.Token)
+ require.Equal(t, 5, ps.Pos)
+ })
+
+ t.Run("errors", func(t *testing.T) {
+ _, ps := runParser("help world!", p)
+ require.Equal(t, "offset 0: expected [", ps.Error.Error())
+ require.Equal(t, 0, ps.Error.Pos())
+ require.Equal(t, 0, ps.Pos)
+ })
+
+ t.Run("errors with cuts", func(t *testing.T) {
+ _, ps := runParser("{world", p)
+ require.Equal(t, "offset 6: expected }", ps.Error.Error())
+ require.Equal(t, 6, ps.Error.Pos())
+ require.Equal(t, 0, ps.Pos)
+ })
+
+ t.Run("misprededicted cut", func(t *testing.T) {
+ // This should probably only happen when the predictor is cold
+ _, ps := runParser("[a", p)
+ require.Equal(t, "offset 2: expected ]", ps.Error.Error())
+ require.Equal(t, 2, ps.Error.Pos())
+ require.Equal(t, 0, ps.Pos)
+ })
+ })
}
func TestSome(t *testing.T) {