diff options
Diffstat (limited to 'tests/ui/fmt/format-args-capture.rs')
-rw-r--r-- | tests/ui/fmt/format-args-capture.rs | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/tests/ui/fmt/format-args-capture.rs b/tests/ui/fmt/format-args-capture.rs new file mode 100644 index 000000000..560352b5c --- /dev/null +++ b/tests/ui/fmt/format-args-capture.rs @@ -0,0 +1,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"); +} |