diff --git a/src/tests.rs b/src/tests.rs index fd5127d9..17612738 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -21,6 +21,18 @@ use super::{ ToCss, Token, TokenSerializationType, UnicodeRange, }; +fn css_parsing_test_json(file_name: &str) -> String { + // Fixtures are Cargo.toml `exclude`d so crates.io packages can compile tests + // without include_str!. Miri isolation cannot open() them; those tests are + // #[cfg_attr(miri, ignore)]. + let path = format!( + "{}/src/css-parsing-tests/{}", + env!("CARGO_MANIFEST_DIR"), + file_name + ); + std::fs::read_to_string(&path).unwrap() +} + macro_rules! JArray { ($($e: expr,)*) => { JArray![ $( $e ),* ] }; ($($e: expr),*) => { Value::Array(vec!( $( $e.to_json() ),* )) } @@ -105,18 +117,20 @@ fn run_json_tests Value>(json_data: &str, parse: F) { }); } +#[cfg_attr(miri, ignore)] #[test] fn component_value_list() { run_json_tests( - include_str!("css-parsing-tests/component_value_list.json"), + &css_parsing_test_json("component_value_list.json"), |input| Value::Array(component_values_to_json(input)), ); } +#[cfg_attr(miri, ignore)] #[test] fn one_component_value() { run_json_tests( - include_str!("css-parsing-tests/one_component_value.json"), + &css_parsing_test_json("one_component_value.json"), |input| { let result: Result> = input.parse_entirely(|input| { Ok(one_component_value_to_json(input.next()?.clone(), input)) @@ -126,33 +140,30 @@ fn one_component_value() { ); } +#[cfg_attr(miri, ignore)] #[test] fn declaration_list() { - run_json_tests( - include_str!("css-parsing-tests/declaration_list.json"), - |input| { - Value::Array( - RuleBodyParser::new(input, &mut JsonParser) - .map(|result| result.unwrap_or(JArray!["error", "invalid"])) - .collect(), - ) - }, - ); + run_json_tests(&css_parsing_test_json("declaration_list.json"), |input| { + Value::Array( + RuleBodyParser::new(input, &mut JsonParser) + .map(|result| result.unwrap_or(JArray!["error", "invalid"])) + .collect(), + ) + }); } +#[cfg_attr(miri, ignore)] #[test] fn one_declaration() { - run_json_tests( - include_str!("css-parsing-tests/one_declaration.json"), - |input| { - parse_one_declaration(input, &mut JsonParser).unwrap_or(JArray!["error", "invalid"]) - }, - ); + run_json_tests(&css_parsing_test_json("one_declaration.json"), |input| { + parse_one_declaration(input, &mut JsonParser).unwrap_or(JArray!["error", "invalid"]) + }); } +#[cfg_attr(miri, ignore)] #[test] fn rule_list() { - run_json_tests(include_str!("css-parsing-tests/rule_list.json"), |input| { + run_json_tests(&css_parsing_test_json("rule_list.json"), |input| { Value::Array( RuleBodyParser::new(input, &mut JsonParser) .map(|result| result.unwrap_or(JArray!["error", "invalid"])) @@ -161,9 +172,10 @@ fn rule_list() { }); } +#[cfg_attr(miri, ignore)] #[test] fn stylesheet() { - run_json_tests(include_str!("css-parsing-tests/stylesheet.json"), |input| { + run_json_tests(&css_parsing_test_json("stylesheet.json"), |input| { Value::Array( StyleSheetParser::new(input, &mut JsonParser) .map(|result| result.unwrap_or(JArray!["error", "invalid"])) @@ -172,13 +184,15 @@ fn stylesheet() { }); } +#[cfg_attr(miri, ignore)] #[test] fn one_rule() { - run_json_tests(include_str!("css-parsing-tests/one_rule.json"), |input| { + run_json_tests(&css_parsing_test_json("one_rule.json"), |input| { parse_one_rule(input, &mut JsonParser).unwrap_or(JArray!["error", "invalid"]) }); } +#[cfg_attr(miri, ignore)] #[test] fn stylesheet_from_bytes() { pub struct EncodingRs; @@ -200,7 +214,7 @@ fn stylesheet_from_bytes() { } run_raw_json_tests( - include_str!("css-parsing-tests/stylesheet_bytes.json"), + &css_parsing_test_json("stylesheet_bytes.json"), |input, expected| { let map = match input { Value::Object(map) => map, @@ -352,9 +366,10 @@ fn test_expect_url() { assert!(parse(&mut input).is_err()); } +#[cfg_attr(miri, ignore)] #[test] fn nth() { - run_json_tests(include_str!("css-parsing-tests/An+B.json"), |input| { + run_json_tests(&css_parsing_test_json("An+B.json"), |input| { input .parse_entirely(|i| { let result: Result<_, ParseError<()>> = parse_nth(i).map_err(Into::into); @@ -381,9 +396,10 @@ fn parse_comma_separated_ignoring_errors() { assert_eq!(result[2], (0, 0, 255)); } +#[cfg_attr(miri, ignore)] #[test] fn unicode_range() { - run_json_tests(include_str!("css-parsing-tests/urange.json"), |input| { + run_json_tests(&css_parsing_test_json("urange.json"), |input| { let result: Result<_, ParseError<()>> = input.parse_comma_separated(|input| { let result = UnicodeRange::parse(input).ok().map(|r| (r.start, r.end)); if input.is_exhausted() { @@ -408,11 +424,13 @@ fn unicode_range() { }); } +#[cfg_attr(miri, ignore)] #[test] fn serializer_not_preserving_comments() { serializer(false) } +#[cfg_attr(miri, ignore)] #[test] fn serializer_preserving_comments() { serializer(true) @@ -420,7 +438,7 @@ fn serializer_preserving_comments() { fn serializer(preserve_comments: bool) { run_json_tests( - include_str!("css-parsing-tests/component_value_list.json"), + &css_parsing_test_json("component_value_list.json"), |input| { fn write_to( mut previous_token: TokenSerializationType,