1
/*
2
 * Hurl (https://hurl.dev)
3
 * Copyright (C) 2024 Orange
4
 *
5
 * Licensed under the Apache License, Version 2.0 (the "License");
6
 * you may not use this file except in compliance with the License.
7
 * You may obtain a copy of the License at
8
 *
9
 *          http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 * See the License for the specific language governing permissions and
15
 * limitations under the License.
16
 *
17
 */
18
use crate::ast::{JsonListElement, JsonObjectElement, JsonValue, SourceInfo, Template};
19
use crate::combinator::{choice, non_recover, ParseError as ParseErrorTrait};
20
use crate::parser::error::*;
21
use crate::parser::primitives::*;
22
use crate::parser::template::*;
23
use crate::parser::{expr, ParseResult};
24
use crate::reader::{Pos, Reader};
25

            
26
25960
pub fn parse(reader: &mut Reader) -> ParseResult<JsonValue> {
27
25960
    choice(
28
25960
        &[
29
25960
            null_value,
30
25960
            boolean_value,
31
25960
            string_value,
32
25960
            number_value,
33
25960
            expression_value,
34
25960
            list_value,
35
25960
            object_value,
36
25960
        ],
37
25960
        reader,
38
25960
    )
39
}
40

            
41
/// Helper for parse, but already knowing that we are inside a JSON body.
42
2700
fn parse_in_json(reader: &mut Reader) -> ParseResult<JsonValue> {
43
2700
    if let Some(c) = reader.peek() {
44
2700
        if c == ',' {
45
            let kind = ParseErrorKind::Json(JsonErrorVariant::EmptyElement);
46
            return Err(ParseError::new(reader.cursor().pos, false, kind));
47
        }
48
    }
49
2700
    match parse(reader) {
50
2660
        Ok(r) => Ok(r),
51
        // The only error that is recoverable is caused by reaching object_value try_literal('{'),
52
        // but this is not recoverable in this case, because we already know that we are in a JSON
53
        // body. So, we change the error to CannotResolve for the object found.
54
40
        Err(e) => match e {
55
            ParseError {
56
                recoverable: true, ..
57
            } => {
58
15
                let kind = ParseErrorKind::Json(JsonErrorVariant::ExpectingElement);
59
15
                Err(ParseError::new(e.pos, false, kind))
60
            }
61
25
            _ => Err(ParseError::new(e.pos, false, e.kind)),
62
        },
63
    }
64
}
65

            
66
25980
pub fn null_value(reader: &mut Reader) -> ParseResult<JsonValue> {
67
25980
    try_literal("null", reader)?;
68
40
    Ok(JsonValue::Null)
69
}
70

            
71
25950
pub fn boolean_value(reader: &mut Reader) -> ParseResult<JsonValue> {
72
25950
    let value = boolean(reader)?;
73
60
    Ok(JsonValue::Boolean(value))
74
}
75

            
76
25870
fn string_value(reader: &mut Reader) -> ParseResult<JsonValue> {
77
25870
    let template = string_template(reader)?;
78
895
    Ok(JsonValue::String(template))
79
}
80

            
81
27610
fn string_template(reader: &mut Reader) -> ParseResult<Template> {
82
27610
    try_literal("\"", reader)?;
83
2645
    let delimiter = Some('"');
84
2645
    let mut chars = vec![];
85
2645
    let start = reader.cursor();
86
    loop {
87
22730
        if reader.peek() == Some('"') || reader.is_eof() {
88
2635
            break;
89
        }
90
20095
        let char = any_char(reader)?;
91
20085
        chars.push(char);
92
    }
93
2635
    let end = reader.cursor();
94
2635

            
95
2635
    let encoded_string = EncodedString {
96
2635
        source_info: SourceInfo::new(start.pos, end.pos),
97
2635
        chars,
98
2635
    };
99
2635
    literal("\"", reader)?;
100
2635
    let elements = templatize(encoded_string)?;
101

            
102
2635
    let template = Template {
103
2635
        delimiter,
104
2635
        elements,
105
2635
        source_info: SourceInfo::new(start.pos, end.pos),
106
2635
    };
107
2635
    Ok(template)
108
}
109

            
110
20095
fn any_char(reader: &mut Reader) -> ParseResult<(char, String, Pos)> {
111
20095
    let start = reader.cursor();
112
20095
    match escape_char(reader) {
113
255
        Ok(c) => Ok((c, reader.read_from(start.index), start.pos)),
114
19840
        Err(e) => {
115
19840
            if e.recoverable {
116
19830
                reader.seek(start);
117
19830
                match reader.read() {
118
                    None => {
119
                        let kind = ParseErrorKind::Expecting {
120
                            value: "char".to_string(),
121
                        };
122
                        Err(ParseError::new(start.pos, true, kind))
123
                    }
124
19830
                    Some(c) => {
125
19830
                        if ['\\', '\x08', '\n', '\x0c', '\r', '\t'].contains(&c) {
126
                            let kind = ParseErrorKind::Expecting {
127
                                value: "char".to_string(),
128
                            };
129
                            Err(ParseError::new(start.pos, true, kind))
130
                        } else {
131
19830
                            Ok((c, reader.read_from(start.index), start.pos))
132
                        }
133
                    }
134
                }
135
            } else {
136
10
                Err(e)
137
            }
138
        }
139
    }
140
}
141

            
142
20095
fn escape_char(reader: &mut Reader) -> ParseResult<char> {
143
20095
    try_literal("\\", reader)?;
144
265
    let start = reader.cursor();
145
265
    match reader.read() {
146
80
        Some('"') => Ok('"'),
147
5
        Some('\\') => Ok('\\'),
148
        Some('/') => Ok('/'),
149
        Some('b') => Ok('\x08'),
150
165
        Some('n') => Ok('\n'),
151
        Some('f') => Ok('\x0c'),
152
        Some('r') => Ok('\r'),
153
        Some('t') => Ok('\t'),
154
15
        Some('u') => unicode(reader),
155
        _ => Err(ParseError::new(
156
            start.pos,
157
            false,
158
            ParseErrorKind::EscapeChar,
159
        )),
160
    }
161
}
162

            
163
15
fn unicode(reader: &mut Reader) -> ParseResult<char> {
164
15
    let start = reader.cursor();
165
15
    let cp1 = hex_value(reader)?;
166
10
    let cp = if is_surrogate(cp1) {
167
10
        literal("\\u", reader)?;
168
10
        let start = reader.cursor();
169
10
        let cp2 = hex_value(reader)?;
170
10
        match cp_surrogate_pair(cp1, cp2) {
171
5
            None => return Err(ParseError::new(start.pos, false, ParseErrorKind::Unicode)),
172
5
            Some(cp) => cp,
173
        }
174
    } else {
175
        cp1
176
    };
177
5
    let c = match char::from_u32(cp) {
178
        None => return Err(ParseError::new(start.pos, false, ParseErrorKind::Unicode)),
179
5
        Some(c) => c,
180
5
    };
181
5
    Ok(c)
182
}
183

            
184
// 0xd800-0xdc00 encodes the high 10 bits of a pair.
185
// 0xdc00-0xe000 encodes the low 10 bits of a pair.
186
// the value is those 20 bits plus 0x10000.
187
const SURR1: u32 = 0xd800;
188
const SURR2: u32 = 0xdc00;
189
const SURR3: u32 = 0xe000;
190
const SURR_SELF: u32 = 0x10000;
191

            
192
/// Returns whether the specified Unicode code point can appear in a surrogate pair.
193
10
fn is_surrogate(cp: u32) -> bool {
194
10
    (SURR1..SURR3).contains(&cp)
195
}
196

            
197
10
fn cp_surrogate_pair(cp1: u32, cp2: u32) -> Option<u32> {
198
10
    if (SURR1..SURR2).contains(&cp1) && (SURR2..SURR3).contains(&cp2) {
199
5
        Some(((cp1 - SURR1) << 10) | ((cp2 - SURR2) + SURR_SELF))
200
    } else {
201
5
        None
202
    }
203
}
204

            
205
25
fn hex_value(reader: &mut Reader) -> ParseResult<u32> {
206
25
    let digit1 = non_recover(hex_digit, reader)?;
207
25
    let digit2 = non_recover(hex_digit, reader)?;
208
25
    let digit3 = non_recover(hex_digit, reader)?;
209
25
    let digit4 = non_recover(hex_digit, reader)?;
210
20
    let value = digit1 * (16 * 16 * 16) + digit2 * (16 * 16) + digit3 * 16 + digit4;
211
20
    Ok(value)
212
}
213

            
214
25000
pub fn number_value(reader: &mut Reader) -> ParseResult<JsonValue> {
215
25000
    let start = reader.cursor();
216

            
217
25000
    let sign = match try_literal("-", reader) {
218
24960
        Err(_) => String::new(),
219
40
        Ok(_) => "-".to_string(),
220
    };
221

            
222
25000
    let integer = match try_literal("0", reader) {
223
        Err(_) => {
224
29651
            let digits = reader.read_while(|c| c.is_ascii_digit());
225
24780
            if digits.is_empty() {
226
24030
                let kind = ParseErrorKind::Expecting {
227
24030
                    value: "number".to_string(),
228
24030
                };
229
24030
                return Err(ParseError::new(start.pos, true, kind));
230
            } else {
231
750
                digits
232
            }
233
        }
234
220
        Ok(_) => "0".to_string(),
235
    };
236

            
237
970
    let fraction = match try_literal(".", reader) {
238
        Ok(_) => {
239
3825
            let digits = reader.read_while(|c| c.is_ascii_digit());
240
575
            if digits.is_empty() {
241
                let kind = ParseErrorKind::Expecting {
242
                    value: "digits".to_string(),
243
                };
244
                return Err(ParseError::new(reader.cursor().pos, false, kind));
245
            } else {
246
575
                format!(".{digits}")
247
            }
248
        }
249
395
        Err(_) => String::new(),
250
    };
251

            
252
970
    let exponent = if reader.peek() == Some('e') || reader.peek() == Some('E') {
253
5
        reader.read();
254
5
        let exponent_sign = match try_literal("-", reader) {
255
            Ok(_) => "-".to_string(),
256
5
            Err(_) => match try_literal("+", reader) {
257
                Ok(_) => "+".to_string(),
258
5
                Err(_) => String::new(),
259
            },
260
        };
261
21
        let exponent_digits = reader.read_while(|c| c.is_ascii_digit());
262
5
        format!("e{exponent_sign}{exponent_digits}")
263
    } else {
264
965
        String::new()
265
    };
266

            
267
970
    Ok(JsonValue::Number(format!(
268
970
        "{sign}{integer}{fraction}{exponent}"
269
970
    )))
270
}
271

            
272
24005
fn expression_value(reader: &mut Reader) -> ParseResult<JsonValue> {
273
24005
    let exp = expr::parse(reader)?;
274
50
    Ok(JsonValue::Expression(exp))
275
}
276

            
277
23955
fn list_value(reader: &mut Reader) -> ParseResult<JsonValue> {
278
23955
    try_literal("[", reader)?;
279
345
    let space0 = whitespace(reader);
280
345
    let mut elements = vec![];
281
345

            
282
345
    // at least one element
283
345
    if reader.peek() != Some(']') {
284
305
        let first_element = list_element(reader)?;
285
305
        elements.push(first_element);
286

            
287
        loop {
288
960
            if reader.peek() == Some(']') {
289
295
                break;
290
            }
291
665
            // Reports "expecting ']'" in case the user forgot to add the last ']', e.g
292
665
            // `[1, 2`
293
665
            if reader.peek() != Some(',') {
294
                break;
295
            }
296
665
            // The reader advances after literal(","), so this saves its position to report an
297
665
            // error in case it happens.
298
665
            let save = reader.cursor();
299
665
            literal(",", reader)?;
300
            // If there is one more comma, e.g. [1, 2,], it's better to report to the user because
301
            // this occurrence is common.
302
2108
            if reader.peek_if(|c| !is_whitespace(c)) == Some(']') {
303
5
                let kind = ParseErrorKind::Json(JsonErrorVariant::TrailingComma);
304
5
                return Err(ParseError::new(save.pos, false, kind));
305
            }
306
660
            let element = list_element(reader)?;
307
655
            elements.push(element);
308
        }
309
    }
310
335
    literal("]", reader)?;
311

            
312
335
    Ok(JsonValue::List { space0, elements })
313
}
314

            
315
965
fn list_element(reader: &mut Reader) -> ParseResult<JsonListElement> {
316
965
    let space0 = whitespace(reader);
317
965
    let value = parse_in_json(reader)?;
318
960
    let space1 = whitespace(reader);
319
960
    Ok(JsonListElement {
320
960
        space0,
321
960
        value,
322
960
        space1,
323
960
    })
324
}
325

            
326
23650
pub fn object_value(reader: &mut Reader) -> ParseResult<JsonValue> {
327
23650
    try_literal("{", reader)?;
328
730
    let space0 = whitespace(reader);
329
730
    let mut elements = vec![];
330
730
    if reader.peek() != Some('}') {
331
695
        let first_element = object_element(reader)?;
332
655
        elements.push(first_element);
333

            
334
        loop {
335
1700
            if reader.peek() == Some('}') {
336
650
                break;
337
            }
338
1050
            // Reports "expecting '}'" in case the user forgot to add the last '}', e.g
339
1050
            // `{"name": "abc"`
340
1050
            if reader.peek() != Some(',') {
341
                break;
342
            }
343
1050
            // The reader advances after literal(","), so this saves its position to report an
344
1050
            // error in case it happens.
345
1050
            let save = reader.cursor();
346
1050
            literal(",", reader)?;
347
            // If there is one more comma, e.g. {"a": "b",}, it's better to report to the user
348
            // because this occurrence is common.
349
6800
            if reader.peek_if(|c| !is_whitespace(c)) == Some('}') {
350
5
                let kind = ParseErrorKind::Json(JsonErrorVariant::TrailingComma);
351
5
                return Err(ParseError::new(save.pos, false, kind));
352
            }
353
1045
            let element = object_element(reader)?;
354
1045
            elements.push(element);
355
        }
356
    }
357

            
358
    // at least one element
359

            
360
685
    literal("}", reader)?;
361

            
362
685
    Ok(JsonValue::Object { space0, elements })
363
}
364

            
365
1740
fn key(reader: &mut Reader) -> ParseResult<Template> {
366
1740
    let name = string_template(reader).map_err(|e| e.to_non_recoverable())?;
367
1740
    Ok(name)
368
}
369

            
370
1740
fn object_element(reader: &mut Reader) -> ParseResult<JsonObjectElement> {
371
1740
    let space0 = whitespace(reader);
372
    //literal("\"", reader)?;
373
1740
    let name = key(reader)?;
374
    //literal("\"", reader)?;
375
1740
    let space1 = whitespace(reader);
376
1740
    literal(":", reader)?;
377
1740
    let save = reader.cursor();
378
1740
    let space2 = whitespace(reader);
379
1740
    // Checks if there is no element after ':'. In this case, a special error must be reported
380
1740
    // because this is a common occurrence.
381
1740
    let next_char = reader.peek();
382
1740
    // Comparing to None because `next_char` can be EOF.
383
1740
    if next_char == Some('}') || next_char.is_none() {
384
5
        let kind = ParseErrorKind::Json(JsonErrorVariant::EmptyElement);
385
5
        return Err(ParseError::new(save.pos, false, kind));
386
    }
387
1735
    let value = parse_in_json(reader)?;
388
1700
    let space3 = whitespace(reader);
389
1700
    Ok(JsonObjectElement {
390
1700
        space0,
391
1700
        name,
392
1700
        space1,
393
1700
        space2,
394
1700
        value,
395
1700
        space3,
396
1700
    })
397
}
398

            
399
34165
fn is_whitespace(c: char) -> bool {
400
34165
    c == ' ' || c == '\t' || c == '\n' || c == '\r'
401
}
402

            
403
9920
fn whitespace(reader: &mut Reader) -> String {
404
9920
    reader.read_while(is_whitespace)
405
}
406

            
407
#[cfg(test)]
408
mod tests {
409
    use super::*;
410
    use crate::ast::*;
411

            
412
    #[test]
413
    fn test_parse_error() {
414
        let mut reader = Reader::new("{ \"a\":\n}");
415
        let error = parse(&mut reader).err().unwrap();
416
        assert_eq!(error.pos, Pos { line: 1, column: 7 });
417
        assert_eq!(
418
            error.kind,
419
            ParseErrorKind::Json(JsonErrorVariant::EmptyElement)
420
        );
421
        assert!(!error.recoverable);
422

            
423
        let mut reader = Reader::new("[0,1,]");
424
        let error = parse(&mut reader).err().unwrap();
425
        assert_eq!(error.pos, Pos { line: 1, column: 5 });
426
        assert_eq!(
427
            error.kind,
428
            ParseErrorKind::Json(JsonErrorVariant::TrailingComma),
429
        );
430
        assert!(!error.recoverable);
431
    }
432

            
433
    #[test]
434
    fn test_null_value() {
435
        let mut reader = Reader::new("null");
436
        assert_eq!(null_value(&mut reader).unwrap(), JsonValue::Null);
437
        assert_eq!(reader.cursor().index, 4);
438

            
439
        let mut reader = Reader::new("true");
440
        let error = null_value(&mut reader).err().unwrap();
441
        assert_eq!(error.pos, Pos { line: 1, column: 1 });
442
        assert_eq!(
443
            error.kind,
444
            ParseErrorKind::Expecting {
445
                value: "null".to_string()
446
            }
447
        );
448
        assert!(error.recoverable);
449
    }
450

            
451
    #[test]
452
    fn test_boolean_value() {
453
        let mut reader = Reader::new("true");
454
        assert_eq!(
455
            boolean_value(&mut reader).unwrap(),
456
            JsonValue::Boolean(true)
457
        );
458
        assert_eq!(reader.cursor().index, 4);
459

            
460
        let mut reader = Reader::new("1");
461
        let error = boolean_value(&mut reader).err().unwrap();
462
        assert_eq!(error.pos, Pos { line: 1, column: 1 });
463
        assert_eq!(
464
            error.kind,
465
            ParseErrorKind::Expecting {
466
                value: "true|false".to_string()
467
            }
468
        );
469
        assert!(error.recoverable);
470
    }
471

            
472
    pub fn json_hello_world_value() -> JsonValue {
473
        // "hello\u0020{{name}}!"
474
        JsonValue::String(Template {
475
            delimiter: Some('"'),
476
            elements: vec![
477
                TemplateElement::String {
478
                    value: "Hello ".to_string(),
479
                    encoded: "Hello\\u0020".to_string(),
480
                },
481
                TemplateElement::Expression(Expr {
482
                    space0: Whitespace {
483
                        value: String::new(),
484
                        source_info: SourceInfo::new(Pos::new(1, 15), Pos::new(1, 15)),
485
                    },
486
                    variable: Variable {
487
                        name: "name".to_string(),
488
                        source_info: SourceInfo::new(Pos::new(1, 15), Pos::new(1, 19)),
489
                    },
490
                    space1: Whitespace {
491
                        value: String::new(),
492
                        source_info: SourceInfo::new(Pos::new(1, 19), Pos::new(1, 19)),
493
                    },
494
                }),
495
                TemplateElement::String {
496
                    value: "!".to_string(),
497
                    encoded: "!".to_string(),
498
                },
499
            ],
500
            source_info: SourceInfo::new(Pos::new(1, 2), Pos::new(1, 22)),
501
        })
502
    }
503

            
504
    #[test]
505
    fn test_string_value() {
506
        let mut reader = Reader::new("\"\"");
507
        assert_eq!(
508
            string_value(&mut reader).unwrap(),
509
            JsonValue::String(Template {
510
                delimiter: Some('"'),
511
                elements: vec![],
512
                source_info: SourceInfo::new(Pos::new(1, 2), Pos::new(1, 2)),
513
            })
514
        );
515
        assert_eq!(reader.cursor().index, 2);
516

            
517
        let mut reader = Reader::new("\"Hello\\u0020{{name}}!\"");
518
        assert_eq!(string_value(&mut reader).unwrap(), json_hello_world_value());
519
        assert_eq!(reader.cursor().index, 22);
520

            
521
        let mut reader = Reader::new("\"{}\"");
522
        assert_eq!(
523
            string_value(&mut reader).unwrap(),
524
            JsonValue::String(Template {
525
                delimiter: Some('"'),
526
                elements: vec![TemplateElement::String {
527
                    value: "{}".to_string(),
528
                    encoded: "{}".to_string(),
529
                }],
530
                source_info: SourceInfo::new(Pos::new(1, 2), Pos::new(1, 4)),
531
            })
532
        );
533
        assert_eq!(reader.cursor().index, 4);
534
    }
535

            
536
    #[test]
537
    fn test_string_value_error() {
538
        let mut reader = Reader::new("1");
539
        let error = string_value(&mut reader).err().unwrap();
540
        assert_eq!(error.pos, Pos { line: 1, column: 1 });
541
        assert_eq!(
542
            error.kind,
543
            ParseErrorKind::Expecting {
544
                value: "\"".to_string()
545
            }
546
        );
547
        assert!(error.recoverable);
548

            
549
        let mut reader = Reader::new("\"1");
550
        let error = string_value(&mut reader).err().unwrap();
551
        assert_eq!(error.pos, Pos { line: 1, column: 3 });
552
        assert_eq!(
553
            error.kind,
554
            ParseErrorKind::Expecting {
555
                value: "\"".to_string()
556
            }
557
        );
558
        assert!(!error.recoverable);
559

            
560
        let mut reader = Reader::new("\"{{x\"");
561
        let error = string_value(&mut reader).err().unwrap();
562
        assert_eq!(error.pos, Pos { line: 1, column: 5 });
563
        assert_eq!(
564
            error.kind,
565
            ParseErrorKind::Expecting {
566
                value: "}}".to_string()
567
            }
568
        );
569
        assert!(!error.recoverable);
570
    }
571

            
572
    #[test]
573
    fn test_any_char() {
574
        let mut reader = Reader::new("a");
575
        assert_eq!(
576
            any_char(&mut reader).unwrap(),
577
            ('a', "a".to_string(), Pos { line: 1, column: 1 })
578
        );
579
        assert_eq!(reader.cursor().index, 1);
580

            
581
        let mut reader = Reader::new(" ");
582
        assert_eq!(
583
            any_char(&mut reader).unwrap(),
584
            (' ', " ".to_string(), Pos { line: 1, column: 1 })
585
        );
586
        assert_eq!(reader.cursor().index, 1);
587

            
588
        let mut reader = Reader::new("\\u0020 ");
589
        assert_eq!(
590
            any_char(&mut reader).unwrap(),
591
            (' ', "\\u0020".to_string(), Pos { line: 1, column: 1 })
592
        );
593
        assert_eq!(reader.cursor().index, 6);
594

            
595
        let mut reader = Reader::new("\\t");
596
        assert_eq!(
597
            any_char(&mut reader).unwrap(),
598
            ('\t', "\\t".to_string(), Pos { line: 1, column: 1 })
599
        );
600
        assert_eq!(reader.cursor().index, 2);
601

            
602
        let mut reader = Reader::new("#");
603
        assert_eq!(
604
            any_char(&mut reader).unwrap(),
605
            ('#', "#".to_string(), Pos { line: 1, column: 1 })
606
        );
607
        assert_eq!(reader.cursor().index, 1);
608
    }
609

            
610
    #[test]
611
    fn test_any_char_error() {
612
        let mut reader = Reader::new("");
613
        let error = any_char(&mut reader).err().unwrap();
614
        assert_eq!(error.pos, Pos { line: 1, column: 1 });
615
        assert!(error.recoverable);
616

            
617
        let mut reader = Reader::new("\t");
618
        let error = any_char(&mut reader).err().unwrap();
619
        assert_eq!(error.pos, Pos { line: 1, column: 1 });
620
        assert!(error.recoverable);
621
    }
622

            
623
    #[test]
624
    fn test_escape_char() {
625
        let mut reader = Reader::new("\\n");
626
        assert_eq!(escape_char(&mut reader).unwrap(), '\n');
627
        assert_eq!(reader.cursor().index, 2);
628

            
629
        let mut reader = Reader::new("\\u000a");
630
        assert_eq!(escape_char(&mut reader).unwrap(), '\n');
631
        assert_eq!(reader.cursor().index, 6);
632

            
633
        let mut reader = Reader::new("x");
634
        let error = escape_char(&mut reader).err().unwrap();
635
        assert_eq!(error.pos, Pos { line: 1, column: 1 });
636
        assert_eq!(
637
            error.kind,
638
            ParseErrorKind::Expecting {
639
                value: "\\".to_string()
640
            }
641
        );
642
        assert!(error.recoverable);
643
        assert_eq!(reader.cursor().index, 0);
644
    }
645

            
646
    #[test]
647
    fn test_unicode() {
648
        let mut reader = Reader::new("000a");
649
        assert_eq!(unicode(&mut reader).unwrap(), '\n');
650
        assert_eq!(reader.cursor().index, 4);
651

            
652
        let mut reader = Reader::new("c350");
653
        assert_eq!(unicode(&mut reader).unwrap(), '썐');
654
        assert_eq!(reader.cursor().index, 4);
655

            
656
        let mut reader = Reader::new("d83c\\udf78");
657
        assert_eq!(unicode(&mut reader).unwrap(), '🍸');
658
        assert_eq!(reader.cursor().index, 10);
659

            
660
        let mut reader = Reader::new("d800");
661
        let error = unicode(&mut reader).unwrap_err();
662
        assert_eq!(error.pos, Pos { line: 1, column: 5 });
663
        assert_eq!(
664
            error.kind,
665
            ParseErrorKind::Expecting {
666
                value: "\\u".to_string()
667
            }
668
        );
669
        assert!(!error.recoverable);
670

            
671
        let mut reader = Reader::new("d800\\ud800");
672
        let error = unicode(&mut reader).unwrap_err();
673
        assert_eq!(error.pos, Pos { line: 1, column: 7 });
674
        assert_eq!(error.kind, ParseErrorKind::Unicode);
675
        assert!(!error.recoverable);
676
    }
677

            
678
    #[test]
679
    fn test_hex_value() {
680
        let mut reader = Reader::new("0020x");
681
        assert_eq!(hex_value(&mut reader).unwrap(), 32);
682

            
683
        let mut reader = Reader::new("d800");
684
        assert_eq!(hex_value(&mut reader).unwrap(), 55296);
685

            
686
        let mut reader = Reader::new("x");
687
        let error = hex_value(&mut reader).unwrap_err();
688
        assert_eq!(error.pos, Pos { line: 1, column: 1 });
689
        assert_eq!(error.kind, ParseErrorKind::HexDigit);
690
        assert!(!error.recoverable);
691
    }
692

            
693
    #[test]
694
    fn test_number_value() {
695
        let mut reader = Reader::new("100");
696
        assert_eq!(
697
            number_value(&mut reader).unwrap(),
698
            JsonValue::Number("100".to_string())
699
        );
700
        assert_eq!(reader.cursor().index, 3);
701

            
702
        let mut reader = Reader::new("1.333");
703
        assert_eq!(
704
            number_value(&mut reader).unwrap(),
705
            JsonValue::Number("1.333".to_string())
706
        );
707
        assert_eq!(reader.cursor().index, 5);
708

            
709
        let mut reader = Reader::new("-1");
710
        assert_eq!(
711
            number_value(&mut reader).unwrap(),
712
            JsonValue::Number("-1".to_string())
713
        );
714
        assert_eq!(reader.cursor().index, 2);
715

            
716
        let mut reader = Reader::new("00");
717
        assert_eq!(
718
            number_value(&mut reader).unwrap(),
719
            JsonValue::Number("0".to_string())
720
        );
721
        assert_eq!(reader.cursor().index, 1);
722

            
723
        let mut reader = Reader::new("1e0");
724
        assert_eq!(
725
            number_value(&mut reader).unwrap(),
726
            JsonValue::Number("1e0".to_string())
727
        );
728
        assert_eq!(reader.cursor().index, 3);
729

            
730
        let mut reader = Reader::new("1e005");
731
        assert_eq!(
732
            number_value(&mut reader).unwrap(),
733
            JsonValue::Number("1e005".to_string())
734
        );
735
        assert_eq!(reader.cursor().index, 5);
736

            
737
        let mut reader = Reader::new("1e-005");
738
        assert_eq!(
739
            number_value(&mut reader).unwrap(),
740
            JsonValue::Number("1e-005".to_string())
741
        );
742
        assert_eq!(reader.cursor().index, 6);
743
    }
744

            
745
    #[test]
746
    fn test_number_value_error() {
747
        let mut reader = Reader::new("true");
748
        let error = number_value(&mut reader).err().unwrap();
749
        assert_eq!(error.pos, Pos { line: 1, column: 1 });
750
        assert_eq!(
751
            error.kind,
752
            ParseErrorKind::Expecting {
753
                value: "number".to_string()
754
            }
755
        );
756
        assert!(error.recoverable);
757

            
758
        let mut reader = Reader::new("1.x");
759
        let error = number_value(&mut reader).err().unwrap();
760
        assert_eq!(error.pos, Pos { line: 1, column: 3 });
761
        assert_eq!(
762
            error.kind,
763
            ParseErrorKind::Expecting {
764
                value: "digits".to_string()
765
            }
766
        );
767
        assert!(!error.recoverable);
768
    }
769

            
770
    #[test]
771
    fn test_expression_value() {
772
        let mut reader = Reader::new("{{n}}");
773
        assert_eq!(
774
            expression_value(&mut reader).unwrap(),
775
            JsonValue::Expression(Expr {
776
                space0: Whitespace {
777
                    value: String::new(),
778
                    source_info: SourceInfo::new(Pos::new(1, 3), Pos::new(1, 3))
779
                },
780
                variable: Variable {
781
                    name: "n".to_string(),
782
                    source_info: SourceInfo::new(Pos::new(1, 3), Pos::new(1, 4))
783
                },
784
                space1: Whitespace {
785
                    value: String::new(),
786
                    source_info: SourceInfo::new(Pos::new(1, 4), Pos::new(1, 4))
787
                }
788
            })
789
        );
790
        assert_eq!(reader.cursor().index, 5);
791
    }
792

            
793
    #[test]
794
    fn test_list_value() {
795
        let mut reader = Reader::new("[]");
796
        assert_eq!(
797
            list_value(&mut reader).unwrap(),
798
            JsonValue::List {
799
                space0: String::new(),
800
                elements: vec![]
801
            }
802
        );
803
        assert_eq!(reader.cursor().index, 2);
804

            
805
        let mut reader = Reader::new("[ ]");
806
        assert_eq!(
807
            list_value(&mut reader).unwrap(),
808
            JsonValue::List {
809
                space0: " ".to_string(),
810
                elements: vec![]
811
            }
812
        );
813
        assert_eq!(reader.cursor().index, 3);
814

            
815
        let mut reader = Reader::new("[true, false]");
816
        assert_eq!(
817
            list_value(&mut reader).unwrap(),
818
            JsonValue::List {
819
                space0: String::new(),
820
                elements: vec![
821
                    JsonListElement {
822
                        space0: String::new(),
823
                        value: JsonValue::Boolean(true),
824
                        space1: String::new(),
825
                    },
826
                    JsonListElement {
827
                        space0: String::from(" "),
828
                        value: JsonValue::Boolean(false),
829
                        space1: String::new(),
830
                    }
831
                ],
832
            }
833
        );
834
        assert_eq!(reader.cursor().index, 13);
835
    }
836

            
837
    #[test]
838
    fn test_list_error() {
839
        let mut reader = Reader::new("true");
840
        let error = list_value(&mut reader).err().unwrap();
841
        assert_eq!(error.pos, Pos { line: 1, column: 1 });
842
        assert_eq!(
843
            error.kind,
844
            ParseErrorKind::Expecting {
845
                value: "[".to_string()
846
            }
847
        );
848
        assert!(error.recoverable);
849

            
850
        let mut reader = Reader::new("[1, 2,]");
851
        let error = list_value(&mut reader).err().unwrap();
852
        assert_eq!(error.pos, Pos { line: 1, column: 6 });
853
        assert_eq!(
854
            error.kind,
855
            ParseErrorKind::Json(JsonErrorVariant::TrailingComma),
856
        );
857
        assert!(!error.recoverable);
858
    }
859

            
860
    #[test]
861
    fn test_list_element() {
862
        let mut reader = Reader::new("true");
863
        assert_eq!(
864
            list_element(&mut reader).unwrap(),
865
            JsonListElement {
866
                space0: String::new(),
867
                value: JsonValue::Boolean(true),
868
                space1: String::new(),
869
            }
870
        );
871
        assert_eq!(reader.cursor().index, 4);
872
    }
873

            
874
    #[test]
875
    fn test_object_value() {
876
        let mut reader = Reader::new("{}");
877
        assert_eq!(
878
            object_value(&mut reader).unwrap(),
879
            JsonValue::Object {
880
                space0: String::new(),
881
                elements: vec![]
882
            }
883
        );
884
        assert_eq!(reader.cursor().index, 2);
885

            
886
        let mut reader = Reader::new("{ }");
887
        assert_eq!(
888
            object_value(&mut reader).unwrap(),
889
            JsonValue::Object {
890
                space0: " ".to_string(),
891
                elements: vec![]
892
            }
893
        );
894
        assert_eq!(reader.cursor().index, 3);
895

            
896
        let mut reader = Reader::new("{\n  \"a\": true\n}");
897
        assert_eq!(
898
            object_value(&mut reader).unwrap(),
899
            JsonValue::Object {
900
                space0: "\n  ".to_string(),
901
                elements: vec![JsonObjectElement {
902
                    space0: String::new(),
903
                    name: Template {
904
                        delimiter: Some('"'),
905
                        elements: vec![TemplateElement::String {
906
                            value: "a".to_string(),
907
                            encoded: "a".to_string()
908
                        }],
909
                        source_info: SourceInfo::new(Pos::new(2, 4), Pos::new(2, 5))
910
                    },
911
                    space1: String::new(),
912
                    space2: " ".to_string(),
913
                    value: JsonValue::Boolean(true),
914
                    space3: "\n".to_string(),
915
                }],
916
            }
917
        );
918
        assert_eq!(reader.cursor().index, 15);
919

            
920
        let mut reader = Reader::new("true");
921
        let error = object_value(&mut reader).err().unwrap();
922
        assert_eq!(error.pos, Pos { line: 1, column: 1 });
923
        assert_eq!(
924
            error.kind,
925
            ParseErrorKind::Expecting {
926
                value: "{".to_string()
927
            }
928
        );
929
        assert!(error.recoverable);
930
    }
931

            
932
    #[test]
933
    fn test_object_error() {
934
        let mut reader = Reader::new("{ \"a\":\n}");
935
        let error = object_value(&mut reader).err().unwrap();
936
        assert_eq!(error.pos, Pos { line: 1, column: 7 });
937
        assert_eq!(
938
            error.kind,
939
            ParseErrorKind::Json(JsonErrorVariant::EmptyElement)
940
        );
941
        assert!(!error.recoverable);
942
    }
943

            
944
    #[test]
945
    fn test_object_element() {
946
        let mut reader = Reader::new("\"a\": true");
947
        assert_eq!(
948
            object_element(&mut reader).unwrap(),
949
            JsonObjectElement {
950
                space0: String::new(),
951
                name: Template {
952
                    delimiter: Some('"'),
953
                    elements: vec![TemplateElement::String {
954
                        value: "a".to_string(),
955
                        encoded: "a".to_string()
956
                    }],
957
                    source_info: SourceInfo::new(Pos::new(1, 2), Pos::new(1, 3))
958
                },
959
                space1: String::new(),
960
                space2: " ".to_string(),
961
                value: JsonValue::Boolean(true),
962
                space3: String::new(),
963
            }
964
        );
965
        assert_eq!(reader.cursor().index, 9);
966
    }
967

            
968
    #[test]
969
    fn test_object_element_error() {
970
        let mut reader = Reader::new(":");
971
        let error = object_element(&mut reader).err().unwrap();
972
        assert_eq!(error.pos, Pos { line: 1, column: 1 });
973
        assert_eq!(
974
            error.kind,
975
            ParseErrorKind::Expecting {
976
                value: "\"".to_string()
977
            }
978
        );
979
        assert!(!error.recoverable);
980

            
981
        let mut reader = Reader::new("\"name\":\n");
982
        let error = object_element(&mut reader).err().unwrap();
983
        assert_eq!(error.pos, Pos { line: 1, column: 8 });
984
        assert_eq!(
985
            error.kind,
986
            ParseErrorKind::Json(JsonErrorVariant::EmptyElement),
987
        );
988
        assert!(!error.recoverable);
989
    }
990

            
991
    #[test]
992
    fn test_whitespace() {
993
        let mut reader = Reader::new("");
994
        assert_eq!(whitespace(&mut reader), String::new());
995
        assert_eq!(reader.cursor().index, 0);
996

            
997
        let mut reader = Reader::new(" x");
998
        assert_eq!(whitespace(&mut reader), " ".to_string());
999
        assert_eq!(reader.cursor().index, 1);
        let mut reader = Reader::new("\n  x");
        assert_eq!(whitespace(&mut reader), "\n  ".to_string());
        assert_eq!(reader.cursor().index, 3);
    }
}