1 #include "ccan/graphql/graphql.h"
2 #include "ccan/str/str.h"
6 * The idea here is to run each test case silently, and if any test point
7 * fails, that test case is re-run verbosely to pinpoint the failure.
9 * RUN macros run a whole test case function.
11 * Different TEST_xxxx macros are provided for different test point types as
14 * TEST_CONT - Test and continue testing regardless of failure (the failure
15 * will still be printed).
16 * TEST_ABRT - Test and abort the test case, used when testing pointer
17 * validity to avoid subsequent dereference errors.
18 * TEST_STRG - Test a string value, which includes the convenience of testing
22 #define RUN(test) { prev_fail = fail; test(source); if (fail != prev_fail) { mute = false; test(source); mute = true; } }
23 #define RUN1(test,arg) { prev_fail = fail; test(source,arg); if (fail != prev_fail) { mute = false; test(source,arg); mute = true; } }
24 #define RUN2(test,arg1,arg2) { prev_fail = fail; test(source,arg1,arg2); if (fail != prev_fail) { mute = false; test(source,arg1,arg2); mute = true; } }
26 #define TEST_CONT(expr) { bool c = (expr); if (mute) c? pass++ : fail++; else printf("%s: %s\033[0m\n", c? "passed" : "\033[91mfailed", stringify(expr)); }
27 #define TEST_ABRT(expr) { bool c = (expr); if (mute) c? pass++ : fail++; else printf("%s: %s\033[0m\n", c? "passed" : "\033[91mfailed", stringify(expr)); if (!c) return; }
28 #define TEST_STRG(str,expr) { bool c = ((str) && streq((str),(expr))); if (mute) c? pass++ : fail++; else printf("%s: %s == %s\033[0m\n", c? "passed" : "\033[91mfailed", stringify(str), stringify(expr)); if (!c) return; }
30 // Global variables to track overall results.
31 int pass = 0, fail = 0;
35 int listlen(struct list_head *tokens) {
36 struct graphql_token *tok;
38 list_for_each(tokens, tok, list) {
44 /* Test case functions begin here, called by main().
45 * Note: Memory should be freed correctly in the success case, but if there
46 * are errors, all bets are off.
49 int check_example_3(const char *source) {
50 struct list_head *tokens;
51 struct graphql_token *tok;
54 if (!mute) printf("// Example No. 3\n");
57 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
58 TEST_ABRT(listlen(tokens) == 11);
59 tok = list_pop(tokens, struct graphql_token, list);
60 TEST_CONT(tok->token_type == '{');
61 TEST_CONT(tok->source_line == 1);
62 TEST_CONT(tok->source_column == 1);
63 TEST_CONT(tok->source_len == 1);
64 tok = list_pop(tokens, struct graphql_token, list);
65 TEST_CONT(tok->token_type == 'a');
66 TEST_STRG(tok->token_string, "user");
67 TEST_CONT(tok->source_line == 2);
68 TEST_CONT(tok->source_column == 3);
69 TEST_CONT(tok->source_len == 4);
70 tok = list_pop(tokens, struct graphql_token, list);
71 TEST_CONT(tok->token_type == '(');
72 TEST_CONT(tok->source_line == 2);
73 TEST_CONT(tok->source_column == 7);
74 TEST_CONT(tok->source_len == 1);
75 tok = list_pop(tokens, struct graphql_token, list);
76 TEST_CONT(tok->token_type == 'a');
77 TEST_STRG(tok->token_string, "id");
78 TEST_CONT(tok->source_line == 2);
79 TEST_CONT(tok->source_column == 8);
80 TEST_CONT(tok->source_len == 2);
81 tok = list_pop(tokens, struct graphql_token, list);
82 TEST_CONT(tok->token_type == ':');
83 TEST_CONT(tok->source_line == 2);
84 TEST_CONT(tok->source_column == 10);
85 TEST_CONT(tok->source_len == 1);
86 tok = list_pop(tokens, struct graphql_token, list);
87 TEST_CONT(tok->token_type == 'i');
88 TEST_STRG(tok->token_string, "4");
89 TEST_CONT(tok->source_line == 2);
90 TEST_CONT(tok->source_column == 12);
91 TEST_CONT(tok->source_len == 1);
92 tok = list_pop(tokens, struct graphql_token, list);
93 TEST_CONT(tok->token_type == ')');
94 TEST_CONT(tok->source_line == 2);
95 TEST_CONT(tok->source_column == 13);
96 TEST_CONT(tok->source_len == 1);
97 tok = list_pop(tokens, struct graphql_token, list);
98 TEST_CONT(tok->token_type == '{');
99 TEST_CONT(tok->source_line == 2);
100 TEST_CONT(tok->source_column == 15);
101 TEST_CONT(tok->source_len == 1);
102 tok = list_pop(tokens, struct graphql_token, list);
103 TEST_CONT(tok->token_type == 'a');
104 TEST_STRG(tok->token_string, "name");
105 TEST_CONT(tok->source_line == 3);
106 TEST_CONT(tok->source_column == 5);
107 TEST_CONT(tok->source_len == 4);
108 tok = list_pop(tokens, struct graphql_token, list);
109 TEST_CONT(tok->token_type == '}');
110 TEST_CONT(tok->source_line == 4);
111 TEST_CONT(tok->source_column == 3);
112 TEST_CONT(tok->source_len == 1);
113 tok = list_pop(tokens, struct graphql_token, list);
114 TEST_CONT(tok->token_type == '}');
115 TEST_CONT(tok->source_line == 5);
116 TEST_CONT(tok->source_column == 1);
117 TEST_CONT(tok->source_len == 1);
118 tok = list_pop(tokens, struct graphql_token, list);
119 TEST_CONT(tok == NULL);
120 tokens = tal_free(tokens);
123 struct graphql_executable_document *doc;
124 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
125 TEST_ABRT(graphql_parse(tokens, &doc) == NULL);
126 TEST_ABRT(doc != NULL);
127 TEST_ABRT(doc->first_def != NULL);
128 TEST_CONT(doc->first_def->next_def == NULL);
129 TEST_CONT(doc->first_def->frag_def == NULL);
130 TEST_ABRT(doc->first_def->op_def != NULL);
131 TEST_CONT(doc->first_def->op_def->op_type == NULL);
132 TEST_CONT(doc->first_def->op_def->op_name == NULL);
133 TEST_CONT(doc->first_def->op_def->vars == NULL);
134 TEST_CONT(doc->first_def->op_def->directives == NULL);
135 TEST_ABRT(doc->first_def->op_def->sel_set != NULL);
136 TEST_ABRT(doc->first_def->op_def->sel_set->first != NULL);
137 TEST_CONT(doc->first_def->op_def->sel_set->first->next == NULL);
138 TEST_CONT(doc->first_def->op_def->sel_set->first->frag_spread == NULL);
139 TEST_CONT(doc->first_def->op_def->sel_set->first->inline_frag == NULL);
140 TEST_ABRT(doc->first_def->op_def->sel_set->first->field != NULL);
141 TEST_CONT(doc->first_def->op_def->sel_set->first->field->alias == NULL);
142 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->name != NULL);
143 TEST_CONT(doc->first_def->op_def->sel_set->first->field->name->token_type == 'a');
144 TEST_STRG(doc->first_def->op_def->sel_set->first->field->name->token_string, "user");
145 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args != NULL);
146 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first != NULL);
147 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->next == NULL);
148 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->name != NULL);
149 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->name->token_type == 'a');
150 TEST_STRG(doc->first_def->op_def->sel_set->first->field->args->first->name->token_string, "id");
151 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val != NULL);
152 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val != NULL);
153 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val->val != NULL);
154 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val->val->token_type == 'i');
155 TEST_STRG(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val->val->token_string, "4");
156 TEST_CONT(doc->first_def->op_def->sel_set->first->field->directives == NULL);
157 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set != NULL);
158 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first != NULL);
159 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next == NULL);
160 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->frag_spread == NULL);
161 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->inline_frag == NULL);
162 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field != NULL);
163 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->alias == NULL);
164 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->args == NULL);
165 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->directives == NULL);
166 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set == NULL);
167 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->name != NULL);
168 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->name->token_type == 'a');
169 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->name->token_string, "name");
170 tokens = tal_free(tokens);
173 int check_example_5(char *source) {
174 struct list_head *tokens;
175 struct graphql_token *tok;
178 if (!mute) printf("// Example No. 5\n");
182 likeStory(storyID: 12345) {\n\
191 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
192 TEST_ABRT(listlen(tokens) == 15);
193 tok = list_pop(tokens, struct graphql_token, list);
194 TEST_CONT(tok->token_type == 'a');
195 TEST_STRG(tok->token_string, "mutation");
196 TEST_CONT(tok->source_line == 1);
197 TEST_CONT(tok->source_column == 1);
198 TEST_CONT(tok->source_len == 8);
199 tok = list_pop(tokens, struct graphql_token, list);
200 TEST_CONT(tok->token_type == '{');
201 tok = list_pop(tokens, struct graphql_token, list);
202 TEST_CONT(tok->token_type == 'a');
203 TEST_STRG(tok->token_string, "likeStory");
204 TEST_CONT(tok->source_line == 2);
205 TEST_CONT(tok->source_column == 3);
206 TEST_CONT(tok->source_len == 9);
207 tok = list_pop(tokens, struct graphql_token, list);
208 TEST_CONT(tok->token_type == '(');
209 tok = list_pop(tokens, struct graphql_token, list);
210 TEST_CONT(tok->token_type == 'a');
211 TEST_STRG(tok->token_string, "storyID");
212 TEST_CONT(tok->source_line == 2);
213 tok = list_pop(tokens, struct graphql_token, list);
214 TEST_CONT(tok->token_type == ':');
215 tok = list_pop(tokens, struct graphql_token, list);
216 TEST_CONT(tok->token_type == 'i');
217 TEST_STRG(tok->token_string, "12345");
218 TEST_CONT(tok->source_line == 2);
219 TEST_CONT(tok->source_column == 22);
220 TEST_CONT(tok->source_len == 5);
221 tok = list_pop(tokens, struct graphql_token, list);
222 TEST_CONT(tok->token_type == ')');
223 tok = list_pop(tokens, struct graphql_token, list);
224 TEST_CONT(tok->token_type == '{');
225 tok = list_pop(tokens, struct graphql_token, list);
226 TEST_CONT(tok->token_type == 'a');
227 TEST_STRG(tok->token_string, "story");
228 TEST_CONT(tok->source_line == 3);
229 tok = list_pop(tokens, struct graphql_token, list);
230 TEST_CONT(tok->token_type == '{');
231 tok = list_pop(tokens, struct graphql_token, list);
232 TEST_CONT(tok->token_type == 'a');
233 TEST_STRG(tok->token_string, "likeCount");
234 TEST_CONT(tok->source_line == 4);
235 tok = list_pop(tokens, struct graphql_token, list);
236 TEST_CONT(tok->token_type == '}');
237 tok = list_pop(tokens, struct graphql_token, list);
238 TEST_CONT(tok->token_type == '}');
239 tok = list_pop(tokens, struct graphql_token, list);
240 TEST_CONT(tok->token_type == '}');
241 tok = list_pop(tokens, struct graphql_token, list);
242 TEST_CONT(tok == NULL);
243 tokens = tal_free(tokens);
246 struct graphql_executable_document *doc;
247 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
248 TEST_ABRT(graphql_parse(tokens, &doc) == NULL);
249 TEST_ABRT(doc != NULL);
250 TEST_ABRT(doc->first_def != NULL);
251 TEST_CONT(doc->first_def->next_def == NULL);
252 TEST_CONT(doc->first_def->frag_def == NULL);
253 TEST_ABRT(doc->first_def->op_def != NULL);
254 TEST_ABRT(doc->first_def->op_def->op_type != NULL);
255 TEST_ABRT(doc->first_def->op_def->op_type->op_type != NULL);
256 TEST_CONT(doc->first_def->op_def->op_type->op_type->token_type == 'a');
257 TEST_STRG(doc->first_def->op_def->op_type->op_type->token_string, "mutation");
258 TEST_ABRT(doc->first_def->op_def->op_name == NULL);
259 TEST_CONT(doc->first_def->op_def->vars == NULL);
260 TEST_CONT(doc->first_def->op_def->directives == NULL);
261 TEST_ABRT(doc->first_def->op_def->sel_set != NULL);
262 TEST_ABRT(doc->first_def->op_def->sel_set->first != NULL);
263 TEST_CONT(doc->first_def->op_def->sel_set->first->next == NULL);
264 TEST_CONT(doc->first_def->op_def->sel_set->first->frag_spread == NULL);
265 TEST_CONT(doc->first_def->op_def->sel_set->first->inline_frag == NULL);
266 TEST_ABRT(doc->first_def->op_def->sel_set->first->field != NULL);
267 TEST_CONT(doc->first_def->op_def->sel_set->first->field->alias == NULL);
268 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->name != NULL);
269 TEST_CONT(doc->first_def->op_def->sel_set->first->field->name->token_type == 'a');
270 TEST_STRG(doc->first_def->op_def->sel_set->first->field->name->token_string, "likeStory");
271 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args != NULL);
272 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first != NULL);
273 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->next == NULL);
274 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->name != NULL);
275 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->name->token_type == 'a');
276 TEST_STRG(doc->first_def->op_def->sel_set->first->field->args->first->name->token_string, "storyID");
277 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val != NULL);
278 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val != NULL);
279 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val->val != NULL);
280 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val->val->token_type == 'i');
281 TEST_STRG(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val->val->token_string, "12345");
282 TEST_CONT(doc->first_def->op_def->sel_set->first->field->directives == NULL);
283 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set != NULL);
284 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first != NULL);
285 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next == NULL);
286 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->frag_spread == NULL);
287 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->inline_frag == NULL);
288 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field != NULL);
289 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->alias == NULL);
290 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->args == NULL);
291 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->directives == NULL);
292 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->name != NULL);
293 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->name->token_type == 'a');
294 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->name->token_string, "story");
295 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set != NULL);
296 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first != NULL);
297 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->next == NULL);
298 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->frag_spread == NULL);
299 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->inline_frag == NULL);
300 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->field != NULL);
301 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->field->alias == NULL);
302 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->field->args == NULL);
303 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->field->directives == NULL);
304 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->field->sel_set == NULL);
305 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->field->name != NULL);
306 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->field->name->token_type == 'a');
307 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->field->name->token_string, "likeCount");
308 tokens = tal_free(tokens);
311 int check_example_6(char *source) {
312 struct list_head *tokens;
313 struct graphql_token *tok;
316 if (!mute) printf("// Example No. 6\n");
325 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
326 TEST_ABRT(listlen(tokens) == 3);
327 tok = list_pop(tokens, struct graphql_token, list);
328 TEST_CONT(tok->token_type == '{');
329 tok = list_pop(tokens, struct graphql_token, list);
330 TEST_CONT(tok->token_type == 'a');
331 TEST_STRG(tok->token_string, "field");
332 TEST_CONT(tok->source_line == 2);
333 TEST_CONT(tok->source_column == 3);
334 TEST_CONT(tok->source_len == 5);
335 tok = list_pop(tokens, struct graphql_token, list);
336 TEST_CONT(tok->token_type == '}');
337 tok = list_pop(tokens, struct graphql_token, list);
338 TEST_CONT(tok == NULL);
339 tokens = tal_free(tokens);
342 struct graphql_executable_document *doc;
343 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
344 TEST_ABRT(graphql_parse(tokens, &doc) == NULL);
345 TEST_ABRT(doc != NULL);
346 TEST_ABRT(doc->first_def != NULL);
347 TEST_CONT(doc->first_def->next_def == NULL);
348 TEST_CONT(doc->first_def->frag_def == NULL);
349 TEST_ABRT(doc->first_def->op_def != NULL);
350 TEST_CONT(doc->first_def->op_def->op_type == NULL);
351 TEST_ABRT(doc->first_def->op_def->op_name == NULL);
352 TEST_CONT(doc->first_def->op_def->vars == NULL);
353 TEST_CONT(doc->first_def->op_def->directives == NULL);
354 TEST_ABRT(doc->first_def->op_def->sel_set != NULL);
355 TEST_ABRT(doc->first_def->op_def->sel_set->first != NULL);
356 TEST_CONT(doc->first_def->op_def->sel_set->first->next == NULL);
357 TEST_CONT(doc->first_def->op_def->sel_set->first->frag_spread == NULL);
358 TEST_CONT(doc->first_def->op_def->sel_set->first->inline_frag == NULL);
359 TEST_ABRT(doc->first_def->op_def->sel_set->first->field != NULL);
360 TEST_CONT(doc->first_def->op_def->sel_set->first->field->alias == NULL);
361 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->name != NULL);
362 TEST_CONT(doc->first_def->op_def->sel_set->first->field->name->token_type == 'a');
363 TEST_STRG(doc->first_def->op_def->sel_set->first->field->name->token_string, "field");
364 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args == NULL);
365 TEST_CONT(doc->first_def->op_def->sel_set->first->field->directives == NULL);
366 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set == NULL);
367 tokens = tal_free(tokens);
370 int check_example_7(char *source) {
371 struct list_head *tokens;
372 struct graphql_token *tok;
375 if (!mute) printf("// Example No. 7\n");
386 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
387 TEST_ABRT(listlen(tokens) == 5);
388 tok = list_pop(tokens, struct graphql_token, list);
389 TEST_CONT(tok->token_type == '{');
390 tok = list_pop(tokens, struct graphql_token, list);
391 TEST_CONT(tok->token_type == 'a');
392 TEST_STRG(tok->token_string, "id");
393 TEST_CONT(tok->source_line == 2);
394 TEST_CONT(tok->source_column == 3);
395 TEST_CONT(tok->source_len == 2);
396 tok = list_pop(tokens, struct graphql_token, list);
397 TEST_CONT(tok->token_type == 'a');
398 TEST_STRG(tok->token_string, "firstName");
399 TEST_CONT(tok->source_line == 3);
400 TEST_CONT(tok->source_column == 3);
401 TEST_CONT(tok->source_len == 9);
402 tok = list_pop(tokens, struct graphql_token, list);
403 TEST_CONT(tok->token_type == 'a');
404 TEST_STRG(tok->token_string, "lastName");
405 TEST_CONT(tok->source_line == 4);
406 TEST_CONT(tok->source_column == 3);
407 TEST_CONT(tok->source_len == 8);
408 tok = list_pop(tokens, struct graphql_token, list);
409 TEST_CONT(tok->token_type == '}');
410 tok = list_pop(tokens, struct graphql_token, list);
411 TEST_CONT(tok == NULL);
412 tokens = tal_free(tokens);
415 struct graphql_executable_document *doc;
416 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
417 TEST_ABRT(graphql_parse(tokens, &doc) == NULL);
418 TEST_ABRT(doc != NULL);
419 TEST_ABRT(doc->first_def != NULL);
420 TEST_CONT(doc->first_def->next_def == NULL);
421 TEST_CONT(doc->first_def->frag_def == NULL);
422 TEST_ABRT(doc->first_def->op_def != NULL);
423 TEST_CONT(doc->first_def->op_def->op_type == NULL);
424 TEST_ABRT(doc->first_def->op_def->op_name == NULL);
425 TEST_CONT(doc->first_def->op_def->vars == NULL);
426 TEST_CONT(doc->first_def->op_def->directives == NULL);
427 TEST_ABRT(doc->first_def->op_def->sel_set != NULL);
428 TEST_ABRT(doc->first_def->op_def->sel_set->first != NULL);
429 TEST_CONT(doc->first_def->op_def->sel_set->first->frag_spread == NULL);
430 TEST_CONT(doc->first_def->op_def->sel_set->first->inline_frag == NULL);
431 TEST_ABRT(doc->first_def->op_def->sel_set->first->field != NULL);
432 TEST_CONT(doc->first_def->op_def->sel_set->first->field->alias == NULL);
433 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->name != NULL);
434 TEST_CONT(doc->first_def->op_def->sel_set->first->field->name->token_type == 'a');
435 TEST_STRG(doc->first_def->op_def->sel_set->first->field->name->token_string, "id");
436 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args == NULL);
437 TEST_CONT(doc->first_def->op_def->sel_set->first->field->directives == NULL);
438 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set == NULL);
439 TEST_ABRT(doc->first_def->op_def->sel_set->first->next != NULL);
440 TEST_CONT(doc->first_def->op_def->sel_set->first->next->frag_spread == NULL);
441 TEST_CONT(doc->first_def->op_def->sel_set->first->next->inline_frag == NULL);
442 TEST_ABRT(doc->first_def->op_def->sel_set->first->next->field != NULL);
443 TEST_CONT(doc->first_def->op_def->sel_set->first->next->field->alias == NULL);
444 TEST_ABRT(doc->first_def->op_def->sel_set->first->next->field->name != NULL);
445 TEST_CONT(doc->first_def->op_def->sel_set->first->next->field->name->token_type == 'a');
446 TEST_STRG(doc->first_def->op_def->sel_set->first->next->field->name->token_string, "firstName");
447 TEST_CONT(doc->first_def->op_def->sel_set->first->next->field->args == NULL);
448 TEST_CONT(doc->first_def->op_def->sel_set->first->next->field->directives == NULL);
449 TEST_CONT(doc->first_def->op_def->sel_set->first->next->field->sel_set == NULL);
450 TEST_ABRT(doc->first_def->op_def->sel_set->first->next->next != NULL);
451 TEST_CONT(doc->first_def->op_def->sel_set->first->next->next->frag_spread == NULL);
452 TEST_CONT(doc->first_def->op_def->sel_set->first->next->next->inline_frag == NULL);
453 TEST_ABRT(doc->first_def->op_def->sel_set->first->next->next->field != NULL);
454 TEST_CONT(doc->first_def->op_def->sel_set->first->next->next->field->alias == NULL);
455 TEST_ABRT(doc->first_def->op_def->sel_set->first->next->next->field->name != NULL);
456 TEST_CONT(doc->first_def->op_def->sel_set->first->next->next->field->name->token_type == 'a');
457 TEST_STRG(doc->first_def->op_def->sel_set->first->next->next->field->name->token_string, "lastName");
458 TEST_CONT(doc->first_def->op_def->sel_set->first->next->next->field->args == NULL);
459 TEST_CONT(doc->first_def->op_def->sel_set->first->next->next->field->directives == NULL);
460 TEST_CONT(doc->first_def->op_def->sel_set->first->next->next->field->sel_set == NULL);
461 TEST_ABRT(doc->first_def->op_def->sel_set->first->next->next->next == NULL);
462 tokens = tal_free(tokens);
465 int check_example_8(char *source) {
466 struct list_head *tokens;
467 struct graphql_token *tok;
470 if (!mute) printf("// Example No. 8\n");
490 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
491 TEST_ABRT(listlen(tokens) == 17);
492 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
493 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
494 TEST_STRG(tok->token_string, "me");
495 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
496 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
497 TEST_STRG(tok->token_string, "id");
498 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
499 TEST_STRG(tok->token_string, "firstName");
500 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
501 TEST_STRG(tok->token_string, "lastName");
502 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
503 TEST_STRG(tok->token_string, "birthday");
504 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
505 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
506 TEST_STRG(tok->token_string, "month");
507 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
508 TEST_STRG(tok->token_string, "day");
509 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
510 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
511 TEST_STRG(tok->token_string, "friends");
512 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
513 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
514 TEST_STRG(tok->token_string, "name");
515 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
516 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
517 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
518 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok == NULL);
519 tokens = tal_free(tokens);
522 struct graphql_executable_document *doc;
523 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
524 TEST_ABRT(graphql_parse(tokens, &doc) == NULL);
525 TEST_ABRT(doc != NULL);
526 TEST_ABRT(doc->first_def != NULL);
527 TEST_CONT(doc->first_def->next_def == NULL);
528 TEST_CONT(doc->first_def->frag_def == NULL);
529 TEST_ABRT(doc->first_def->op_def != NULL);
530 TEST_CONT(doc->first_def->op_def->op_type == NULL);
531 TEST_ABRT(doc->first_def->op_def->op_name == NULL);
532 TEST_CONT(doc->first_def->op_def->vars == NULL);
533 TEST_CONT(doc->first_def->op_def->directives == NULL);
534 TEST_ABRT(doc->first_def->op_def->sel_set != NULL);
535 TEST_ABRT(doc->first_def->op_def->sel_set->first != NULL);
536 TEST_CONT(doc->first_def->op_def->sel_set->first->next == NULL);
537 TEST_CONT(doc->first_def->op_def->sel_set->first->frag_spread == NULL);
538 TEST_CONT(doc->first_def->op_def->sel_set->first->inline_frag == NULL);
539 TEST_ABRT(doc->first_def->op_def->sel_set->first->field != NULL);
540 TEST_CONT(doc->first_def->op_def->sel_set->first->field->alias == NULL);
541 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->name != NULL);
542 TEST_CONT(doc->first_def->op_def->sel_set->first->field->name->token_type == 'a');
543 TEST_STRG(doc->first_def->op_def->sel_set->first->field->name->token_string, "me");
544 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args == NULL);
545 TEST_CONT(doc->first_def->op_def->sel_set->first->field->directives == NULL);
546 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set != NULL);
547 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first != NULL);
548 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->frag_spread == NULL);
549 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->inline_frag == NULL);
550 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field != NULL);
551 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->alias == NULL);
552 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->name != NULL);
553 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->name->token_type == 'a');
554 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->name->token_string, "id");
555 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->args == NULL);
556 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->directives == NULL);
557 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set == NULL);
558 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next != NULL);
559 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->frag_spread == NULL);
560 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->inline_frag == NULL);
561 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field != NULL);
562 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->alias == NULL);
563 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->name != NULL);
564 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->name->token_type == 'a');
565 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->name->token_string, "firstName");
566 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->args == NULL);
567 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->directives == NULL);
568 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set == NULL);
569 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next != NULL);
570 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->frag_spread == NULL);
571 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag == NULL);
572 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field != NULL);
573 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->alias == NULL);
574 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->name != NULL);
575 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->name->token_type == 'a');
576 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->name->token_string, "lastName");
577 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args == NULL);
578 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->directives == NULL);
579 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->sel_set == NULL);
580 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next != NULL);
581 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->frag_spread == NULL);
582 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->inline_frag == NULL);
583 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field != NULL);
584 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->alias == NULL);
585 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->name != NULL);
586 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->name->token_type == 'a');
587 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->name->token_string, "birthday");
588 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->args == NULL);
589 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->directives == NULL);
590 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->sel_set != NULL);
591 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->sel_set->first != NULL);
592 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->sel_set->first->field != NULL);
593 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->sel_set->first->field->alias == NULL);
594 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->sel_set->first->field->name != NULL);
595 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->sel_set->first->field->name->token_type == 'a');
596 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->sel_set->first->field->name->token_string, "month");
597 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->sel_set->first->field->args == NULL);
598 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->sel_set->first->field->directives == NULL);
599 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->sel_set->first->field->sel_set == NULL);
600 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->sel_set->first->next != NULL);
601 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->sel_set->first->next->field != NULL);
602 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->sel_set->first->next->field->alias == NULL);
603 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->sel_set->first->next->field->name != NULL);
604 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->sel_set->first->next->field->name->token_type == 'a');
605 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->sel_set->first->next->field->name->token_string, "day");
606 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->sel_set->first->next->field->args == NULL);
607 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->sel_set->first->next->field->directives == NULL);
608 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->sel_set->first->next->field->sel_set == NULL);
609 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->sel_set->first->next->next == NULL);
610 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->next != NULL);
611 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->next->frag_spread == NULL);
612 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->next->inline_frag == NULL);
613 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->next->field != NULL);
614 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->next->field->alias == NULL);
615 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->next->field->name != NULL);
616 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->next->field->name->token_type == 'a');
617 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->next->field->name->token_string, "friends");
618 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->next->field->args == NULL);
619 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->next->field->directives == NULL);
620 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->next->field->sel_set != NULL);
621 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->next->field->sel_set->first != NULL);
622 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->next->field->sel_set->first->field != NULL);
623 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->next->field->sel_set->first->field->alias == NULL);
624 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->next->field->sel_set->first->field->name != NULL);
625 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->next->field->sel_set->first->field->name->token_type == 'a');
626 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->next->field->sel_set->first->field->name->token_string, "name");
627 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->next->field->sel_set->first->field->args == NULL);
628 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->next->field->sel_set->first->field->directives == NULL);
629 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->next->field->sel_set->first->field->sel_set == NULL);
630 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->next->field->sel_set->first->next == NULL);
631 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->next->next == NULL);
632 tokens = tal_free(tokens);
635 int check_example_9(char *source) {
636 struct list_head *tokens;
637 struct graphql_token *tok;
640 if (!mute) printf("// Example No. 9\n");
643 # `me` could represent the currently logged in viewer.\n\
650 # `user` represents one of many users in a graph of data, referred to by a\n\
651 # unique identifier.\n\
660 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
661 TEST_ABRT(listlen(tokens) == 17);
662 // NOTE: Comments are ignored.
663 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
664 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
665 TEST_STRG(tok->token_string, "me");
666 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
667 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
668 TEST_STRG(tok->token_string, "name");
669 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
670 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
671 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
672 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
673 TEST_STRG(tok->token_string, "user");
674 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '(');
675 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
676 TEST_STRG(tok->token_string, "id");
677 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
678 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'i');
679 TEST_STRG(tok->token_string, "4");
680 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ')');
681 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
682 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
683 TEST_STRG(tok->token_string, "name");
684 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
685 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
686 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok == NULL);
687 tokens = tal_free(tokens);
690 struct graphql_executable_document *doc;
691 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
692 TEST_ABRT(graphql_parse(tokens, &doc) == NULL);
693 TEST_ABRT(doc != NULL);
694 TEST_ABRT(doc->first_def != NULL);
695 TEST_ABRT(doc->first_def->next_def != NULL);
696 TEST_CONT(doc->first_def->frag_def == NULL);
697 TEST_ABRT(doc->first_def->op_def != NULL);
698 TEST_CONT(doc->first_def->op_def->op_type == NULL);
699 TEST_ABRT(doc->first_def->op_def->op_name == NULL);
700 TEST_CONT(doc->first_def->op_def->vars == NULL);
701 TEST_CONT(doc->first_def->op_def->directives == NULL);
702 TEST_ABRT(doc->first_def->op_def->sel_set != NULL);
703 TEST_ABRT(doc->first_def->op_def->sel_set->first != NULL);
704 TEST_CONT(doc->first_def->op_def->sel_set->first->next == NULL);
705 TEST_CONT(doc->first_def->op_def->sel_set->first->frag_spread == NULL);
706 TEST_CONT(doc->first_def->op_def->sel_set->first->inline_frag == NULL);
707 TEST_ABRT(doc->first_def->op_def->sel_set->first->field != NULL);
708 TEST_CONT(doc->first_def->op_def->sel_set->first->field->alias == NULL);
709 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->name != NULL);
710 TEST_CONT(doc->first_def->op_def->sel_set->first->field->name->token_type == 'a');
711 TEST_STRG(doc->first_def->op_def->sel_set->first->field->name->token_string, "me");
712 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args == NULL);
713 TEST_CONT(doc->first_def->op_def->sel_set->first->field->directives == NULL);
714 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set != NULL);
715 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first != NULL);
716 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next == NULL);
717 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->frag_spread == NULL);
718 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->inline_frag == NULL);
719 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field != NULL);
720 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->alias == NULL);
721 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->name != NULL);
722 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->name->token_type == 'a');
723 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->name->token_string, "name");
724 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->args == NULL);
725 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->directives == NULL);
726 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set == NULL);
727 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next == NULL);
728 TEST_CONT(doc->first_def->next_def->next_def == NULL);
729 TEST_CONT(doc->first_def->next_def->frag_def == NULL);
730 TEST_ABRT(doc->first_def->next_def->op_def != NULL);
731 TEST_CONT(doc->first_def->next_def->op_def->op_type == NULL);
732 TEST_CONT(doc->first_def->next_def->op_def->op_name == NULL);
733 TEST_CONT(doc->first_def->next_def->op_def->vars == NULL);
734 TEST_CONT(doc->first_def->next_def->op_def->directives == NULL);
735 TEST_ABRT(doc->first_def->next_def->op_def->sel_set != NULL);
736 TEST_ABRT(doc->first_def->next_def->op_def->sel_set->first != NULL);
737 TEST_CONT(doc->first_def->next_def->op_def->sel_set->first->next == NULL);
738 TEST_CONT(doc->first_def->next_def->op_def->sel_set->first->frag_spread == NULL);
739 TEST_CONT(doc->first_def->next_def->op_def->sel_set->first->inline_frag == NULL);
740 TEST_ABRT(doc->first_def->next_def->op_def->sel_set->first->field != NULL);
741 TEST_CONT(doc->first_def->next_def->op_def->sel_set->first->field->alias == NULL);
742 TEST_ABRT(doc->first_def->next_def->op_def->sel_set->first->field->name != NULL);
743 TEST_CONT(doc->first_def->next_def->op_def->sel_set->first->field->name->token_type == 'a');
744 TEST_STRG(doc->first_def->next_def->op_def->sel_set->first->field->name->token_string, "user");
745 TEST_ABRT(doc->first_def->next_def->op_def->sel_set->first->field->args != NULL);
746 TEST_ABRT(doc->first_def->next_def->op_def->sel_set->first->field->args->first != NULL);
747 TEST_CONT(doc->first_def->next_def->op_def->sel_set->first->field->args->first->next == NULL);
748 TEST_ABRT(doc->first_def->next_def->op_def->sel_set->first->field->args->first->name != NULL);
749 TEST_CONT(doc->first_def->next_def->op_def->sel_set->first->field->args->first->name->token_type == 'a');
750 TEST_STRG(doc->first_def->next_def->op_def->sel_set->first->field->args->first->name->token_string, "id");
751 TEST_ABRT(doc->first_def->next_def->op_def->sel_set->first->field->args->first->val != NULL);
752 TEST_ABRT(doc->first_def->next_def->op_def->sel_set->first->field->args->first->val->int_val != NULL);
753 TEST_ABRT(doc->first_def->next_def->op_def->sel_set->first->field->args->first->val->int_val->val != NULL);
754 TEST_CONT(doc->first_def->next_def->op_def->sel_set->first->field->args->first->val->int_val->val->token_type == 'i');
755 TEST_STRG(doc->first_def->next_def->op_def->sel_set->first->field->args->first->val->int_val->val->token_string, "4");
756 TEST_CONT(doc->first_def->next_def->op_def->sel_set->first->field->directives == NULL);
757 TEST_ABRT(doc->first_def->next_def->op_def->sel_set->first->field->sel_set != NULL);
758 TEST_ABRT(doc->first_def->next_def->op_def->sel_set->first->field->sel_set->first != NULL);
759 TEST_CONT(doc->first_def->next_def->op_def->sel_set->first->field->sel_set->first->next == NULL);
760 TEST_CONT(doc->first_def->next_def->op_def->sel_set->first->field->sel_set->first->frag_spread == NULL);
761 TEST_CONT(doc->first_def->next_def->op_def->sel_set->first->field->sel_set->first->inline_frag == NULL);
762 TEST_ABRT(doc->first_def->next_def->op_def->sel_set->first->field->sel_set->first->field != NULL);
763 TEST_CONT(doc->first_def->next_def->op_def->sel_set->first->field->sel_set->first->field->alias == NULL);
764 TEST_CONT(doc->first_def->next_def->op_def->sel_set->first->field->sel_set->first->field->args == NULL);
765 TEST_CONT(doc->first_def->next_def->op_def->sel_set->first->field->sel_set->first->field->directives == NULL);
766 TEST_CONT(doc->first_def->next_def->op_def->sel_set->first->field->sel_set->first->field->sel_set == NULL);
767 TEST_ABRT(doc->first_def->next_def->op_def->sel_set->first->field->sel_set->first->field->name != NULL);
768 TEST_CONT(doc->first_def->next_def->op_def->sel_set->first->field->sel_set->first->field->name->token_type == 'a');
769 TEST_STRG(doc->first_def->next_def->op_def->sel_set->first->field->sel_set->first->field->name->token_string, "name");
770 tokens = tal_free(tokens);
773 int check_example_10(char *source) {
774 struct list_head *tokens;
775 struct graphql_token *tok;
778 if (!mute) printf("// Example No. 10\n");
785 profilePic(size: 100)\n\
791 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
792 TEST_ABRT(listlen(tokens) == 18);
793 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
794 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
795 TEST_STRG(tok->token_string, "user");
796 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '(');
797 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
798 TEST_STRG(tok->token_string, "id");
799 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
800 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'i');
801 TEST_STRG(tok->token_string, "4");
802 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ')');
803 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
804 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
805 TEST_STRG(tok->token_string, "id");
806 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
807 TEST_STRG(tok->token_string, "name");
808 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
809 TEST_STRG(tok->token_string, "profilePic");
810 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '(');
811 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
812 TEST_STRG(tok->token_string, "size");
813 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
814 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'i');
815 TEST_STRG(tok->token_string, "100");
816 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ')');
817 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
818 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
819 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok == NULL);
820 tokens = tal_free(tokens);
823 struct graphql_executable_document *doc;
824 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
825 TEST_ABRT(graphql_parse(tokens, &doc) == NULL);
826 TEST_ABRT(doc != NULL);
827 TEST_ABRT(doc->first_def != NULL);
828 TEST_CONT(doc->first_def->next_def == NULL);
829 TEST_CONT(doc->first_def->frag_def == NULL);
830 TEST_ABRT(doc->first_def->op_def != NULL);
831 TEST_CONT(doc->first_def->op_def->op_type == NULL);
832 TEST_CONT(doc->first_def->op_def->op_name == NULL);
833 TEST_CONT(doc->first_def->op_def->vars == NULL);
834 TEST_CONT(doc->first_def->op_def->directives == NULL);
835 TEST_ABRT(doc->first_def->op_def->sel_set != NULL);
836 TEST_ABRT(doc->first_def->op_def->sel_set->first != NULL);
837 TEST_CONT(doc->first_def->op_def->sel_set->first->next == NULL);
838 TEST_CONT(doc->first_def->op_def->sel_set->first->frag_spread == NULL);
839 TEST_CONT(doc->first_def->op_def->sel_set->first->inline_frag == NULL);
840 TEST_ABRT(doc->first_def->op_def->sel_set->first->field != NULL);
841 TEST_CONT(doc->first_def->op_def->sel_set->first->field->alias == NULL);
842 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->name != NULL);
843 TEST_CONT(doc->first_def->op_def->sel_set->first->field->name->token_type == 'a');
844 TEST_STRG(doc->first_def->op_def->sel_set->first->field->name->token_string, "user");
845 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args != NULL);
846 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first != NULL);
847 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->next == NULL);
848 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->name != NULL);
849 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->name->token_type == 'a');
850 TEST_STRG(doc->first_def->op_def->sel_set->first->field->args->first->name->token_string, "id");
851 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val != NULL);
852 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val != NULL);
853 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val->val != NULL);
854 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val->val->token_type == 'i');
855 TEST_STRG(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val->val->token_string, "4");
856 TEST_CONT(doc->first_def->op_def->sel_set->first->field->directives == NULL);
857 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set != NULL);
858 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first != NULL);
859 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->frag_spread == NULL);
860 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->inline_frag == NULL);
861 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field != NULL);
862 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->alias == NULL);
863 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->name != NULL);
864 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->name->token_type == 'a');
865 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->name->token_string, "id");
866 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->args == NULL);
867 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->directives == NULL);
868 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set == NULL);
869 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next != NULL);
870 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->frag_spread == NULL);
871 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->inline_frag == NULL);
872 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field != NULL);
873 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->alias == NULL);
874 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->name != NULL);
875 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->name->token_type == 'a');
876 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->name->token_string, "name");
877 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->args == NULL);
878 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->directives == NULL);
879 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set == NULL);
880 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next != NULL);
881 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next == NULL);
882 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->frag_spread == NULL);
883 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag == NULL);
884 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field != NULL);
885 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->alias == NULL);
886 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->name != NULL);
887 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->name->token_type == 'a');
888 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->name->token_string, "profilePic");
889 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->directives == NULL);
890 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->sel_set == NULL);
891 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args != NULL);
892 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first != NULL);
893 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->next == NULL);
894 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->name != NULL);
895 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->name->token_type == 'a');
896 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->name->token_string, "size");
897 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->val != NULL);
898 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->val->int_val != NULL);
899 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->val->int_val->val != NULL);
900 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->val->int_val->val->token_type == 'i');
901 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->val->int_val->val->token_string, "100");
902 tokens = tal_free(tokens);
905 int check_example_11(char *source) {
906 struct list_head *tokens;
907 struct graphql_token *tok;
910 if (!mute) printf("// Example No. 11\n");
917 profilePic(width: 100, height: 50)\n\
923 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
924 TEST_ABRT(listlen(tokens) == 21);
925 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
926 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
927 TEST_STRG(tok->token_string, "user");
928 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '(');
929 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
930 TEST_STRG(tok->token_string, "id");
931 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
932 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'i');
933 TEST_STRG(tok->token_string, "4");
934 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ')');
935 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
936 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
937 TEST_STRG(tok->token_string, "id");
938 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
939 TEST_STRG(tok->token_string, "name");
940 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
941 TEST_STRG(tok->token_string, "profilePic");
942 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '(');
943 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
944 TEST_STRG(tok->token_string, "width");
945 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
946 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'i');
947 TEST_STRG(tok->token_string, "100");
948 // NOTE: Comma is ignored.
949 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
950 TEST_STRG(tok->token_string, "height");
951 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
952 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'i');
953 TEST_STRG(tok->token_string, "50");
954 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ')');
955 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
956 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
957 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok == NULL);
958 tokens = tal_free(tokens);
961 struct graphql_executable_document *doc;
962 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
963 TEST_ABRT(graphql_parse(tokens, &doc) == NULL);
964 TEST_ABRT(doc != NULL);
965 TEST_ABRT(doc->first_def != NULL);
966 TEST_CONT(doc->first_def->next_def == NULL);
967 TEST_CONT(doc->first_def->frag_def == NULL);
968 TEST_ABRT(doc->first_def->op_def != NULL);
969 TEST_CONT(doc->first_def->op_def->op_type == NULL);
970 TEST_CONT(doc->first_def->op_def->op_name == NULL);
971 TEST_CONT(doc->first_def->op_def->vars == NULL);
972 TEST_CONT(doc->first_def->op_def->directives == NULL);
973 TEST_ABRT(doc->first_def->op_def->sel_set != NULL);
974 TEST_ABRT(doc->first_def->op_def->sel_set->first != NULL);
975 TEST_CONT(doc->first_def->op_def->sel_set->first->next == NULL);
976 TEST_CONT(doc->first_def->op_def->sel_set->first->frag_spread == NULL);
977 TEST_CONT(doc->first_def->op_def->sel_set->first->inline_frag == NULL);
978 TEST_ABRT(doc->first_def->op_def->sel_set->first->field != NULL);
979 TEST_CONT(doc->first_def->op_def->sel_set->first->field->alias == NULL);
980 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->name != NULL);
981 TEST_CONT(doc->first_def->op_def->sel_set->first->field->name->token_type == 'a');
982 TEST_STRG(doc->first_def->op_def->sel_set->first->field->name->token_string, "user");
983 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args != NULL);
984 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first != NULL);
985 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->next == NULL);
986 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->name != NULL);
987 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->name->token_type == 'a');
988 TEST_STRG(doc->first_def->op_def->sel_set->first->field->args->first->name->token_string, "id");
989 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val != NULL);
990 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val != NULL);
991 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val->val != NULL);
992 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val->val->token_type == 'i');
993 TEST_STRG(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val->val->token_string, "4");
994 TEST_CONT(doc->first_def->op_def->sel_set->first->field->directives == NULL);
995 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set != NULL);
996 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first != NULL);
997 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->frag_spread == NULL);
998 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->inline_frag == NULL);
999 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field != NULL);
1000 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->alias == NULL);
1001 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->name != NULL);
1002 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->name->token_type == 'a');
1003 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->name->token_string, "id");
1004 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->args == NULL);
1005 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->directives == NULL);
1006 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set == NULL);
1007 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next != NULL);
1008 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->frag_spread == NULL);
1009 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->inline_frag == NULL);
1010 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field != NULL);
1011 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->alias == NULL);
1012 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->name != NULL);
1013 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->name->token_type == 'a');
1014 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->name->token_string, "name");
1015 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->args == NULL);
1016 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->directives == NULL);
1017 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set == NULL);
1018 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next != NULL);
1019 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next == NULL);
1020 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->frag_spread == NULL);
1021 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag == NULL);
1022 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field != NULL);
1023 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->alias == NULL);
1024 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->name != NULL);
1025 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->name->token_type == 'a');
1026 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->name->token_string, "profilePic");
1027 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->directives == NULL);
1028 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->sel_set == NULL);
1029 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args != NULL);
1030 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first != NULL);
1031 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->name != NULL);
1032 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->name->token_type == 'a');
1033 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->name->token_string, "width");
1034 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->val != NULL);
1035 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->val->int_val != NULL);
1036 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->val->int_val->val != NULL);
1037 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->val->int_val->val->token_type == 'i');
1038 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->val->int_val->val->token_string, "100");
1039 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->next != NULL);
1040 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->next->name != NULL);
1041 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->next->name->token_type == 'a');
1042 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->next->name->token_string, "height");
1043 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->next->val != NULL);
1044 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->next->val->int_val != NULL);
1045 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->next->val->int_val->val != NULL);
1046 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->next->val->int_val->val->token_type == 'i');
1047 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->next->val->int_val->val->token_string, "50");
1048 tokens = tal_free(tokens);
1051 int check_example_12_and_13(const char *source) {
1052 struct list_head *tokens;
1053 struct graphql_token *tok;
1056 if (!mute) printf("// Example Nos. 12 and 13\n");
1060 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
1061 TEST_ABRT(listlen(tokens) == 11);
1062 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
1063 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1064 TEST_STRG(tok->token_string, "picture");
1065 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '(');
1066 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1067 TEST_ABRT(tok->token_string != NULL && (streq(tok->token_string, "width") || streq(tok->token_string, "height")));
1068 param = tok->token_string;
1069 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
1070 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'i');
1071 TEST_CONT(tok->token_string != NULL && ((streq(param, "width") && streq(tok->token_string, "200")) || (streq(param, "height") && streq(tok->token_string, "100"))));
1072 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1073 TEST_CONT(tok->token_string != NULL && (streq(tok->token_string, "width") || streq(tok->token_string, "height")));
1074 param = tok->token_string;
1075 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
1076 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'i');
1077 TEST_CONT(tok->token_string != NULL && ((streq(param, "width") && streq(tok->token_string, "200")) || (streq(param, "height") && streq(tok->token_string, "100"))));
1078 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ')');
1079 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
1080 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok == NULL);
1081 tokens = tal_free(tokens);
1084 struct graphql_argument *arg;
1085 struct graphql_executable_document *doc;
1086 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
1087 TEST_ABRT(graphql_parse(tokens, &doc) == NULL);
1088 TEST_ABRT(doc != NULL);
1089 TEST_ABRT(doc->first_def != NULL);
1090 TEST_CONT(doc->first_def->next_def == NULL);
1091 TEST_CONT(doc->first_def->frag_def == NULL);
1092 TEST_ABRT(doc->first_def->op_def != NULL);
1093 TEST_CONT(doc->first_def->op_def->op_type == NULL);
1094 TEST_CONT(doc->first_def->op_def->op_name == NULL);
1095 TEST_CONT(doc->first_def->op_def->vars == NULL);
1096 TEST_CONT(doc->first_def->op_def->directives == NULL);
1097 TEST_ABRT(doc->first_def->op_def->sel_set != NULL);
1098 TEST_ABRT(doc->first_def->op_def->sel_set->first != NULL);
1099 TEST_CONT(doc->first_def->op_def->sel_set->first->next == NULL);
1100 TEST_CONT(doc->first_def->op_def->sel_set->first->frag_spread == NULL);
1101 TEST_CONT(doc->first_def->op_def->sel_set->first->inline_frag == NULL);
1102 TEST_ABRT(doc->first_def->op_def->sel_set->first->field != NULL);
1103 TEST_CONT(doc->first_def->op_def->sel_set->first->field->alias == NULL);
1104 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->name != NULL);
1105 TEST_CONT(doc->first_def->op_def->sel_set->first->field->name->token_type == 'a');
1106 TEST_STRG(doc->first_def->op_def->sel_set->first->field->name->token_string, "picture");
1107 TEST_CONT(doc->first_def->op_def->sel_set->first->field->directives == NULL);
1108 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set == NULL);
1109 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args != NULL);
1110 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first != NULL);
1111 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->next != NULL);
1112 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->next->next == NULL);
1113 arg = doc->first_def->op_def->sel_set->first->field->args->first;
1114 if (!streq(doc->first_def->op_def->sel_set->first->field->args->first->name->token_string, "width")) arg = arg->next;
1115 TEST_ABRT(arg->name != NULL);
1116 TEST_CONT(arg->name->token_type == 'a');
1117 TEST_STRG(arg->name->token_string, "width");
1118 TEST_ABRT(arg->val != NULL);
1119 TEST_ABRT(arg->val->int_val != NULL);
1120 TEST_ABRT(arg->val->int_val->val != NULL);
1121 TEST_CONT(arg->val->int_val->val->token_type == 'i');
1122 TEST_STRG(arg->val->int_val->val->token_string, "200");
1123 arg = doc->first_def->op_def->sel_set->first->field->args->first;
1124 if (!streq(doc->first_def->op_def->sel_set->first->field->args->first->name->token_string, "height")) arg = arg->next;
1125 TEST_ABRT(arg->name != NULL);
1126 TEST_CONT(arg->name->token_type == 'a');
1127 TEST_STRG(arg->name->token_string, "height");
1128 TEST_ABRT(arg->val != NULL);
1129 TEST_ABRT(arg->val->int_val != NULL);
1130 TEST_ABRT(arg->val->int_val->val != NULL);
1131 TEST_CONT(arg->val->int_val->val->token_type == 'i');
1132 TEST_STRG(arg->val->int_val->val->token_string, "100");
1133 tokens = tal_free(tokens);
1136 int check_example_14(char *source) {
1137 struct list_head *tokens;
1138 struct graphql_token *tok;
1141 if (!mute) printf("// Example No. 14\n");
1148 smallPic: profilePic(size: 64)\n\
1149 bigPic: profilePic(size: 1024)\n\
1155 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
1156 TEST_ABRT(listlen(tokens) == 28);
1157 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
1158 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1159 TEST_STRG(tok->token_string, "user");
1160 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '(');
1161 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1162 TEST_STRG(tok->token_string, "id");
1163 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
1164 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'i');
1165 TEST_STRG(tok->token_string, "4");
1166 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ')');
1167 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
1168 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1169 TEST_STRG(tok->token_string, "id");
1170 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1171 TEST_STRG(tok->token_string, "name");
1172 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1173 TEST_STRG(tok->token_string, "smallPic");
1174 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
1175 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1176 TEST_STRG(tok->token_string, "profilePic");
1177 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '(');
1178 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1179 TEST_STRG(tok->token_string, "size");
1180 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
1181 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'i');
1182 TEST_STRG(tok->token_string, "64");
1183 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ')');
1184 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1185 TEST_STRG(tok->token_string, "bigPic");
1186 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
1187 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1188 TEST_STRG(tok->token_string, "profilePic");
1189 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '(');
1190 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1191 TEST_STRG(tok->token_string, "size");
1192 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
1193 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'i');
1194 TEST_STRG(tok->token_string, "1024");
1195 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ')');
1196 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
1197 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
1198 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok == NULL);
1199 tokens = tal_free(tokens);
1202 struct graphql_executable_document *doc;
1203 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
1204 TEST_ABRT(graphql_parse(tokens, &doc) == NULL);
1205 TEST_ABRT(doc != NULL);
1206 TEST_ABRT(doc->first_def != NULL);
1207 TEST_CONT(doc->first_def->next_def == NULL);
1208 TEST_CONT(doc->first_def->frag_def == NULL);
1209 TEST_ABRT(doc->first_def->op_def != NULL);
1210 TEST_CONT(doc->first_def->op_def->op_type == NULL);
1211 TEST_CONT(doc->first_def->op_def->op_name == NULL);
1212 TEST_CONT(doc->first_def->op_def->vars == NULL);
1213 TEST_CONT(doc->first_def->op_def->directives == NULL);
1214 TEST_ABRT(doc->first_def->op_def->sel_set != NULL);
1215 TEST_ABRT(doc->first_def->op_def->sel_set->first != NULL);
1216 TEST_CONT(doc->first_def->op_def->sel_set->first->next == NULL);
1217 TEST_CONT(doc->first_def->op_def->sel_set->first->frag_spread == NULL);
1218 TEST_CONT(doc->first_def->op_def->sel_set->first->inline_frag == NULL);
1219 TEST_ABRT(doc->first_def->op_def->sel_set->first->field != NULL);
1220 TEST_CONT(doc->first_def->op_def->sel_set->first->field->alias == NULL);
1221 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->name != NULL);
1222 TEST_CONT(doc->first_def->op_def->sel_set->first->field->name->token_type == 'a');
1223 TEST_STRG(doc->first_def->op_def->sel_set->first->field->name->token_string, "user");
1224 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args != NULL);
1225 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first != NULL);
1226 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->next == NULL);
1227 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->name != NULL);
1228 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->name->token_type == 'a');
1229 TEST_STRG(doc->first_def->op_def->sel_set->first->field->args->first->name->token_string, "id");
1230 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val != NULL);
1231 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val != NULL);
1232 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val->val != NULL);
1233 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val->val->token_type == 'i');
1234 TEST_STRG(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val->val->token_string, "4");
1235 TEST_CONT(doc->first_def->op_def->sel_set->first->field->directives == NULL);
1236 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set != NULL);
1237 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first != NULL);
1238 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->frag_spread == NULL);
1239 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->inline_frag == NULL);
1240 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field != NULL);
1241 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->alias == NULL);
1242 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->name != NULL);
1243 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->name->token_type == 'a');
1244 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->name->token_string, "id");
1245 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->args == NULL);
1246 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->directives == NULL);
1247 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set == NULL);
1248 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next != NULL);
1249 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->frag_spread == NULL);
1250 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->inline_frag == NULL);
1251 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field != NULL);
1252 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->alias == NULL);
1253 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->name != NULL);
1254 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->name->token_type == 'a');
1255 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->name->token_string, "name");
1256 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->args == NULL);
1257 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->directives == NULL);
1258 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set == NULL);
1259 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next != NULL);
1260 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->frag_spread == NULL);
1261 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag == NULL);
1262 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field != NULL);
1263 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->alias != NULL);
1264 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->alias->name != NULL);
1265 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->alias->name->token_type == 'a');
1266 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->alias->name->token_string, "smallPic");
1267 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->name != NULL);
1268 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->name->token_type == 'a');
1269 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->name->token_string, "profilePic");
1270 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->directives == NULL);
1271 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->sel_set == NULL);
1272 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args != NULL);
1273 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first != NULL);
1274 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->name != NULL);
1275 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->name->token_type == 'a');
1276 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->name->token_string, "size");
1277 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->val != NULL);
1278 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->val->int_val != NULL);
1279 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->val->int_val->val != NULL);
1280 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->val->int_val->val->token_type == 'i');
1281 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->val->int_val->val->token_string, "64");
1282 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->next == NULL);
1283 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next != NULL);
1284 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->next == NULL);
1285 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->frag_spread == NULL);
1286 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->inline_frag == NULL);
1287 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field != NULL);
1288 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->alias != NULL);
1289 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->alias->name != NULL);
1290 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->alias->name->token_type == 'a');
1291 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->alias->name->token_string, "bigPic");
1292 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->name != NULL);
1293 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->name->token_type == 'a');
1294 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->name->token_string, "profilePic");
1295 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->directives == NULL);
1296 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->sel_set == NULL);
1297 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->args != NULL);
1298 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->args->first != NULL);
1299 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->args->first->name != NULL);
1300 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->args->first->name->token_type == 'a');
1301 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->args->first->name->token_string, "size");
1302 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->args->first->val != NULL);
1303 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->args->first->val->int_val != NULL);
1304 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->args->first->val->int_val->val != NULL);
1305 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->args->first->val->int_val->val->token_type == 'i');
1306 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->args->first->val->int_val->val->token_string, "1024");
1307 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next->field->args->first->next == NULL);
1308 tokens = tal_free(tokens);
1311 int check_example_16(char *source) {
1312 struct list_head *tokens;
1313 struct graphql_token *tok;
1316 if (!mute) printf("// Example No. 16\n");
1320 zuck: user(id: 4) {\n\
1328 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
1329 TEST_ABRT(listlen(tokens) == 14);
1330 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
1331 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1332 TEST_STRG(tok->token_string, "zuck");
1333 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
1334 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1335 TEST_STRG(tok->token_string, "user");
1336 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '(');
1337 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1338 TEST_STRG(tok->token_string, "id");
1339 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
1340 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'i');
1341 TEST_STRG(tok->token_string, "4");
1342 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ')');
1343 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
1344 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1345 TEST_STRG(tok->token_string, "id");
1346 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1347 TEST_STRG(tok->token_string, "name");
1348 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
1349 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
1350 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok == NULL);
1351 tokens = tal_free(tokens);
1354 struct graphql_executable_document *doc;
1355 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
1356 TEST_ABRT(graphql_parse(tokens, &doc) == NULL);
1357 TEST_ABRT(doc != NULL);
1358 TEST_ABRT(doc->first_def != NULL);
1359 TEST_CONT(doc->first_def->next_def == NULL);
1360 TEST_CONT(doc->first_def->frag_def == NULL);
1361 TEST_ABRT(doc->first_def->op_def != NULL);
1362 TEST_CONT(doc->first_def->op_def->op_type == NULL);
1363 TEST_CONT(doc->first_def->op_def->op_name == NULL);
1364 TEST_CONT(doc->first_def->op_def->vars == NULL);
1365 TEST_CONT(doc->first_def->op_def->directives == NULL);
1366 TEST_ABRT(doc->first_def->op_def->sel_set != NULL);
1367 TEST_ABRT(doc->first_def->op_def->sel_set->first != NULL);
1368 TEST_CONT(doc->first_def->op_def->sel_set->first->next == NULL);
1369 TEST_CONT(doc->first_def->op_def->sel_set->first->frag_spread == NULL);
1370 TEST_CONT(doc->first_def->op_def->sel_set->first->inline_frag == NULL);
1371 TEST_ABRT(doc->first_def->op_def->sel_set->first->field != NULL);
1372 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->alias != NULL);
1373 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->alias->name != NULL);
1374 TEST_CONT(doc->first_def->op_def->sel_set->first->field->alias->name->token_type == 'a');
1375 TEST_STRG(doc->first_def->op_def->sel_set->first->field->alias->name->token_string, "zuck");
1376 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->name != NULL);
1377 TEST_CONT(doc->first_def->op_def->sel_set->first->field->name->token_type == 'a');
1378 TEST_STRG(doc->first_def->op_def->sel_set->first->field->name->token_string, "user");
1379 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args != NULL);
1380 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first != NULL);
1381 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->next == NULL);
1382 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->name != NULL);
1383 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->name->token_type == 'a');
1384 TEST_STRG(doc->first_def->op_def->sel_set->first->field->args->first->name->token_string, "id");
1385 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val != NULL);
1386 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val != NULL);
1387 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val->val != NULL);
1388 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val->val->token_type == 'i');
1389 TEST_STRG(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val->val->token_string, "4");
1390 TEST_CONT(doc->first_def->op_def->sel_set->first->field->directives == NULL);
1391 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set != NULL);
1392 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first != NULL);
1393 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->frag_spread == NULL);
1394 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->inline_frag == NULL);
1395 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field != NULL);
1396 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->alias == NULL);
1397 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->name != NULL);
1398 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->name->token_type == 'a');
1399 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->name->token_string, "id");
1400 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->args == NULL);
1401 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->directives == NULL);
1402 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set == NULL);
1403 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next != NULL);
1404 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->frag_spread == NULL);
1405 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->inline_frag == NULL);
1406 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field != NULL);
1407 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->alias == NULL);
1408 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->name != NULL);
1409 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->name->token_type == 'a');
1410 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->name->token_string, "name");
1411 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->args == NULL);
1412 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->directives == NULL);
1413 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set == NULL);
1414 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next == NULL);
1415 tokens = tal_free(tokens);
1418 int check_example_18(char *source) {
1419 struct list_head *tokens;
1420 struct graphql_token *tok;
1423 if (!mute) printf("// Example No. 18\n");
1426 query noFragments {\n\
1428 friends(first: 10) {\n\
1431 profilePic(size: 50)\n\
1433 mutualFriends(first: 10) {\n\
1436 profilePic(size: 50)\n\
1443 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
1444 TEST_ABRT(listlen(tokens) == 44);
1445 tokens = tal_free(tokens);
1448 struct graphql_executable_document *doc;
1449 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
1450 TEST_ABRT(graphql_parse(tokens, &doc) == NULL);
1451 TEST_ABRT(doc != NULL);
1452 TEST_ABRT(doc->first_def != NULL);
1453 TEST_ABRT(doc->first_def->op_def != NULL);
1454 TEST_ABRT(doc->first_def->op_def->sel_set != NULL);
1455 TEST_ABRT(doc->first_def->op_def->sel_set->first != NULL);
1456 TEST_CONT(doc->first_def->op_def->sel_set->first->next == NULL);
1457 TEST_ABRT(doc->first_def->op_def->sel_set->first->field != NULL);
1458 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set != NULL);
1459 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first != NULL);
1460 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field != NULL);
1461 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set != NULL);
1462 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first != NULL);
1463 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->next != NULL);
1464 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->next->next != NULL);
1465 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->next->next->next == NULL);
1466 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next != NULL);
1467 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field != NULL);
1468 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set != NULL);
1469 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set->first != NULL);
1470 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set->first->next != NULL);
1471 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set->first->next->next != NULL);
1472 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set->first->next->next->next == NULL);
1473 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next == NULL);
1474 tokens = tal_free(tokens);
1477 int check_example_19(char *source) {
1478 struct list_head *tokens;
1479 struct graphql_token *tok;
1482 if (!mute) printf("// Example No. 19\n");
1485 query withFragments {\n\
1487 friends(first: 10) {\n\
1490 mutualFriends(first: 10) {\n\
1496 fragment friendFields on User {\n\
1499 profilePic(size: 50)\n\
1504 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
1505 TEST_ABRT(listlen(tokens) == 46);
1506 for (int i=0; i<17; i++)
1507 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
1508 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 0x2026);
1509 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1510 TEST_STRG(tok->token_string, "friendFields");
1511 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
1512 for (int i=0; i<7; i++)
1513 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
1514 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 0x2026);
1515 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1516 TEST_STRG(tok->token_string, "friendFields");
1517 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
1518 tokens = tal_free(tokens);
1521 struct graphql_executable_document *doc;
1523 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
1524 TEST_CONT((e = graphql_parse(tokens, &doc)) == NULL);
1525 if (e) printf("%s\n", e);
1526 TEST_ABRT(doc != NULL);
1527 TEST_ABRT(doc->first_def != NULL);
1528 TEST_ABRT(doc->first_def->op_def != NULL);
1529 TEST_CONT(doc->first_def->frag_def == NULL);
1530 TEST_ABRT(doc->first_def->op_def->sel_set != NULL);
1531 TEST_ABRT(doc->first_def->op_def->sel_set->first != NULL);
1532 TEST_CONT(doc->first_def->op_def->sel_set->first->next == NULL);
1533 TEST_ABRT(doc->first_def->op_def->sel_set->first->field != NULL);
1534 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set != NULL);
1535 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first != NULL);
1536 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field != NULL);
1537 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set != NULL);
1538 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first != NULL);
1539 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->next == NULL);
1540 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->field == NULL);
1541 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->inline_frag == NULL);
1542 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->frag_spread != NULL);
1543 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->frag_spread->directives == NULL);
1544 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->frag_spread->name != NULL);
1545 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->frag_spread->name->name != NULL);
1546 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->frag_spread->name->name->token_type == 'a');
1547 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->frag_spread->name->name->token_string, "friendFields");
1548 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next != NULL);
1549 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field != NULL);
1550 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set != NULL);
1551 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set->first != NULL);
1552 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set->first->next == NULL);
1553 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set->first->field == NULL);
1554 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set->first->inline_frag == NULL);
1555 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set->first->frag_spread != NULL);
1556 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set->first->frag_spread->directives == NULL);
1557 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set->first->frag_spread->name != NULL);
1558 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set->first->frag_spread->name->name != NULL);
1559 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set->first->frag_spread->name->name->token_type == 'a');
1560 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set->first->frag_spread->name->name->token_string, "friendFields");
1561 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next == NULL);
1562 TEST_ABRT(doc->first_def->next_def != NULL);
1563 TEST_CONT(doc->first_def->next_def->next_def == NULL);
1564 TEST_CONT(doc->first_def->next_def->op_def == NULL);
1565 TEST_ABRT(doc->first_def->next_def->frag_def != NULL);
1566 TEST_ABRT(doc->first_def->next_def->frag_def->name != NULL);
1567 TEST_ABRT(doc->first_def->next_def->frag_def->name->name != NULL);
1568 TEST_CONT(doc->first_def->next_def->frag_def->name->name->token_type == 'a');
1569 TEST_STRG(doc->first_def->next_def->frag_def->name->name->token_string, "friendFields");
1570 TEST_ABRT(doc->first_def->next_def->frag_def->type_cond != NULL);
1571 TEST_ABRT(doc->first_def->next_def->frag_def->type_cond->named_type != NULL);
1572 TEST_ABRT(doc->first_def->next_def->frag_def->type_cond->named_type->name != NULL);
1573 TEST_CONT(doc->first_def->next_def->frag_def->type_cond->named_type->name->token_type == 'a');
1574 TEST_STRG(doc->first_def->next_def->frag_def->type_cond->named_type->name->token_string, "User");
1575 TEST_CONT(doc->first_def->next_def->frag_def->directives == NULL);
1576 TEST_ABRT(doc->first_def->next_def->frag_def->sel_set != NULL);
1577 TEST_ABRT(doc->first_def->next_def->frag_def->sel_set->first != NULL);
1578 TEST_ABRT(doc->first_def->next_def->frag_def->sel_set->first->next != NULL);
1579 TEST_ABRT(doc->first_def->next_def->frag_def->sel_set->first->next->next != NULL);
1580 TEST_ABRT(doc->first_def->next_def->frag_def->sel_set->first->next->next->next == NULL);
1581 tokens = tal_free(tokens);
1584 int check_example_20(char *source) {
1585 struct list_head *tokens;
1586 struct graphql_token *tok;
1589 if (!mute) printf("// Example No. 20\n");
1592 query withNestedFragments {\n\
1594 friends(first: 10) {\n\
1597 mutualFriends(first: 10) {\n\
1603 fragment friendFields on User {\n\
1606 ...standardProfilePic\n\
1609 fragment standardProfilePic on User {\n\
1610 profilePic(size: 50)\n\
1615 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
1616 TEST_ABRT(listlen(tokens) == 54);
1617 for (int i=0; i<17; i++)
1618 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
1619 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 0x2026);
1620 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1621 TEST_STRG(tok->token_string, "friendFields");
1622 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
1623 for (int i=0; i<7; i++)
1624 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
1625 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 0x2026);
1626 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1627 TEST_STRG(tok->token_string, "friendFields");
1628 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
1629 tokens = tal_free(tokens);
1632 struct graphql_executable_document *doc;
1634 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
1635 TEST_CONT((e = graphql_parse(tokens, &doc)) == NULL);
1636 if (e) printf("%s\n", e);
1637 TEST_ABRT(doc != NULL);
1638 TEST_ABRT(doc->first_def != NULL);
1639 TEST_ABRT(doc->first_def->op_def != NULL);
1640 TEST_CONT(doc->first_def->frag_def == NULL);
1641 TEST_ABRT(doc->first_def->op_def->sel_set != NULL);
1642 TEST_ABRT(doc->first_def->op_def->sel_set->first != NULL);
1643 TEST_CONT(doc->first_def->op_def->sel_set->first->next == NULL);
1644 TEST_ABRT(doc->first_def->op_def->sel_set->first->field != NULL);
1645 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set != NULL);
1646 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first != NULL);
1647 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field != NULL);
1648 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set != NULL);
1649 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first != NULL);
1650 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->next == NULL);
1651 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->field == NULL);
1652 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->inline_frag == NULL);
1653 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->frag_spread != NULL);
1654 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->frag_spread->directives == NULL);
1655 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->frag_spread->name != NULL);
1656 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->frag_spread->name->name != NULL);
1657 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->frag_spread->name->name->token_type == 'a');
1658 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set->first->frag_spread->name->name->token_string, "friendFields");
1659 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next != NULL);
1660 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field != NULL);
1661 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set != NULL);
1662 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set->first != NULL);
1663 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set->first->next == NULL);
1664 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set->first->field == NULL);
1665 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set->first->inline_frag == NULL);
1666 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set->first->frag_spread != NULL);
1667 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set->first->frag_spread->directives == NULL);
1668 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set->first->frag_spread->name != NULL);
1669 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set->first->frag_spread->name->name != NULL);
1670 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set->first->frag_spread->name->name->token_type == 'a');
1671 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set->first->frag_spread->name->name->token_string, "friendFields");
1672 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next == NULL);
1673 TEST_ABRT(doc->first_def->next_def != NULL);
1674 TEST_CONT(doc->first_def->next_def->op_def == NULL);
1675 TEST_ABRT(doc->first_def->next_def->frag_def != NULL);
1676 TEST_ABRT(doc->first_def->next_def->frag_def->name != NULL);
1677 TEST_ABRT(doc->first_def->next_def->frag_def->name->name != NULL);
1678 TEST_CONT(doc->first_def->next_def->frag_def->name->name->token_type == 'a');
1679 TEST_STRG(doc->first_def->next_def->frag_def->name->name->token_string, "friendFields");
1680 TEST_ABRT(doc->first_def->next_def->frag_def->type_cond != NULL);
1681 TEST_ABRT(doc->first_def->next_def->frag_def->type_cond->named_type != NULL);
1682 TEST_ABRT(doc->first_def->next_def->frag_def->type_cond->named_type->name != NULL);
1683 TEST_CONT(doc->first_def->next_def->frag_def->type_cond->named_type->name->token_type == 'a');
1684 TEST_STRG(doc->first_def->next_def->frag_def->type_cond->named_type->name->token_string, "User");
1685 TEST_CONT(doc->first_def->next_def->frag_def->directives == NULL);
1686 TEST_ABRT(doc->first_def->next_def->frag_def->sel_set != NULL);
1687 TEST_ABRT(doc->first_def->next_def->frag_def->sel_set->first != NULL);
1688 TEST_ABRT(doc->first_def->next_def->frag_def->sel_set->first->field != NULL);
1689 TEST_CONT(doc->first_def->next_def->frag_def->sel_set->first->frag_spread == NULL);
1690 TEST_CONT(doc->first_def->next_def->frag_def->sel_set->first->inline_frag == NULL);
1691 TEST_ABRT(doc->first_def->next_def->frag_def->sel_set->first->next != NULL);
1692 TEST_ABRT(doc->first_def->next_def->frag_def->sel_set->first->next->field != NULL);
1693 TEST_CONT(doc->first_def->next_def->frag_def->sel_set->first->next->frag_spread == NULL);
1694 TEST_CONT(doc->first_def->next_def->frag_def->sel_set->first->next->inline_frag == NULL);
1695 TEST_ABRT(doc->first_def->next_def->frag_def->sel_set->first->next->next != NULL);
1696 TEST_CONT(doc->first_def->next_def->frag_def->sel_set->first->next->next->field == NULL);
1697 TEST_ABRT(doc->first_def->next_def->frag_def->sel_set->first->next->next->frag_spread != NULL);
1698 TEST_CONT(doc->first_def->next_def->frag_def->sel_set->first->next->next->inline_frag == NULL);
1699 TEST_ABRT(doc->first_def->next_def->frag_def->sel_set->first->next->next->next == NULL);
1700 TEST_ABRT(doc->first_def->next_def->next_def != NULL);
1701 TEST_CONT(doc->first_def->next_def->next_def->next_def == NULL);
1702 TEST_CONT(doc->first_def->next_def->next_def->op_def == NULL);
1703 TEST_ABRT(doc->first_def->next_def->next_def->frag_def != NULL);
1704 TEST_ABRT(doc->first_def->next_def->next_def->frag_def->name != NULL);
1705 TEST_ABRT(doc->first_def->next_def->next_def->frag_def->name->name != NULL);
1706 TEST_CONT(doc->first_def->next_def->next_def->frag_def->name->name->token_type == 'a');
1707 TEST_STRG(doc->first_def->next_def->next_def->frag_def->name->name->token_string, "standardProfilePic");
1708 TEST_ABRT(doc->first_def->next_def->next_def->frag_def->type_cond != NULL);
1709 TEST_ABRT(doc->first_def->next_def->next_def->frag_def->type_cond->named_type != NULL);
1710 TEST_ABRT(doc->first_def->next_def->next_def->frag_def->type_cond->named_type->name != NULL);
1711 TEST_CONT(doc->first_def->next_def->next_def->frag_def->type_cond->named_type->name->token_type == 'a');
1712 TEST_STRG(doc->first_def->next_def->next_def->frag_def->type_cond->named_type->name->token_string, "User");
1713 TEST_CONT(doc->first_def->next_def->next_def->frag_def->directives == NULL);
1714 TEST_ABRT(doc->first_def->next_def->next_def->frag_def->sel_set != NULL);
1715 TEST_ABRT(doc->first_def->next_def->next_def->frag_def->sel_set->first != NULL);
1716 TEST_CONT(doc->first_def->next_def->next_def->frag_def->sel_set->first->next == NULL);
1717 tokens = tal_free(tokens);
1720 int check_example_21(char *source) {
1721 struct list_head *tokens;
1722 struct graphql_token *tok;
1725 if (!mute) printf("// Example No. 21\n");
1728 query FragmentTyping {\n\
1729 profiles(handles: [\"zuck\", \"coca-cola\"]) {\n\
1736 fragment userFragment on User {\n\
1742 fragment pageFragment on Page {\n\
1750 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
1751 TEST_ABRT(listlen(tokens) == 40);
1752 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1753 TEST_STRG(tok->token_string, "query");
1754 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1755 TEST_STRG(tok->token_string, "FragmentTyping");
1756 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
1757 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1758 TEST_STRG(tok->token_string, "profiles");
1759 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '(');
1760 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1761 TEST_STRG(tok->token_string, "handles");
1762 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
1763 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '[');
1764 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 's');
1765 TEST_STRG(tok->token_string, "zuck");
1766 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 's');
1767 TEST_STRG(tok->token_string, "coca-cola");
1768 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ']');
1769 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ')');
1770 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
1771 tokens = tal_free(tokens);
1774 struct graphql_executable_document *doc;
1776 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
1777 TEST_CONT((e = graphql_parse(tokens, &doc)) == NULL);
1778 if (e) printf("%s\n", e);
1779 TEST_ABRT(doc != NULL);
1780 TEST_ABRT(doc->first_def != NULL);
1781 TEST_ABRT(doc->first_def->op_def != NULL);
1782 TEST_CONT(doc->first_def->frag_def == NULL);
1783 TEST_ABRT(doc->first_def->op_def->sel_set != NULL);
1784 TEST_ABRT(doc->first_def->op_def->sel_set->first != NULL);
1785 TEST_CONT(doc->first_def->op_def->sel_set->first->next == NULL);
1786 TEST_ABRT(doc->first_def->op_def->sel_set->first->field != NULL);
1787 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set != NULL);
1788 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first != NULL);
1789 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field != NULL);
1790 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set == NULL);
1791 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->frag_spread == NULL);
1792 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->inline_frag == NULL);
1793 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next != NULL);
1794 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field == NULL);
1795 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->frag_spread != NULL);
1796 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->frag_spread->name != NULL);
1797 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->frag_spread->name->name != NULL);
1798 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->frag_spread->name->name->token_type == 'a');
1799 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->frag_spread->name->name->token_string, "userFragment");
1800 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->inline_frag == NULL);
1801 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next != NULL);
1802 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field == NULL);
1803 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->frag_spread != NULL);
1804 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->frag_spread->name != NULL);
1805 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->frag_spread->name->name != NULL);
1806 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->frag_spread->name->name->token_type == 'a');
1807 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->frag_spread->name->name->token_string, "pageFragment");
1808 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag == NULL);
1809 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next == NULL);
1810 TEST_ABRT(doc->first_def->next_def != NULL);
1811 TEST_CONT(doc->first_def->next_def->op_def == NULL);
1812 TEST_ABRT(doc->first_def->next_def->frag_def != NULL);
1813 TEST_ABRT(doc->first_def->next_def->frag_def->name != NULL);
1814 TEST_ABRT(doc->first_def->next_def->frag_def->name->name != NULL);
1815 TEST_CONT(doc->first_def->next_def->frag_def->name->name->token_type == 'a');
1816 TEST_STRG(doc->first_def->next_def->frag_def->name->name->token_string, "userFragment");
1817 TEST_ABRT(doc->first_def->next_def->frag_def->type_cond != NULL);
1818 TEST_ABRT(doc->first_def->next_def->frag_def->type_cond->named_type != NULL);
1819 TEST_ABRT(doc->first_def->next_def->frag_def->type_cond->named_type->name != NULL);
1820 TEST_CONT(doc->first_def->next_def->frag_def->type_cond->named_type->name->token_type == 'a');
1821 TEST_STRG(doc->first_def->next_def->frag_def->type_cond->named_type->name->token_string, "User");
1822 TEST_CONT(doc->first_def->next_def->frag_def->directives == NULL);
1823 TEST_ABRT(doc->first_def->next_def->frag_def->sel_set != NULL);
1824 TEST_ABRT(doc->first_def->next_def->frag_def->sel_set->first != NULL);
1825 TEST_ABRT(doc->first_def->next_def->frag_def->sel_set->first->field != NULL);
1826 TEST_CONT(doc->first_def->next_def->frag_def->sel_set->first->frag_spread == NULL);
1827 TEST_CONT(doc->first_def->next_def->frag_def->sel_set->first->inline_frag == NULL);
1828 TEST_ABRT(doc->first_def->next_def->frag_def->sel_set->first->next == NULL);
1829 TEST_ABRT(doc->first_def->next_def->next_def != NULL);
1830 TEST_CONT(doc->first_def->next_def->next_def->next_def == NULL);
1831 TEST_CONT(doc->first_def->next_def->next_def->op_def == NULL);
1832 TEST_ABRT(doc->first_def->next_def->next_def->frag_def != NULL);
1833 TEST_ABRT(doc->first_def->next_def->next_def->frag_def->name != NULL);
1834 TEST_ABRT(doc->first_def->next_def->next_def->frag_def->name->name != NULL);
1835 TEST_CONT(doc->first_def->next_def->next_def->frag_def->name->name->token_type == 'a');
1836 TEST_STRG(doc->first_def->next_def->next_def->frag_def->name->name->token_string, "pageFragment");
1837 TEST_ABRT(doc->first_def->next_def->next_def->frag_def->type_cond != NULL);
1838 TEST_ABRT(doc->first_def->next_def->next_def->frag_def->type_cond->named_type != NULL);
1839 TEST_ABRT(doc->first_def->next_def->next_def->frag_def->type_cond->named_type->name != NULL);
1840 TEST_CONT(doc->first_def->next_def->next_def->frag_def->type_cond->named_type->name->token_type == 'a');
1841 TEST_STRG(doc->first_def->next_def->next_def->frag_def->type_cond->named_type->name->token_string, "Page");
1842 TEST_CONT(doc->first_def->next_def->next_def->frag_def->directives == NULL);
1843 TEST_ABRT(doc->first_def->next_def->next_def->frag_def->sel_set != NULL);
1844 TEST_ABRT(doc->first_def->next_def->next_def->frag_def->sel_set->first != NULL);
1845 TEST_CONT(doc->first_def->next_def->next_def->frag_def->sel_set->first->next == NULL);
1846 tokens = tal_free(tokens);
1849 int check_example_23(char *source) {
1850 struct list_head *tokens;
1851 struct graphql_token *tok;
1854 if (!mute) printf("// Example No. 23\n");
1857 query inlineFragmentTyping {\n\
1858 profiles(handles: [\"zuck\", \"coca-cola\"]) {\n\
1875 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
1876 TEST_ABRT(listlen(tokens) == 34);
1877 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1878 TEST_STRG(tok->token_string, "query");
1879 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1880 TEST_STRG(tok->token_string, "inlineFragmentTyping");
1881 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
1882 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1883 TEST_STRG(tok->token_string, "profiles");
1884 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '(');
1885 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1886 TEST_STRG(tok->token_string, "handles");
1887 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
1888 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '[');
1889 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 's');
1890 TEST_STRG(tok->token_string, "zuck");
1891 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 's');
1892 TEST_STRG(tok->token_string, "coca-cola");
1893 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ']');
1894 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ')');
1895 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
1896 tokens = tal_free(tokens);
1899 struct graphql_executable_document *doc;
1901 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
1902 TEST_CONT((e = graphql_parse(tokens, &doc)) == NULL);
1903 if (e) printf("%s\n", e);
1904 TEST_ABRT(doc != NULL);
1905 TEST_ABRT(doc->first_def != NULL);
1906 TEST_ABRT(doc->first_def->op_def != NULL);
1907 TEST_CONT(doc->first_def->frag_def == NULL);
1908 TEST_ABRT(doc->first_def->op_def->sel_set != NULL);
1909 TEST_ABRT(doc->first_def->op_def->sel_set->first != NULL);
1910 TEST_CONT(doc->first_def->op_def->sel_set->first->next == NULL);
1911 TEST_ABRT(doc->first_def->op_def->sel_set->first->field != NULL);
1912 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set != NULL);
1913 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first != NULL);
1914 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field != NULL);
1915 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set == NULL);
1916 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->frag_spread == NULL);
1917 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->inline_frag == NULL);
1918 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next != NULL);
1919 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field == NULL);
1920 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->frag_spread == NULL);
1921 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->inline_frag != NULL);
1922 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->inline_frag->directives == NULL);
1923 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->inline_frag->type_cond != NULL);
1924 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->inline_frag->type_cond->named_type->name != NULL);
1925 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->inline_frag->type_cond->named_type->name->token_type == 'a');
1926 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->inline_frag->type_cond->named_type->name->token_string, "User");
1927 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->inline_frag->sel_set != NULL);
1928 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->inline_frag->sel_set->first != NULL);
1929 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->inline_frag->sel_set->first->field != NULL);
1930 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->inline_frag->sel_set->first->frag_spread == NULL);
1931 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->inline_frag->sel_set->first->inline_frag == NULL);
1932 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->inline_frag->sel_set->first->next == NULL);
1933 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next != NULL);
1934 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field == NULL);
1935 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->frag_spread == NULL);
1936 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag != NULL);
1937 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->directives == NULL);
1938 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->type_cond != NULL);
1939 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->type_cond->named_type->name != NULL);
1940 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->type_cond->named_type->name->token_type == 'a');
1941 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->type_cond->named_type->name->token_string, "Page");
1942 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->sel_set != NULL);
1943 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->sel_set->first != NULL);
1944 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->sel_set->first->field != NULL);
1945 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->sel_set->first->frag_spread == NULL);
1946 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->sel_set->first->inline_frag == NULL);
1947 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->sel_set->first->next == NULL);
1948 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next == NULL);
1949 TEST_CONT(doc->first_def->next_def == NULL);
1950 tokens = tal_free(tokens);
1953 int check_example_24(char *source) {
1954 struct list_head *tokens;
1955 struct graphql_token *tok;
1958 if (!mute) printf("// Example No. 24\n");
1961 query inlineFragmentNoType($expandedInfo: Boolean) {\n\
1962 user(handle: \"zuck\") {\n\
1965 ... @include(if: $expandedInfo) {\n\
1975 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
1976 TEST_ABRT(listlen(tokens) == 34);
1977 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1978 TEST_STRG(tok->token_string, "query");
1979 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1980 TEST_STRG(tok->token_string, "inlineFragmentNoType");
1981 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '(');
1982 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '$');
1983 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1984 TEST_STRG(tok->token_string, "expandedInfo");
1985 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
1986 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1987 TEST_STRG(tok->token_string, "Boolean");
1988 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ')');
1989 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
1990 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1991 TEST_STRG(tok->token_string, "user");
1992 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '(');
1993 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
1994 TEST_STRG(tok->token_string, "handle");
1995 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
1996 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 's');
1997 TEST_STRG(tok->token_string, "zuck");
1998 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ')');
1999 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
2000 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2001 TEST_STRG(tok->token_string, "id");
2002 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2003 TEST_STRG(tok->token_string, "name");
2004 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 0x2026);
2005 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '@');
2006 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2007 TEST_STRG(tok->token_string, "include");
2008 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '(');
2009 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2010 TEST_STRG(tok->token_string, "if");
2011 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
2012 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '$');
2013 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2014 TEST_STRG(tok->token_string, "expandedInfo");
2015 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ')');
2016 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
2017 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2018 TEST_STRG(tok->token_string, "firstName");
2019 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2020 TEST_STRG(tok->token_string, "lastName");
2021 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2022 TEST_STRG(tok->token_string, "birthday");
2023 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
2024 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
2025 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
2026 tokens = tal_free(tokens);
2029 struct graphql_executable_document *doc;
2030 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
2031 TEST_CONT(graphql_parse(tokens, &doc) == NULL);
2032 TEST_ABRT(doc != NULL);
2033 TEST_ABRT(doc->first_def != NULL);
2034 TEST_ABRT(doc->first_def->op_def != NULL);
2035 TEST_CONT(doc->first_def->frag_def == NULL);
2036 TEST_ABRT(doc->first_def->op_def->sel_set != NULL);
2037 TEST_ABRT(doc->first_def->op_def->sel_set->first != NULL);
2038 TEST_CONT(doc->first_def->op_def->sel_set->first->next == NULL);
2039 TEST_ABRT(doc->first_def->op_def->sel_set->first->field != NULL);
2040 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set != NULL);
2041 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first != NULL);
2042 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field != NULL);
2043 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set == NULL);
2044 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->frag_spread == NULL);
2045 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->inline_frag == NULL);
2046 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next != NULL);
2047 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field != NULL);
2048 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->frag_spread == NULL);
2049 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->inline_frag == NULL);
2050 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next != NULL);
2051 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field == NULL);
2052 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->frag_spread == NULL);
2053 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag != NULL);
2054 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->type_cond == NULL);
2055 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->directives != NULL);
2056 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->directives->first != NULL);
2057 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->directives->first->next == NULL);
2058 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->directives->first->name != NULL);
2059 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->directives->first->name->token_type == 'a');
2060 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->directives->first->name->token_string, "include");
2061 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->directives->first->args != NULL);
2062 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->directives->first->args->first != NULL);
2063 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->directives->first->args->first->next == NULL);
2064 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->directives->first->args->first->name != NULL);
2065 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->directives->first->args->first->name->token_type == 'a');
2066 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->directives->first->args->first->name->token_string, "if");
2067 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->directives->first->args->first->val != NULL);
2068 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->directives->first->args->first->val->int_val == NULL);
2069 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->directives->first->args->first->val->float_val == NULL);
2070 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->directives->first->args->first->val->bool_val == NULL);
2071 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->directives->first->args->first->val->str_val == NULL);
2072 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->directives->first->args->first->val->null_val == NULL);
2073 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->directives->first->args->first->val->enum_val == NULL);
2074 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->directives->first->args->first->val->list_val == NULL);
2075 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->directives->first->args->first->val->obj_val == NULL);
2076 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->directives->first->args->first->val->var != NULL);
2077 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->directives->first->args->first->val->var->name != NULL);
2078 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->directives->first->args->first->val->var->name->token_type == 'a');
2079 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->directives->first->args->first->val->var->name->token_string, "expandedInfo");
2080 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->sel_set != NULL);
2081 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->sel_set->first != NULL);
2082 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->sel_set->first->field != NULL);
2083 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->sel_set->first->frag_spread == NULL);
2084 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->sel_set->first->inline_frag == NULL);
2085 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->sel_set->first->next != NULL);
2086 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->sel_set->first->next->next != NULL);
2087 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag->sel_set->first->next->next->next == NULL);
2088 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next == NULL);
2089 TEST_CONT(doc->first_def->next_def == NULL);
2090 tokens = tal_free(tokens);
2093 int check_int_value(char *source, int int_value) {
2094 struct list_head *tokens;
2095 struct graphql_token *tok;
2098 if (!mute) printf("// Int Value Range Check on %d\n", int_value);
2109 sprintf(buf, "%d", int_value);
2112 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
2113 TEST_ABRT(listlen(tokens) == 11);
2114 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
2115 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2116 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '(');
2117 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2118 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
2119 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'i');
2120 TEST_STRG(tok->token_string, buf);
2121 TEST_CONT(tok->source_line == 2);
2122 TEST_CONT(tok->source_column == 12);
2123 TEST_CONT(tok->source_len == strlen(buf));
2124 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ')');
2125 TEST_CONT(tok->source_line == 2);
2126 TEST_CONT(tok->source_column == 12 + strlen(buf));
2127 TEST_CONT(tok->source_len == 1);
2128 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
2129 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2130 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
2131 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
2132 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok == NULL);
2133 tokens = tal_free(tokens);
2136 struct graphql_executable_document *doc;
2137 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
2138 TEST_CONT(graphql_parse(tokens, &doc) == NULL);
2139 TEST_ABRT(doc != NULL);
2140 TEST_ABRT(doc->first_def != NULL);
2141 TEST_ABRT(doc->first_def->op_def != NULL);
2142 TEST_CONT(doc->first_def->next_def == NULL);
2143 TEST_CONT(doc->first_def->frag_def == NULL);
2144 TEST_ABRT(doc->first_def->op_def->sel_set != NULL);
2145 TEST_ABRT(doc->first_def->op_def->sel_set->first != NULL);
2146 TEST_CONT(doc->first_def->op_def->sel_set->first->next == NULL);
2147 TEST_ABRT(doc->first_def->op_def->sel_set->first->field != NULL);
2148 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args != NULL);
2149 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first != NULL);
2150 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->next == NULL);
2151 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val != NULL);
2152 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val != NULL);
2153 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val->val != NULL);
2154 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val->val->token_type == 'i');
2155 TEST_STRG(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val->val->token_string, buf);
2156 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set != NULL);
2157 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first != NULL);
2158 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next == NULL);
2159 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field != NULL);
2160 tokens = tal_free(tokens);
2163 int check_invalid_int_values(char *source) {
2164 struct list_head *tokens;
2165 struct graphql_token *tok;
2168 if (!mute) printf("// Invalid Int Values\n");
2170 char *bad_values[] = {"00", "-00", "+1", "1.", "1a", "1e", "0x123", "123L", 0};
2172 for (int i=0; bad_values[i]; i++) {
2182 TEST_CONT(graphql_lex(source, NULL, &tokens) != NULL);
2183 TEST_ABRT(listlen(tokens) == 5);
2184 tokens = tal_free(tokens);
2186 // No need to test parser when lexer fails.
2190 int check_float_value(char *source, float float_value, const char *format) {
2191 struct list_head *tokens;
2192 struct graphql_token *tok;
2195 if (!mute) printf("// Float Value Range Check on %f\n", float_value);
2205 sprintf(source, buf, float_value);
2206 sprintf(buf, format, float_value);
2209 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
2210 TEST_ABRT(listlen(tokens) == 11);
2211 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
2212 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2213 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '(');
2214 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2215 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
2216 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'f');
2217 TEST_STRG(tok->token_string, buf);
2218 TEST_CONT(tok->source_line == 2);
2219 TEST_CONT(tok->source_column == 12);
2220 TEST_CONT(tok->source_len == strlen(buf));
2221 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ')');
2222 TEST_CONT(tok->source_line == 2);
2223 TEST_CONT(tok->source_column == 12 + strlen(buf));
2224 TEST_CONT(tok->source_len == 1);
2225 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
2226 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2227 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
2228 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
2229 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok == NULL);
2230 tokens = tal_free(tokens);
2233 struct graphql_executable_document *doc;
2234 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
2235 TEST_CONT(graphql_parse(tokens, &doc) == NULL);
2236 TEST_ABRT(doc != NULL);
2237 TEST_ABRT(doc->first_def != NULL);
2238 TEST_ABRT(doc->first_def->op_def != NULL);
2239 TEST_CONT(doc->first_def->next_def == NULL);
2240 TEST_CONT(doc->first_def->frag_def == NULL);
2241 TEST_ABRT(doc->first_def->op_def->sel_set != NULL);
2242 TEST_ABRT(doc->first_def->op_def->sel_set->first != NULL);
2243 TEST_CONT(doc->first_def->op_def->sel_set->first->next == NULL);
2244 TEST_ABRT(doc->first_def->op_def->sel_set->first->field != NULL);
2245 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args != NULL);
2246 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first != NULL);
2247 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->next == NULL);
2248 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val != NULL);
2249 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->float_val != NULL);
2250 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->float_val->val != NULL);
2251 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->float_val->val->token_type == 'f');
2252 TEST_STRG(doc->first_def->op_def->sel_set->first->field->args->first->val->float_val->val->token_string, buf);
2253 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set != NULL);
2254 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first != NULL);
2255 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next == NULL);
2256 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field != NULL);
2257 tokens = tal_free(tokens);
2260 int check_valid_float_values(char *source) {
2261 struct list_head *tokens;
2262 struct graphql_token *tok;
2265 if (!mute) printf("// Valid Float Values\n");
2267 char *good_values[] = {"1.0", "1e50", "6.0221413e23", "1.23", 0};
2269 for (int i=0; good_values[i]; i++) {
2279 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
2280 TEST_ABRT(listlen(tokens) == 11);
2281 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
2282 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2283 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '(');
2284 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2285 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
2286 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'f');
2287 TEST_STRG(tok->token_string, good_values[i]);
2288 TEST_CONT(tok->source_line == 2);
2289 TEST_CONT(tok->source_column == 12);
2290 TEST_CONT(tok->source_len == strlen(good_values[i]));
2291 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ')');
2292 TEST_CONT(tok->source_line == 2);
2293 TEST_CONT(tok->source_column == 12 + strlen(good_values[i]));
2294 TEST_CONT(tok->source_len == 1);
2295 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
2296 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2297 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
2298 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
2299 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok == NULL);
2300 tokens = tal_free(tokens);
2303 struct graphql_executable_document *doc;
2304 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
2305 TEST_CONT(graphql_parse(tokens, &doc) == NULL);
2306 TEST_ABRT(doc != NULL);
2307 TEST_ABRT(doc->first_def != NULL);
2308 TEST_ABRT(doc->first_def->op_def != NULL);
2309 TEST_CONT(doc->first_def->next_def == NULL);
2310 TEST_CONT(doc->first_def->frag_def == NULL);
2311 TEST_ABRT(doc->first_def->op_def->sel_set != NULL);
2312 TEST_ABRT(doc->first_def->op_def->sel_set->first != NULL);
2313 TEST_CONT(doc->first_def->op_def->sel_set->first->next == NULL);
2314 TEST_ABRT(doc->first_def->op_def->sel_set->first->field != NULL);
2315 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args != NULL);
2316 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first != NULL);
2317 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->next == NULL);
2318 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val != NULL);
2319 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->float_val != NULL);
2320 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->float_val->val != NULL);
2321 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->float_val->val->token_type == 'f');
2322 TEST_STRG(doc->first_def->op_def->sel_set->first->field->args->first->val->float_val->val->token_string, good_values[i]);
2323 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set != NULL);
2324 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first != NULL);
2325 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next == NULL);
2326 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field != NULL);
2327 tokens = tal_free(tokens);
2331 int check_invalid_float_values(char *source) {
2332 struct list_head *tokens;
2333 struct graphql_token *tok;
2336 if (!mute) printf("// Invalid Float Values\n");
2338 char *bad_values[] = {"00.0", "-00.0", "00e1", "1.23.4", "0x1.2p3", 0};
2340 for (int i=0; bad_values[i]; i++) {
2350 TEST_CONT(graphql_lex(source, NULL, &tokens) != NULL);
2351 TEST_ABRT(listlen(tokens) == 5);
2352 tokens = tal_free(tokens);
2354 // No need to test parser when lexer fails.
2358 int check_boolean_values(char *source) {
2359 struct list_head *tokens;
2360 struct graphql_token *tok;
2363 if (!mute) printf("// Boolean Values\n");
2365 char *good_values[] = {"true", "false", 0};
2367 for (int i=0; good_values[i]; i++) {
2377 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
2378 TEST_ABRT(listlen(tokens) == 11);
2379 tokens = tal_free(tokens);
2382 struct graphql_executable_document *doc;
2383 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
2384 TEST_CONT(graphql_parse(tokens, &doc) == NULL);
2385 TEST_ABRT(doc != NULL);
2386 TEST_ABRT(doc->first_def != NULL);
2387 TEST_ABRT(doc->first_def->op_def != NULL);
2388 TEST_CONT(doc->first_def->next_def == NULL);
2389 TEST_CONT(doc->first_def->frag_def == NULL);
2390 TEST_ABRT(doc->first_def->op_def->sel_set != NULL);
2391 TEST_ABRT(doc->first_def->op_def->sel_set->first != NULL);
2392 TEST_CONT(doc->first_def->op_def->sel_set->first->next == NULL);
2393 TEST_ABRT(doc->first_def->op_def->sel_set->first->field != NULL);
2394 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args != NULL);
2395 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first != NULL);
2396 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->next == NULL);
2397 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val != NULL);
2398 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->bool_val != NULL);
2399 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->bool_val->val != NULL);
2400 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->bool_val->val->token_type == 'a');
2401 TEST_STRG(doc->first_def->op_def->sel_set->first->field->args->first->val->bool_val->val->token_string, good_values[i]);
2402 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set != NULL);
2403 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first != NULL);
2404 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next == NULL);
2405 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field != NULL);
2406 tokens = tal_free(tokens);
2409 char *bad_values[] = {"True", "False", "TRUE", "FALSE", 0};
2411 for (int i=0; bad_values[i]; i++) {
2421 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
2422 TEST_ABRT(listlen(tokens) == 11);
2423 tokens = tal_free(tokens);
2425 // Test the parser (it will succeed in parsing the bad values as enum values, not boolean values).
2426 struct graphql_executable_document *doc;
2427 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
2428 TEST_CONT(graphql_parse(tokens, &doc) == NULL);
2429 TEST_ABRT(doc != NULL);
2430 TEST_ABRT(doc->first_def != NULL);
2431 TEST_ABRT(doc->first_def->op_def != NULL);
2432 TEST_CONT(doc->first_def->next_def == NULL);
2433 TEST_CONT(doc->first_def->frag_def == NULL);
2434 TEST_ABRT(doc->first_def->op_def->sel_set != NULL);
2435 TEST_ABRT(doc->first_def->op_def->sel_set->first != NULL);
2436 TEST_CONT(doc->first_def->op_def->sel_set->first->next == NULL);
2437 TEST_ABRT(doc->first_def->op_def->sel_set->first->field != NULL);
2438 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args != NULL);
2439 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first != NULL);
2440 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->next == NULL);
2441 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val != NULL);
2442 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->var == NULL);
2443 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val == NULL);
2444 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->float_val == NULL);
2445 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->bool_val == NULL);
2446 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->str_val == NULL);
2447 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->null_val == NULL);
2448 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->list_val == NULL);
2449 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->obj_val == NULL);
2450 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->enum_val != NULL);
2451 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->enum_val->val != NULL);
2452 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->enum_val->val->token_type == 'a');
2453 TEST_STRG(doc->first_def->op_def->sel_set->first->field->args->first->val->enum_val->val->token_string, bad_values[i]);
2454 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set != NULL);
2455 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first != NULL);
2456 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next == NULL);
2457 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field != NULL);
2458 tokens = tal_free(tokens);
2462 int check_string_value(char *source, const char *test_value, const char *expected_result) {
2463 struct list_head *tokens;
2464 struct graphql_token *tok;
2467 if (!mute) printf("// String Value Test: %s\n", test_value);
2477 bool block = (test_value[0]=='\"' && test_value[1]=='\"' && test_value[2]=='\"')? true: false;
2478 if (expected_result) {
2479 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
2480 TEST_ABRT(listlen(tokens) == 11);
2481 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
2482 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2483 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '(');
2484 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2485 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
2486 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 's');
2487 TEST_STRG(tok->token_string, expected_result);
2488 TEST_CONT(tok->source_line == 2);
2489 TEST_CONT(tok->source_column == 11 + (block? 3: 1));
2490 TEST_CONT(tok->source_len == strlen(test_value) - (block? 6: 2));
2491 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ')');
2492 TEST_CONT(tok->source_line == 2);
2493 TEST_CONT(tok->source_column == 11 + strlen(test_value));
2494 TEST_CONT(tok->source_len == 1);
2495 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
2496 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2497 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
2498 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
2499 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok == NULL);
2500 tokens = tal_free(tokens);
2502 // Test the parser (it will succeed in parsing the bad values as enum values, not boolean values).
2503 struct graphql_executable_document *doc;
2504 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
2505 TEST_CONT(graphql_parse(tokens, &doc) == NULL);
2506 TEST_ABRT(doc != NULL);
2507 TEST_ABRT(doc->first_def != NULL);
2508 TEST_ABRT(doc->first_def->op_def != NULL);
2509 TEST_CONT(doc->first_def->next_def == NULL);
2510 TEST_CONT(doc->first_def->frag_def == NULL);
2511 TEST_ABRT(doc->first_def->op_def->sel_set != NULL);
2512 TEST_ABRT(doc->first_def->op_def->sel_set->first != NULL);
2513 TEST_CONT(doc->first_def->op_def->sel_set->first->next == NULL);
2514 TEST_ABRT(doc->first_def->op_def->sel_set->first->field != NULL);
2515 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args != NULL);
2516 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first != NULL);
2517 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->next == NULL);
2518 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val != NULL);
2519 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->var == NULL);
2520 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val == NULL);
2521 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->float_val == NULL);
2522 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->bool_val == NULL);
2523 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->enum_val == NULL);
2524 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->null_val == NULL);
2525 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->list_val == NULL);
2526 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->obj_val == NULL);
2527 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->str_val != NULL);
2528 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->str_val->val != NULL);
2529 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->str_val->val->token_type == 's');
2530 TEST_STRG(doc->first_def->op_def->sel_set->first->field->args->first->val->str_val->val->token_string, expected_result);
2531 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set != NULL);
2532 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first != NULL);
2533 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next == NULL);
2534 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field != NULL);
2535 tokens = tal_free(tokens);
2537 TEST_CONT(graphql_lex(source, NULL, &tokens) != NULL);
2538 tokens = tal_free(tokens);
2542 int check_example_25_and_26(const char *source) {
2543 struct list_head *tokens;
2544 struct graphql_token *tok;
2547 if (!mute) printf("// Example No. 25 and 26\n");
2549 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
2550 while ((tok = list_pop(tokens, struct graphql_token, list)) && tok->token_type != 's') { }
2552 TEST_STRG(tok->token_string, "Hello,\n World!\n\nYours,\n GraphQL.");
2555 tokens = tal_free(tokens);
2558 struct graphql_executable_document *doc;
2559 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
2560 TEST_CONT(graphql_parse(tokens, &doc) == NULL);
2561 TEST_ABRT(doc != NULL);
2562 tokens = tal_free(tokens);
2565 int check_example_29(char *source) {
2566 struct list_head *tokens;
2567 struct graphql_token *tok;
2570 if (!mute) printf("// Example No. 29\n");
2580 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
2581 TEST_ABRT(listlen(tokens) == 9);
2582 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
2583 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2584 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '(');
2585 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2586 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
2587 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2588 TEST_STRG(tok->token_string, "null");
2589 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ')');
2590 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2591 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
2592 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok == NULL);
2593 tokens = tal_free(tokens);
2596 struct graphql_executable_document *doc;
2597 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
2598 TEST_ABRT(graphql_parse(tokens, &doc) == NULL);
2599 TEST_ABRT(doc != NULL);
2600 TEST_ABRT(doc->first_def != NULL);
2601 TEST_CONT(doc->first_def->next_def == NULL);
2602 TEST_CONT(doc->first_def->frag_def == NULL);
2603 TEST_ABRT(doc->first_def->op_def != NULL);
2604 TEST_CONT(doc->first_def->op_def->op_type == NULL);
2605 TEST_CONT(doc->first_def->op_def->op_name == NULL);
2606 TEST_CONT(doc->first_def->op_def->vars == NULL);
2607 TEST_CONT(doc->first_def->op_def->directives == NULL);
2608 TEST_ABRT(doc->first_def->op_def->sel_set != NULL);
2609 TEST_ABRT(doc->first_def->op_def->sel_set->first != NULL);
2610 TEST_CONT(doc->first_def->op_def->sel_set->first->frag_spread == NULL);
2611 TEST_CONT(doc->first_def->op_def->sel_set->first->inline_frag == NULL);
2612 TEST_ABRT(doc->first_def->op_def->sel_set->first->field != NULL);
2613 TEST_CONT(doc->first_def->op_def->sel_set->first->field->alias == NULL);
2614 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->name != NULL);
2615 TEST_CONT(doc->first_def->op_def->sel_set->first->field->name->token_type == 'a');
2616 TEST_STRG(doc->first_def->op_def->sel_set->first->field->name->token_string, "field");
2617 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args != NULL);
2618 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first != NULL);
2619 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->next == NULL);
2620 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->name != NULL);
2621 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->name->token_type == 'a');
2622 TEST_STRG(doc->first_def->op_def->sel_set->first->field->args->first->name->token_string, "arg");
2623 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val != NULL);
2624 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->var == NULL);
2625 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val == NULL);
2626 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->float_val == NULL);
2627 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->bool_val == NULL);
2628 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->enum_val == NULL);
2629 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->list_val == NULL);
2630 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->obj_val == NULL);
2631 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->str_val == NULL);
2632 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->null_val != NULL);
2633 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->null_val->val != NULL);
2634 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->null_val->val->token_type == 'a');
2635 TEST_STRG(doc->first_def->op_def->sel_set->first->field->args->first->val->null_val->val->token_string, "null");
2636 TEST_CONT(doc->first_def->op_def->sel_set->first->field->directives == NULL);
2637 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set == NULL);
2638 TEST_ABRT(doc->first_def->op_def->sel_set->first->next != NULL);
2639 TEST_CONT(doc->first_def->op_def->sel_set->first->next->frag_spread == NULL);
2640 TEST_CONT(doc->first_def->op_def->sel_set->first->next->inline_frag == NULL);
2641 TEST_ABRT(doc->first_def->op_def->sel_set->first->next->field != NULL);
2642 TEST_CONT(doc->first_def->op_def->sel_set->first->next->field->alias == NULL);
2643 TEST_ABRT(doc->first_def->op_def->sel_set->first->next->field->name != NULL);
2644 TEST_CONT(doc->first_def->op_def->sel_set->first->next->field->name->token_type == 'a');
2645 TEST_STRG(doc->first_def->op_def->sel_set->first->next->field->name->token_string, "field");
2646 TEST_CONT(doc->first_def->op_def->sel_set->first->next->field->args == NULL);
2647 tokens = tal_free(tokens);
2650 int check_example_30_and_31(const char *source) {
2651 struct list_head *tokens;
2652 struct graphql_token *tok;
2655 if (!mute) printf("// Example No. 30 and 31\n");
2657 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
2658 TEST_ABRT(listlen(tokens) == 15);
2659 while ((tok = list_pop(tokens, struct graphql_token, list)) && !(tok->token_type == 'a' && tok->token_string != NULL && streq(tok->token_string, "lat"))) { }
2662 TEST_CONT(tok->token_type == 'a');
2663 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
2664 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'f');
2665 TEST_STRG(tok->token_string, "-53.211");
2667 tokens = tal_free(tokens);
2669 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
2670 while ((tok = list_pop(tokens, struct graphql_token, list)) && !(tok->token_type == 'a' && tok->token_string != NULL && streq(tok->token_string, "lon"))) { }
2673 TEST_CONT(tok->token_type == 'a');
2674 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
2675 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'f');
2676 TEST_STRG(tok->token_string, "12.43");
2678 tokens = tal_free(tokens);
2681 struct graphql_argument *arg;
2682 struct graphql_executable_document *doc;
2684 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
2685 TEST_CONT((e = graphql_parse(tokens, &doc)) == NULL);
2686 if (e) printf("%s\n", e);
2687 TEST_ABRT(doc != NULL);
2688 TEST_ABRT(doc->first_def != NULL);
2689 TEST_CONT(doc->first_def->next_def == NULL);
2690 TEST_CONT(doc->first_def->frag_def == NULL);
2691 TEST_ABRT(doc->first_def->op_def != NULL);
2692 TEST_CONT(doc->first_def->op_def->op_type == NULL);
2693 TEST_CONT(doc->first_def->op_def->op_name == NULL);
2694 TEST_CONT(doc->first_def->op_def->vars == NULL);
2695 TEST_CONT(doc->first_def->op_def->directives == NULL);
2696 TEST_ABRT(doc->first_def->op_def->sel_set != NULL);
2697 TEST_ABRT(doc->first_def->op_def->sel_set->first != NULL);
2698 TEST_CONT(doc->first_def->op_def->sel_set->first->next == NULL);
2699 TEST_CONT(doc->first_def->op_def->sel_set->first->frag_spread == NULL);
2700 TEST_CONT(doc->first_def->op_def->sel_set->first->inline_frag == NULL);
2701 TEST_ABRT(doc->first_def->op_def->sel_set->first->field != NULL);
2702 TEST_CONT(doc->first_def->op_def->sel_set->first->field->alias == NULL);
2703 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->name != NULL);
2704 TEST_CONT(doc->first_def->op_def->sel_set->first->field->name->token_type == 'a');
2705 TEST_STRG(doc->first_def->op_def->sel_set->first->field->name->token_string, "nearestThing");
2706 TEST_CONT(doc->first_def->op_def->sel_set->first->field->directives == NULL);
2707 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set == NULL);
2708 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args != NULL);
2709 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first != NULL);
2710 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->next == NULL);
2711 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->name != NULL);
2712 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->name->token_type == 'a');
2713 TEST_STRG(doc->first_def->op_def->sel_set->first->field->args->first->name->token_string, "location");
2714 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val != NULL);
2715 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->var == NULL);
2716 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val == NULL);
2717 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->float_val == NULL);
2718 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->bool_val == NULL);
2719 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->enum_val == NULL);
2720 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->list_val == NULL);
2721 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->null_val == NULL);
2722 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->str_val == NULL);
2723 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->obj_val != NULL);
2724 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->obj_val->first != NULL);
2725 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->obj_val->first->name != NULL);
2726 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->obj_val->first->name->token_type == 'a');
2727 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->obj_val->first->val != NULL);
2728 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->obj_val->first->val->float_val != NULL);
2729 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->obj_val->first->val->float_val->val != NULL);
2730 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->obj_val->first->val->float_val->val->token_type == 'f');
2731 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->obj_val->first->next != NULL);
2732 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->obj_val->first->next->name != NULL);
2733 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->obj_val->first->next->name->token_type == 'a');
2734 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->obj_val->first->next->val != NULL);
2735 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->obj_val->first->next->val->float_val != NULL);
2736 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->obj_val->first->next->val->float_val->val != NULL);
2737 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->obj_val->first->next->val->float_val->val->token_type == 'f');
2738 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->obj_val->first->next->next == NULL);
2739 tokens = tal_free(tokens);
2742 int check_example_32(char *source) {
2743 struct list_head *tokens;
2744 struct graphql_token *tok;
2747 if (!mute) printf("// Example No. 32\n");
2750 query getZuckProfile($devicePicSize: Int) {\n\
2754 profilePic(size: $devicePicSize)\n\
2760 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
2761 TEST_ABRT(listlen(tokens) == 27);
2762 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2763 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2764 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '(');
2765 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '$');
2766 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2767 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
2768 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2769 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ')');
2770 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
2771 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2772 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '(');
2773 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2774 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
2775 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'i');
2776 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ')');
2777 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
2778 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2779 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2780 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2781 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '(');
2782 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2783 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
2784 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '$');
2785 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2786 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ')');
2787 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
2788 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
2789 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok == NULL);
2790 tokens = tal_free(tokens);
2793 struct graphql_executable_document *doc;
2794 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
2795 TEST_ABRT(graphql_parse(tokens, &doc) == NULL);
2796 TEST_ABRT(doc != NULL);
2797 TEST_ABRT(doc->first_def != NULL);
2798 TEST_CONT(doc->first_def->next_def == NULL);
2799 TEST_CONT(doc->first_def->frag_def == NULL);
2800 TEST_ABRT(doc->first_def->op_def != NULL);
2801 TEST_ABRT(doc->first_def->op_def->op_type != NULL);
2802 TEST_ABRT(doc->first_def->op_def->op_type->op_type != NULL);
2803 TEST_CONT(doc->first_def->op_def->op_type->op_type->token_type == 'a');
2804 TEST_STRG(doc->first_def->op_def->op_type->op_type->token_string, "query");
2805 TEST_CONT(doc->first_def->op_def->op_name != NULL);
2806 TEST_CONT(doc->first_def->op_def->op_name->token_type == 'a');
2807 TEST_STRG(doc->first_def->op_def->op_name->token_string, "getZuckProfile");
2808 TEST_ABRT(doc->first_def->op_def->vars != NULL);
2809 TEST_ABRT(doc->first_def->op_def->vars->first != NULL);
2810 TEST_CONT(doc->first_def->op_def->vars->first->next == NULL);
2811 TEST_ABRT(doc->first_def->op_def->vars->first->var != NULL);
2812 TEST_ABRT(doc->first_def->op_def->vars->first->var->name != NULL);
2813 TEST_CONT(doc->first_def->op_def->vars->first->var->name->token_type == 'a');
2814 TEST_STRG(doc->first_def->op_def->vars->first->var->name->token_string, "devicePicSize");
2815 TEST_ABRT(doc->first_def->op_def->vars->first->type != NULL);
2816 // TEST_CONT(doc->first_def->op_def->vars->first->type->list == NULL);
2817 // TEST_CONT(doc->first_def->op_def->vars->first->type->non_null == NULL);
2818 TEST_ABRT(doc->first_def->op_def->vars->first->type->named != NULL);
2819 TEST_ABRT(doc->first_def->op_def->vars->first->type->named->name != NULL);
2820 TEST_CONT(doc->first_def->op_def->vars->first->type->named->name->token_type == 'a');
2821 TEST_STRG(doc->first_def->op_def->vars->first->type->named->name->token_string, "Int");
2822 TEST_CONT(doc->first_def->op_def->vars->first->default_val == NULL);
2823 TEST_CONT(doc->first_def->op_def->vars->first->directives == NULL);
2824 TEST_CONT(doc->first_def->op_def->directives == NULL);
2825 TEST_ABRT(doc->first_def->op_def->sel_set != NULL);
2826 TEST_ABRT(doc->first_def->op_def->sel_set->first != NULL);
2827 TEST_CONT(doc->first_def->op_def->sel_set->first->next == NULL);
2828 TEST_CONT(doc->first_def->op_def->sel_set->first->frag_spread == NULL);
2829 TEST_CONT(doc->first_def->op_def->sel_set->first->inline_frag == NULL);
2830 TEST_ABRT(doc->first_def->op_def->sel_set->first->field != NULL);
2831 TEST_CONT(doc->first_def->op_def->sel_set->first->field->alias == NULL);
2832 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->name != NULL);
2833 TEST_CONT(doc->first_def->op_def->sel_set->first->field->name->token_type == 'a');
2834 TEST_STRG(doc->first_def->op_def->sel_set->first->field->name->token_string, "user");
2835 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args != NULL);
2836 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first != NULL);
2837 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->next == NULL);
2838 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->name != NULL);
2839 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->name->token_type == 'a');
2840 TEST_STRG(doc->first_def->op_def->sel_set->first->field->args->first->name->token_string, "id");
2841 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val != NULL);
2842 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val != NULL);
2843 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val->val != NULL);
2844 TEST_CONT(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val->val->token_type == 'i');
2845 TEST_STRG(doc->first_def->op_def->sel_set->first->field->args->first->val->int_val->val->token_string, "4");
2846 TEST_CONT(doc->first_def->op_def->sel_set->first->field->directives == NULL);
2847 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set != NULL);
2848 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first != NULL);
2849 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->frag_spread == NULL);
2850 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->inline_frag == NULL);
2851 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field != NULL);
2852 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->alias == NULL);
2853 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->name != NULL);
2854 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->name->token_type == 'a');
2855 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->name->token_string, "id");
2856 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->args == NULL);
2857 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->directives == NULL);
2858 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->field->sel_set == NULL);
2859 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next != NULL);
2860 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->frag_spread == NULL);
2861 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->inline_frag == NULL);
2862 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field != NULL);
2863 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->alias == NULL);
2864 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->name != NULL);
2865 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->name->token_type == 'a');
2866 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->name->token_string, "name");
2867 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->args == NULL);
2868 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->directives == NULL);
2869 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->field->sel_set == NULL);
2870 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next != NULL);
2871 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->next == NULL);
2872 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->frag_spread == NULL);
2873 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->inline_frag == NULL);
2874 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field != NULL);
2875 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->alias == NULL);
2876 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->name != NULL);
2877 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->name->token_type == 'a');
2878 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->name->token_string, "profilePic");
2879 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->directives == NULL);
2880 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->sel_set == NULL);
2881 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args != NULL);
2882 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first != NULL);
2883 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->next == NULL);
2884 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->name != NULL);
2885 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->name->token_type == 'a');
2886 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->name->token_string, "size");
2887 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->val != NULL);
2888 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->val->var != NULL);
2889 TEST_ABRT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->val->var->name != NULL);
2890 TEST_CONT(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->val->var->name->token_type == 'a');
2891 TEST_STRG(doc->first_def->op_def->sel_set->first->field->sel_set->first->next->next->field->args->first->val->var->name->token_string, "devicePicSize");
2892 tokens = tal_free(tokens);
2895 int check_example_34(char *source) {
2896 struct list_head *tokens;
2897 struct graphql_token *tok;
2900 if (!mute) printf("// Example No. 34\n");
2904 @addExternalFields(source: \"profiles\")\n\
2905 @excludeField(name: \"photo\") {\n\
2911 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
2912 TEST_ABRT(listlen(tokens) == 21);
2913 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2914 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2915 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '@');
2916 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2917 TEST_STRG(tok->token_string, "addExternalFields");
2918 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '(');
2919 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2920 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
2921 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 's');
2922 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ')');
2923 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '@');
2924 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2925 TEST_STRG(tok->token_string, "excludeField");
2926 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '(');
2927 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2928 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
2929 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 's');
2930 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ')');
2931 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
2932 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2933 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
2934 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2935 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
2936 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok == NULL);
2937 tokens = tal_free(tokens);
2939 // The type system is not yet implemented, so parsing will fail here.
2940 // This could be "phase 2" of this project.
2941 struct graphql_executable_document *doc;
2942 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
2943 TEST_CONT(graphql_parse(tokens, &doc) != NULL);
2944 tokens = tal_free(tokens);
2947 int check_example_35(char *source) {
2948 struct list_head *tokens;
2949 struct graphql_token *tok;
2952 if (!mute) printf("// Example No. 35\n");
2956 @excludeField(name: \"photo\")\n\
2957 @addExternalFields(source: \"profiles\") {\n\
2962 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
2963 TEST_ABRT(listlen(tokens) == 21);
2964 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2965 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2966 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '@');
2967 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2968 TEST_STRG(tok->token_string, "excludeField");
2969 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '(');
2970 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2971 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
2972 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 's');
2973 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ')');
2974 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '@');
2975 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2976 TEST_STRG(tok->token_string, "addExternalFields");
2977 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '(');
2978 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2979 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
2980 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 's');
2981 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ')');
2982 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '{');
2983 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2984 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == ':');
2985 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == 'a');
2986 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok->token_type == '}');
2987 tok = list_pop(tokens, struct graphql_token, list); TEST_CONT(tok == NULL);
2988 tokens = tal_free(tokens);
2990 // The type system is not yet implemented, so parsing will fail here.
2991 // This could be "phase 2" of this project.
2992 struct graphql_executable_document *doc;
2993 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
2994 TEST_CONT(graphql_parse(tokens, &doc) != NULL);
2995 tokens = tal_free(tokens);
2998 /* End of test case functions. */
3000 /* Beginning of main() test run to run all test cases. */
3004 printf("\nTesting GraphQL lexer/parser...\n");
3007 int prev_fail; // Used by RUNx macros.
3009 // Check the lexer with all valid line terminators.
3010 char *new_line = "\n";
3011 char *carriage_return = "\r";
3012 char *carriage_return_new_line = "\r\n";
3013 char *line_terminators[] = { new_line, carriage_return, carriage_return_new_line };
3014 for (int i=0; i<3; i++) {
3021 ", line_terminators[i], line_terminators[i], line_terminators[i], line_terminators[i], line_terminators[i]);
3023 RUN(check_example_3);
3026 RUN(check_example_5); // Parse a mutation operation and check results.
3028 RUN(check_example_6); // Parse an unnamed query and check results.
3030 RUN(check_example_7); // Parse multiple fields in a selection set and check results.
3031 RUN(check_example_8); // Parse complex data structure and check results.
3032 RUN(check_example_9); // Parse example of top-level fields and check results.
3033 RUN(check_example_10); // Parse example with parameterized field and check results.
3034 RUN(check_example_11); // Parse example with multiple field arguments and check results.
3036 // Parse examples of different parameter order and check for identical results.
3039 picture(width: 200, height: 100)\n\
3042 RUN(check_example_12_and_13);
3045 picture(height: 100, width: 200)\n\
3048 RUN(check_example_12_and_13);
3050 RUN(check_example_14); // Parse alias example and check results.
3051 RUN(check_example_16); // Parse a top-level-field alias example and check results.
3053 RUN(check_example_18); // Parse example and check results.
3055 RUN(check_example_19); // Parse fragment example and check results.
3056 RUN(check_example_20); // Parse another fragment example and check results.
3057 RUN(check_example_21); // Parse fragment typing example and check results.
3058 RUN(check_example_23); // Parse fragment typing example and check results.
3059 RUN(check_example_24); // Parse fragment typing example and check results.
3061 // Parse various int values and check results.
3062 for (int i= -15; i<= 15; i++) { RUN1(check_int_value, i); }
3063 for (int i= -32770; i<= -32765; i++) { RUN1(check_int_value, i); }
3064 for (int i= 32765; i<= 32770; i++) { RUN1(check_int_value, i); }
3065 for (int i=-2147483648; i<=-2147483645; i++) { RUN1(check_int_value, i); }
3066 for (int i= 2147483647; i>= 2147483645; i--) { RUN1(check_int_value, i); }
3067 RUN(check_invalid_int_values);
3069 // Parse various float values and check results.
3070 for (float i= -1.0; i<= 1.0; i+= 0.1) { RUN2(check_float_value, i, "%1.1f"); }
3071 for (float i=-327.70; i<=-327.65; i+= 0.01) { RUN2(check_float_value, i, "%1.2f"); }
3072 for (float i= 327.65; i<= 327.70; i+= 0.01) { RUN2(check_float_value, i, "%1.2f"); }
3073 for (float i= -5e-20; i<= -1e-20; i+= 1e-20) { RUN2(check_float_value, i, "%1.0e"); }
3074 for (float i= 5e-20; i>= 1e-20; i-= 1e-20) { RUN2(check_float_value, i, "%1.0e"); }
3075 for (float i= 5E+20; i>= 1E+20; i-= 1E+20) { RUN2(check_float_value, i, "%1.2E"); }
3076 for (float i=1.5E+20; i>=1.1E+20; i-=0.1E+20) { RUN2(check_float_value, i, "%1.1E"); }
3077 RUN(check_valid_float_values);
3078 RUN(check_invalid_float_values);
3080 RUN(check_boolean_values); // Parse boolean values and check results.
3082 // Parse various string values and check results.
3083 RUN2(check_string_value, "te^st", NULL ); // Missing quotes (the caret makes it an invalid token for testing purposes).
3084 RUN2(check_string_value, "\"te^st\"", "te^st" ); // A valid string.
3085 RUN2(check_string_value, "\"\"", "" ); // An empty string is valid.
3086 RUN2(check_string_value, "\"\"\"te^st\"\"\"", "te^st" ); // A block string.
3087 RUN2(check_string_value, "\"te\\st\"", NULL ); // Backslashes are normally invalid.
3088 RUN2(check_string_value, "\"te\nst\"", NULL ); // New-line characters are invalid except in block strings.
3089 RUN2(check_string_value, "\"te\rst\"", NULL ); // New-line characters are invalid except in block strings.
3090 RUN2(check_string_value, "\"\"\"te\nst\"\"\"", "te\nst" ); // New-line characters are valid in block strings.
3091 RUN2(check_string_value, "\"\"\"te\rst\"\"\"", "te\rst" ); // New-line characters are valid in block strings.
3092 RUN2(check_string_value, "\"te\"st\"", NULL ); // A quote in a string is invalid.
3093 RUN2(check_string_value, "\"te\\\"st\"", "te\"st" ); // ...unless it is escaped.
3094 RUN2(check_string_value, "\"\"\"te\"st\"\"\"", "te\"st" ); // A quote in a block string is valid.
3095 RUN2(check_string_value, "\"\"\"te\"\"st\"\"\"", "te\"\"st" ); // It is even valid to have two quotes in a block string.
3096 RUN2(check_string_value, "\"\"\"te\"\"\"st\"\"\"", NULL ); // Three quotes in a row are not allowed in a block string.
3097 RUN2(check_string_value, "\"\"\"te\\\"\"\"st\"\"\"", "te\"\"\"st" ); // ...unless escaped.
3098 RUN2(check_string_value, "\"te\\\"st\"", "te\"st" ); // Check escape sequence.
3099 RUN2(check_string_value, "\"te\\\\st\"", "te\\st" ); // Check escape sequence.
3100 RUN2(check_string_value, "\"te\\/st\"", "te/st" ); // Check escape sequence.
3101 RUN2(check_string_value, "\"te\\bst\"", "te\bst" ); // Check escape sequence.
3102 RUN2(check_string_value, "\"te\\fst\"", "te\fst" ); // Check escape sequence.
3103 RUN2(check_string_value, "\"te\\nst\"", "te\nst" ); // Check escape sequence.
3104 RUN2(check_string_value, "\"te\\rst\"", "te\rst" ); // Check escape sequence.
3105 RUN2(check_string_value, "\"te\\tst\"", "te\tst" ); // Check escape sequence.
3106 RUN2(check_string_value, "\"te\\vst\"", NULL ); // Invalid escape sequence.
3107 RUN2(check_string_value, "\"te\\033st\"", NULL ); // Invalid escape sequence.
3108 // Note: Unicode excape sequence is tested below.
3110 // This block string and this string should result in identical tokens.
3113 sendEmail(message: \"\"\"\n\
3122 RUN(check_example_25_and_26);
3125 sendEmail(message: \"Hello,\\n World!\\n\\nYours,\\n GraphQL.\")\n\
3128 RUN(check_example_25_and_26);
3130 // Check block string example.
3131 RUN2(check_string_value,
3133 This starts with and ends with an empty line,\n\
3134 which makes it easier to read.\n\
3136 "This starts with and ends with an empty line,\nwhich makes it easier to read.");
3138 // Check block string counter example.
3139 RUN2(check_string_value,
3140 "\"\"\"This does not start with or end with any empty lines,\n\
3141 which makes it a little harder to read.\"\"\"",
3142 "This does not start with or end with any empty lines,\nwhich makes it a little harder to read.");
3144 RUN2(check_string_value, "\"te\\u001bst\"", "te\033st" ); // Check unicode escape sequence.
3145 RUN2(check_string_value, "\"te\\u001Bst\"", "te\033st" ); // Check again with other case.
3146 RUN2(check_string_value, "\"\"\"te\\u001bst\"\"\"", "te\\u001bst" ); // Escape sequences are ignored in block strings (except for the triple quote).
3147 RUN2(check_string_value, "\"\"\"te\\nst\"\"\"", "te\\nst" ); // Escape sequences are ignored in block strings (except for the triple quote).
3148 RUN2(check_string_value, "\"te\\u2026st\"", "te\xe2\x80\xa6st"); // Check a unicode escape sequence.
3150 RUN(check_example_29); // Parse null value and check result.
3152 // These two input objects should have the same result.
3155 nearestThing(location: { lon: 12.43, lat: -53.211 })\n\
3158 RUN(check_example_30_and_31);
3161 nearestThing(location: { lat: -53.211, lon: 12.43 })\n\
3164 RUN(check_example_30_and_31);
3166 RUN(check_example_32); // Parse an example with a variable and check result.
3168 RUN(check_example_34); // Parse directives and check result.
3169 RUN(check_example_35); // Parse directives and check result.
3171 RUN(check_example_35); // Parse directives and check result.
3173 printf("total passed: %d\n%stotal failed: %d\033[0m\n", pass, fail?"\033[91m":"", fail);
3175 return fail==0? 0: 1;