2019-06-15 19:54:46 +00:00
|
|
|
use super::*;
|
|
|
|
|
|
|
|
fn same(fmt: &'static str, p: &[Piece<'static>]) {
|
2020-05-08 17:14:06 +00:00
|
|
|
let parser = Parser::new(fmt, None, None, false, ParseMode::Format);
|
2019-11-06 00:02:12 +00:00
|
|
|
assert_eq!(parser.collect::<Vec<Piece<'static>>>(), p);
|
2019-06-15 19:54:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
fn fmtdflt() -> FormatSpec<'static> {
|
|
|
|
return FormatSpec {
|
|
|
|
fill: None,
|
|
|
|
align: AlignUnknown,
|
|
|
|
flags: 0,
|
|
|
|
precision: CountImplied,
|
|
|
|
width: CountImplied,
|
2019-07-30 04:51:32 +00:00
|
|
|
precision_span: None,
|
|
|
|
width_span: None,
|
2019-06-15 19:54:46 +00:00
|
|
|
ty: "",
|
2019-11-06 00:02:12 +00:00
|
|
|
ty_span: None,
|
2019-06-15 19:54:46 +00:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
fn musterr(s: &str) {
|
2020-05-08 17:14:06 +00:00
|
|
|
let mut p = Parser::new(s, None, None, false, ParseMode::Format);
|
2019-06-15 19:54:46 +00:00
|
|
|
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() {
|
2022-07-16 21:13:14 +00:00
|
|
|
same(
|
|
|
|
"{3}",
|
|
|
|
&[NextArgument(Argument {
|
|
|
|
position: ArgumentIs(3, Some(InnerSpan { start: 2, end: 3 })),
|
|
|
|
format: fmtdflt(),
|
|
|
|
})],
|
|
|
|
);
|
2019-06-15 19:54:46 +00:00
|
|
|
}
|
|
|
|
#[test]
|
|
|
|
fn format_position_nothing_else() {
|
2022-07-16 21:13:14 +00:00
|
|
|
same(
|
|
|
|
"{3:}",
|
|
|
|
&[NextArgument(Argument {
|
|
|
|
position: ArgumentIs(3, Some(InnerSpan { start: 2, end: 3 })),
|
|
|
|
format: fmtdflt(),
|
|
|
|
})],
|
|
|
|
);
|
2019-06-15 19:54:46 +00:00
|
|
|
}
|
|
|
|
#[test]
|
|
|
|
fn format_type() {
|
2019-07-30 04:51:32 +00:00
|
|
|
same(
|
2019-11-06 00:02:12 +00:00
|
|
|
"{3:x}",
|
2019-07-30 04:51:32 +00:00
|
|
|
&[NextArgument(Argument {
|
2022-07-16 21:13:14 +00:00
|
|
|
position: ArgumentIs(3, Some(InnerSpan { start: 2, end: 3 })),
|
2019-07-30 04:51:32 +00:00
|
|
|
format: FormatSpec {
|
|
|
|
fill: None,
|
|
|
|
align: AlignUnknown,
|
|
|
|
flags: 0,
|
|
|
|
precision: CountImplied,
|
|
|
|
width: CountImplied,
|
|
|
|
precision_span: None,
|
|
|
|
width_span: None,
|
2019-11-06 00:02:12 +00:00
|
|
|
ty: "x",
|
|
|
|
ty_span: None,
|
2019-07-30 04:51:32 +00:00
|
|
|
},
|
|
|
|
})],
|
|
|
|
);
|
2019-06-15 19:54:46 +00:00
|
|
|
}
|
|
|
|
#[test]
|
|
|
|
fn format_align_fill() {
|
2019-07-30 04:51:32 +00:00
|
|
|
same(
|
|
|
|
"{3:>}",
|
|
|
|
&[NextArgument(Argument {
|
2022-07-16 21:13:14 +00:00
|
|
|
position: ArgumentIs(3, Some(InnerSpan { start: 2, end: 3 })),
|
2019-07-30 04:51:32 +00:00
|
|
|
format: FormatSpec {
|
|
|
|
fill: None,
|
|
|
|
align: AlignRight,
|
|
|
|
flags: 0,
|
|
|
|
precision: CountImplied,
|
|
|
|
width: CountImplied,
|
|
|
|
precision_span: None,
|
|
|
|
width_span: None,
|
|
|
|
ty: "",
|
2019-11-06 00:02:12 +00:00
|
|
|
ty_span: None,
|
2019-07-30 04:51:32 +00:00
|
|
|
},
|
|
|
|
})],
|
|
|
|
);
|
|
|
|
same(
|
|
|
|
"{3:0<}",
|
|
|
|
&[NextArgument(Argument {
|
2022-07-16 21:13:14 +00:00
|
|
|
position: ArgumentIs(3, Some(InnerSpan { start: 2, end: 3 })),
|
2019-07-30 04:51:32 +00:00
|
|
|
format: FormatSpec {
|
|
|
|
fill: Some('0'),
|
|
|
|
align: AlignLeft,
|
|
|
|
flags: 0,
|
|
|
|
precision: CountImplied,
|
|
|
|
width: CountImplied,
|
|
|
|
precision_span: None,
|
|
|
|
width_span: None,
|
|
|
|
ty: "",
|
2019-11-06 00:02:12 +00:00
|
|
|
ty_span: None,
|
2019-07-30 04:51:32 +00:00
|
|
|
},
|
|
|
|
})],
|
|
|
|
);
|
|
|
|
same(
|
|
|
|
"{3:*<abcd}",
|
|
|
|
&[NextArgument(Argument {
|
2022-07-16 21:13:14 +00:00
|
|
|
position: ArgumentIs(3, Some(InnerSpan { start: 2, end: 3 })),
|
2019-07-30 04:51:32 +00:00
|
|
|
format: FormatSpec {
|
|
|
|
fill: Some('*'),
|
|
|
|
align: AlignLeft,
|
|
|
|
flags: 0,
|
|
|
|
precision: CountImplied,
|
|
|
|
width: CountImplied,
|
|
|
|
precision_span: None,
|
|
|
|
width_span: None,
|
|
|
|
ty: "abcd",
|
2019-11-06 00:02:12 +00:00
|
|
|
ty_span: Some(InnerSpan::new(6, 10)),
|
2019-07-30 04:51:32 +00:00
|
|
|
},
|
|
|
|
})],
|
|
|
|
);
|
2019-06-15 19:54:46 +00:00
|
|
|
}
|
|
|
|
#[test]
|
|
|
|
fn format_counts() {
|
2022-04-29 16:48:58 +00:00
|
|
|
same(
|
|
|
|
"{:10x}",
|
|
|
|
&[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: "x",
|
|
|
|
ty_span: None,
|
|
|
|
},
|
|
|
|
})],
|
|
|
|
);
|
|
|
|
same(
|
|
|
|
"{:10$.10x}",
|
|
|
|
&[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: "x",
|
|
|
|
ty_span: None,
|
|
|
|
},
|
|
|
|
})],
|
|
|
|
);
|
2022-07-19 21:25:26 +00:00
|
|
|
same(
|
|
|
|
"{1:0$.10x}",
|
|
|
|
&[NextArgument(Argument {
|
2022-07-16 21:13:14 +00:00
|
|
|
position: ArgumentIs(1, Some(InnerSpan { start: 2, end: 3 })),
|
2022-07-19 21:25:26 +00:00
|
|
|
format: FormatSpec {
|
|
|
|
fill: None,
|
|
|
|
align: AlignUnknown,
|
|
|
|
flags: 0,
|
|
|
|
precision: CountIs(10),
|
|
|
|
width: CountIsParam(0),
|
|
|
|
precision_span: None,
|
|
|
|
width_span: Some(InnerSpan::new(4, 6)),
|
|
|
|
ty: "x",
|
|
|
|
ty_span: None,
|
|
|
|
},
|
|
|
|
})],
|
|
|
|
);
|
2022-04-29 16:48:58 +00:00
|
|
|
same(
|
|
|
|
"{:.*x}",
|
|
|
|
&[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: "x",
|
|
|
|
ty_span: None,
|
|
|
|
},
|
|
|
|
})],
|
|
|
|
);
|
|
|
|
same(
|
|
|
|
"{:.10$x}",
|
|
|
|
&[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: "x",
|
|
|
|
ty_span: None,
|
|
|
|
},
|
|
|
|
})],
|
|
|
|
);
|
|
|
|
same(
|
|
|
|
"{:a$.b$?}",
|
|
|
|
&[NextArgument(Argument {
|
|
|
|
position: ArgumentImplicitlyIs(0),
|
|
|
|
format: FormatSpec {
|
|
|
|
fill: None,
|
|
|
|
align: AlignUnknown,
|
|
|
|
flags: 0,
|
|
|
|
precision: CountIsName("b", InnerSpan::new(6, 7)),
|
|
|
|
width: CountIsName("a", InnerSpan::new(4, 4)),
|
|
|
|
precision_span: None,
|
|
|
|
width_span: None,
|
|
|
|
ty: "?",
|
|
|
|
ty_span: None,
|
|
|
|
},
|
|
|
|
})],
|
|
|
|
);
|
2019-06-15 19:54:46 +00:00
|
|
|
}
|
|
|
|
#[test]
|
|
|
|
fn format_flags() {
|
2019-07-30 04:51:32 +00:00
|
|
|
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: "",
|
2019-11-06 00:02:12 +00:00
|
|
|
ty_span: None,
|
2019-07-30 04:51:32 +00:00
|
|
|
},
|
|
|
|
})],
|
|
|
|
);
|
|
|
|
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: "",
|
2019-11-06 00:02:12 +00:00
|
|
|
ty_span: None,
|
2019-07-30 04:51:32 +00:00
|
|
|
},
|
|
|
|
})],
|
|
|
|
);
|
2019-06-15 19:54:46 +00:00
|
|
|
}
|
|
|
|
#[test]
|
|
|
|
fn format_mixture() {
|
2019-07-30 04:51:32 +00:00
|
|
|
same(
|
2019-11-06 00:02:12 +00:00
|
|
|
"abcd {3:x} efg",
|
2019-07-30 04:51:32 +00:00
|
|
|
&[
|
|
|
|
String("abcd "),
|
|
|
|
NextArgument(Argument {
|
2022-07-16 21:13:14 +00:00
|
|
|
position: ArgumentIs(3, Some(InnerSpan { start: 7, end: 8 })),
|
2019-07-30 04:51:32 +00:00
|
|
|
format: FormatSpec {
|
|
|
|
fill: None,
|
|
|
|
align: AlignUnknown,
|
|
|
|
flags: 0,
|
|
|
|
precision: CountImplied,
|
|
|
|
width: CountImplied,
|
|
|
|
precision_span: None,
|
|
|
|
width_span: None,
|
2019-11-06 00:02:12 +00:00
|
|
|
ty: "x",
|
|
|
|
ty_span: None,
|
2019-07-30 04:51:32 +00:00
|
|
|
},
|
|
|
|
}),
|
|
|
|
String(" efg"),
|
|
|
|
],
|
|
|
|
);
|
2019-06-15 19:54:46 +00:00
|
|
|
}
|