use super::*; use crate::sexpr; fn parse(source: &str) -> Result { let doc = sexpr::read(source).expect("reads"); let form = &doc.values[0]; parse_asset_form(form.as_list().expect("list"), form.span()).expect("an asset form") } #[test] fn an_asset_carries_its_path_verbatim() { assert_eq!( parse(r#"(asset "icons/logo.png")"#).unwrap(), "icons/logo.png" ); } #[test] fn a_non_asset_head_is_not_claimed() { let doc = sexpr::read("(path (move 0 0))").expect("reads"); let form = &doc.values[0]; assert!(parse_asset_form(form.as_list().unwrap(), form.span()).is_none()); } #[test] fn wrong_arity_is_an_error() { assert!( parse("(asset)") .unwrap_err() .message .contains("exactly one") ); assert!( parse(r#"(asset "a.png" "b.png")"#) .unwrap_err() .message .contains("exactly one") ); } #[test] fn a_non_string_path_is_pointed() { assert!(parse("(asset 3)").unwrap_err().message.contains("string")); } #[test] fn an_empty_path_is_rejected() { assert!( parse(r#"(asset "")"#) .unwrap_err() .message .contains("empty") ); } #[test] fn machine_dependent_paths_are_rejected() { assert!( parse(r#"(asset "/etc/passwd")"#) .unwrap_err() .message .contains("not absolute") ); assert!( parse(r#"(asset "../../secrets.png")"#) .unwrap_err() .message .contains("climb out") ); } #[test] fn an_interpolated_path_is_rejected() { // A `.gdc` author writing `{name}` means interpolation, but this form is // read from the raw s-expression, so it would otherwise become a literal // filename with braces in it. The bytes are found at build time. assert!( parse(r#"(asset "icons/{name}.png")"#) .unwrap_err() .message .contains("interpolation") ); }