Add test of Display impl nested inside display attribute

This commit is contained in:
David Tolnay 2022-10-20 10:28:23 -07:00
parent 29ee95ef47
commit 4b06a3e263
No known key found for this signature in database
GPG Key ID: F9BA143B95FF6D82
1 changed files with 30 additions and 1 deletions

View File

@ -1,4 +1,4 @@
use std::fmt::Display;
use std::fmt::{self, Display};
use thiserror::Error;
fn assert<T: Display>(expected: &str, value: T) {
@ -141,6 +141,35 @@ fn test_match() {
);
}
#[test]
fn test_nested_display() {
// Same behavior as the one in `test_match`, but without String allocations.
#[derive(Error, Debug)]
#[error("{}", {
struct Msg<'a>(&'a String, &'a Option<usize>);
impl<'a> Display for Msg<'a> {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
match self.1 {
Some(n) => write!(formatter, "error occurred with {}", n),
None => write!(formatter, "there was an empty error"),
}?;
write!(formatter, ": {}", self.0)
}
}
Msg(.0, .1)
})]
struct Error(String, Option<usize>);
assert(
"error occurred with 1: ...",
Error("...".to_owned(), Some(1)),
);
assert(
"there was an empty error: ...",
Error("...".to_owned(), None),
);
}
#[test]
fn test_void() {
#[allow(clippy::empty_enum)]