about summary refs log tree commit diff
path: root/tests/ui/fmt/format-args-capture.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/fmt/format-args-capture.rs')
-rw-r--r--tests/ui/fmt/format-args-capture.rs89
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 00000000000..560352b5cb9
--- /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");
+}