use picojson::{Event, ParseError, PullParser, SliceParser, String};
#[test]
fn test_new_no_escapes() {
let json = r#"{"name": "value", "number": 42, "bool": true}"#;
let mut parser = SliceParser::new(json);
assert_eq!(parser.next_event(), Ok(Event::StartObject));
assert_eq!(
parser.next_event(),
Ok(Event::Key(String::Borrowed("name")))
);
assert_eq!(
parser.next_event(),
Ok(Event::String(String::Borrowed("value")))
);
let mut remaining_count = 0;
loop {
match parser.next_event() {
Ok(Event::EndDocument) => break,
Ok(_) => remaining_count += 1,
Err(e) => panic!("Parse error: {:?}", e),
}
}
assert_eq!(remaining_count, 5); }
#[test]
fn test_new_with_escapes_fails() {
let json = r#"{"message": "Hello\nWorld"}"#; let mut parser = SliceParser::new(json);
assert_eq!(parser.next_event(), Ok(Event::StartObject));
assert_eq!(
parser.next_event(),
Ok(Event::Key(String::Borrowed("message")))
);
match parser.next_event() {
Err(ParseError::ScratchBufferFull) => {
}
other => panic!("Expected ScratchBufferFull error, got: {:?}", other),
}
}
#[test]
fn test_with_buffer_handles_escapes() {
let json = r#"{"message": "Hello\nWorld"}"#;
let mut scratch = [0u8; 1024];
let mut parser = SliceParser::with_buffer(json, &mut scratch);
assert_eq!(parser.next_event(), Ok(Event::StartObject));
assert_eq!(
parser.next_event(),
Ok(Event::Key(String::Borrowed("message")))
);
match parser.next_event() {
Ok(Event::String(String::Unescaped(s))) => {
assert_eq!(s, "Hello\nWorld");
}
other => panic!("Expected unescaped string, got: {:?}", other),
}
assert_eq!(parser.next_event(), Ok(Event::EndObject));
assert_eq!(parser.next_event(), Ok(Event::EndDocument));
}
#[test]
fn test_new_with_numbers_and_arrays() {
#[cfg(feature = "float-error")]
let json = r#"[1, 2, true, false, null]"#; #[cfg(not(feature = "float-error"))]
let json = r#"[1, 2.5, true, false, null]"#;
let mut parser = SliceParser::new(json);
assert_eq!(parser.next_event(), Ok(Event::StartArray));
assert!(matches!(parser.next_event(), Ok(Event::Number(_))));
assert!(matches!(parser.next_event(), Ok(Event::Number(_))));
assert_eq!(parser.next_event(), Ok(Event::Bool(true)));
assert_eq!(parser.next_event(), Ok(Event::Bool(false)));
assert_eq!(parser.next_event(), Ok(Event::Null));
assert_eq!(parser.next_event(), Ok(Event::EndArray));
assert_eq!(parser.next_event(), Ok(Event::EndDocument));
}
#[test]
fn test_mixed_string_types() {
let json = r#"{"simple": "no_escapes", "complex": "with\tescapes"}"#;
let mut scratch = [0u8; 1024];
let mut parser = SliceParser::with_buffer(json, &mut scratch);
assert_eq!(parser.next_event(), Ok(Event::StartObject));
assert_eq!(
parser.next_event(),
Ok(Event::Key(String::Borrowed("simple")))
);
match parser.next_event() {
Ok(Event::String(String::Borrowed(s))) => {
assert_eq!(s, "no_escapes");
}
other => panic!("Expected borrowed string, got: {:?}", other),
}
assert_eq!(
parser.next_event(),
Ok(Event::Key(String::Borrowed("complex")))
);
match parser.next_event() {
Ok(Event::String(String::Unescaped(s))) => {
assert_eq!(s, "with\tescapes");
}
other => panic!("Expected unescaped string, got: {:?}", other),
}
assert_eq!(parser.next_event(), Ok(Event::EndObject));
assert_eq!(parser.next_event(), Ok(Event::EndDocument));
}