244 lines
6.5 KiB
Rust
244 lines
6.5 KiB
Rust
![]() |
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,
|
||
|
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,
|
||
|
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,
|
||
|
ty: "",
|
||
|
},
|
||
|
})]);
|
||
|
same("{3:0<}",
|
||
|
&[NextArgument(Argument {
|
||
|
position: ArgumentIs(3),
|
||
|
format: FormatSpec {
|
||
|
fill: Some('0'),
|
||
|
align: AlignLeft,
|
||
|
flags: 0,
|
||
|
precision: CountImplied,
|
||
|
width: CountImplied,
|
||
|
ty: "",
|
||
|
},
|
||
|
})]);
|
||
|
same("{3:*<abcd}",
|
||
|
&[NextArgument(Argument {
|
||
|
position: ArgumentIs(3),
|
||
|
format: FormatSpec {
|
||
|
fill: Some('*'),
|
||
|
align: AlignLeft,
|
||
|
flags: 0,
|
||
|
precision: CountImplied,
|
||
|
width: CountImplied,
|
||
|
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),
|
||
|
ty: "s",
|
||
|
},
|
||
|
})]);
|
||
|
same("{:10$.10s}",
|
||
|
&[NextArgument(Argument {
|
||
|
position: ArgumentImplicitlyIs(0),
|
||
|
format: FormatSpec {
|
||
|
fill: None,
|
||
|
align: AlignUnknown,
|
||
|
flags: 0,
|
||
|
precision: CountIs(10),
|
||
|
width: CountIsParam(10),
|
||
|
ty: "s",
|
||
|
},
|
||
|
})]);
|
||
|
same("{:.*s}",
|
||
|
&[NextArgument(Argument {
|
||
|
position: ArgumentImplicitlyIs(1),
|
||
|
format: FormatSpec {
|
||
|
fill: None,
|
||
|
align: AlignUnknown,
|
||
|
flags: 0,
|
||
|
precision: CountIsParam(0),
|
||
|
width: CountImplied,
|
||
|
ty: "s",
|
||
|
},
|
||
|
})]);
|
||
|
same("{:.10$s}",
|
||
|
&[NextArgument(Argument {
|
||
|
position: ArgumentImplicitlyIs(0),
|
||
|
format: FormatSpec {
|
||
|
fill: None,
|
||
|
align: AlignUnknown,
|
||
|
flags: 0,
|
||
|
precision: CountIsParam(10),
|
||
|
width: CountImplied,
|
||
|
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")),
|
||
|
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,
|
||
|
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,
|
||
|
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,
|
||
|
ty: "a",
|
||
|
},
|
||
|
}),
|
||
|
String(" efg")]);
|
||
|
}
|