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