use super::*;

fn same(fmt: &'static str, p: &[Piece<'static>]) {
    let parser = Parser::new(fmt, None, vec![], false);
    assert!(parser.collect::<Vec<Piece<'static>>>() == p);
}

fn fmtdflt() -> FormatSpec<'static> {
    return FormatSpec {
        fill: None,
        align: AlignUnknown,
        flags: 0,
        precision: CountImplied,
        width: CountImplied,
        precision_span: None,
        width_span: None,
        ty: "",
    };
}

fn musterr(s: &str) {
    let mut p = Parser::new(s, None, vec![], false);
    p.next();
    assert!(!p.errors.is_empty());
}

#[test]
fn simple() {
    same("asdf", &[String("asdf")]);
    same("a{{b", &[String("a"), String("{b")]);
    same("a}}b", &[String("a"), String("}b")]);
    same("a}}", &[String("a"), String("}")]);
    same("}}", &[String("}")]);
    same("\\}}", &[String("\\"), String("}")]);
}

#[test]
fn invalid01() {
    musterr("{")
}
#[test]
fn invalid02() {
    musterr("}")
}
#[test]
fn invalid04() {
    musterr("{3a}")
}
#[test]
fn invalid05() {
    musterr("{:|}")
}
#[test]
fn invalid06() {
    musterr("{:>>>}")
}

#[test]
fn format_nothing() {
    same("{}",
         &[NextArgument(Argument {
               position: ArgumentImplicitlyIs(0),
               format: fmtdflt(),
           })]);
}
#[test]
fn format_position() {
    same("{3}",
         &[NextArgument(Argument {
               position: ArgumentIs(3),
               format: fmtdflt(),
           })]);
}
#[test]
fn format_position_nothing_else() {
    same("{3:}",
         &[NextArgument(Argument {
               position: ArgumentIs(3),
               format: fmtdflt(),
           })]);
}
#[test]
fn format_type() {
    same(
        "{3:a}",
        &[NextArgument(Argument {
            position: ArgumentIs(3),
            format: FormatSpec {
                fill: None,
                align: AlignUnknown,
                flags: 0,
                precision: CountImplied,
                width: CountImplied,
                precision_span: None,
                width_span: None,
                ty: "a",
            },
        })]);
}
#[test]
fn format_align_fill() {
    same(
        "{3:>}",
        &[NextArgument(Argument {
            position: ArgumentIs(3),
            format: FormatSpec {
                fill: None,
                align: AlignRight,
                flags: 0,
                precision: CountImplied,
                width: CountImplied,
                precision_span: None,
                width_span: None,
                ty: "",
            },
        })]);
    same(
        "{3:0<}",
        &[NextArgument(Argument {
            position: ArgumentIs(3),
            format: FormatSpec {
                fill: Some('0'),
                align: AlignLeft,
                flags: 0,
                precision: CountImplied,
                width: CountImplied,
                precision_span: None,
                width_span: None,
                ty: "",
            },
        })]);
    same(
        "{3:*<abcd}",
        &[NextArgument(Argument {
            position: ArgumentIs(3),
            format: FormatSpec {
                fill: Some('*'),
                align: AlignLeft,
                flags: 0,
                precision: CountImplied,
                width: CountImplied,
                precision_span: None,
                width_span: None,
                ty: "abcd",
            },
        })]);
}
#[test]
fn format_counts() {
    use syntax_pos::{GLOBALS, Globals, edition};
    GLOBALS.set(&Globals::new(edition::DEFAULT_EDITION), || {
    same(
        "{:10s}",
        &[NextArgument(Argument {
            position: ArgumentImplicitlyIs(0),
            format: FormatSpec {
                fill: None,
                align: AlignUnknown,
                flags: 0,
                precision: CountImplied,
                width: CountIs(10),
                precision_span: None,
                width_span: None,
                ty: "s",
            },
        })]);
    same(
        "{:10$.10s}",
        &[NextArgument(Argument {
            position: ArgumentImplicitlyIs(0),
            format: FormatSpec {
                fill: None,
                align: AlignUnknown,
                flags: 0,
                precision: CountIs(10),
                width: CountIsParam(10),
                precision_span: None,
                width_span: Some(InnerSpan::new(3, 6)),
                ty: "s",
            },
        })]);
    same(
        "{:.*s}",
        &[NextArgument(Argument {
            position: ArgumentImplicitlyIs(1),
            format: FormatSpec {
                fill: None,
                align: AlignUnknown,
                flags: 0,
                precision: CountIsParam(0),
                width: CountImplied,
                precision_span: Some(InnerSpan::new(3, 5)),
                width_span: None,
                ty: "s",
            },
        })]);
    same(
        "{:.10$s}",
        &[NextArgument(Argument {
            position: ArgumentImplicitlyIs(0),
            format: FormatSpec {
                fill: None,
                align: AlignUnknown,
                flags: 0,
                precision: CountIsParam(10),
                width: CountImplied,
                precision_span: Some(InnerSpan::new(3, 7)),
                width_span: None,
                ty: "s",
            },
        })]);
    same(
        "{:a$.b$s}",
        &[NextArgument(Argument {
            position: ArgumentImplicitlyIs(0),
            format: FormatSpec {
                fill: None,
                align: AlignUnknown,
                flags: 0,
                precision: CountIsName(Symbol::intern("b")),
                width: CountIsName(Symbol::intern("a")),
                precision_span: None,
                width_span: None,
                ty: "s",
            },
        })]);
    });
}
#[test]
fn format_flags() {
    same(
        "{:-}",
        &[NextArgument(Argument {
            position: ArgumentImplicitlyIs(0),
            format: FormatSpec {
                fill: None,
                align: AlignUnknown,
                flags: (1 << FlagSignMinus as u32),
                precision: CountImplied,
                width: CountImplied,
                precision_span: None,
                width_span: None,
                ty: "",
            },
        })]);
    same(
        "{:+#}",
        &[NextArgument(Argument {
            position: ArgumentImplicitlyIs(0),
            format: FormatSpec {
                fill: None,
                align: AlignUnknown,
                flags: (1 << FlagSignPlus as u32) | (1 << FlagAlternate as u32),
                precision: CountImplied,
                width: CountImplied,
                precision_span: None,
                width_span: None,
                ty: "",
            },
        })]);
}
#[test]
fn format_mixture() {
    same(
        "abcd {3:a} efg",
        &[
            String("abcd "),
            NextArgument(Argument {
                position: ArgumentIs(3),
                format: FormatSpec {
                    fill: None,
                    align: AlignUnknown,
                    flags: 0,
                    precision: CountImplied,
                    width: CountImplied,
                    precision_span: None,
                    width_span: None,
                    ty: "a",
                },
            }),
            String(" efg"),
        ],
    );
}
