use crate::json;
use super::Json;
fn round_trip(values: &[&str]) -> Vec<String> {
let json = Json::string_array(values);
let doc = json::parse(json.as_str().into()).expect("a built array is JSON");
let items = doc.root().as_array().expect("the value is an array");
let mut decoded: Vec<String> = Vec::with_capacity(items.len());
for item in items {
let raw = item.to_raw_str().expect("each item is a string");
decoded.push(raw.decode_escapes().ignore_warnings().into_owned());
}
decoded
}
#[test]
fn an_array_of_days_is_quoted_and_comma_separated() {
let json = Json::string_array(&["MONDAY", "FRIDAY"]);
assert_eq!(json.as_str(), r#"["MONDAY", "FRIDAY"]"#);
}
#[test]
fn an_empty_array_is_written_as_empty_brackets() {
let json = Json::string_array(&[]);
assert_eq!(json.as_str(), "[]");
}
#[test]
fn a_quote_in_a_value_is_escaped() {
let json = Json::string_array(&[r#"a"b"#]);
assert_eq!(json.as_str(), r#"["a\"b"]"#);
assert_eq!(round_trip(&[r#"a"b"#]), vec![r#"a"b"#.to_owned()]);
}
#[test]
fn a_backslash_in_a_value_is_escaped() {
let json = Json::string_array(&[r"a\b"]);
assert_eq!(json.as_str(), r#"["a\\b"]"#);
assert_eq!(round_trip(&[r"a\b"]), vec![r"a\b".to_owned()]);
}
#[test]
fn control_characters_are_escaped() {
let json = Json::string_array(&["a\nb\tc\u{1}d"]);
assert_eq!(json.as_str(), r#"["a\nb\tc\u0001d"]"#);
}
#[test]
fn every_shorthand_escape_is_used() {
let json = Json::string_array(&["\u{8}\u{c}\n\r\t"]);
assert_eq!(json.as_str(), r#"["\b\f\n\r\t"]"#);
}
#[test]
fn a_value_needing_no_escape_is_written_as_it_came() {
assert_eq!(round_trip(&["NL", "de", "17"]), vec!["NL", "de", "17"]);
}
#[test]
#[cfg(debug_assertions)]
#[should_panic(expected = "not a single JSON value")]
fn text_that_is_not_one_value_trips_the_debug_assertion() {
let _json = Json::raw("{oops");
}
#[test]
#[cfg(debug_assertions)]
#[should_panic(expected = "not a single JSON value")]
fn more_than_one_value_trips_the_debug_assertion() {
let _json = Json::raw("1 2");
}