| //@ 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"); |
| } |