diff options
author | Adam Scarr <adam@vektah.net> | 2017-08-13 15:28:43 +1000 |
---|---|---|
committer | Adam Scarr <adam@vektah.net> | 2017-08-13 15:28:43 +1000 |
commit | 79b7cc082cac1904b87bbe7996df5a8824f7c2d8 (patch) | |
tree | 6f97bfaf20629a77fc2a847fa82b0bcb5a5cc2af /combinator_test.go | |
parent | e30b92276464f1a7cbd9e3772f315c990fac2073 (diff) |
Add one byte prediction to Any()
Diffstat (limited to 'combinator_test.go')
-rw-r--r-- | combinator_test.go | 35 |
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) { |