1 package parser
2
3 import (
4 "testing"
5
6 "github.com/stretchr/testify/require"
7 "github.com/vektah/gqlparser/ast"
8 "github.com/vektah/gqlparser/lexer"
9 )
10
11 func TestParserUtils(t *testing.T) {
12 t.Run("test lookaround", func(t *testing.T) {
13 p := newParser("asdf 1.0 turtles")
14 require.Equal(t, "asdf", p.peek().Value)
15 require.Equal(t, "asdf", p.expectKeyword("asdf").Value)
16 require.Equal(t, "asdf", p.prev.Value)
17 require.Nil(t, p.err)
18
19 require.Equal(t, "1.0", p.peek().Value)
20 require.Equal(t, "1.0", p.peek().Value)
21 require.Equal(t, "1.0", p.expect(lexer.Float).Value)
22 require.Equal(t, "1.0", p.prev.Value)
23 require.Nil(t, p.err)
24
25 require.True(t, p.skip(lexer.Name))
26 require.Nil(t, p.err)
27
28 require.Equal(t, lexer.EOF, p.peek().Kind)
29 require.Nil(t, p.err)
30 })
31
32 t.Run("test many", func(t *testing.T) {
33 t.Run("can read array", func(t *testing.T) {
34 p := newParser("[a b c d]")
35
36 var arr []string
37 p.many(lexer.BracketL, lexer.BracketR, func() {
38 arr = append(arr, p.next().Value)
39 })
40 require.Nil(t, p.err)
41 require.Equal(t, []string{"a", "b", "c", "d"}, arr)
42
43 require.Equal(t, lexer.EOF, p.peek().Kind)
44 require.Nil(t, p.err)
45 })
46
47 t.Run("return if open is not found", func(t *testing.T) {
48 p := newParser("turtles are happy")
49
50 p.many(lexer.BracketL, lexer.BracketR, func() {
51 t.Error("cb should not be called")
52 })
53 require.Nil(t, p.err)
54 require.Equal(t, "turtles", p.next().Value)
55 })
56
57 t.Run("will stop on error", func(t *testing.T) {
58 p := newParser("[a b c d]")
59
60 var arr []string
61 p.many(lexer.BracketL, lexer.BracketR, func() {
62 arr = append(arr, p.next().Value)
63 if len(arr) == 2 {
64 p.error(p.peek(), "boom")
65 }
66 })
67 require.EqualError(t, p.err, "input.graphql:1: boom")
68 require.Equal(t, []string{"a", "b"}, arr)
69 })
70 })
71
72 t.Run("test some", func(t *testing.T) {
73 t.Run("can read array", func(t *testing.T) {
74 p := newParser("[a b c d]")
75
76 var arr []string
77 p.some(lexer.BracketL, lexer.BracketR, func() {
78 arr = append(arr, p.next().Value)
79 })
80 require.Nil(t, p.err)
81 require.Equal(t, []string{"a", "b", "c", "d"}, arr)
82
83 require.Equal(t, lexer.EOF, p.peek().Kind)
84 require.Nil(t, p.err)
85 })
86
87 t.Run("can't read empty array", func(t *testing.T) {
88 p := newParser("[]")
89
90 var arr []string
91 p.some(lexer.BracketL, lexer.BracketR, func() {
92 arr = append(arr, p.next().Value)
93 })
94 require.EqualError(t, p.err, "input.graphql:1: expected at least one definition, found ]")
95 require.Equal(t, []string(nil), arr)
96 require.NotEqual(t, lexer.EOF, p.peek().Kind)
97 })
98
99 t.Run("return if open is not found", func(t *testing.T) {
100 p := newParser("turtles are happy")
101
102 p.some(lexer.BracketL, lexer.BracketR, func() {
103 t.Error("cb should not be called")
104 })
105 require.Nil(t, p.err)
106 require.Equal(t, "turtles", p.next().Value)
107 })
108
109 t.Run("will stop on error", func(t *testing.T) {
110 p := newParser("[a b c d]")
111
112 var arr []string
113 p.some(lexer.BracketL, lexer.BracketR, func() {
114 arr = append(arr, p.next().Value)
115 if len(arr) == 2 {
116 p.error(p.peek(), "boom")
117 }
118 })
119 require.EqualError(t, p.err, "input.graphql:1: boom")
120 require.Equal(t, []string{"a", "b"}, arr)
121 })
122 })
123
124 t.Run("test errors", func(t *testing.T) {
125 p := newParser("foo bar")
126
127 p.next()
128 p.error(p.peek(), "test error")
129 p.error(p.peek(), "secondary error")
130
131 require.EqualError(t, p.err, "input.graphql:1: test error")
132
133 require.Equal(t, "foo", p.peek().Value)
134 require.Equal(t, "foo", p.next().Value)
135 require.Equal(t, "foo", p.peek().Value)
136 })
137
138 t.Run("unexpected error", func(t *testing.T) {
139 p := newParser("1 3")
140 p.unexpectedError()
141 require.EqualError(t, p.err, "input.graphql:1: Unexpected Int \"1\"")
142 })
143
144 t.Run("unexpected error", func(t *testing.T) {
145 p := newParser("1 3")
146 p.unexpectedToken(p.next())
147 require.EqualError(t, p.err, "input.graphql:1: Unexpected Int \"1\"")
148 })
149
150 t.Run("expect error", func(t *testing.T) {
151 p := newParser("foo bar")
152 p.expect(lexer.Float)
153
154 require.EqualError(t, p.err, "input.graphql:1: Expected Float, found Name")
155 })
156
157 t.Run("expectKeyword error", func(t *testing.T) {
158 p := newParser("foo bar")
159 p.expectKeyword("baz")
160
161 require.EqualError(t, p.err, "input.graphql:1: Expected \"baz\", found Name \"foo\"")
162 })
163 }
164
165 func newParser(input string) parser {
166 return parser{lexer: lexer.New(&ast.Source{Input: input, Name: "input.graphql"})}
167 }
168
View as plain text