uni_error 0.11.3

A simple, universal error type for Rust
Documentation
use uni_error::cause::Cause;
use uni_error::convert::ErrorContext as _;
use uni_error::{SimpleError, UniError, UniKind};

use crate::common::{TestError, TestKind};

mod common;

#[test]
fn test_kind() {
    let error = UniError::from_kind(TestKind::NotATest);
    let kind = error.kind_ref();

    assert_eq!(kind.type_name(), "test_error::common::TestKind");
    assert_eq!(error.kind_value(), "NotATest");
    assert_eq!(error.kind_context_str(), Some("This is not a test!".into()));
    assert_eq!(error.kind_code(), 123);
}

#[test]
fn test_dyn_kind_error() {
    let err = UniError::from_kind(TestKind::NotATest);
    let error: UniError<dyn UniKind> = err.clone().into();

    assert_eq!(
        error.type_name(),
        "uni_error::error::UniError<test_error::common::TestKind>"
    );
    assert_eq!(error.kind_value(), "NotATest");
    assert_eq!(error.kind_context_str(), Some("This is not a test!".into()));
    assert_eq!(error.kind_code(), 123);

    match error.to_typed_kind::<TestKind>() {
        Some(err2) => assert_eq!(err2, err),
        None => panic!("Expected downcast to TestKind"),
    }
}

#[test]
fn test_dyn_kind_code() {
    let error = UniError::from_kind(TestKind::NotATest).into_dyn_kind_code();
    assert_eq!(error.kind_value(), "NotATest");
    assert_eq!(error.kind_context_str(), Some("This is not a test!".into()));
    assert_eq!(error.kind_code(), 123);
    assert_eq!(error.typed_code(), 123);

    let kind = error.kind_ref();
    match kind.downcast_ref::<TestKind>() {
        Some(kind) => assert_eq!(kind, &TestKind::NotATest),
        None => panic!("Expected downcast to TestKind"),
    }

    assert!(error.into_typed_kind::<TestKind>().is_some());
}

#[test]
fn test_dyn_kind_codes() {
    let error = UniError::from_kind(TestKind::NotATest).into_dyn_kind_codes();
    assert_eq!(error.kind_value(), "NotATest");
    assert_eq!(error.kind_context_str(), Some("This is not a test!".into()));
    assert_eq!(error.kind_code(), 123);
    assert_eq!(error.typed_code(), 123);
    assert_eq!(error.typed_code2(), 124);

    let kind = error.kind_ref();
    match kind.downcast_ref::<TestKind>() {
        Some(kind) => assert_eq!(kind, &TestKind::NotATest),
        None => panic!("Expected downcast to TestKind"),
    }

    assert!(error.into_typed::<TestKind>().is_some());
}

#[test]
fn test_root_cause() {
    let error = TestError::new("test".to_string(), None);
    let error: UniError<TestKind> = error.into();
    let error: UniError<dyn UniKind> = error.into();
    let root_cause = error.root_cause();

    assert!(matches!(root_cause, Some(Cause::UniStdError(_))));
    assert_eq!(
        root_cause.unwrap().type_name(),
        "test_error::common::TestError"
    );
}

#[test]
fn test_display() {
    let error = TestError::new("testing".to_string(), None);
    let error: UniError<TestKind> = error.kind_context(TestKind::NotATest, "is this a test?");

    assert_eq!(
        error.to_string(),
        "is this a test?: This is not a test!: TestError: testing"
    );
}

#[test]
fn test_simple_error_partial_eq() {
    let error1 = SimpleError::from_kind_default_context("test");
    let error2 = SimpleError::from_kind_default_context("test");
    let error3 = SimpleError::from_kind_default_context("test2");

    assert_eq!(error1, error2);
    assert_ne!(error1, error3);
}

#[test]
fn test_uni_error_partial_eq() {
    let error1 = UniError::from_kind_context(TestKind::Test, "test");
    let error2 = UniError::from_kind(TestKind::Test);
    let error3 = UniError::from_kind(TestKind::NotATest);

    assert_eq!(error1, error2);
    assert_ne!(error1, error3);
}