use ops_derive::*;
#[derive(
Copy,
Clone,
PartialEq,
Debug,
AutoAll,
// AutoAdd,
// AutoSub,
// AutoMul,
// AutoDiv,
// AutoNeg,
// AutoAddAssign,
// AutoDivAssign,
// AutoMulAssign,
// AutoSubAssign,
)]
pub struct Point {
x: f32,
y: f32,
z: f32,
}
impl Point {
fn new(x: f32, y: f32, z: f32) -> Self {
Self { x, y, z }
}
}
#[test]
fn base() {
let a = Point::new(1.0, 2.0, 3.0);
let b = Point::new(4.0, 5.0, 6.0);
let add = Point::new(5.0, 7.0, 9.0);
let sub = Point::new(-3.0, -3.0, -3.0);
let mul = Point::new(4.0, 10.0, 18.0);
let div = Point::new(0.25, 0.4, 0.5);
let neg = Point::new(-1.0, -2.0, -3.0);
assert_eq!(a + b, add);
assert_eq!(a - b, sub);
assert_eq!(a * b, mul);
assert_eq!(a / b, div);
assert_eq!(-a, neg);
}
macro_rules! assert_assign {
($a:ident $op:tt $b:ident = $out:ident) => {
{
let mut actual = $a.clone();
actual $op $b;
assert_eq!(actual, $out)
}
};
}
#[test]
fn assign() {
let a = Point::new(1.0, 2.0, 3.0);
let b = Point::new(4.0, 5.0, 6.0);
let add = Point::new(5.0, 7.0, 9.0);
let sub = Point::new(-3.0, -3.0, -3.0);
let mul = Point::new(4.0, 10.0, 18.0);
let div = Point::new(0.25, 0.4, 0.5);
assert_assign!(a += b = add);
assert_assign!(a -= b = sub);
assert_assign!(a *= b = mul);
assert_assign!(a /= b = div);
}