thiserror/tests/test_path.rs
David Tolnay 520343e37d
Add test of Debug and Display of paths
DisplayDebug currently works but DebugDisplay does not.

    error[E0277]: `PathBuf` doesn't implement `std::fmt::Display`
      --> tests/test_path.rs:36:13
       |
    32 | #[derive(Error, Debug)]
       |          ----- in this derive macro expansion
    ...
    36 |     #[error("debug:{0:?} display:{0}")]
       |             ^^^^^^^^^^^^^^^^^^^^^^^^^ `PathBuf` cannot be formatted with the default formatter; call `.display()` on it
       |
       = help: the trait `std::fmt::Display` is not implemented for `PathBuf`
       = note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead
       = note: call `.display()` or `.to_string_lossy()` to safely print paths, as they may contain non-Unicode data
       = help: the trait `std::fmt::Display` is implemented for `Var<'_, T>`
       = note: this error originates in the macro `$crate::format_args` which comes from the expansion of the derive macro `Error` (in Nightly builds, run with -Z macro-backtrace for more info)
2024-11-10 12:57:31 -08:00

52 lines
1.1 KiB
Rust

use core::fmt::Display;
use ref_cast::RefCast;
use std::path::{Path, PathBuf};
use thiserror::Error;
#[derive(Error, Debug)]
#[error("failed to read '{file}'")]
struct StructPathBuf {
file: PathBuf,
}
#[derive(Error, Debug, RefCast)]
#[repr(C)]
#[error("failed to read '{file}'")]
struct StructPath {
file: Path,
}
#[derive(Error, Debug)]
enum EnumPathBuf {
#[error("failed to read '{0}'")]
Read(PathBuf),
}
#[derive(Error, Debug)]
#[error("{tail}")]
pub struct UnsizedError {
pub head: i32,
pub tail: str,
}
#[derive(Error, Debug)]
pub enum BothError {
#[error("display:{0} debug:{0:?}")]
DisplayDebug(PathBuf),
#[error("debug:{0:?} display:{0}")]
DebugDisplay(PathBuf),
}
fn assert<T: Display>(expected: &str, value: T) {
assert_eq!(expected, value.to_string());
}
#[test]
fn test_display() {
let path = Path::new("/thiserror");
let file = path.to_owned();
assert("failed to read '/thiserror'", StructPathBuf { file });
let file = path.to_owned();
assert("failed to read '/thiserror'", EnumPathBuf::Read(file));
assert("failed to read '/thiserror'", StructPath::ref_cast(path));
}