1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
|
// run-pass
fn main() {
named_argument_takes_precedence_to_captured();
formatting_parameters_can_be_captured();
capture_raw_strings_and_idents();
repeated_capture();
#[cfg(panic = "unwind")]
{
panic_with_single_argument_does_not_get_formatted();
panic_with_multiple_arguments_is_formatted();
}
}
fn named_argument_takes_precedence_to_captured() {
let foo = "captured";
let s = format!("{foo}", foo = "named");
assert_eq!(&s, "named");
let s = format!("{foo}-{foo}-{foo}", foo = "named");
assert_eq!(&s, "named-named-named");
let s = format!("{}-{bar}-{foo}", "positional", bar = "named");
assert_eq!(&s, "positional-named-captured");
}
fn capture_raw_strings_and_idents() {
let r#type = "apple";
let s = format!(r#"The fruit is an {type}"#);
assert_eq!(&s, "The fruit is an apple");
let r#type = "orange";
let s = format!(r"The fruit is an {type}");
assert_eq!(&s, "The fruit is an orange");
}
#[cfg(panic = "unwind")]
fn panic_with_single_argument_does_not_get_formatted() {
// panic! with a single argument does not perform string formatting.
// RFC #2795 suggests that this may need to change so that captured arguments are formatted.
// For stability reasons this will need to part of an edition change.
#[allow(non_fmt_panics)]
let msg = std::panic::catch_unwind(|| {
panic!("{foo}");
})
.unwrap_err();
assert_eq!(msg.downcast_ref::<&str>(), Some(&"{foo}"))
}
#[cfg(panic = "unwind")]
fn panic_with_multiple_arguments_is_formatted() {
let foo = "captured";
let msg = std::panic::catch_unwind(|| {
panic!("{}-{bar}-{foo}", "positional", bar = "named");
})
.unwrap_err();
assert_eq!(msg.downcast_ref::<String>(), Some(&"positional-named-captured".to_string()))
}
fn formatting_parameters_can_be_captured() {
let width = 9;
let precision = 3;
let x = 7.0;
let s = format!("{x:width$}");
assert_eq!(&s, " 7");
let s = format!("{x:<width$}");
assert_eq!(&s, "7 ");
let s = format!("{x:-^width$}");
assert_eq!(&s, "----7----");
let s = format!("{x:-^width$.precision$}");
assert_eq!(&s, "--7.000--");
}
fn repeated_capture() {
let a = 1;
let b = 2;
let s = format!("{a} {b} {a}");
assert_eq!(&s, "1 2 1");
}
|