/// Tests boml by parsing `Cargo.toml` files from well-known crates. const SYN_URL: &str = "https://raw.githubusercontent.com/dtolnay/syn/98a90d70105f9b43f08eba091d6df1ec490a56e9/Cargo.toml"; use boml::{Error, Toml}; // "well-known crates" hehehe #[test] fn boml() { let source = include_str!("../Cargo.toml"); let toml = parse(source); let package = toml.get_table("package").unwrap(); assert_eq!(package.get_string("name").unwrap(), "boml"); assert_eq!(package.get_string("edition").unwrap(), "2021"); let dev_deps = toml.get_table("dev-dependencies").unwrap(); let reqwest = dev_deps.get_table("reqwest").unwrap(); assert_eq!(reqwest.get_string("version").unwrap(), "0.11"); let features = reqwest.get_array("features").unwrap(); assert_eq!(features.len(), 1); assert_eq!(features.first().unwrap().string().unwrap(), "blocking"); } #[test] fn syn() { let source = reqwest::blocking::get(SYN_URL).unwrap().text().unwrap(); let toml = parse(&source); let package = toml.get_table("package").unwrap(); assert_eq!(package.get_string("name").unwrap(), "syn"); assert_eq!(package.get_string("version").unwrap(), "2.0.48"); let features = toml.get_table("features").unwrap(); let default_features = features.get_array("default").unwrap(); let default_features: Vec<&str> = default_features .iter() .map(|feature| feature.string().unwrap()) .collect(); assert_eq!( default_features, vec!["derive", "parsing", "printing", "clone-impls", "proc-macro"] ); let dev_deps = toml.get_table("dev-dependencies").unwrap(); let reqwest = dev_deps.get_table("reqwest").unwrap(); assert_eq!(reqwest.get_string("version").unwrap(), "0.11"); let features = reqwest.get_array("features").unwrap(); assert_eq!(features.len(), 1); assert_eq!(features.first().unwrap().string().unwrap(), "blocking"); let benches = toml.get_array("bench").unwrap(); assert_eq!(benches.len(), 2); } /// Wraps around `Toml::parse` and provides prettier error messages. fn parse(source: &str) -> Toml<'_> { match Toml::parse(source) { Ok(toml) => toml, Err(error) => { let Error { start, end, kind } = error; let more_ctx_start = if start > 15 { start - 15 } else { 0 }; let more_ctx_end = if source.len() - 16 > end { end + 15 } else { source.len() - 1 }; panic!( "Error at characters {start}..{end} (`{}`): {kind:?}\nMore context: `{}`", &source[start..=end], &source[more_ctx_start..=more_ctx_end] ); } } }