use parse_fmt_str::{
parse_fmt_str, Align, Argument, Count, Precision, PossibleFormatSlot, Sign, Type,
};
#[test]
fn hello_fmt_str() {
let formatstr = parse_fmt_str("Hello, {:}!").unwrap();
assert_eq!(formatstr.text, vec!["Hello, ", "!"]);
assert_eq!(formatstr.maybe_fmt.len(), 1);
assert!(match &formatstr.maybe_fmt[0] {
PossibleFormatSlot::FormatSlot(fmt) => {
assert!(fmt.arg.is_none());
assert!(fmt.fmt_spec.is_some());
let fmt_spec = fmt.fmt_spec.as_ref().unwrap();
assert!(fmt_spec.fill.is_none());
assert!(fmt_spec.align.is_none());
assert!(fmt_spec.sign.is_none());
assert!(!fmt_spec.alternate);
assert!(!fmt_spec.pad_with_zeros);
assert!(fmt_spec.width.is_none());
assert!(fmt_spec.percision.is_none());
assert_eq!(fmt_spec.kind, Type::None);
true
}
_ => false,
});
}
#[test]
fn escaped_brackets() {
let formatstr = parse_fmt_str("abc{{123}}xyz").unwrap();
assert_eq!(formatstr.text, vec!["abc", "123", "xyz"]);
}
#[test]
fn blank() {
let formatstr = parse_fmt_str("{:}").unwrap();
assert_eq!(formatstr.text, vec!["", ""]);
assert!(match &formatstr.maybe_fmt[0] {
PossibleFormatSlot::FormatSlot(fmt) => {
assert!(fmt.arg.is_none());
assert!(fmt.fmt_spec.is_some());
let fmt_spec = fmt.fmt_spec.as_ref().unwrap();
assert!(fmt_spec.fill.is_none());
assert!(fmt_spec.align.is_none());
assert!(fmt_spec.sign.is_none());
assert!(!fmt_spec.alternate);
assert!(!fmt_spec.pad_with_zeros);
assert!(fmt_spec.width.is_none());
assert!(fmt_spec.percision.is_none());
assert_eq!(fmt_spec.kind, Type::None);
true
}
_ => false,
});
}
#[test]
fn all_in_one() {
let formatstr = parse_fmt_str("Hello, {{{argument:-^+#0wide$.*X?}}}!").unwrap();
assert_eq!(formatstr.text, vec!["Hello, ", "", "", "!"]);
assert_eq!(formatstr.maybe_fmt.len(), 3);
assert!(match &formatstr.maybe_fmt[1] {
PossibleFormatSlot::FormatSlot(fmt) => {
assert!(match fmt.arg.as_ref().unwrap() {
Argument::Identifier(str) => {
assert_eq!(str, "argument");
true
}
_ => false,
});
assert!(fmt.fmt_spec.is_some());
let fmt_spec = fmt.fmt_spec.as_ref().unwrap();
assert_eq!(fmt_spec.fill.as_ref().unwrap(), &'-');
assert_eq!(fmt_spec.align.as_ref().unwrap(), &Align::Center);
assert_eq!(fmt_spec.sign.as_ref().unwrap(), &Sign::Positive);
assert!(fmt_spec.alternate);
assert!(fmt_spec.pad_with_zeros);
assert!(match fmt_spec.width.as_ref().unwrap() {
Count::Parameter(param) => {
match param {
Argument::Identifier(wide) => wide == "wide",
_ => false,
}
}
_ => false,
});
assert_eq!(
fmt_spec.percision.as_ref().unwrap(),
&Precision::SpecifiedPrecision
);
assert_eq!(fmt_spec.kind, Type::DebugUpperHex);
true
}
_ => false,
});
}