use super::*;
#[derive(Debug, PartialEq, serde::Serialize, serde::Deserialize)]
struct Sample {
name: String,
count: i64,
enabled: bool,
optional: Option<String>,
items: Vec<String>,
}
fn sample() -> Sample {
Sample {
name: "router".to_string(),
count: 42,
enabled: true,
optional: None,
items: vec!["one".to_string(), "two".to_string()],
}
}
#[test]
fn state_round_trips_through_links_notation() {
let encoded = encode(&sample()).expect("encode");
let decoded: Sample = decode(&encoded).expect("decode");
assert_eq!(decoded, sample());
}
#[test]
fn the_encoded_form_is_readable() {
let encoded = encode(&sample()).expect("encode");
assert!(encoded.contains("name \"router\""), "{encoded}");
assert!(encoded.contains("count 42"), "{encoded}");
assert!(encoded.contains("enabled true"), "{encoded}");
assert!(!encoded.contains("\"42\""), "{encoded}");
assert!(!encoded.contains("base64"), "{encoded}");
}
#[test]
fn json_written_by_an_earlier_release_still_loads() {
let json = serde_json::to_string(&sample()).expect("serialize");
let decoded: Sample = decode(&json).expect("JSON still decodes");
assert_eq!(decoded, sample());
}
#[test]
fn every_value_shape_converts_both_ways() {
let value = serde_json::json!({
"null": null,
"bool": false,
"int": -7,
"float": 1.5,
"string": "text",
"array": [1, "two", true],
"nested": {"inner": {"deep": 1}}
});
assert_eq!(from_lino(&to_lino(&value)), value);
}
#[test]
fn a_control_character_is_carried_without_base64ing_everything() {
let value = serde_json::json!({"plain": "readable", "raw": "a\u{0007}b"});
let encoded = lino_objects_codec::encode(&to_lino(&value));
assert!(encoded.contains("plain \"readable\""), "{encoded}");
let decoded = lino_objects_codec::decode(&encoded).expect("decode");
assert_eq!(from_lino(&decoded), value);
}