use grass_compiler::OutputStyle;

#[macro_use]
mod macros;

test!(
    charset_exists_when_output_not_ascii,
    "a {\n  color: 🦆;\n}\n",
    "@charset \"UTF-8\";\na {\n  color: 🦆;\n}\n"
);
test!(
    charset_utf8_is_removed_when_ascii,
    "@charset \"UTF-8\";\na {\n  color: red;\n}\n",
    "a {\n  color: red;\n}\n"
);
test!(
    unknown_charset_is_removed,
    "@charset \"foo\";\na {\n  color: red;\n}\n",
    "a {\n  color: red;\n}\n"
);
test!(
    comment_between_rule_and_string,
    "@charset/**/\"foo\";\na {\n  color: red;\n}\n",
    "a {\n  color: red;\n}\n"
);
test!(
    comment_after_string,
    "@charset \"foo\"/**/;\na {\n  color: red;\n}\n",
    "/**/\na {\n  color: red;\n}\n"
);
test!(
    no_space_after_at_rule,
    "@charset\"foo\";\na {\n  color: red;\n}\n",
    "a {\n  color: red;\n}\n"
);
test!(
    charset_inside_rule,
    "a {\n  color: red;@charset \"foo\";\n\n}\n",
    "a {\n  color: red;\n  @charset \"foo\";\n}\n"
);
test!(
    charset_after_rule,
    "a {\n  color: red;\n}\n@charset \"foo\";\n",
    "a {\n  color: red;\n}\n"
);
error!(
    invalid_charset_value,
    "@charset 1;", "Error: Expected string."
);
error!(
    invalid_charset_value_unquoted_string,
    "@charset a;", "Error: Expected string."
);
error!(
    invalid_charset_value_silent_comment,
    "@charset //", "Error: Expected string."
);
error!(
    invalid_charset_value_unterminated_loud_comment,
    "@charset /*", "Error: expected more input."
);

#[test]
fn charset_not_allowed_expanded() {
    let input = r#"
        a {
            color: 🦆;
        }
    "#;

    assert_eq!(
        "a {\n  color: 🦆;\n}\n",
        &grass::from_string(
            input.to_string(),
            &grass::Options::default().allows_charset(false)
        )
        .expect(input)
    );
}

#[test]
fn charset_not_allowed_compressed() {
    let input = r#"
        a {
            color: 🦆;
        }
    "#;

    assert_eq!(
        "a{color:🦆}",
        &grass::from_string(
            input.to_string(),
            &grass::Options::default()
                .allows_charset(false)
                .style(OutputStyle::Compressed)
        )
        .expect(input)
    );
}