// This test ensures that all items from `foo` are correctly generated into the `redirect-map.json` // file with `--generate-redirect-map` rustdoc option. use std::path::Path; use run_make_support::rfs::read_to_string; use run_make_support::{path, rustdoc, serde_json}; fn main() { let out_dir = "out"; let crate_name = "foo"; rustdoc() .input("foo.rs") .crate_name(crate_name) .arg("-Zunstable-options") .arg("--generate-redirect-map") .out_dir(&out_dir) .run(); let generated = read_to_string(path(out_dir).join(crate_name).join("redirect-map.json")); let expected = read_to_string("expected.json"); let generated: serde_json::Value = serde_json::from_str(&generated).expect("failed to parse JSON"); let expected: serde_json::Value = serde_json::from_str(&expected).expect("failed to parse JSON"); let expected = expected.as_object().unwrap(); let mut differences = Vec::new(); for (key, expected_value) in expected.iter() { match generated.get(key) { Some(value) => { if expected_value != value { differences.push(format!( "values for key `{key}` don't match: `{expected_value:?}` != `{value:?}`" )); } } None => differences.push(format!("missing key `{key}`")), } } for (key, data) in generated.as_object().unwrap().iter() { if !expected.contains_key(key) { differences.push(format!("Extra data not expected: key: `{key}`, data: `{data}`")); } } if !differences.is_empty() { eprintln!("Found differences in JSON files:"); for diff in differences { eprintln!("=> {diff}"); } panic!("Found differences in JSON files"); } }