Skip to content

Commit

Permalink
Add test of generic error types
Browse files Browse the repository at this point in the history
  • Loading branch information
dtolnay committed Sep 5, 2021
1 parent ec9ac76 commit 81b8810
Showing 1 changed file with 133 additions and 0 deletions.
133 changes: 133 additions & 0 deletions tests/test_generics.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
#![deny(clippy::all, clippy::pedantic)]

use std::fmt::{self, Debug, Display};
use thiserror::Error;

pub struct NoFormat;

#[derive(Debug)]
pub struct DebugOnly;

pub struct DisplayOnly;

impl Display for DisplayOnly {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str("display only")
}
}

#[derive(Debug)]
pub struct DebugAndDisplay;

impl Display for DebugAndDisplay {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str("debug and display")
}
}

/*
// Should expand to:
//
// impl<E> Display for EnumDebugField<E>
// where
// E: Debug;
//
// impl<E> Error for EnumDebugField<E>
// where
// Self: Debug + Display;
//
#[derive(Error, Debug)]
pub enum EnumDebugGeneric<E> {
#[error("{0:?}")]
FatalError(E),
}
// Should expand to:
//
// impl<E> Display for EnumFromGeneric<E>;
//
// impl<E> Error for EnumFromGeneric<E>
// where
// EnumDebugGeneric<E>: Error + 'static,
// Self: Debug + Display;
//
#[derive(Error, Debug)]
pub enum EnumFromGeneric<E> {
#[error("enum from generic")]
Source(#[from] EnumDebugGeneric<E>),
}
// Should expand to:
//
// impl<HasDisplay, HasDebug, HasNeither> Display
// for EnumCompound<HasDisplay, HasDebug, HasNeither>
// where
// HasDisplay: Display,
// HasDebug: Debug;
//
// impl<HasDisplay, HasDebug, HasNeither> Error
// for EnumCompound<HasDisplay, HasDebug, HasNeither>
// where
// Self: Debug + Display;
//
#[derive(Error)]
pub enum EnumCompound<HasDisplay, HasDebug, HasNeither> {
#[error("{0} {1:?}")]
DisplayDebug(HasDisplay, HasDebug),
#[error("{0}")]
Display(HasDisplay, HasNeither),
#[error("{1:?}")]
Debug(HasNeither, HasDebug),
}
impl<HasDisplay, HasDebug, HasNeither> Debug for EnumCompound<HasDisplay, HasDebug, HasNeither> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str("EnumCompound")
}
}
#[test]
fn test_display_enum_compound() {
let mut instance: EnumCompound<DisplayOnly, DebugOnly, NoFormat>;
instance = EnumCompound::DisplayDebug(DisplayOnly, DebugOnly);
assert_eq!(format!("{}", instance), "display only DebugOnly");
instance = EnumCompound::Display(DisplayOnly, NoFormat);
assert_eq!(format!("{}", instance), "display only");
instance = EnumCompound::Debug(NoFormat, DebugOnly);
assert_eq!(format!("{}", instance), "DebugOnly");
}
*/

// Should expand to:
//
// impl<E> Display for StructDebugGeneric<E>
// where
// E: Debug;
//
// impl<E> Error for StructDebugGeneric<E>
// where
// Self: Debug + Display;
//
#[derive(Error, Debug)]
#[error("{underlying:?}")]
pub struct StructDebugGeneric<E> {
pub underlying: E,
}

/*
// Should expand to:
//
// impl<E> Error for StructFromGeneric<E>
// where
// StructDebugGeneric<E>: Error + 'static,
// Self: Debug + Display;
//
#[derive(Error, Debug)]
pub struct StructFromGeneric<E> {
#[from]
pub source: StructDebugGeneric<E>,
}
*/

0 comments on commit 81b8810

Please sign in to comment.