#![allow(clippy::expect_used, clippy::unwrap_used)]
use zerodds_flatdata::FlatStruct;
use zerodds_flatdata_derive::FlatStruct as DeriveFlatStruct;
#[derive(Copy, Clone, Debug, PartialEq, Eq, DeriveFlatStruct)]
#[repr(C)]
struct PoseDerived {
x: i64,
y: i64,
z: i64,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, DeriveFlatStruct)]
#[repr(C)]
struct PoseDifferent {
a: i32,
b: i32,
}
#[test]
fn derive_generates_wire_size() {
assert_eq!(PoseDerived::WIRE_SIZE, 24);
assert_eq!(PoseDifferent::WIRE_SIZE, 8);
}
#[test]
fn derive_generates_type_hash_nonzero() {
assert_ne!(PoseDerived::TYPE_HASH, [0u8; 16]);
}
#[test]
fn derive_generates_distinct_hash_per_layout() {
assert_ne!(PoseDerived::TYPE_HASH, PoseDifferent::TYPE_HASH);
}
#[test]
fn derive_as_bytes_roundtrip() {
let p = PoseDerived { x: 1, y: 2, z: 3 };
let bytes = p.as_bytes();
assert_eq!(bytes.len(), 24);
let p2: PoseDerived = unsafe { PoseDerived::from_bytes_unchecked(bytes) };
assert_eq!(p, p2);
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, DeriveFlatStruct)]
#[repr(C)]
struct Tuple(u64, u64);
#[test]
fn derive_works_for_tuple_struct() {
assert_eq!(Tuple::WIRE_SIZE, 16);
let t = Tuple(0xAA, 0xBB);
assert_eq!(t.as_bytes().len(), 16);
}
#[derive(Copy, Clone, DeriveFlatStruct)]
#[repr(transparent)]
struct WrappedPose(PoseDerived);
#[test]
fn derive_accepts_repr_transparent() {
assert_eq!(WrappedPose::WIRE_SIZE, PoseDerived::WIRE_SIZE);
assert_ne!(WrappedPose::TYPE_HASH, PoseDerived::TYPE_HASH);
}
#[derive(Copy, Clone, DeriveFlatStruct)]
#[repr(C)]
struct PoseReordered {
z: i64,
y: i64,
x: i64,
}
#[test]
fn derive_detects_field_reorder() {
assert_ne!(PoseDerived::TYPE_HASH, PoseReordered::TYPE_HASH);
}
#[derive(Copy, Clone, DeriveFlatStruct)]
#[repr(C)]
struct PoseUnsigned {
x: u64,
y: u64,
z: u64,
}
#[test]
fn derive_detects_field_type_change() {
assert_eq!(PoseDerived::WIRE_SIZE, PoseUnsigned::WIRE_SIZE);
assert_ne!(PoseDerived::TYPE_HASH, PoseUnsigned::TYPE_HASH);
}
#[derive(Copy, Clone, DeriveFlatStruct)]
#[repr(C)]
struct PoseRenamed {
x: i64,
y: i64,
z: i64,
}
#[test]
fn derive_detects_type_rename() {
assert_ne!(PoseDerived::TYPE_HASH, PoseRenamed::TYPE_HASH);
}
#[derive(Copy, Clone, DeriveFlatStruct)]
#[repr(C)]
struct PoseDerived2 {
x: i64,
y: i64,
z: i64,
}
#[test]
fn derive_hash_is_deterministic_for_identical_layout() {
assert_ne!(PoseDerived::TYPE_HASH, PoseDerived2::TYPE_HASH);
}
#[derive(Copy, Clone, DeriveFlatStruct)]
#[repr(C)]
struct Marker;
#[test]
fn derive_works_for_unit_struct() {
assert_eq!(Marker::WIRE_SIZE, 0);
assert_ne!(Marker::TYPE_HASH, [0u8; 16]);
}