1const std = @import("std");
2const json = @import("json");
3const build_options = @import("build_options");
4const nfs = @import("nfs");
5const nio = @import("nio");
6const expect = @import("expect").expect;
7
8const JSONTestSuite_root = build_options.JSONTestSuite_root;
9
10fn parse_full(buffer: []const u8) !void {
11 const alloc = std.testing.allocator;
12 var fbs: nio.FixedBufferStream([]const u8) = .init(buffer);
13 var doc = try json.parse(alloc, "", &fbs, .{ .support_trailing_commas = true, .maximum_depth = 100 });
14 defer doc.deinit(alloc);
15}
16
17test {
18 try parse_full(
19 \\[
20 \\ {
21 \\ "id": 131325113,
22 \\ "author": {
23 \\ "login": "github-actions[bot]",
24 \\ "id": 41898282,
25 \\ "node_id": "MDM6Qm90NDE4OTgyODI=",
26 \\ "gravatar_id": "",
27 \\ "type": "Bot",
28 \\ "site_admin": false
29 \\ },
30 \\ "node_id": "RE_kwDOEpDmIc4H09y5",
31 \\ "tag_name": "r89",
32 \\ "target_commitish": "0df96b60dee2a9e76bf12ad8b8ab1d47dba52994",
33 \\ "name": "r89",
34 \\ "draft": false,
35 \\ "prerelease": false,
36 \\ "created_at": "2023-11-24T08:33:57Z",
37 \\ "published_at": "2023-11-24T08:38:51Z",
38 \\ "assets": [
39 \\ {
40 \\ "id": 137211731,
41 \\ "node_id": "RA_kwDOEpDmIc4ILa9T",
42 \\ "name": "zigmod-aarch64-linux",
43 \\ "label": "",
44 \\ "uploader": {
45 \\ "login": "github-actions[bot]",
46 \\ "id": 41898282,
47 \\ "node_id": "MDM6Qm90NDE4OTgyODI=",
48 \\ "gravatar_id": "",
49 \\ "type": "Bot",
50 \\ "site_admin": false
51 \\ },
52 \\ "content_type": "application/octet-stream",
53 \\ "state": "uploaded",
54 \\ "size": 12449224,
55 \\ "download_count": 28,
56 \\ "created_at": "2023-11-24T08:38:52Z",
57 \\ "updated_at": "2023-11-24T08:38:53Z",
58 \\ },
59 \\ {
60 \\ "id": 137211736,
61 \\ "node_id": "RA_kwDOEpDmIc4ILa9Y",
62 \\ "name": "zigmod-aarch64-macos",
63 \\ "label": "",
64 \\ "uploader": {
65 \\ "login": "github-actions[bot]",
66 \\ "id": 41898282,
67 \\ "node_id": "MDM6Qm90NDE4OTgyODI=",
68 \\ "gravatar_id": "",
69 \\ "type": "Bot",
70 \\ "site_admin": false
71 \\ },
72 \\ "content_type": "application/octet-stream",
73 \\ "state": "uploaded",
74 \\ "size": 9137624,
75 \\ "download_count": 581,
76 \\ "created_at": "2023-11-24T08:38:55Z",
77 \\ "updated_at": "2023-11-24T08:38:56Z",
78 \\ },
79 \\ {
80 \\ "id": 137211747,
81 \\ "node_id": "RA_kwDOEpDmIc4ILa9j",
82 \\ "name": "zigmod-aarch64-windows.exe",
83 \\ "label": "",
84 \\ "uploader": {
85 \\ "login": "github-actions[bot]",
86 \\ "id": 41898282,
87 \\ "node_id": "MDM6Qm90NDE4OTgyODI=",
88 \\ "gravatar_id": "",
89 \\ "type": "Bot",
90 \\ "site_admin": false
91 \\ },
92 \\ "content_type": "application/octet-stream",
93 \\ "state": "uploaded",
94 \\ "size": 7738880,
95 \\ "download_count": 23,
96 \\ "created_at": "2023-11-24T08:39:00Z",
97 \\ "updated_at": "2023-11-24T08:39:01Z",
98 \\ },
99 \\ {
100 \\ "id": 137211740,
101 \\ "node_id": "RA_kwDOEpDmIc4ILa9c",
102 \\ "name": "zigmod-aarch64-windows.pdb",
103 \\ "label": "",
104 \\ "uploader": {
105 \\ "login": "github-actions[bot]",
106 \\ "id": 41898282,
107 \\ "node_id": "MDM6Qm90NDE4OTgyODI=",
108 \\ "gravatar_id": "",
109 \\ "type": "Bot",
110 \\ "site_admin": false
111 \\ },
112 \\ "content_type": "application/octet-stream",
113 \\ "state": "uploaded",
114 \\ "size": 3813376,
115 \\ "download_count": 2,
116 \\ "created_at": "2023-11-24T08:38:56Z",
117 \\ "updated_at": "2023-11-24T08:38:57Z",
118 \\ },
119 \\ {
120 \\ "id": 137211748,
121 \\ "node_id": "RA_kwDOEpDmIc4ILa9k",
122 \\ "name": "zigmod-mips64-linux",
123 \\ "label": "",
124 \\ "uploader": {
125 \\ "login": "github-actions[bot]",
126 \\ "id": 41898282,
127 \\ "node_id": "MDM6Qm90NDE4OTgyODI=",
128 \\ "gravatar_id": "",
129 \\ "type": "Bot",
130 \\ "site_admin": false
131 \\ },
132 \\ "content_type": "application/octet-stream",
133 \\ "state": "uploaded",
134 \\ "size": 12545712,
135 \\ "download_count": 3,
136 \\ "created_at": "2023-11-24T08:39:01Z",
137 \\ "updated_at": "2023-11-24T08:39:03Z",
138 \\ },
139 \\ {
140 \\ "id": 137211749,
141 \\ "node_id": "RA_kwDOEpDmIc4ILa9l",
142 \\ "name": "zigmod-powerpc64le-linux",
143 \\ "label": "",
144 \\ "uploader": {
145 \\ "login": "github-actions[bot]",
146 \\ "id": 41898282,
147 \\ "node_id": "MDM6Qm90NDE4OTgyODI=",
148 \\ "gravatar_id": "",
149 \\ "type": "Bot",
150 \\ "site_admin": false
151 \\ },
152 \\ "content_type": "application/octet-stream",
153 \\ "state": "uploaded",
154 \\ "size": 11638720,
155 \\ "download_count": 3,
156 \\ "created_at": "2023-11-24T08:39:03Z",
157 \\ "updated_at": "2023-11-24T08:39:04Z",
158 \\ },
159 \\ {
160 \\ "id": 137211745,
161 \\ "node_id": "RA_kwDOEpDmIc4ILa9h",
162 \\ "name": "zigmod-riscv64-linux",
163 \\ "label": "",
164 \\ "uploader": {
165 \\ "login": "github-actions[bot]",
166 \\ "id": 41898282,
167 \\ "node_id": "MDM6Qm90NDE4OTgyODI=",
168 \\ "gravatar_id": "",
169 \\ "type": "Bot",
170 \\ "site_admin": false
171 \\ },
172 \\ "content_type": "application/octet-stream",
173 \\ "state": "uploaded",
174 \\ "size": 17282528,
175 \\ "download_count": 4,
176 \\ "created_at": "2023-11-24T08:38:58Z",
177 \\ "updated_at": "2023-11-24T08:39:00Z",
178 \\ },
179 \\ {
180 \\ "id": 137211752,
181 \\ "node_id": "RA_kwDOEpDmIc4ILa9o",
182 \\ "name": "zigmod-x86_64-linux",
183 \\ "label": "",
184 \\ "uploader": {
185 \\ "login": "github-actions[bot]",
186 \\ "id": 41898282,
187 \\ "node_id": "MDM6Qm90NDE4OTgyODI=",
188 \\ "gravatar_id": "",
189 \\ "type": "Bot",
190 \\ "site_admin": false
191 \\ },
192 \\ "content_type": "application/octet-stream",
193 \\ "state": "uploaded",
194 \\ "size": 11913416,
195 \\ "download_count": 4906,
196 \\ "created_at": "2023-11-24T08:39:06Z",
197 \\ "updated_at": "2023-11-24T08:39:07Z",
198 \\ },
199 \\ {
200 \\ "id": 137211733,
201 \\ "node_id": "RA_kwDOEpDmIc4ILa9V",
202 \\ "name": "zigmod-x86_64-macos",
203 \\ "label": "",
204 \\ "uploader": {
205 \\ "login": "github-actions[bot]",
206 \\ "id": 41898282,
207 \\ "node_id": "MDM6Qm90NDE4OTgyODI=",
208 \\ "gravatar_id": "",
209 \\ "type": "Bot",
210 \\ "site_admin": false
211 \\ },
212 \\ "content_type": "application/octet-stream",
213 \\ "state": "uploaded",
214 \\ "size": 8618320,
215 \\ "download_count": 795,
216 \\ "created_at": "2023-11-24T08:38:53Z",
217 \\ "updated_at": "2023-11-24T08:38:54Z",
218 \\ },
219 \\ {
220 \\ "id": 137211742,
221 \\ "node_id": "RA_kwDOEpDmIc4ILa9e",
222 \\ "name": "zigmod-x86_64-windows.exe",
223 \\ "label": "",
224 \\ "uploader": {
225 \\ "login": "github-actions[bot]",
226 \\ "id": 41898282,
227 \\ "node_id": "MDM6Qm90NDE4OTgyODI=",
228 \\ "gravatar_id": "",
229 \\ "type": "Bot",
230 \\ "site_admin": false
231 \\ },
232 \\ "content_type": "application/octet-stream",
233 \\ "state": "uploaded",
234 \\ "size": 7557632,
235 \\ "download_count": 300,
236 \\ "created_at": "2023-11-24T08:38:57Z",
237 \\ "updated_at": "2023-11-24T08:38:58Z",
238 \\ },
239 \\ {
240 \\ "id": 137211751,
241 \\ "node_id": "RA_kwDOEpDmIc4ILa9n",
242 \\ "name": "zigmod-x86_64-windows.pdb",
243 \\ "label": "",
244 \\ "uploader": {
245 \\ "login": "github-actions[bot]",
246 \\ "id": 41898282,
247 \\ "node_id": "MDM6Qm90NDE4OTgyODI=",
248 \\ "gravatar_id": "",
249 \\ "type": "Bot",
250 \\ "site_admin": false
251 \\ },
252 \\ "content_type": "application/octet-stream",
253 \\ "state": "uploaded",
254 \\ "size": 4411392,
255 \\ "download_count": 8,
256 \\ "created_at": "2023-11-24T08:39:05Z",
257 \\ "updated_at": "2023-11-24T08:39:05Z",
258 \\ }
259 \\ ],
260 \\ "body": "<li><a href='https://github.com/nektro/zigmod/commit/0df96b60dee2a9e76bf12ad8b8ab1d47dba52994'><code>0df96b6</code></a> cmd/aq/{install,update}: use proper cachepath (Meghan Denny)</li>\n<li><a href='https://github.com/nektro/zigmod/commit/a1ea508279920f457c5f899022046fefd6dc146a'><code>a1ea508</code></a> main: pass proper self_path value (Meghan Denny)</li>\n<li><a href='https://github.com/nektro/zigmod/commit/09d633b1405c5cbd4e02f4c86cb34f0368bf321f'><code>09d633b</code></a> cmd: when running zigmod inside deps folder, use parent deps folder as cachepath (Meghan Denny)</li>\n<li><a href='https://github.com/nektro/zigmod/commit/65666d00836654f33ac4405acc12ccf50f93a071'><code>65666d0</code></a> add self_name arg to all execute() call signatures (Meghan Denny)</li>\n<li><a href='https://github.com/nektro/zigmod/commit/e2d42e8ff71c3e6f534a380b7d16465fa77032f7'><code>e2d42e8</code></a> add deps.addAllLibrariesTo(), closes #84 (Meghan Denny)</li>\n<li><a href='https://github.com/nektro/zigmod/commit/f3aabb5e4e3baa7cf58af4f36f8683532d49fce3'><code>f3aabb5</code></a> regenerate deps.zig (Meghan Denny)</li>\n<li><a href='https://github.com/nektro/zigmod/commit/b8cd095ebd012788b83ac2d8e1592ce531fecde9'><code>b8cd095</code></a> mark versioned dep folders as readonly, closes #53 (Meghan Denny)</li>\n<li><a href='https://github.com/nektro/zigmod/commit/255cb974db260e67d6782f785f26604292c39131'><code>255cb97</code></a> add a buffered reader for parsing zigmod.lock (Meghan Denny)</li>\n<li><a href='https://github.com/nektro/zigmod/commit/a9863df0dedb0f59bbabcbf3d13f859e33c265a2'><code>a9863df</code></a> close some file descriptors (Meghan Denny)</li>\n<li><a href='https://github.com/nektro/zigmod/commit/941ad7c971be96e2b85a683760f0a7a3a513c202'><code>941ad7c</code></a> deps: marlersoft/zigwin32: misc confirmed update (Meghan Denny)</li>\n<li><a href='https://github.com/nektro/zigmod/commit/0e7516562fea909c18c770484919174a6e81485e'><code>0e75165</code></a> deps: nektro/zig-extras: misc confirmed updates (Meghan Denny)</li>\n<li><a href='https://github.com/nektro/zigmod/commit/8e4e9ae69d8f09d32347e7ee6c250271067f0b37'><code>8e4e9ae</code></a> deps: ziglibs/known-folders: misc confirmed updates (Meghan Denny)</li>\n<li><a href='https://github.com/nektro/zigmod/commit/8ba1d87039adee5566a0af66c3645989b976f822'><code>8ba1d87</code></a> deps: truemedian/hzzp: misc confirmed updates (Meghan Denny)</li>\n<li><a href='https://github.com/nektro/zigmod/commit/ddd0eb706c5f759141a9df462c31dbee32ef3b83'><code>ddd0eb7</code></a> deps: nektro/iguanaTLS: misc confirmed updates (Meghan Denny)</li>\n<li><a href='https://github.com/nektro/zigmod/commit/02464e094476795725f261a987c53d46da8934a3'><code>02464e0</code></a> build_release.sh: use debug mode, release breaks stack traces (Meghan Denny)</li>\n<li><a href='https://github.com/nektro/zigmod/commit/6c68f38b8cc76288dcc871b6acc5e9470385d2a7'><code>6c68f38</code></a> build.zig: add a -Doption (Meghan Denny)</li>\n<li><a href='https://github.com/nektro/zigmod/commit/5403d1a72d023253754eca1d275537ea8dc0be5a'><code>5403d1a</code></a> build.zig: move -Dtag option declaration out with other options (Meghan Denny)</li>"
261 \\ }
262 \\]
263 \\
264 );
265}
266test {
267 try parse_full(@embedFile("./fuzz/input/input.json"));
268}
269
270fn expectPass(path: [:0]const u8) !void {
271 const alloc = std.testing.allocator;
272 const file = try nfs.cwd().openFile(path, .{});
273 defer file.close();
274 var doc = try json.parse(alloc, path, file, .{ .support_trailing_commas = false, .maximum_depth = 100 });
275 defer doc.deinit(alloc);
276}
277
278// zig fmt: off
279test { try expectPass(JSONTestSuite_root ++ "/y_array_arraysWithSpaces.json"); }
280test { try expectPass(JSONTestSuite_root ++ "/y_array_empty.json"); }
281test { try expectPass(JSONTestSuite_root ++ "/y_array_empty-string.json"); }
282test { try expectPass(JSONTestSuite_root ++ "/y_array_ending_with_newline.json"); }
283test { try expectPass(JSONTestSuite_root ++ "/y_array_false.json"); }
284test { try expectPass(JSONTestSuite_root ++ "/y_array_heterogeneous.json"); }
285test { try expectPass(JSONTestSuite_root ++ "/y_array_null.json"); }
286test { try expectPass(JSONTestSuite_root ++ "/y_array_with_1_and_newline.json"); }
287test { try expectPass(JSONTestSuite_root ++ "/y_array_with_leading_space.json"); }
288test { try expectPass(JSONTestSuite_root ++ "/y_array_with_several_null.json"); }
289test { try expectPass(JSONTestSuite_root ++ "/y_array_with_trailing_space.json"); }
290test { try expectPass(JSONTestSuite_root ++ "/y_number_0e+1.json"); }
291test { try expectPass(JSONTestSuite_root ++ "/y_number_0e1.json"); }
292test { try expectPass(JSONTestSuite_root ++ "/y_number_after_space.json"); }
293test { try expectPass(JSONTestSuite_root ++ "/y_number_double_close_to_zero.json"); }
294test { try expectPass(JSONTestSuite_root ++ "/y_number_int_with_exp.json"); }
295test { try expectPass(JSONTestSuite_root ++ "/y_number.json"); }
296test { try expectPass(JSONTestSuite_root ++ "/y_number_minus_zero.json"); }
297test { try expectPass(JSONTestSuite_root ++ "/y_number_negative_int.json"); }
298test { try expectPass(JSONTestSuite_root ++ "/y_number_negative_one.json"); }
299test { try expectPass(JSONTestSuite_root ++ "/y_number_negative_zero.json"); }
300test { try expectPass(JSONTestSuite_root ++ "/y_number_real_capital_e.json"); }
301test { try expectPass(JSONTestSuite_root ++ "/y_number_real_capital_e_neg_exp.json"); }
302test { try expectPass(JSONTestSuite_root ++ "/y_number_real_capital_e_pos_exp.json"); }
303test { try expectPass(JSONTestSuite_root ++ "/y_number_real_exponent.json"); }
304test { try expectPass(JSONTestSuite_root ++ "/y_number_real_fraction_exponent.json"); }
305test { try expectPass(JSONTestSuite_root ++ "/y_number_real_neg_exp.json"); }
306test { try expectPass(JSONTestSuite_root ++ "/y_number_real_pos_exponent.json"); }
307test { try expectPass(JSONTestSuite_root ++ "/y_number_simple_int.json"); }
308test { try expectPass(JSONTestSuite_root ++ "/y_number_simple_real.json"); }
309test { try expectPass(JSONTestSuite_root ++ "/y_object_basic.json"); }
310test { try expectPass(JSONTestSuite_root ++ "/y_object_duplicated_key_and_value.json"); }
311test { try expectPass(JSONTestSuite_root ++ "/y_object_duplicated_key.json"); }
312test { try expectPass(JSONTestSuite_root ++ "/y_object_empty.json"); }
313test { try expectPass(JSONTestSuite_root ++ "/y_object_empty_key.json"); }
314test { try expectPass(JSONTestSuite_root ++ "/y_object_escaped_null_in_key.json"); }
315test { try expectPass(JSONTestSuite_root ++ "/y_object_extreme_numbers.json"); }
316test { try expectPass(JSONTestSuite_root ++ "/y_object.json"); }
317test { try expectPass(JSONTestSuite_root ++ "/y_object_long_strings.json"); }
318test { try expectPass(JSONTestSuite_root ++ "/y_object_simple.json"); }
319test { try expectPass(JSONTestSuite_root ++ "/y_object_string_unicode.json"); }
320test { try expectPass(JSONTestSuite_root ++ "/y_object_with_newlines.json"); }
321test { try expectPass(JSONTestSuite_root ++ "/y_string_1_2_3_bytes_UTF-8_sequences.json"); }
322test { try expectPass(JSONTestSuite_root ++ "/y_string_accepted_surrogate_pair.json"); }
323test { try expectPass(JSONTestSuite_root ++ "/y_string_accepted_surrogate_pairs.json"); }
324test { try expectPass(JSONTestSuite_root ++ "/y_string_allowed_escapes.json"); }
325test { try expectPass(JSONTestSuite_root ++ "/y_string_backslash_and_u_escaped_zero.json"); }
326test { try expectPass(JSONTestSuite_root ++ "/y_string_backslash_doublequotes.json"); }
327test { try expectPass(JSONTestSuite_root ++ "/y_string_comments.json"); }
328test { try expectPass(JSONTestSuite_root ++ "/y_string_double_escape_a.json"); }
329test { try expectPass(JSONTestSuite_root ++ "/y_string_double_escape_n.json"); }
330test { try expectPass(JSONTestSuite_root ++ "/y_string_escaped_control_character.json"); }
331test { try expectPass(JSONTestSuite_root ++ "/y_string_escaped_noncharacter.json"); }
332test { try expectPass(JSONTestSuite_root ++ "/y_string_in_array.json"); }
333test { try expectPass(JSONTestSuite_root ++ "/y_string_in_array_with_leading_space.json"); }
334test { try expectPass(JSONTestSuite_root ++ "/y_string_last_surrogates_1_and_2.json"); }
335test { try expectPass(JSONTestSuite_root ++ "/y_string_nbsp_uescaped.json"); }
336test { try expectPass(JSONTestSuite_root ++ "/y_string_nonCharacterInUTF-8_U+10FFFF.json"); }
337test { try expectPass(JSONTestSuite_root ++ "/y_string_nonCharacterInUTF-8_U+FFFF.json"); }
338test { try expectPass(JSONTestSuite_root ++ "/y_string_null_escape.json"); }
339test { try expectPass(JSONTestSuite_root ++ "/y_string_one-byte-utf-8.json"); }
340test { try expectPass(JSONTestSuite_root ++ "/y_string_pi.json"); }
341test { try expectPass(JSONTestSuite_root ++ "/y_string_reservedCharacterInUTF-8_U+1BFFF.json"); }
342test { try expectPass(JSONTestSuite_root ++ "/y_string_simple_ascii.json"); }
343test { try expectPass(JSONTestSuite_root ++ "/y_string_space.json"); }
344test { try expectPass(JSONTestSuite_root ++ "/y_string_surrogates_U+1D11E_MUSICAL_SYMBOL_G_CLEF.json"); }
345test { try expectPass(JSONTestSuite_root ++ "/y_string_three-byte-utf-8.json"); }
346test { try expectPass(JSONTestSuite_root ++ "/y_string_two-byte-utf-8.json"); }
347test { try expectPass(JSONTestSuite_root ++ "/y_string_u+2028_line_sep.json"); }
348test { try expectPass(JSONTestSuite_root ++ "/y_string_u+2029_par_sep.json"); }
349test { try expectPass(JSONTestSuite_root ++ "/y_string_uescaped_newline.json"); }
350test { try expectPass(JSONTestSuite_root ++ "/y_string_uEscape.json"); }
351test { try expectPass(JSONTestSuite_root ++ "/y_string_unescaped_char_delete.json"); }
352test { try expectPass(JSONTestSuite_root ++ "/y_string_unicode_2.json"); }
353test { try expectPass(JSONTestSuite_root ++ "/y_string_unicodeEscapedBackslash.json"); }
354test { try expectPass(JSONTestSuite_root ++ "/y_string_unicode_escaped_double_quote.json"); }
355test { try expectPass(JSONTestSuite_root ++ "/y_string_unicode.json"); }
356test { try expectPass(JSONTestSuite_root ++ "/y_string_unicode_U+10FFFE_nonchar.json"); }
357test { try expectPass(JSONTestSuite_root ++ "/y_string_unicode_U+1FFFE_nonchar.json"); }
358test { try expectPass(JSONTestSuite_root ++ "/y_string_unicode_U+200B_ZERO_WIDTH_SPACE.json"); }
359test { try expectPass(JSONTestSuite_root ++ "/y_string_unicode_U+2064_invisible_plus.json"); }
360test { try expectPass(JSONTestSuite_root ++ "/y_string_unicode_U+FDD0_nonchar.json"); }
361test { try expectPass(JSONTestSuite_root ++ "/y_string_unicode_U+FFFE_nonchar.json"); }
362test { try expectPass(JSONTestSuite_root ++ "/y_string_utf8.json"); }
363test { try expectPass(JSONTestSuite_root ++ "/y_string_with_del_character.json"); }
364test { try expectPass(JSONTestSuite_root ++ "/y_structure_lonely_false.json"); }
365test { try expectPass(JSONTestSuite_root ++ "/y_structure_lonely_int.json"); }
366test { try expectPass(JSONTestSuite_root ++ "/y_structure_lonely_negative_real.json"); }
367test { try expectPass(JSONTestSuite_root ++ "/y_structure_lonely_null.json"); }
368test { try expectPass(JSONTestSuite_root ++ "/y_structure_lonely_string.json"); }
369test { try expectPass(JSONTestSuite_root ++ "/y_structure_lonely_true.json"); }
370test { try expectPass(JSONTestSuite_root ++ "/y_structure_string_empty.json"); }
371test { try expectPass(JSONTestSuite_root ++ "/y_structure_trailing_newline.json"); }
372test { try expectPass(JSONTestSuite_root ++ "/y_structure_true_in_array.json"); }
373test { try expectPass(JSONTestSuite_root ++ "/y_structure_whitespace_array.json"); }
374// zig fmt: on
375
376fn expectFail(path: [:0]const u8) !void {
377 const alloc = std.testing.allocator;
378 const file = try nfs.cwd().openFile(path, .{});
379 defer file.close();
380 var doc = json.parse(alloc, path, file, .{ .support_trailing_commas = false, .maximum_depth = 100 }) catch return;
381 defer doc.deinit(alloc);
382 try std.testing.expect(false);
383}
384
385// zig fmt: off
386test { try expectFail(JSONTestSuite_root ++ "/n_array_1_true_without_comma.json"); }
387test { try expectFail(JSONTestSuite_root ++ "/n_array_a_invalid_utf8.json"); }
388test { try expectFail(JSONTestSuite_root ++ "/n_array_colon_instead_of_comma.json"); }
389test { try expectFail(JSONTestSuite_root ++ "/n_array_comma_after_close.json"); }
390test { try expectFail(JSONTestSuite_root ++ "/n_array_comma_and_number.json"); }
391test { try expectFail(JSONTestSuite_root ++ "/n_array_double_comma.json"); }
392test { try expectFail(JSONTestSuite_root ++ "/n_array_double_extra_comma.json"); }
393test { try expectFail(JSONTestSuite_root ++ "/n_array_extra_close.json"); }
394test { try expectFail(JSONTestSuite_root ++ "/n_array_extra_comma.json"); }
395test { try expectFail(JSONTestSuite_root ++ "/n_array_incomplete_invalid_value.json"); }
396test { try expectFail(JSONTestSuite_root ++ "/n_array_incomplete.json"); }
397test { try expectFail(JSONTestSuite_root ++ "/n_array_inner_array_no_comma.json"); }
398test { try expectFail(JSONTestSuite_root ++ "/n_array_invalid_utf8.json"); }
399test { try expectFail(JSONTestSuite_root ++ "/n_array_items_separated_by_semicolon.json"); }
400test { try expectFail(JSONTestSuite_root ++ "/n_array_just_comma.json"); }
401test { try expectFail(JSONTestSuite_root ++ "/n_array_just_minus.json"); }
402test { try expectFail(JSONTestSuite_root ++ "/n_array_missing_value.json"); }
403test { try expectFail(JSONTestSuite_root ++ "/n_array_newlines_unclosed.json"); }
404test { try expectFail(JSONTestSuite_root ++ "/n_array_number_and_comma.json"); }
405test { try expectFail(JSONTestSuite_root ++ "/n_array_number_and_several_commas.json"); }
406test { try expectFail(JSONTestSuite_root ++ "/n_array_spaces_vertical_tab_formfeed.json"); }
407test { try expectFail(JSONTestSuite_root ++ "/n_array_star_inside.json"); }
408test { try expectFail(JSONTestSuite_root ++ "/n_array_unclosed.json"); }
409test { try expectFail(JSONTestSuite_root ++ "/n_array_unclosed_trailing_comma.json"); }
410test { try expectFail(JSONTestSuite_root ++ "/n_array_unclosed_with_new_lines.json"); }
411test { try expectFail(JSONTestSuite_root ++ "/n_array_unclosed_with_object_inside.json"); }
412test { try expectFail(JSONTestSuite_root ++ "/n_incomplete_false.json"); }
413test { try expectFail(JSONTestSuite_root ++ "/n_incomplete_null.json"); }
414test { try expectFail(JSONTestSuite_root ++ "/n_incomplete_true.json"); }
415test { try expectFail(JSONTestSuite_root ++ "/n_multidigit_number_then_00.json"); }
416test { try expectFail(JSONTestSuite_root ++ "/n_number_0.1.2.json"); }
417test { try expectFail(JSONTestSuite_root ++ "/n_number_-01.json"); }
418test { try expectFail(JSONTestSuite_root ++ "/n_number_0.3e+.json"); }
419test { try expectFail(JSONTestSuite_root ++ "/n_number_0.3e.json"); }
420test { try expectFail(JSONTestSuite_root ++ "/n_number_0_capital_E+.json"); }
421test { try expectFail(JSONTestSuite_root ++ "/n_number_0_capital_E.json"); }
422test { try expectFail(JSONTestSuite_root ++ "/n_number_0.e1.json"); }
423test { try expectFail(JSONTestSuite_root ++ "/n_number_0e+.json"); }
424test { try expectFail(JSONTestSuite_root ++ "/n_number_0e.json"); }
425test { try expectFail(JSONTestSuite_root ++ "/n_number_1_000.json"); }
426test { try expectFail(JSONTestSuite_root ++ "/n_number_1.0e+.json"); }
427test { try expectFail(JSONTestSuite_root ++ "/n_number_1.0e-.json"); }
428test { try expectFail(JSONTestSuite_root ++ "/n_number_1.0e.json"); }
429test { try expectFail(JSONTestSuite_root ++ "/n_number_-1.0..json"); }
430test { try expectFail(JSONTestSuite_root ++ "/n_number_1eE2.json"); }
431test { try expectFail(JSONTestSuite_root ++ "/n_number_+1.json"); }
432test { try expectFail(JSONTestSuite_root ++ "/n_number_.-1.json"); }
433test { try expectFail(JSONTestSuite_root ++ "/n_number_2.e+3.json"); }
434test { try expectFail(JSONTestSuite_root ++ "/n_number_2.e-3.json"); }
435test { try expectFail(JSONTestSuite_root ++ "/n_number_2.e3.json"); }
436test { try expectFail(JSONTestSuite_root ++ "/n_number_.2e-3.json"); }
437test { try expectFail(JSONTestSuite_root ++ "/n_number_-2..json"); }
438test { try expectFail(JSONTestSuite_root ++ "/n_number_9.e+.json"); }
439test { try expectFail(JSONTestSuite_root ++ "/n_number_expression.json"); }
440test { try expectFail(JSONTestSuite_root ++ "/n_number_hex_1_digit.json"); }
441test { try expectFail(JSONTestSuite_root ++ "/n_number_hex_2_digits.json"); }
442test { try expectFail(JSONTestSuite_root ++ "/n_number_infinity.json"); }
443test { try expectFail(JSONTestSuite_root ++ "/n_number_+Inf.json"); }
444test { try expectFail(JSONTestSuite_root ++ "/n_number_Inf.json"); }
445test { try expectFail(JSONTestSuite_root ++ "/n_number_invalid+-.json"); }
446test { try expectFail(JSONTestSuite_root ++ "/n_number_invalid-negative-real.json"); }
447test { try expectFail(JSONTestSuite_root ++ "/n_number_invalid-utf-8-in-bigger-int.json"); }
448test { try expectFail(JSONTestSuite_root ++ "/n_number_invalid-utf-8-in-exponent.json"); }
449test { try expectFail(JSONTestSuite_root ++ "/n_number_invalid-utf-8-in-int.json"); }
450test { try expectFail(JSONTestSuite_root ++ "/n_number_++.json"); }
451test { try expectFail(JSONTestSuite_root ++ "/n_number_minus_infinity.json"); }
452test { try expectFail(JSONTestSuite_root ++ "/n_number_minus_sign_with_trailing_garbage.json"); }
453test { try expectFail(JSONTestSuite_root ++ "/n_number_minus_space_1.json"); }
454test { try expectFail(JSONTestSuite_root ++ "/n_number_-NaN.json"); }
455test { try expectFail(JSONTestSuite_root ++ "/n_number_NaN.json"); }
456test { try expectFail(JSONTestSuite_root ++ "/n_number_neg_int_starting_with_zero.json"); }
457test { try expectFail(JSONTestSuite_root ++ "/n_number_neg_real_without_int_part.json"); }
458test { try expectFail(JSONTestSuite_root ++ "/n_number_neg_with_garbage_at_end.json"); }
459test { try expectFail(JSONTestSuite_root ++ "/n_number_real_garbage_after_e.json"); }
460test { try expectFail(JSONTestSuite_root ++ "/n_number_real_with_invalid_utf8_after_e.json"); }
461test { try expectFail(JSONTestSuite_root ++ "/n_number_real_without_fractional_part.json"); }
462test { try expectFail(JSONTestSuite_root ++ "/n_number_starting_with_dot.json"); }
463test { try expectFail(JSONTestSuite_root ++ "/n_number_U+FF11_fullwidth_digit_one.json"); }
464test { try expectFail(JSONTestSuite_root ++ "/n_number_with_alpha_char.json"); }
465test { try expectFail(JSONTestSuite_root ++ "/n_number_with_alpha.json"); }
466test { try expectFail(JSONTestSuite_root ++ "/n_number_with_leading_zero.json"); }
467test { try expectFail(JSONTestSuite_root ++ "/n_object_bad_value.json"); }
468test { try expectFail(JSONTestSuite_root ++ "/n_object_bracket_key.json"); }
469test { try expectFail(JSONTestSuite_root ++ "/n_object_comma_instead_of_colon.json"); }
470test { try expectFail(JSONTestSuite_root ++ "/n_object_double_colon.json"); }
471test { try expectFail(JSONTestSuite_root ++ "/n_object_emoji.json"); }
472test { try expectFail(JSONTestSuite_root ++ "/n_object_garbage_at_end.json"); }
473test { try expectFail(JSONTestSuite_root ++ "/n_object_key_with_single_quotes.json"); }
474test { try expectFail(JSONTestSuite_root ++ "/n_object_lone_continuation_byte_in_key_and_trailing_comma.json"); }
475test { try expectFail(JSONTestSuite_root ++ "/n_object_missing_colon.json"); }
476test { try expectFail(JSONTestSuite_root ++ "/n_object_missing_key.json"); }
477test { try expectFail(JSONTestSuite_root ++ "/n_object_missing_semicolon.json"); }
478test { try expectFail(JSONTestSuite_root ++ "/n_object_missing_value.json"); }
479test { try expectFail(JSONTestSuite_root ++ "/n_object_no-colon.json"); }
480test { try expectFail(JSONTestSuite_root ++ "/n_object_non_string_key_but_huge_number_instead.json"); }
481test { try expectFail(JSONTestSuite_root ++ "/n_object_non_string_key.json"); }
482test { try expectFail(JSONTestSuite_root ++ "/n_object_repeated_null_null.json"); }
483test { try expectFail(JSONTestSuite_root ++ "/n_object_several_trailing_commas.json"); }
484test { try expectFail(JSONTestSuite_root ++ "/n_object_single_quote.json"); }
485test { try expectFail(JSONTestSuite_root ++ "/n_object_trailing_comma.json"); }
486test { try expectFail(JSONTestSuite_root ++ "/n_object_trailing_comment.json"); }
487test { try expectFail(JSONTestSuite_root ++ "/n_object_trailing_comment_open.json"); }
488test { try expectFail(JSONTestSuite_root ++ "/n_object_trailing_comment_slash_open_incomplete.json"); }
489test { try expectFail(JSONTestSuite_root ++ "/n_object_trailing_comment_slash_open.json"); }
490test { try expectFail(JSONTestSuite_root ++ "/n_object_two_commas_in_a_row.json"); }
491test { try expectFail(JSONTestSuite_root ++ "/n_object_unquoted_key.json"); }
492test { try expectFail(JSONTestSuite_root ++ "/n_object_unterminated-value.json"); }
493test { try expectFail(JSONTestSuite_root ++ "/n_object_with_single_string.json"); }
494test { try expectFail(JSONTestSuite_root ++ "/n_object_with_trailing_garbage.json"); }
495test { try expectFail(JSONTestSuite_root ++ "/n_single_space.json"); }
496test { try expectFail(JSONTestSuite_root ++ "/n_string_1_surrogate_then_escape.json"); }
497test { try expectFail(JSONTestSuite_root ++ "/n_string_1_surrogate_then_escape_u1.json"); }
498test { try expectFail(JSONTestSuite_root ++ "/n_string_1_surrogate_then_escape_u1x.json"); }
499test { try expectFail(JSONTestSuite_root ++ "/n_string_1_surrogate_then_escape_u.json"); }
500test { try expectFail(JSONTestSuite_root ++ "/n_string_accentuated_char_no_quotes.json"); }
501test { try expectFail(JSONTestSuite_root ++ "/n_string_backslash_00.json"); }
502test { try expectFail(JSONTestSuite_root ++ "/n_string_escaped_backslash_bad.json"); }
503test { try expectFail(JSONTestSuite_root ++ "/n_string_escaped_ctrl_char_tab.json"); }
504test { try expectFail(JSONTestSuite_root ++ "/n_string_escaped_emoji.json"); }
505test { try expectFail(JSONTestSuite_root ++ "/n_string_escape_x.json"); }
506test { try expectFail(JSONTestSuite_root ++ "/n_string_incomplete_escaped_character.json"); }
507test { try expectFail(JSONTestSuite_root ++ "/n_string_incomplete_escape.json"); }
508test { try expectFail(JSONTestSuite_root ++ "/n_string_incomplete_surrogate_escape_invalid.json"); }
509test { try expectFail(JSONTestSuite_root ++ "/n_string_incomplete_surrogate.json"); }
510test { try expectFail(JSONTestSuite_root ++ "/n_string_invalid_backslash_esc.json"); }
511test { try expectFail(JSONTestSuite_root ++ "/n_string_invalid_unicode_escape.json"); }
512test { try expectFail(JSONTestSuite_root ++ "/n_string_invalid_utf8_after_escape.json"); }
513test { try expectFail(JSONTestSuite_root ++ "/n_string_invalid-utf-8-in-escape.json"); }
514test { try expectFail(JSONTestSuite_root ++ "/n_string_leading_uescaped_thinspace.json"); }
515test { try expectFail(JSONTestSuite_root ++ "/n_string_no_quotes_with_bad_escape.json"); }
516test { try expectFail(JSONTestSuite_root ++ "/n_string_single_doublequote.json"); }
517test { try expectFail(JSONTestSuite_root ++ "/n_string_single_quote.json"); }
518test { try expectFail(JSONTestSuite_root ++ "/n_string_single_string_no_double_quotes.json"); }
519test { try expectFail(JSONTestSuite_root ++ "/n_string_start_escape_unclosed.json"); }
520test { try expectFail(JSONTestSuite_root ++ "/n_string_unescaped_ctrl_char.json"); }
521test { try expectFail(JSONTestSuite_root ++ "/n_string_unescaped_newline.json"); }
522test { try expectFail(JSONTestSuite_root ++ "/n_string_unescaped_tab.json"); }
523test { try expectFail(JSONTestSuite_root ++ "/n_string_unicode_CapitalU.json"); }
524test { try expectFail(JSONTestSuite_root ++ "/n_string_with_trailing_garbage.json"); }
525test { try expectFail(JSONTestSuite_root ++ "/n_structure_100000_opening_arrays.json"); }
526test { try expectFail(JSONTestSuite_root ++ "/n_structure_angle_bracket_..json"); }
527test { try expectFail(JSONTestSuite_root ++ "/n_structure_angle_bracket_null.json"); }
528test { try expectFail(JSONTestSuite_root ++ "/n_structure_array_trailing_garbage.json"); }
529test { try expectFail(JSONTestSuite_root ++ "/n_structure_array_with_extra_array_close.json"); }
530test { try expectFail(JSONTestSuite_root ++ "/n_structure_array_with_unclosed_string.json"); }
531test { try expectFail(JSONTestSuite_root ++ "/n_structure_ascii-unicode-identifier.json"); }
532test { try expectFail(JSONTestSuite_root ++ "/n_structure_capitalized_True.json"); }
533test { try expectFail(JSONTestSuite_root ++ "/n_structure_close_unopened_array.json"); }
534test { try expectFail(JSONTestSuite_root ++ "/n_structure_comma_instead_of_closing_brace.json"); }
535test { try expectFail(JSONTestSuite_root ++ "/n_structure_double_array.json"); }
536test { try expectFail(JSONTestSuite_root ++ "/n_structure_end_array.json"); }
537test { try expectFail(JSONTestSuite_root ++ "/n_structure_incomplete_UTF8_BOM.json"); }
538test { try expectFail(JSONTestSuite_root ++ "/n_structure_lone-invalid-utf-8.json"); }
539test { try expectFail(JSONTestSuite_root ++ "/n_structure_lone-open-bracket.json"); }
540test { try expectFail(JSONTestSuite_root ++ "/n_structure_no_data.json"); }
541test { try expectFail(JSONTestSuite_root ++ "/n_structure_null-byte-outside-string.json"); }
542test { try expectFail(JSONTestSuite_root ++ "/n_structure_number_with_trailing_garbage.json"); }
543test { try expectFail(JSONTestSuite_root ++ "/n_structure_object_followed_by_closing_object.json"); }
544test { try expectFail(JSONTestSuite_root ++ "/n_structure_object_unclosed_no_value.json"); }
545test { try expectFail(JSONTestSuite_root ++ "/n_structure_object_with_comment.json"); }
546test { try expectFail(JSONTestSuite_root ++ "/n_structure_object_with_trailing_garbage.json"); }
547test { try expectFail(JSONTestSuite_root ++ "/n_structure_open_array_apostrophe.json"); }
548test { try expectFail(JSONTestSuite_root ++ "/n_structure_open_array_comma.json"); }
549test { try expectFail(JSONTestSuite_root ++ "/n_structure_open_array_object.json"); }
550test { try expectFail(JSONTestSuite_root ++ "/n_structure_open_array_open_object.json"); }
551test { try expectFail(JSONTestSuite_root ++ "/n_structure_open_array_open_string.json"); }
552test { try expectFail(JSONTestSuite_root ++ "/n_structure_open_array_string.json"); }
553test { try expectFail(JSONTestSuite_root ++ "/n_structure_open_object_close_array.json"); }
554test { try expectFail(JSONTestSuite_root ++ "/n_structure_open_object_comma.json"); }
555test { try expectFail(JSONTestSuite_root ++ "/n_structure_open_object.json"); }
556test { try expectFail(JSONTestSuite_root ++ "/n_structure_open_object_open_array.json"); }
557test { try expectFail(JSONTestSuite_root ++ "/n_structure_open_object_open_string.json"); }
558test { try expectFail(JSONTestSuite_root ++ "/n_structure_open_object_string_with_apostrophes.json"); }
559test { try expectFail(JSONTestSuite_root ++ "/n_structure_open_open.json"); }
560test { try expectFail(JSONTestSuite_root ++ "/n_structure_single_eacute.json"); }
561test { try expectFail(JSONTestSuite_root ++ "/n_structure_single_star.json"); }
562test { try expectFail(JSONTestSuite_root ++ "/n_structure_trailing_#.json"); }
563test { try expectFail(JSONTestSuite_root ++ "/n_structure_U+2060_word_joined.json"); }
564test { try expectFail(JSONTestSuite_root ++ "/n_structure_uescaped_LF_before_string.json"); }
565test { try expectFail(JSONTestSuite_root ++ "/n_structure_unclosed_array.json"); }
566test { try expectFail(JSONTestSuite_root ++ "/n_structure_unclosed_array_partial_null.json"); }
567test { try expectFail(JSONTestSuite_root ++ "/n_structure_unclosed_array_unfinished_false.json"); }
568test { try expectFail(JSONTestSuite_root ++ "/n_structure_unclosed_array_unfinished_true.json"); }
569test { try expectFail(JSONTestSuite_root ++ "/n_structure_unclosed_object.json"); }
570test { try expectFail(JSONTestSuite_root ++ "/n_structure_unicode-identifier.json"); }
571test { try expectFail(JSONTestSuite_root ++ "/n_structure_UTF8_BOM_no_data.json"); }
572test { try expectFail(JSONTestSuite_root ++ "/n_structure_whitespace_formfeed.json"); }
573test { try expectFail(JSONTestSuite_root ++ "/n_structure_whitespace_U+2060_word_joiner.json"); }
574// zig fmt: on
575
576fn expectCanonical(buffer: []const u8) !void {
577 const alloc = std.testing.allocator;
578 var fbs: nio.FixedBufferStream([]const u8) = .init(buffer);
579 var doc = try json.parse(alloc, "", &fbs, .{ .support_trailing_commas = true, .maximum_depth = 100 });
580 defer doc.deinit(alloc);
581 doc.acquire();
582 defer doc.release();
583 try expect(buffer).toEqualNFmt("{}", .{doc});
584
585 var buf: [4096]u8 = undefined;
586 var out: nio.FixedBufferStream([]u8) = .init(&buf);
587 try doc.stringify(&out, .{ .count = 0 }, 0);
588 try std.testing.expectEqualStrings(buffer, out.buffer[0..out.pos]);
589}
590
591// zig fmt: off
592test { try expectCanonical("{}"); }
593test { try expectCanonical("[]"); }
594test { try expectCanonical("\"aba\""); }
595test { try expectCanonical("4.3"); }
596test { try expectCanonical("true"); }
597test { try expectCanonical("false"); }
598test { try expectCanonical("null"); }
599test { try expectCanonical("[7,8,9]"); }
600// zig fmt: on
601
602test {
603 const alloc = std.testing.allocator;
604 var fbs: nio.FixedBufferStream([]const u8) = .init(
605 \\["abc",456,"ghi",{"foo":"bar"}]
606 );
607 var doc = try json.parse(alloc, "", &fbs, .{ .support_trailing_commas = true, .maximum_depth = 100 });
608 defer doc.deinit(alloc);
609 doc.acquire();
610 defer doc.release();
611
612 const a = doc.root.array();
613 try std.testing.expectEqual(4, a.len);
614 try std.testing.expectEqualStrings("abc", a[0].string());
615 try std.testing.expectEqual(456, a[1].number().get(u16));
616 try std.testing.expectEqualStrings("ghi", a[2].string());
617 try std.testing.expectEqualStrings("bar", a[3].object().getS("foo").?);
618}
619
620test {
621 try expectCanonical(
622 \\{"asd":"sdf","dfg":"fgh"}
623 );
624}
625test {
626 try expectCanonical(
627 \\{"min":-1.0e+28,"max":1.0e+28}
628 );
629}
630test {
631 try expectCanonical(
632 \\[{"type":"interface","name":"A","inheritance":null,"members":[{"type":"operation","name":"toWord","idlType":{"type":"return-type","extAttrs":[],"generic":"","nullable":false,"union":false,"idlType":"DOMString"},"arguments":[{"type":"argument","name":"index","extAttrs":[],"idlType":{"type":"argument-type","extAttrs":[],"generic":"","nullable":false,"union":false,"idlType":"unsigned long"},"default":null,"optional":false,"variadic":false}],"extAttrs":[],"special":"getter"}],"extAttrs":[{"type":"extended-attribute","name":"Exposed","rhs":{"type":"identifier","value":"Window"},"arguments":[]}],"partial":false}]
633 );
634}