use crate::ratio::Ratio;

macro_rules! test_op{
	($ratio_op:ident,$op:ident,$a:expr,$b:expr,$c:expr,$d:expr)=>{
		assert_eq!(
			Ratio::new($a,$b).$ratio_op(Ratio::new($c,$d)),
			(($a as f32)/($b as f32)).$op(&(($c as f32)/($d as f32)))
		);
	};
}

macro_rules! test_many_ops{
	($ratio_op:ident,$op:ident)=>{
		test_op!($ratio_op,$op,1,2,3,4);
		test_op!($ratio_op,$op,1,2,-3,4);
		test_op!($ratio_op,$op,-1,2,-3,4);
		test_op!($ratio_op,$op,-1,-2,-3,4);
		test_op!($ratio_op,$op,2,1,6,3);
		test_op!($ratio_op,$op,-2,1,6,3);
		test_op!($ratio_op,$op,2,-1,-6,3);
		test_op!($ratio_op,$op,2,1,6,-3);
	};
}

#[test]
fn test_lt(){
	test_many_ops!(lt_ratio,lt);
}

#[test]
fn test_gt(){
	test_many_ops!(gt_ratio,gt);
}

#[test]
fn test_le(){
	test_many_ops!(le_ratio,le);
}

#[test]
fn test_ge(){
	test_many_ops!(ge_ratio,ge);
}

#[test]
fn test_eq(){
	test_many_ops!(eq_ratio,eq);
}

#[test]
fn test_partial_cmp(){
	test_many_ops!(partial_cmp_ratio,partial_cmp);
}

// #[test]
// fn test_cmp(){
// 	test_many_ops!(cmp_ratio,cmp);
// }
