#[macro_use]
mod macros;

test!(
    content_inside_keyframes,
    "@mixin foo {
        @keyframes {
          @content;
        }
      }
      a {
        @include foo {
          color: red;
        };
      }",
    "@keyframes {\n  color: red;\n}\n"
);

test!(
    empty_keyframes_is_emitted_exact,
    "@keyframes {}",
    "@keyframes {}\n"
);
test!(
    keyframes_is_at_root,
    "a {\n    @keyframes {}\n}\n",
    "@keyframes {}\n"
);
test!(
    keyframes_inside_ruleset_with_other_styles,
    "a {
        color: red;
        @keyframes {}
        color: green;
    }",
    "a {\n  color: red;\n  color: green;\n}\n@keyframes {}\n"
);
test!(
    keyframes_lowercase_to,
    "@keyframes {to {color: red;}}",
    "@keyframes {\n  to {\n    color: red;\n  }\n}\n"
);
test!(
    keyframes_lowercase_from,
    "@keyframes {from {color: red;}}",
    "@keyframes {\n  from {\n    color: red;\n  }\n}\n"
);
test!(
    keyframes_uppercase_to,
    "@keyframes {TO {color: red;}}",
    "@keyframes {\n  to {\n    color: red;\n  }\n}\n"
);
test!(
    keyframes_uppercase_from,
    "@keyframes {FROM {color: red;}}",
    "@keyframes {\n  from {\n    color: red;\n  }\n}\n"
);
error!(
    keyframes_invalid_selector_beginning_with_f,
    "@keyframes {foo {}}", "Error: Expected \"to\" or \"from\"."
);
error!(
    keyframes_invalid_selector_beginning_with_t,
    "@keyframes {too {}}", "Error: Expected \"to\" or \"from\"."
);
error!(
    keyframes_invalid_selector_beginning_with_ascii_char,
    "@keyframes {a {}}", "Error: Expected \"to\" or \"from\"."
);
error!(
    keyframes_invalid_selector_number_missing_percent,
    "@keyframes {10 {}}", "Error: expected \"%\"."
);
test!(
    keyframes_simple_percent_selector,
    "@keyframes {0% {color: red;}}",
    "@keyframes {\n  0% {\n    color: red;\n  }\n}\n"
);
test!(
    keyframes_comma_separated_percent_selectors,
    "@keyframes {0%, 5%, 10%, 15% {color: red;}}",
    "@keyframes {\n  0%, 5%, 10%, 15% {\n    color: red;\n  }\n}\n"
);
test!(
    keyframes_empty_with_name,
    "@keyframes foo {}",
    "@keyframes foo {}\n"
);
test!(
    keyframes_variable_in_name,
    "@keyframes $foo {}",
    "@keyframes $foo {}\n"
);
test!(
    keyframes_arithmetic_in_name,
    "@keyframes 1 + 2 {}",
    "@keyframes 1 + 2 {}\n"
);
test!(
    keyframes_interpolation_in_name,
    "@keyframes #{1 + 2} {}",
    "@keyframes 3 {}\n"
);
test!(
    keyframes_contains_multiline_comment,
    "@keyframes foo {/**/}",
    "@keyframes foo {\n  /**/\n}\n"
);
test!(
    keyframes_multiple_rulesets,
    "@keyframes {
        to {
            color: red;
        }
        from {
            color: green;
        }
    }",
    "@keyframes {\n  to {\n    color: red;\n  }\n  from {\n    color: green;\n  }\n}\n"
);
test!(
    keyframes_vendor_prefix,
    "@-webkit-keyframes foo {
        0% {
            color: red;
        }
    }",
    "@-webkit-keyframes foo {\n  0% {\n    color: red;\n  }\n}\n"
);
test!(
    keyframes_percent_has_e,
    "@keyframes foo {
        1e2% {
            color: red;
        }
    }",
    "@keyframes foo {\n  1e2% {\n    color: red;\n  }\n}\n"
);
test!(
    keyframes_percent_has_plus_e,
    "@keyframes foo {
        1e+2% {
            color: red;
        }
    }",
    "@keyframes foo {\n  1e+2% {\n    color: red;\n  }\n}\n"
);
test!(
    keyframes_percent_has_negative_e,
    "@keyframes foo {
        1e-2% {
            color: red;
        }
    }",
    "@keyframes foo {\n  1e-2% {\n    color: red;\n  }\n}\n"
);
test!(
    keyframes_allow_decimal_selector,
    "@keyframes foo {
        12.5% {
            color: red;
        }
    }",
    "@keyframes foo {\n  12.5% {\n    color: red;\n  }\n}\n"
);
test!(
    keyframes_hash_in_name,
    "@keyframes #identifier {
      to {
        color: red;
      }
    }",
    "@keyframes #identifier {\n  to {\n    color: red;\n  }\n}\n"
);
test!(
    keyframes_interpolated_selector,
    "@keyframes foo {
      #{t}o {
        color: red;
      }
    }",
    "@keyframes foo {\n  to {\n    color: red;\n  }\n}\n"
);
error!(
    keyframes_denies_selector_with_hash,
    "@keyframes foo {
      #to {
        color: red;
      }
    }",
    "Error: Expected number."
);
error!(
    keyframes_nothing_after_forward_slash_in_selector,
    "@keyframes foo { a/", "Error: expected \"{\"."
);
error!(
    keyframes_no_ident_after_forward_slash_in_selector,
    "@keyframes foo { a/ {} }", "Error: Expected \"to\" or \"from\"."
);
error!(
    keyframes_nothing_after_selector,
    "@keyframes foo { a", "Error: expected \"{\"."
);
test!(
    e_alone,
    "@keyframes foo {
      1e3% {
        color: red;
      }
    }",
    "@keyframes foo {\n  1e3% {\n    color: red;\n  }\n}\n"
);
test!(
    e_with_plus,
    "@keyframes foo {
      1e+3% {
        color: red;
      }
    }",
    "@keyframes foo {\n  1e+3% {\n    color: red;\n  }\n}\n"
);
test!(
    e_with_minus,
    "@keyframes foo {
      1e-3% {
        color: red;
      }
    }",
    "@keyframes foo {\n  1e-3% {\n    color: red;\n  }\n}\n"
);
test!(
    e_with_decimal_plus,
    "@keyframes foo {
      1.5e+3% {
        color: red;
      }
    }",
    "@keyframes foo {\n  1.5e+3% {\n    color: red;\n  }\n}\n"
);
test!(
    e_with_decimal_no_number_after_decimal,
    "@keyframes foo {
      1.e3% {
        color: red;
      }
    }",
    "@keyframes foo {\n  1.e3% {\n    color: red;\n  }\n}\n"
);
test!(
    uppercase_e,
    "@keyframes foo {
      1E3% {
        color: red;
      }
    }",
    "@keyframes foo {\n  1e3% {\n    color: red;\n  }\n}\n"
);
test!(
    escaped_e,
    "@keyframes foo {
      1\\65 3% {
        color: red;
      }
    }",
    "@keyframes foo {\n  1e3% {\n    color: red;\n  }\n}\n"
);
test!(
    uppercase_escaped_e,
    "@keyframes foo {
      1\\45 3% {
        color: red;
      }
    }",
    "@keyframes foo {\n  1e3% {\n    color: red;\n  }\n}\n"
);
test!(
    style_rule_before_keyframes,
    "a {
        color: red;
    }

    @keyframes spinner-border {
        to {
            color: red;
        }
    }",
    "a {\n  color: red;\n}\n\n@keyframes spinner-border {\n  to {\n    color: red;\n  }\n}\n"
);
test!(
    style_rule_after_keyframes,
    "@keyframes spinner-border {
        to {
            color: red;
        }
    }

    a {
        color: red;
    }",
    "@keyframes spinner-border {\n  to {\n    color: red;\n  }\n}\na {\n  color: red;\n}\n"
);
test!(
    percent_selector_leading_plus,
    "@keyframes foo {
        +5% {
            color: red;
        }
    }",
    "@keyframes foo {\n  +5% {\n    color: red;\n  }\n}\n"
);
error!(
    invalid_escape_in_place_of_e,
    "@keyframes foo {
      1\\110000 3% {
        color: red;
      }
    }",
    r#"Error: expected "%"."#
);
error!(
    percent_selector_no_number_after_e,
    "@keyframes foo {
        5e% {
            color: red;
        }
    }",
    r#"Error: Expected digit."#
);
error!(
    selector_is_empty_after_interpolation_is_resolved,
    "@keyframes foo {
        #{null} {}
    }",
    r#"Error: Expected number."#
);

// todo: span for this
// @keyframes foo {
//   1\1100000000000000 3% {
//     // color: \110000;
//   }
// }