From 035af4d873d3de0685ab281be952e346547e40fd Mon Sep 17 00:00:00 2001 From: Adam Scarr Date: Tue, 8 Aug 2017 20:34:21 +1000 Subject: Add NumberLit parser and complete json spec --- literals_test.go | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 99 insertions(+), 6 deletions(-) (limited to 'literals_test.go') diff --git a/literals_test.go b/literals_test.go index 15b971d..83e087b 100644 --- a/literals_test.go +++ b/literals_test.go @@ -6,23 +6,23 @@ import ( "github.com/stretchr/testify/require" ) -func TestString(t *testing.T) { +func TestStringLit(t *testing.T) { parser := StringLit(`"'`) t.Run("test double match", func(t *testing.T) { result, p := runParser(`"hello"`, parser) - require.Equal(t, `hello`, result.Token) + require.Equal(t, `hello`, result.Result) require.Equal(t, "", p.Get()) }) t.Run("test single match", func(t *testing.T) { result, p := runParser(`"hello"`, parser) - require.Equal(t, `hello`, result.Token) + require.Equal(t, `hello`, result.Result) require.Equal(t, "", p.Get()) }) t.Run("test nested quotes", func(t *testing.T) { result, p := runParser(`"hello 'world'"`, parser) - require.Equal(t, `hello 'world'`, result.Token) + require.Equal(t, `hello 'world'`, result.Result) require.Equal(t, "", p.Get()) }) @@ -52,14 +52,14 @@ func TestString(t *testing.T) { t.Run("test escaping", func(t *testing.T) { result, p := runParser(`"hello \"world\""`, parser) - require.Equal(t, `hello "world"`, result.Token) + require.Equal(t, `hello "world"`, result.Result) require.Equal(t, ``, p.Get()) }) t.Run("test escaped unicode", func(t *testing.T) { result, p := runParser(`"hello \ubeef cake"`, parser) require.Equal(t, "", p.Error.Expected) - require.Equal(t, "hello \uBEEF cake", result.Token) + require.Equal(t, "hello \uBEEF cake", result.Result) require.Equal(t, ``, p.Get()) }) @@ -75,3 +75,96 @@ func TestString(t *testing.T) { require.Equal(t, 0, p.Pos) }) } + +func TestUnhex(t *testing.T) { + tests := map[int64]string{ + 0xF: "F", + 0x5: "5", + 0xFF: "FF", + 0xFFF: "FFF", + 0xA4B: "a4b", + 0xFFFF: "FFFF", + 0xBEEFCAFE: "beeFCAfe", + } + for expected, input := range tests { + t.Run(input, func(t *testing.T) { + r, ok := unhex(input) + require.True(t, ok) + require.EqualValues(t, expected, r) + }) + } + + t.Run("Fails on non hex chars", func(t *testing.T) { + _, ok := unhex("hello") + require.False(t, ok) + }) +} + +func TestNumberLit(t *testing.T) { + parser := NumberLit() + t.Run("test int", func(t *testing.T) { + result, p := runParser("1234", parser) + require.Equal(t, int64(1234), result.Result) + require.Equal(t, "", p.Get()) + }) + + t.Run("test float", func(t *testing.T) { + result, p := runParser("12.34", parser) + require.Equal(t, 12.34, result.Result) + require.Equal(t, "", p.Get()) + }) + + t.Run("test negative float", func(t *testing.T) { + result, p := runParser("-12.34", parser) + require.Equal(t, -12.34, result.Result) + require.Equal(t, "", p.Get()) + }) + + t.Run("without leading zero", func(t *testing.T) { + result, p := runParser("-.34", parser) + require.Equal(t, -.34, result.Result) + require.Equal(t, "", p.Get()) + }) + + t.Run("scientific notation", func(t *testing.T) { + result, p := runParser("12.34e3", parser) + require.Equal(t, 12.34e3, result.Result) + require.Equal(t, "", p.Get()) + }) + + t.Run("scientific notation without decimal", func(t *testing.T) { + result, p := runParser("34e3", parser) + require.Equal(t, 34e3, result.Result) + require.Equal(t, "", p.Get()) + }) + + t.Run("scientific notation negative power", func(t *testing.T) { + result, p := runParser("34e-3", parser) + require.Equal(t, 34e-3, result.Result) + require.Equal(t, "", p.Get()) + }) + + t.Run("negative scientific notation negative power", func(t *testing.T) { + result, p := runParser("-.34e-3", parser) + require.Equal(t, -.34e-3, result.Result) + require.Equal(t, "", p.Get()) + }) + + t.Run("partial match", func(t *testing.T) { + result, p := runParser("-1.34foo", parser) + require.Equal(t, -1.34, result.Result) + require.Equal(t, "foo", p.Get()) + }) + + t.Run("non matching string", func(t *testing.T) { + _, p := runParser("foo", parser) + require.Equal(t, "offset 0: Expected number", p.Error.Error()) + require.Equal(t, 0, p.Pos) + }) + + t.Run("invalid number", func(t *testing.T) { + _, p := runParser("-.", parser) + require.Equal(t, "offset 0: Expected number", p.Error.Error()) + require.Equal(t, 0, p.Pos) + }) +} -- cgit v1.2.3