use spenso::structure::representation::{LibraryRep, RepName};
use spenso_macros::SimpleRepresentation;
#[rustfmt::skip]
#[derive(
SimpleRepresentation)]
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
Hash,
PartialOrd,
Ord,
Default,
)]
#[representation(name = "spf", dual_name = "SpinAntiFundamental")] pub struct SpinFundamental {}
#[rustfmt::skip]
#[derive(SimpleRepresentation)]
#[representation(name = "vec")] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Default)]
pub struct Vector {}
#[derive(
SimpleRepresentation, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Default,
)]
#[representation(name = "sc", self_dual)]
pub struct Scalar {}
#[test]
fn reps() {
let sf = SpinFundamental {};
let sf_dual: SpinAntiFundamental = sf.dual();
let v = Vector {};
let v_dual: DualVector = v.dual();
assert_eq!(format!("{}", sf), "spf🠑");
assert_eq!(format!("{}", sf_dual), "spf🠓"); assert_eq!(format!("{}", v), "vec🠑");
assert_eq!(format!("{}", v_dual), "vec🠓");
assert!(
std::any::TypeId::of::<<SpinFundamental as RepName>::Dual>()
== std::any::TypeId::of::<SpinAntiFundamental>()
);
assert!(
std::any::TypeId::of::<<Vector as RepName>::Dual>() == std::any::TypeId::of::<DualVector>()
);
assert_eq!(sf.dual(), sf_dual);
assert_eq!(sf_dual.dual(), sf); assert_eq!(v.dual(), v_dual);
assert_eq!(v_dual.dual(), v);
let rep_sf: LibraryRep = sf.into();
let rep_sf_dual: LibraryRep = sf_dual.into();
assert_eq!(SpinFundamental::try_from(rep_sf).unwrap(), sf);
assert_eq!(SpinAntiFundamental::try_from(rep_sf_dual).unwrap(), sf_dual);
assert!(SpinAntiFundamental::try_from(rep_sf).is_err());
assert_eq!(sf_dual.base(), sf);
let sc = Scalar::default();
let sc_dual = sc.dual();
assert_eq!(sc_dual.base(), sc);
assert_eq!(format!("{}", sc), "sc");
}