extern crate rand; extern crate alchemy; extern crate sigils; macro_rules! transmutation_test { ($modName: ident, $varType: ident, $numBytes: expr, [$($var: ident)*]) => { mod $modName { use rand::{thread_rng, Rng, ThreadRng}; use alchemy::{Endianess, Transmutable}; use sigils::Zero; use sigils::vector::$varType; #[test] pub fn transmutation() { let mut vec: $varType; let final_vec: $varType; let endianess: Endianess; let mut rng: ThreadRng; let mut buffer: [u8; $numBytes]; // Initialize the variables. rng = thread_rng(); vec = $varType::::zero(); $(vec.$var = rng.next_u64();)* buffer = [0u8; $numBytes]; endianess = Endianess::PLATFORM; vec.to_bytes(&mut buffer, endianess); final_vec = $varType::from_bytes(&buffer, endianess); $(assert_eq!(vec.$var, final_vec.$var);)* } } } } transmutation_test!(vec2, Vector2, 16, [x y]); transmutation_test!(vec3, Vector3, 24, [x y z]); transmutation_test!(vec4, Vector4, 32, [x y z w]);