//! writer 模块(JSON 序列化)的集成测试。 //! Integration tests for the writer module (JSON serialization). use focus_json::{parse, to_string, JsonValue}; fn roundtrip(input: &str) { let parsed = parse(input).unwrap_or_else(|e| panic!("parse failed for {:?}: {}", input, e)); let serialized = to_string(&parsed); let reparsed = parse(&serialized).expect("reparse failed"); assert_eq!(parsed, reparsed, "roundtrip mismatch for {:?}", input); } #[test] fn serializes_primitives() { assert_eq!(to_string(&JsonValue::Null), "null"); assert_eq!(to_string(&JsonValue::Bool(true)), "true"); assert_eq!(to_string(&JsonValue::Bool(false)), "false"); assert_eq!(to_string(&JsonValue::Str("hi".into())), r#""hi""#); } #[test] fn serializes_integers_without_fraction() { assert_eq!(to_string(&JsonValue::Num(3.0)), "3"); assert_eq!(to_string(&JsonValue::Num(-42.0)), "-42"); assert_eq!(to_string(&JsonValue::Num(0.0)), "0"); } #[test] fn serializes_fractional_numbers() { assert_eq!(to_string(&JsonValue::Num(12.345)), "12.345"); } #[test] fn escapes_strings() { let s = JsonValue::Str("a\"b\nc".into()); assert_eq!(to_string(&s), r#""a\"b\nc""#); } #[test] fn escapes_control_chars_as_unicode() { let s = JsonValue::Str("\u{0001}".into()); assert_eq!(to_string(&s), r#""\u0001""#); } #[test] fn serializes_arrays_and_objects() { let mut o = JsonValue::obj(); o.insert("a", JsonValue::Num(1.0)).unwrap(); o.insert( "b", JsonValue::Arr(vec![JsonValue::Bool(true), JsonValue::Null]), ) .unwrap(); assert_eq!(to_string(&o), r#"{"a":1,"b":[true,null]}"#); } #[test] fn roundtrips_various() { roundtrip(r#"{"name":"focus","nums":[1,2,3],"nested":{"deep":true}}"#); roundtrip(r#""escape: \\ \" \n \t""#); roundtrip("12.345159"); roundtrip("-0"); roundtrip("[]"); roundtrip("{}"); } #[test] fn handles_unicode_in_strings() { let s = JsonValue::Str("中文😀".into()); let serialized = to_string(&s); assert_eq!(serialized, r#""中文😀""#); assert_eq!(parse(&serialized).unwrap(), s); } #[test] fn non_finite_becomes_null() { assert_eq!(to_string(&JsonValue::Num(f64::NAN)), "null"); assert_eq!(to_string(&JsonValue::Num(f64::INFINITY)), "null"); }