#[macro_use]
extern crate endian_trait;
use endian_trait::Endian;
use std::mem::{
size_of,
transmute,
};
#[test]
fn derive_8() {
type Raw = [u8; 1];
#[repr(u8)]
#[derive(Endian)]
enum Foo {
A = 16,
}
assert_eq!(size_of::<Foo>(), 1);
let bytes_be: Raw = [16];
let bytes_le: Raw = [16];
let foo_be: Raw = unsafe { transmute(Foo::A.to_be()) };
let foo_le: Raw = unsafe { transmute(Foo::A.to_le()) };
assert_eq!(&bytes_be[..], &foo_be[..]);
assert_eq!(&bytes_le[..], &foo_le[..]);
}
#[test]
fn derive_16() {
type Raw = [u8; 2];
#[repr(i16)]
#[derive(Endian)]
enum Foo {
A = 16,
}
assert_eq!(size_of::<Foo>(), 2);
let bytes_be: Raw = [0, 16];
let bytes_le: Raw = [16, 0];
let foo_be: Raw = unsafe { transmute(Foo::A.to_be()) };
let foo_le: Raw = unsafe { transmute(Foo::A.to_le()) };
assert_eq!(&bytes_be[..], &foo_be[..]);
assert_eq!(&bytes_le[..], &foo_le[..]);
}
#[test]
fn derive_32() {
type Raw = [u8; 4];
#[repr(u32)]
#[derive(Endian)]
enum Foo {
A = 16,
}
assert_eq!(size_of::<Foo>(), 4);
let bytes_be: Raw = [0, 0, 0, 16];
let bytes_le: Raw = [16, 0, 0, 0];
let foo_be: Raw = unsafe { transmute(Foo::A.to_be()) };
let foo_le: Raw = unsafe { transmute(Foo::A.to_le()) };
assert_eq!(&bytes_be[..], &foo_be[..]);
assert_eq!(&bytes_le[..], &foo_le[..]);
}
#[test]
fn derive_64() {
type Raw = [u8; 8];
#[repr(i64)]
#[derive(Endian)]
enum Foo {
A = 16,
}
assert_eq!(size_of::<Foo>(), 8);
let bytes_be: Raw = [0, 0, 0, 0, 0, 0, 0, 16];
let bytes_le: Raw = [16, 0, 0, 0, 0, 0, 0, 0];
let foo_be: Raw = unsafe { transmute(Foo::A.to_be()) };
let foo_le: Raw = unsafe { transmute(Foo::A.to_le()) };
assert_eq!(&bytes_be[..], &foo_be[..]);
assert_eq!(&bytes_le[..], &foo_le[..]);
}