1use uson::{parse, apply_builtin_types, Value, Number};
2use serde_json;
3
4fn parse_and_apply_types(input: &str) -> Vec<Value> {
5 let values = parse(input).expect("Parse should succeed");
6 values.into_iter().map(apply_builtin_types).collect()
7}
8
9fn to_array_mode(values: &[Value]) -> serde_json::Value {
10 serde_json::to_value(values).unwrap()
11}
12
13fn to_object_mode(values: &[Value]) -> serde_json::Value {
14 let mut result = serde_json::Map::new();
15 let mut non_object_index = 0;
16
17 for value in values.iter() {
18 match value {
19 Value::Object(obj) => {
20 for (key, val) in obj {
21 result.insert(key.clone(), serde_json::to_value(val).unwrap());
22 }
23 }
24 _ => {
25 result.insert(non_object_index.to_string(), serde_json::to_value(value).unwrap());
26 non_object_index += 1;
27 }
28 }
29 }
30
31 serde_json::Value::Object(result)
32}
33
34// BASIC TESTS
35
36#[test]
37fn test_empty_input() {
38 let values = parse_and_apply_types("");
39 assert_eq!(to_array_mode(&values), serde_json::json!([]));
40 assert_eq!(to_object_mode(&values), serde_json::json!({}));
41}
42
43#[test]
44fn test_empty_whitespace() {
45 let values = parse_and_apply_types(" ");
46 assert_eq!(to_array_mode(&values), serde_json::json!([]));
47 assert_eq!(to_object_mode(&values), serde_json::json!({}));
48}
49
50#[test]
51fn test_empty_newlines() {
52 let values = parse_and_apply_types("\n ");
53 assert_eq!(to_array_mode(&values), serde_json::json!([]));
54 assert_eq!(to_object_mode(&values), serde_json::json!({}));
55}
56
57#[test]
58fn test_simple_values() {
59 let values = parse_and_apply_types("a b c");
60 assert_eq!(to_array_mode(&values), serde_json::json!(["a", "b", "c"]));
61 assert_eq!(to_object_mode(&values), serde_json::json!({"0": "a", "1": "b", "2": "c"}));
62}
63
64#[test]
65fn test_nested_array_single() {
66 let values = parse_and_apply_types("[a]");
67 assert_eq!(to_array_mode(&values), serde_json::json!([["a"]]));
68 assert_eq!(to_object_mode(&values), serde_json::json!({"0": ["a"]}));
69}
70
71#[test]
72fn test_nested_array_multiple() {
73 let values = parse_and_apply_types("[a b c]");
74 assert_eq!(to_array_mode(&values), serde_json::json!([["a", "b", "c"]]));
75 assert_eq!(to_object_mode(&values), serde_json::json!({"0": ["a", "b", "c"]}));
76}
77
78#[test]
79fn test_nested_array_deep() {
80 let values = parse_and_apply_types("[a [[b]] c]");
81 assert_eq!(to_array_mode(&values), serde_json::json!([["a", [["b"]], "c"]]));
82 assert_eq!(to_object_mode(&values), serde_json::json!({"0": ["a", [["b"]], "c"]}));
83}
84
85#[test]
86fn test_simple_objects() {
87 let values = parse_and_apply_types("a:1 b:2 c:3");
88 assert_eq!(to_array_mode(&values), serde_json::json!([{"a": 1}, {"b": 2}, {"c": 3}]));
89 assert_eq!(to_object_mode(&values), serde_json::json!({"a": 1, "b": 2, "c": 3}));
90}
91
92#[test]
93fn test_simple_objects_in_array() {
94 let values = parse_and_apply_types("[a:1 b:2 c:3]");
95 assert_eq!(to_array_mode(&values), serde_json::json!([[{"a": 1}, {"b": 2}, {"c": 3}]]));
96 assert_eq!(to_object_mode(&values), serde_json::json!({"0": [{"a": 1}, {"b": 2}, {"c": 3}]}));
97}
98
99#[test]
100fn test_type_str() {
101 let values = parse_and_apply_types("str!42");
102 assert_eq!(to_array_mode(&values), serde_json::json!(["42"]));
103 assert_eq!(to_object_mode(&values), serde_json::json!({"0": "42"}));
104}
105
106#[test]
107fn test_type_nested() {
108 let values = parse_and_apply_types("int!str!42");
109 assert_eq!(to_array_mode(&values), serde_json::json!([42]));
110 assert_eq!(to_object_mode(&values), serde_json::json!({"0": 42}));
111}
112
113#[test]
114fn test_type_triple_nested() {
115 let values = parse_and_apply_types("str!int!str!42");
116 assert_eq!(to_array_mode(&values), serde_json::json!(["42"]));
117 assert_eq!(to_object_mode(&values), serde_json::json!({"0": "42"}));
118}
119
120#[test]
121fn test_type_in_object() {
122 let values = parse_and_apply_types("x:{test:str!42 multi:bool!str!true}");
123 assert_eq!(
124 to_array_mode(&values),
125 serde_json::json!([{"x": {"test": "42", "multi": true}}])
126 );
127 assert_eq!(
128 to_object_mode(&values),
129 serde_json::json!({"x": {"test": "42", "multi": true}})
130 );
131}
132
133#[test]
134fn test_type_str_array() {
135 let values = parse_and_apply_types("str![1 2 3]");
136 assert_eq!(to_array_mode(&values), serde_json::json!(["1,2,3"]));
137 assert_eq!(to_object_mode(&values), serde_json::json!({"0": "1,2,3"}));
138}
139
140#[test]
141fn test_type_nonexistent() {
142 let values = parse_and_apply_types("nonexists!42");
143 assert_eq!(to_array_mode(&values), serde_json::json!([42]));
144 assert_eq!(to_object_mode(&values), serde_json::json!({"0": 42}));
145}
146
147#[test]
148fn test_type_custom_name() {
149 let values = parse_and_apply_types("A_b3-!42");
150 assert_eq!(to_array_mode(&values), serde_json::json!([42]));
151 assert_eq!(to_object_mode(&values), serde_json::json!({"0": 42}));
152}
153
154#[test]
155fn test_advanced_example() {
156 let values = parse_and_apply_types(
157 r#"number:12.05 text:Banana quotedText:"John Devilseed" empty:null good:true"#
158 );
159 assert_eq!(
160 to_array_mode(&values),
161 serde_json::json!([
162 {"number": 12.05},
163 {"text": "Banana"},
164 {"quotedText": "John Devilseed"},
165 {"empty": null},
166 {"good": true}
167 ])
168 );
169 assert_eq!(
170 to_object_mode(&values),
171 serde_json::json!({
172 "number": 12.05,
173 "text": "Banana",
174 "quotedText": "John Devilseed",
175 "empty": null,
176 "good": true
177 })
178 );
179}
180
181// TYPE TESTS
182
183#[test]
184fn test_number_integer() {
185 let values = parse_and_apply_types("1");
186 assert_eq!(to_array_mode(&values), serde_json::json!([1]));
187 assert_eq!(to_object_mode(&values), serde_json::json!({"0": 1}));
188}
189
190#[test]
191fn test_number_float() {
192 let values = parse_and_apply_types("42.42");
193 assert_eq!(to_array_mode(&values), serde_json::json!([42.42]));
194 assert_eq!(to_object_mode(&values), serde_json::json!({"0": 42.42}));
195}
196
197#[test]
198fn test_number_negative() {
199 let values = parse_and_apply_types("-50.43");
200 assert_eq!(to_array_mode(&values), serde_json::json!([-50.43]));
201 assert_eq!(to_object_mode(&values), serde_json::json!({"0": -50.43}));
202}
203
204#[test]
205fn test_number_large() {
206 let values = parse_and_apply_types("1000000.0001");
207 assert_eq!(to_array_mode(&values), serde_json::json!([1000000.0001]));
208 assert_eq!(to_object_mode(&values), serde_json::json!({"0": 1000000.0001}));
209}
210
211#[test]
212fn test_number_scientific() {
213 let values = parse_and_apply_types("10e5");
214 assert_eq!(to_array_mode(&values), serde_json::json!([10e5]));
215 assert_eq!(to_object_mode(&values), serde_json::json!({"0": 10e5}));
216}
217
218#[test]
219fn test_float_type_cast() {
220 let values = parse_and_apply_types(r#"float!"42.42""#);
221 assert_eq!(to_array_mode(&values), serde_json::json!([42.42]));
222 assert_eq!(to_object_mode(&values), serde_json::json!({"0": 42.42}));
223}
224
225#[test]
226fn test_string_simple() {
227 let values = parse_and_apply_types("abc");
228 assert_eq!(to_array_mode(&values), serde_json::json!(["abc"]));
229 assert_eq!(to_object_mode(&values), serde_json::json!({"0": "abc"}));
230}
231
232#[test]
233fn test_string_starts_with_digit() {
234 let values = parse_and_apply_types("1ab");
235 assert_eq!(to_array_mode(&values), serde_json::json!(["1ab"]));
236 assert_eq!(to_object_mode(&values), serde_json::json!({"0": "1ab"}));
237}
238
239#[test]
240fn test_string_multiple() {
241 let values = parse_and_apply_types("abc def");
242 assert_eq!(to_array_mode(&values), serde_json::json!(["abc", "def"]));
243 assert_eq!(to_object_mode(&values), serde_json::json!({"0": "abc", "1": "def"}));
244}
245
246#[test]
247fn test_string_double_quoted() {
248 let values = parse_and_apply_types(r#""abc""#);
249 assert_eq!(to_array_mode(&values), serde_json::json!(["abc"]));
250 assert_eq!(to_object_mode(&values), serde_json::json!({"0": "abc"}));
251}
252
253#[test]
254fn test_string_double_quoted_with_space() {
255 let values = parse_and_apply_types(r#""abc def""#);
256 assert_eq!(to_array_mode(&values), serde_json::json!(["abc def"]));
257 assert_eq!(to_object_mode(&values), serde_json::json!({"0": "abc def"}));
258}
259
260#[test]
261fn test_string_double_quoted_escaped() {
262 let values = parse_and_apply_types(r#""abc \"ok def""#);
263 assert_eq!(to_array_mode(&values), serde_json::json!([r#"abc "ok def"#]));
264 assert_eq!(to_object_mode(&values), serde_json::json!({"0": r#"abc "ok def"#}));
265}
266
267#[test]
268fn test_string_single_quoted() {
269 let values = parse_and_apply_types("'abc'");
270 assert_eq!(to_array_mode(&values), serde_json::json!(["abc"]));
271 assert_eq!(to_object_mode(&values), serde_json::json!({"0": "abc"}));
272}
273
274#[test]
275fn test_string_single_quoted_with_space() {
276 let values = parse_and_apply_types("'abc def'");
277 assert_eq!(to_array_mode(&values), serde_json::json!(["abc def"]));
278 assert_eq!(to_object_mode(&values), serde_json::json!({"0": "abc def"}));
279}
280
281#[test]
282fn test_string_single_quoted_escaped() {
283 let values = parse_and_apply_types(r#"'abc \'42 def'"#);
284 assert_eq!(to_array_mode(&values), serde_json::json!(["abc '42 def"]));
285 assert_eq!(to_object_mode(&values), serde_json::json!({"0": "abc '42 def"}));
286}
287
288#[test]
289fn test_null_value() {
290 let values = parse_and_apply_types("null");
291 assert_eq!(to_array_mode(&values), serde_json::json!([null]));
292 assert_eq!(to_object_mode(&values), serde_json::json!({"0": null}));
293}
294
295#[test]
296fn test_null_typed() {
297 let values = parse_and_apply_types("x:null!xx");
298 assert_eq!(to_array_mode(&values), serde_json::json!([{"x": null}]));
299 assert_eq!(to_object_mode(&values), serde_json::json!({"x": null}));
300}
301
302#[test]
303fn test_true_value() {
304 let values = parse_and_apply_types("true");
305 assert_eq!(to_array_mode(&values), serde_json::json!([true]));
306 assert_eq!(to_object_mode(&values), serde_json::json!({"0": true}));
307}
308
309#[test]
310fn test_bool_true_typed() {
311 let values = parse_and_apply_types(r#"bool!"true""#);
312 assert_eq!(to_array_mode(&values), serde_json::json!([true]));
313 assert_eq!(to_object_mode(&values), serde_json::json!({"0": true}));
314}
315
316#[test]
317fn test_false_value() {
318 let values = parse_and_apply_types("false");
319 assert_eq!(to_array_mode(&values), serde_json::json!([false]));
320 assert_eq!(to_object_mode(&values), serde_json::json!({"0": false}));
321}
322
323#[test]
324fn test_bool_false_typed() {
325 let values = parse_and_apply_types(r#"bool!"false""#);
326 assert_eq!(to_array_mode(&values), serde_json::json!([false]));
327 assert_eq!(to_object_mode(&values), serde_json::json!({"0": false}));
328}
329
330#[test]
331fn test_array_single() {
332 let values = parse_and_apply_types("[a]");
333 assert_eq!(to_array_mode(&values), serde_json::json!([["a"]]));
334 assert_eq!(to_object_mode(&values), serde_json::json!({"0": ["a"]}));
335}
336
337#[test]
338fn test_array_numbers_no_comma() {
339 let values = parse_and_apply_types("[1 2 3]");
340 assert_eq!(to_array_mode(&values), serde_json::json!([[1, 2, 3]]));
341 assert_eq!(to_object_mode(&values), serde_json::json!({"0": [1, 2, 3]}));
342}
343
344#[test]
345fn test_array_numbers_with_commas() {
346 let values = parse_and_apply_types("[1, 2, 3]");
347 assert_eq!(to_array_mode(&values), serde_json::json!([[1, 2, 3]]));
348 assert_eq!(to_object_mode(&values), serde_json::json!({"0": [1, 2, 3]}));
349}
350
351#[test]
352fn test_array_numbers_mixed_commas() {
353 let values = parse_and_apply_types("[1 2,3 ]");
354 assert_eq!(to_array_mode(&values), serde_json::json!([[1, 2, 3]]));
355 assert_eq!(to_object_mode(&values), serde_json::json!({"0": [1, 2, 3]}));
356}
357
358#[test]
359fn test_array_typed() {
360 let values = parse_and_apply_types(r#"arr!"1,2,3""#);
361 assert_eq!(to_array_mode(&values), serde_json::json!([[1, 2, 3]]));
362 assert_eq!(to_object_mode(&values), serde_json::json!({"0": [1, 2, 3]}));
363}
364
365#[test]
366fn test_object_single() {
367 let values = parse_and_apply_types("{a:1}");
368 assert_eq!(to_array_mode(&values), serde_json::json!([{"a": 1}]));
369 assert_eq!(to_object_mode(&values), serde_json::json!({"a": 1}));
370}
371
372#[test]
373fn test_object_multiple_no_comma() {
374 let values = parse_and_apply_types("{a:1 b:two c:3}");
375 assert_eq!(to_array_mode(&values), serde_json::json!([{"a": 1, "b": "two", "c": 3}]));
376 assert_eq!(to_object_mode(&values), serde_json::json!({"a": 1, "b": "two", "c": 3}));
377}
378
379#[test]
380fn test_object_multiple_with_commas() {
381 let values = parse_and_apply_types("{a:1,b:two,c:3}");
382 assert_eq!(to_array_mode(&values), serde_json::json!([{"a": 1, "b": "two", "c": 3}]));
383 assert_eq!(to_object_mode(&values), serde_json::json!({"a": 1, "b": "two", "c": 3}));
384}
385
386#[test]
387fn test_object_typed() {
388 let values = parse_and_apply_types(r#"obj!'"a":1'"#);
389 assert_eq!(to_array_mode(&values), serde_json::json!([{"a": 1}]));
390 assert_eq!(to_object_mode(&values), serde_json::json!({"a": 1}));
391}
392
393#[test]
394fn test_object_nested() {
395 let values = parse_and_apply_types("x:{a:1 b:coffee}");
396 assert_eq!(
397 to_array_mode(&values),
398 serde_json::json!([{"x": {"a": 1, "b": "coffee"}}])
399 );
400 assert_eq!(
401 to_object_mode(&values),
402 serde_json::json!({"x": {"a": 1, "b": "coffee"}})
403 );
404}
405
406#[test]
407fn test_assign_simple() {
408 let values = parse_and_apply_types("a:1");
409 assert_eq!(to_array_mode(&values), serde_json::json!([{"a": 1}]));
410 assert_eq!(to_object_mode(&values), serde_json::json!({"a": 1}));
411}
412
413#[test]
414fn test_assign_multiple() {
415 let values = parse_and_apply_types("a:1 b:2 c:3");
416 assert_eq!(to_array_mode(&values), serde_json::json!([{"a": 1}, {"b": 2}, {"c": 3}]));
417 assert_eq!(to_object_mode(&values), serde_json::json!({"a": 1, "b": 2, "c": 3}));
418}
419
420#[test]
421fn test_assign_single_quoted_key() {
422 let values = parse_and_apply_types("'a':1");
423 assert_eq!(to_array_mode(&values), serde_json::json!([{"a": 1}]));
424 assert_eq!(to_object_mode(&values), serde_json::json!({"a": 1}));
425}
426
427#[test]
428fn test_assign_double_quoted_key() {
429 let values = parse_and_apply_types(r#""a":1"#);
430 assert_eq!(to_array_mode(&values), serde_json::json!([{"a": 1}]));
431 assert_eq!(to_object_mode(&values), serde_json::json!({"a": 1}));
432}
433
434#[test]
435fn test_assign_special_chars() {
436 let values = parse_and_apply_types("~@$%^&*()-:1");
437 assert_eq!(to_array_mode(&values), serde_json::json!([{"~@$%^&*()-": 1}]));
438 assert_eq!(to_object_mode(&values), serde_json::json!({"~@$%^&*()-": 1}));
439}
440
441#[test]
442fn test_comment_empty() {
443 let values = parse_and_apply_types("#");
444 assert_eq!(to_array_mode(&values), serde_json::json!([]));
445 assert_eq!(to_object_mode(&values), serde_json::json!({}));
446}
447
448#[test]
449fn test_comment_escaped_hash() {
450 let values = parse_and_apply_types(r"a:\#");
451 assert_eq!(to_array_mode(&values), serde_json::json!([{"a": "#"}]));
452 assert_eq!(to_object_mode(&values), serde_json::json!({"a": "#"}));
453}
454
455#[test]
456fn test_comment_in_quotes() {
457 let values = parse_and_apply_types(r"a:'\#1'");
458 assert_eq!(to_array_mode(&values), serde_json::json!([{"a": "#1"}]));
459 assert_eq!(to_object_mode(&values), serde_json::json!({"a": "#1"}));
460}
461
462#[test]
463fn test_comment_after_value() {
464 let values = parse_and_apply_types("a:1 # a");
465 assert_eq!(to_array_mode(&values), serde_json::json!([{"a": 1}]));
466 assert_eq!(to_object_mode(&values), serde_json::json!({"a": 1}));
467}
468
469#[test]
470fn test_comment_with_spaces() {
471 let values = parse_and_apply_types(" # a");
472 assert_eq!(to_array_mode(&values), serde_json::json!([]));
473 assert_eq!(to_object_mode(&values), serde_json::json!({}));
474}
475
476#[test]
477fn test_comment_line_start() {
478 let values = parse_and_apply_types("#a");
479 assert_eq!(to_array_mode(&values), serde_json::json!([]));
480 assert_eq!(to_object_mode(&values), serde_json::json!({}));
481}
482
483#[test]
484fn test_comment_in_array() {
485 let values = parse_and_apply_types("x: [a # b c]\n# good\n tone ]");
486 assert_eq!(to_array_mode(&values), serde_json::json!([{"x": ["a", "tone"]}]));
487 assert_eq!(to_object_mode(&values), serde_json::json!({"x": ["a", "tone"]}));
488}
489
490#[test]
491fn test_comment_complex() {
492 let values = parse_and_apply_types("{x: [#y ]\n] #n\n} 42 #^\n@");
493 assert_eq!(to_array_mode(&values), serde_json::json!([{"x": []}, 42, "@"]));
494 assert_eq!(to_object_mode(&values), serde_json::json!({"0": 42, "1": "@", "x": []}));
495}