#[macro_use]
mod macros;

test!(
    if_toplevel_true,
    "@if true {\n  a {\n    color: foo;\n}\n}\n",
    "a {\n  color: foo;\n}\n"
);
test!(
    if_inner_true,
    "a {\n  @if true {\n    color: foo;\n}\n}\n",
    "a {\n  color: foo;\n}\n"
);
test!(
    if_toplevel_false,
    "@if false {\n  a {\n    color: foo;\n}\n}\n",
    ""
);
test!(
    if_inner_false,
    "a {\n  @if false {\n    color: foo;\n}\n}\n",
    ""
);
test!(
    if_else_toplevel_true,
    "@if true {\n  a {\n    color: foo;\n}\n} @else {\n  b {\n    color: bar;\n}\n}\n",
    "a {\n  color: foo;\n}\n"
);
test!(
    if_else_inner_true,
    "a {\n  @if true {\n    color: foo;\n} @else {\n    color: bar;\n}\n}\n",
    "a {\n  color: foo;\n}\n"
);
test!(
    if_else_toplevel_false,
    "@if false {\n  a {\n    color: foo;\n}\n} @else {\n  a {\n    color: bar;\n}\n}\n",
    "a {\n  color: bar;\n}\n"
);
test!(
    if_else_inner_false,
    "a {\n  @if false {\n    color: foo;\n} @else {\n    color: bar;\n}\n}\n",
    "a {\n  color: bar;\n}\n"
);
error!(
    no_brace_after_else,
    "@if false {} @else -}", "Error: expected \"{\"."
);
test!(
    if_else_if_no_else,
    "a {\n  @if false {\n    color: red;\n} @else if true {\n    color: blue;\n}\n}\n",
    "a {\n  color: blue;\n}\n"
);
test!(
    if_false_else_if_false_else,
    "a {\n  @if false {\n    color: red;\n} @else if false {\n    color: blue;\n} @else {\n    color: green;\n}\n}\n",
    "a {\n  color: green;\n}\n"
);
test!(
    if_false_else_if_true_else,
    "a {\n  @if false {\n    color: red;\n} @else if true {\n    color: blue;\n} @else {\n    color: green;\n}\n}\n",
    "a {\n  color: blue;\n}\n"
);
test!(
    if_inner_style_missing_semicolon,
    "a {\n  @if true {\n    color: red\n  }\n}\n",
    "a {\n  color: red;\n}\n"
);
test!(
    atrule_other_than_else_immediately_following,
    "a {\n  @if true {\n    b {\n      background: gray;\n    }\n  }\n\n  @if true {\n    b {\n      background: gray;\n    }\n  }\n}\n",
    "a b {\n  background: gray;\n}\na b {\n  background: gray;\n}\n"
);
test!(
    nested_if_in_function,
    "@function foo($value) {\n  @if true {\n    @if false {\n      @error foo;\n    }\n\n    @else {\n      @return $value;\n    }\n  }\n}
    a { color: foo(bar); }",
    "a {\n  color: bar;\n}\n"
);
test!(
    multiline_comments_surrounding_condition_empty,
    "@if/**/true/**/{ a { color: red; } }",
    "a {\n  color: red;\n}\n"
);
test!(
    multiline_comments_surrounding_condition,
    "@if/* pre 1 */true/* post 1 */{ a { color: red; } }",
    "a {\n  color: red;\n}\n"
);
test!(
    escaped_if,
    "@\\69 f true {\n  a {\n    color: red;\n  }\n}\n",
    "a {\n  color: red;\n}\n"
);
test!(
    uppercase_escaped_if,
    "@\\49 f true {\n  a {\n    color: red;\n  }\n}\n",
    "@If true {\n  a {\n    color: red;\n  }\n}\n"
);
test!(
    escaped_else,
    "@if false {}\n\n@\\65lse {\n  a {\n    color: red;\n  }\n}\n",
    "a {\n  color: red;\n}\n"
);
test!(
    uppercase_escaped_else,
    "@if false {}\n\n@\\45lse {\n  a {\n    color: red;\n  }\n}\n",
    "@Else {\n  a {\n    color: red;\n  }\n}\n"
);
test!(
    uppercase_else,
    "@if false {}\n\n@Else {\n  a {\n    color: red;\n  }\n}\n",
    "@Else {\n  a {\n    color: red;\n  }\n}\n"
);
test!(
    uppercase_if,
    "@If true {\n  a {\n    color: red;\n  }\n}\n",
    "@If true {\n  a {\n    color: red;\n  }\n}\n"
);
error!(nothing_after_if, "@if", "Error: Expected expression.");
error!(
    nothing_after_dollar,
    "@if ${}", "Error: Expected identifier."
);
error!(no_condition, "@if{}", "Error: Expected expression.");
error!(
    nothing_after_open_curly,
    "@if foo {", "Error: expected \"}\"."
);
error!(
    first_condition_error,
    "@if 1 + 1 =s {\n}", "Error: expected \"=\"."
);
test!(
    conditions_evaluated_lazily,
    "$p: null;
    @if $p==null {}
    @else if not comparable($p, 0) {}",
    ""
);
test!(
    at_rule_inside_ruleset,
    "@mixin foo {\n    color: red;\n}\n\n@if true {\n    a {\n        @include foo;\n    }\n}\n",
    "a {\n  color: red;\n}\n"
);
test!(
    crazy_interpolation,
    "a {
        @if true {
            a: #{\"#{\"\\\\}}}{{{\"}#\"};
        }

        @if false {
            a: #{\"#{\"\\\\}}}{{{\"}#\"};
        } @else if true {
            b: #{\"#{\"\\\\}}}{{{\"}#\"};
        }

        @if false {
            a: #{\"#{\"\\\\}}}{{{\"}#\"};
        } @else if false {
            b: #{\"#{\"\\\\}}}{{{\"}#\"};
        } @else {
            c: #{\"#{\"\\\\}}}{{{\"}#\"};
        }
    }",
    "a {\n  a: \\}}}{{{#;\n  b: \\}}}{{{#;\n  c: \\}}}{{{#;\n}\n"
);
test!(
    multiline_comments_everywhere,
    "  /**/  @if  /**/  false  /**/  {}  /**/  
    /**/  
    /**/  @else  /**/  if  /**/  false  /**/  {}  /**/  
    /**/  
    /**/  @else  /**/  {}  /**/  
      /**/  ",
    "/**/\n/**/\n/**/\n"
);
test!(
    parent_selector_is_null_at_root,
    "@if & {
        a {
            color: red;
        }
    }",
    ""
);
test!(
    comment_inside_if_body,
    "@if true {
      /* a */
    }",
    "/* a */\n"
);
test!(
    comment_inside_if_else_body,
    "@if false {
      /* a */
    } @else if true {
      /* b */
    }",
    "/* b */\n"
);
test!(
    comment_inside_else_body,
    "@if false {
      /* a */
    } @else if false {
      /* b */
    } @else {
      /* c */
    }",
    "/* c */\n"
);
error!(
    nothing_after_escape,
    "@if \\", "Error: Expected expression."
);
error!(unclosed_dbl_quote, "@if true \" {}", "Error: Expected \".");
error!(unclosed_sgl_quote, "@if true ' {}", "Error: Expected '.");
error!(unclosed_call_args, "@if a({}", "Error: expected \")\".");
error!(nothing_after_div, "@if a/", "Error: Expected expression.");
error!(multiline_error, "@if \"\n\"{}", "Error: Expected \".");
error!(
    nothing_after_i_after_else,
    "@if true {} @else i", "Error: expected \"{\"."
);
error!(
    invalid_toplevel_selector,
    "@if true { & { } }", "Error: Top-level selectors may not contain the parent selector \"&\"."
);
error!(
    #[ignore = "unsure what the exact rule is here wrt denying interpolation (@media allows this)"]
    denies_interpolated_at_rule,
    "@#{if} true { a {   color: red; } }", "Error: expected \"(\"."
);
test!(
    else_if_escaped_lower_i,
    r"@if false {
    } @else \69 f true {
      /**/
    }",
    "/**/\n"
);
test!(
    else_if_escaped_lower_both,
    r"@if false {
    } @else \69 \66  true {
      /**/
    }",
    "/**/\n"
);
test!(
    else_if_uppercase,
    r"@if false {
    } @else IF true {
      /**/
    }",
    "/**/\n"
);
test!(
    elseif_is_parsed_as_else_if,
    r"@if false {}

    @elseif true {
        a {
            color: red;
        }
    }",
    "a {\n  color: red;\n}\n"
);