]> git.ozlabs.org Git - ccan/blob - ccan/graphql/test/run.c
91bc322e940ec5da2a449cbc90e4353b64100c5d
[ccan] / ccan / graphql / test / run.c
1 #include "ccan/graphql/graphql.h"
2 #include "ccan/str/str.h"
3
4 /* TEST POINT MACROS
5  *
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.
8  *
9  * RUN macros run a whole test case function.
10  *
11  * Different TEST_xxxx macros are provided for different test point types as
12  * follows:
13  *
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
19  *              for a null pointer.
20  */
21
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; } }
25
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; }
29
30 // Global variables to track overall results.
31 int pass = 0, fail = 0;
32 bool mute = 1;
33
34 // Helper function.
35 int listlen(struct list_head *tokens) {
36         struct graphql_token *tok;
37         int n=0;
38         list_for_each(tokens, tok, list) {
39                 n++;
40         }
41         return n;
42 }
43
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.
47  */
48
49 int check_example_3(const char *source) {
50         struct list_head *tokens;
51         struct graphql_token *tok;
52         const char *err;
53
54         if (!mute) printf("// Example No. 3\n");
55
56         // Test the lexer.
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);
121
122         // Test the parser.
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);
171 }
172
173 int check_example_5(char *source) {
174         struct list_head *tokens;
175         struct graphql_token *tok;
176         const char *err;
177
178         if (!mute) printf("// Example No. 5\n");
179
180         sprintf(source, "\
181 mutation {\n\
182   likeStory(storyID: 12345) {\n\
183     story {\n\
184       likeCount\n\
185     }\n\
186   }\n\
187 }\n\
188         ");
189
190         // Test the lexer.
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);
244
245         // Test the parser.
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);
309 }
310
311 int check_example_6(char *source) {
312         struct list_head *tokens;
313         struct graphql_token *tok;
314         const char *err;
315
316         if (!mute) printf("// Example No. 6\n");
317
318         sprintf(source, "\
319 {\n\
320   field\n\
321 }\n\
322         ");
323
324         // Test the lexer.
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);
340
341         // Test the parser.
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);
368 }
369
370 int check_example_7(char *source) {
371         struct list_head *tokens;
372         struct graphql_token *tok;
373         const char *err;
374
375         if (!mute) printf("// Example No. 7\n");
376
377         sprintf(source, "\
378 {\n\
379   id\n\
380   firstName\n\
381   lastName\n\
382 }\n\
383         ");
384
385         // Test the lexer.
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);
413
414         // Test the parser.
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);
463 }
464
465 int check_example_8(char *source) {
466         struct list_head *tokens;
467         struct graphql_token *tok;
468         const char *err;
469
470         if (!mute) printf("// Example No. 8\n");
471
472         sprintf(source, "\
473 {\n\
474   me {\n\
475     id\n\
476     firstName\n\
477     lastName\n\
478     birthday {\n\
479       month\n\
480       day\n\
481     }\n\
482     friends {\n\
483       name\n\
484     }\n\
485   }\n\
486 }\n\
487         ");
488
489         // Test the lexer.
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);
520
521         // Test the parser.
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);
633 }
634
635 int check_example_9(char *source) {
636         struct list_head *tokens;
637         struct graphql_token *tok;
638         const char *err;
639
640         if (!mute) printf("// Example No. 9\n");
641
642         sprintf(source, "\
643 # `me` could represent the currently logged in viewer.\n\
644 {\n\
645   me {\n\
646     name\n\
647   }\n\
648 }\n\
649 \n\
650 # `user` represents one of many users in a graph of data, referred to by a\n\
651 # unique identifier.\n\
652 {\n\
653   user(id: 4) {\n\
654     name\n\
655   }\n\
656 }\n\
657         ");
658
659         // Test the lexer.
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);
688
689         // Test the parser.
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);
771 }
772
773 int check_example_10(char *source) {
774         struct list_head *tokens;
775         struct graphql_token *tok;
776         const char *err;
777
778         if (!mute) printf("// Example No. 10\n");
779
780         sprintf(source, "\
781 {\n\
782   user(id: 4) {\n\
783     id\n\
784     name\n\
785     profilePic(size: 100)\n\
786   }\n\
787 }\n\
788         ");
789
790         // Test the lexer.
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);
821
822         // Test the parser.
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);
903 }
904
905 int check_example_11(char *source) {
906         struct list_head *tokens;
907         struct graphql_token *tok;
908         const char *err;
909
910         if (!mute) printf("// Example No. 11\n");
911
912         sprintf(source, "\
913 {\n\
914   user(id: 4) {\n\
915     id\n\
916     name\n\
917     profilePic(width: 100, height: 50)\n\
918   }\n\
919 }\n\
920         ");
921
922         // Test the lexer.
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);
959
960         // Test the parser.
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);
1049 }
1050
1051 int check_example_12_and_13(const char *source) {
1052         struct list_head *tokens;
1053         struct graphql_token *tok;
1054         const char *err;
1055
1056         if (!mute) printf("// Example Nos. 12 and 13\n");
1057
1058         // Test the lexer.
1059         const char *param;
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);
1082
1083         // Test the parser.
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);
1134 }
1135
1136 int check_example_14(char *source) {
1137         struct list_head *tokens;
1138         struct graphql_token *tok;
1139         const char *err;
1140
1141         if (!mute) printf("// Example No. 14\n");
1142
1143         sprintf(source, "\
1144 {\n\
1145   user(id: 4) {\n\
1146     id\n\
1147     name\n\
1148     smallPic: profilePic(size: 64)\n\
1149     bigPic: profilePic(size: 1024)\n\
1150   }\n\
1151 }\n\
1152         ");
1153
1154         // Test the lexer.
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);
1200
1201         // Test the parser.
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);
1309 }
1310
1311 int check_example_16(char *source) {
1312         struct list_head *tokens;
1313         struct graphql_token *tok;
1314         const char *err;
1315
1316         if (!mute) printf("// Example No. 16\n");
1317
1318         sprintf(source, "\
1319 {\n\
1320   zuck: user(id: 4) {\n\
1321     id\n\
1322     name\n\
1323   }\n\
1324 }\n\
1325         ");
1326
1327         // Test the lexer.
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);
1352
1353         // Test the parser.
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);
1416 }
1417
1418 int check_example_18(char *source) {
1419         struct list_head *tokens;
1420         struct graphql_token *tok;
1421         const char *err;
1422
1423         if (!mute) printf("// Example No. 18\n");
1424
1425         sprintf(source, "\
1426 query noFragments {\n\
1427   user(id: 4) {\n\
1428     friends(first: 10) {\n\
1429       id\n\
1430       name\n\
1431       profilePic(size: 50)\n\
1432     }\n\
1433     mutualFriends(first: 10) {\n\
1434       id\n\
1435       name\n\
1436       profilePic(size: 50)\n\
1437     }\n\
1438   }\n\
1439 }\n\
1440         ");
1441
1442         // Test the lexer.
1443         TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
1444         TEST_ABRT(listlen(tokens) == 44);
1445         tokens = tal_free(tokens);
1446
1447         // Test the parser.
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);
1475 }
1476
1477 int check_example_19(char *source) {
1478         struct list_head *tokens;
1479         struct graphql_token *tok;
1480         const char *err;
1481
1482         if (!mute) printf("// Example No. 19\n");
1483
1484         sprintf(source, "\
1485 query withFragments {\n\
1486   user(id: 4) {\n\
1487     friends(first: 10) {\n\
1488       ...friendFields\n\
1489     }\n\
1490     mutualFriends(first: 10) {\n\
1491       ...friendFields\n\
1492     }\n\
1493   }\n\
1494 }\n\
1495 \n\
1496 fragment friendFields on User {\n\
1497   id\n\
1498   name\n\
1499   profilePic(size: 50)\n\
1500 }\n\
1501         ");
1502
1503         // Test the lexer.
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);
1519
1520         // Test the parser.
1521         struct graphql_executable_document *doc;
1522         const char *e;
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);
1582 }
1583
1584 int check_example_20(char *source) {
1585         struct list_head *tokens;
1586         struct graphql_token *tok;
1587         const char *err;
1588
1589         if (!mute) printf("// Example No. 20\n");
1590
1591         sprintf(source, "\
1592 query withNestedFragments {\n\
1593   user(id: 4) {\n\
1594     friends(first: 10) {\n\
1595       ...friendFields\n\
1596     }\n\
1597     mutualFriends(first: 10) {\n\
1598       ...friendFields\n\
1599     }\n\
1600   }\n\
1601 }\n\
1602 \n\
1603 fragment friendFields on User {\n\
1604   id\n\
1605   name\n\
1606   ...standardProfilePic\n\
1607 }\n\
1608 \n\
1609 fragment standardProfilePic on User {\n\
1610   profilePic(size: 50)\n\
1611 }\n\
1612         ");
1613
1614         // Test the lexer.
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);
1630
1631         // Test the parser.
1632         struct graphql_executable_document *doc;
1633         const char *e;
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);
1718 }
1719
1720 int check_example_21(char *source) {
1721         struct list_head *tokens;
1722         struct graphql_token *tok;
1723         const char *err;
1724
1725         if (!mute) printf("// Example No. 21\n");
1726
1727         sprintf(source, "\
1728 query FragmentTyping {\n\
1729   profiles(handles: [\"zuck\", \"coca-cola\"]) {\n\
1730     handle\n\
1731     ...userFragment\n\
1732     ...pageFragment\n\
1733   }\n\
1734 }\n\
1735 \n\
1736 fragment userFragment on User {\n\
1737   friends {\n\
1738     count\n\
1739   }\n\
1740 }\n\
1741 \n\
1742 fragment pageFragment on Page {\n\
1743   likers {\n\
1744     count\n\
1745   }\n\
1746 }\n\
1747         ");
1748
1749         // Test the lexer.
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);
1772
1773         // Test the parser.
1774         struct graphql_executable_document *doc;
1775         const char *e;
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);
1847 }
1848
1849 int check_example_23(char *source) {
1850         struct list_head *tokens;
1851         struct graphql_token *tok;
1852         const char *err;
1853
1854         if (!mute) printf("// Example No. 23\n");
1855
1856         sprintf(source, "\
1857 query inlineFragmentTyping {\n\
1858   profiles(handles: [\"zuck\", \"coca-cola\"]) {\n\
1859     handle\n\
1860     ... on User {\n\
1861       friends {\n\
1862         count\n\
1863       }\n\
1864     }\n\
1865     ... on Page {\n\
1866       likers {\n\
1867         count\n\
1868       }\n\
1869     }\n\
1870   }\n\
1871 }\n\
1872         ");
1873
1874         // Test the lexer.
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);
1897
1898         // Test the parser.
1899         struct graphql_executable_document *doc;
1900         const char *e;
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);
1951 }
1952
1953 int check_example_24(char *source) {
1954         struct list_head *tokens;
1955         struct graphql_token *tok;
1956         const char *err;
1957
1958         if (!mute) printf("// Example No. 24\n");
1959
1960         sprintf(source, "\
1961 query inlineFragmentNoType($expandedInfo: Boolean) {\n\
1962   user(handle: \"zuck\") {\n\
1963     id\n\
1964     name\n\
1965     ... @include(if: $expandedInfo) {\n\
1966       firstName\n\
1967       lastName\n\
1968       birthday\n\
1969     }\n\
1970   }\n\
1971 }\n\
1972         ");
1973
1974         // Test the lexer.
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);
2027
2028         // Test the parser.
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);
2091 }
2092
2093 int check_int_value(char *source, int int_value) {
2094         struct list_head *tokens;
2095         struct graphql_token *tok;
2096         const char *err;
2097
2098         if (!mute) printf("// Int Value Range Check on %d\n", int_value);
2099
2100         sprintf(source, "\
2101 {\n\
2102   user(id: %d) {\n\
2103     name\n\
2104   }\n\
2105 }\n\
2106         ", int_value);
2107
2108         char buf[20];
2109         sprintf(buf, "%d", int_value);
2110
2111         // Test the lexer.
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);
2134
2135         // Test the parser.
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);
2161 }
2162
2163 int check_invalid_int_values(char *source) {
2164         struct list_head *tokens;
2165         struct graphql_token *tok;
2166         const char *err;
2167
2168         if (!mute) printf("// Invalid Int Values\n");
2169
2170         char *bad_values[] = {"00", "-00", "+1", "1.", "1a", "1e", "0x123", "123L", 0};
2171
2172         for (int i=0; bad_values[i]; i++) {
2173                 sprintf(source, "\
2174 {\n\
2175   user(id: %s) {\n\
2176     name\n\
2177   }\n\
2178 }\n\
2179                 ", bad_values[i]);
2180
2181                 // Test the lexer.
2182                 TEST_CONT(graphql_lex(source, NULL, &tokens) != NULL);
2183                 TEST_ABRT(listlen(tokens) == 5);
2184                 tokens = tal_free(tokens);
2185
2186                 // No need to test parser when lexer fails.
2187         }
2188 }
2189
2190 int check_float_value(char *source, float float_value, const char *format) {
2191         struct list_head *tokens;
2192         struct graphql_token *tok;
2193         const char *err;
2194
2195         if (!mute) printf("// Float Value Range Check on %f\n", float_value);
2196
2197         char buf[100];
2198         sprintf(buf, "\
2199 {\n\
2200   user(id: %s) {\n\
2201     name\n\
2202   }\n\
2203 }\n\
2204         ", format);
2205         sprintf(source, buf, float_value);
2206         sprintf(buf, format, float_value);
2207
2208         // Test the lexer.
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);
2231
2232         // Test the parser.
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);
2258 }
2259
2260 int check_valid_float_values(char *source) {
2261         struct list_head *tokens;
2262         struct graphql_token *tok;
2263         const char *err;
2264
2265         if (!mute) printf("// Valid Float Values\n");
2266
2267         char *good_values[] = {"1.0", "1e50", "6.0221413e23", "1.23", 0};
2268
2269         for (int i=0; good_values[i]; i++) {
2270                 sprintf(source, "\
2271 {\n\
2272   user(id: %s) {\n\
2273     name\n\
2274   }\n\
2275 }\n\
2276                 ", good_values[i]);
2277
2278                 // Test the lexer.
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);
2301
2302                 // Test the parser.
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);
2328         }
2329 }
2330
2331 int check_invalid_float_values(char *source) {
2332         struct list_head *tokens;
2333         struct graphql_token *tok;
2334         const char *err;
2335
2336         if (!mute) printf("// Invalid Float Values\n");
2337
2338         char *bad_values[] = {"00.0", "-00.0", "00e1", "1.23.4", "0x1.2p3", 0};
2339
2340         for (int i=0; bad_values[i]; i++) {
2341                 sprintf(source, "\
2342 {\n\
2343   user(id: %s) {\n\
2344     name\n\
2345   }\n\
2346 }\n\
2347                 ", bad_values[i]);
2348
2349                 // Test the lexer.
2350                 TEST_CONT(graphql_lex(source, NULL, &tokens) != NULL);
2351                 TEST_ABRT(listlen(tokens) == 5);
2352                 tokens = tal_free(tokens);
2353
2354                 // No need to test parser when lexer fails.
2355         }
2356 }
2357
2358 int check_boolean_values(char *source) {
2359         struct list_head *tokens;
2360         struct graphql_token *tok;
2361         const char *err;
2362
2363         if (!mute) printf("// Boolean Values\n");
2364
2365         char *good_values[] = {"true", "false", 0};
2366
2367         for (int i=0; good_values[i]; i++) {
2368                 sprintf(source, "\
2369 {\n\
2370   user(id: %s) {\n\
2371     name\n\
2372   }\n\
2373 }\n\
2374                 ", good_values[i]);
2375
2376                 // Test the lexer.
2377                 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
2378                 TEST_ABRT(listlen(tokens) == 11);
2379                 tokens = tal_free(tokens);
2380
2381                 // Test the parser.
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);
2407         }
2408
2409         char *bad_values[] = {"True", "False", "TRUE", "FALSE", 0};
2410
2411         for (int i=0; bad_values[i]; i++) {
2412                 sprintf(source, "\
2413 {\n\
2414   user(id: %s) {\n\
2415     name\n\
2416   }\n\
2417 }\n\
2418                 ", bad_values[i]);
2419
2420                 // Test the lexer.
2421                 TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
2422                 TEST_ABRT(listlen(tokens) == 11);
2423                 tokens = tal_free(tokens);
2424
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);
2459         }
2460 }
2461
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;
2465         const char *err;
2466
2467         if (!mute) printf("// String Value Test: %s\n", test_value);
2468
2469         sprintf(source, "\
2470 {\n\
2471   user(id:%s) {\n\
2472     name\n\
2473   }\n\
2474 }\n\
2475         ", test_value);
2476
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);
2501
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);
2536         } else {
2537                 TEST_CONT(graphql_lex(source, NULL, &tokens) != NULL);
2538                 tokens = tal_free(tokens);
2539         }
2540 }
2541
2542 int check_example_25_and_26(const char *source) {
2543         struct list_head *tokens;
2544         struct graphql_token *tok;
2545         const char *err;
2546
2547         if (!mute) printf("// Example No. 25 and 26\n");
2548
2549         TEST_CONT(graphql_lex(source, NULL, &tokens) == NULL);
2550         while ((tok = list_pop(tokens, struct graphql_token, list)) && tok->token_type != 's') { }
2551         if (tok) {
2552                 TEST_STRG(tok->token_string, "Hello,\n  World!\n\nYours,\n  GraphQL.");
2553         }
2554
2555         tokens = tal_free(tokens);
2556
2557         // Test the parser.
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);
2563 }
2564
2565 int check_example_29(char *source) {
2566         struct list_head *tokens;
2567         struct graphql_token *tok;
2568         const char *err;
2569
2570         if (!mute) printf("// Example No. 29\n");
2571
2572         sprintf(source, "\
2573 {\n\
2574   field(arg: null)\n\
2575   field\n\
2576 }\n\
2577         ");
2578
2579         // Test the lexer.
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);
2594
2595         // Test the parser.
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);
2648 }
2649
2650 int check_example_30_and_31(const char *source) {
2651         struct list_head *tokens;
2652         struct graphql_token *tok;
2653         const char *err;
2654
2655         if (!mute) printf("// Example No. 30 and 31\n");
2656
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"))) { }
2660         TEST_CONT(tok);
2661         if (tok) {
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");
2666         }
2667         tokens = tal_free(tokens);
2668
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"))) { }
2671         TEST_CONT(tok);
2672         if (tok) {
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");
2677         }
2678         tokens = tal_free(tokens);
2679
2680         // Test the parser.
2681         struct graphql_argument *arg;
2682         struct graphql_executable_document *doc;
2683         const char *e;
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);
2740 }
2741
2742 int check_example_32(char *source) {
2743         struct list_head *tokens;
2744         struct graphql_token *tok;
2745         const char *err;
2746
2747         if (!mute) printf("// Example No. 32\n");
2748
2749         sprintf(source, "\
2750 query getZuckProfile($devicePicSize: Int) {\n\
2751   user(id: 4) {\n\
2752     id\n\
2753     name\n\
2754     profilePic(size: $devicePicSize)\n\
2755   }\n\
2756 }\n\
2757         ");
2758
2759         // Test the lexer.
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);
2791
2792         // Test the parser.
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);
2893 }
2894
2895 int check_example_34(char *source) {
2896         struct list_head *tokens;
2897         struct graphql_token *tok;
2898         const char *err;
2899
2900         if (!mute) printf("// Example No. 34\n");
2901
2902         sprintf(source, "\
2903 type Person\n\
2904   @addExternalFields(source: \"profiles\")\n\
2905   @excludeField(name: \"photo\") {\n\
2906   name: String\n\
2907 }\n\
2908         ");
2909
2910         // Test the lexer.
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);
2938
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);
2945 }
2946
2947 int check_example_35(char *source) {
2948         struct list_head *tokens;
2949         struct graphql_token *tok;
2950         const char *err;
2951
2952         if (!mute) printf("// Example No. 35\n");
2953
2954         sprintf(source, "\
2955 type Person\n\
2956   @excludeField(name: \"photo\")\n\
2957   @addExternalFields(source: \"profiles\") {\n\
2958   name: String\n\
2959 }\n\
2960         ");
2961
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);
2989
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);
2996 }
2997
2998 /* End of test case functions. */
2999
3000 /* Beginning of main() test run to run all test cases. */
3001
3002 int main(void)
3003 {
3004         printf("\nTesting GraphQL lexer/parser...\n");
3005
3006         char source[1024];
3007         int prev_fail; // Used by RUNx macros.
3008
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++) {
3015                 sprintf(source, "\
3016 {%s\
3017   user(id: 4) {%s\
3018     name%s\
3019   }%s\
3020 }%s\
3021                 ", line_terminators[i], line_terminators[i], line_terminators[i], line_terminators[i], line_terminators[i]);
3022
3023                 RUN(check_example_3);
3024         }
3025
3026         RUN(check_example_5); // Parse a mutation operation and check results.
3027
3028         RUN(check_example_6); // Parse an unnamed query and check results.
3029
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.
3035
3036         // Parse examples of different parameter order and check for identical results.
3037         sprintf(source, "\
3038 {\n\
3039   picture(width: 200, height: 100)\n\
3040 }\n\
3041         ");
3042         RUN(check_example_12_and_13);
3043         sprintf(source, "\
3044 {\n\
3045   picture(height: 100, width: 200)\n\
3046 }\n\
3047         ");
3048         RUN(check_example_12_and_13);
3049
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.
3052
3053         RUN(check_example_18); // Parse example and check results.
3054
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.
3060
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);
3068
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);
3079
3080         RUN(check_boolean_values); // Parse boolean values and check results.
3081
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.
3109
3110         // This block string and this string should result in identical tokens.
3111         sprintf(source, "\
3112 mutation {\n\
3113   sendEmail(message: \"\"\"\n\
3114     Hello,\n\
3115       World!\n\
3116 \n\
3117     Yours,\n\
3118       GraphQL.\n\
3119   \"\"\")\n\
3120 }\n\
3121         ");
3122         RUN(check_example_25_and_26);
3123         sprintf(source, "\
3124 mutation {\n\
3125   sendEmail(message: \"Hello,\\n  World!\\n\\nYours,\\n  GraphQL.\")\n\
3126 }\n\
3127         ");
3128         RUN(check_example_25_and_26);
3129
3130         // Check block string example.
3131         RUN2(check_string_value,
3132 "\"\"\"\n\
3133 This starts with and ends with an empty line,\n\
3134 which makes it easier to read.\n\
3135 \"\"\"",
3136                 "This starts with and ends with an empty line,\nwhich makes it easier to read.");
3137
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.");
3143
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.
3149
3150         RUN(check_example_29); // Parse null value and check result.
3151
3152         // These two input objects should have the same result.
3153         sprintf(source, "\
3154 {\n\
3155   nearestThing(location: { lon: 12.43, lat: -53.211 })\n\
3156 }\n\
3157         ");
3158         RUN(check_example_30_and_31);
3159         sprintf(source, "\
3160 {\n\
3161   nearestThing(location: { lat: -53.211, lon: 12.43 })\n\
3162 }\n\
3163         ");
3164         RUN(check_example_30_and_31);
3165
3166         RUN(check_example_32); // Parse an example with a variable and check result.
3167
3168         RUN(check_example_34); // Parse directives and check result.
3169         RUN(check_example_35); // Parse directives and check result.
3170
3171         RUN(check_example_35); // Parse directives and check result.
3172
3173         printf("total passed: %d\n%stotal failed: %d\033[0m\n", pass, fail?"\033[91m":"", fail);
3174
3175         return fail==0? 0: 1;
3176 }
3177