use super::*;
#[test]
fn bitand_complement_is_zero() {
let x = Expr::var("x");
let expr = Expr::bitand(
x.clone(),
Expr::UnOp {
op: UnOp::BitNot,
operand: Box::new(x),
},
);
assert_eq!(reduce_expr(&expr), Some(Expr::u32(0)));
}
#[test]
fn bitand_complement_reversed() {
let x = Expr::var("x");
let expr = Expr::bitand(
Expr::UnOp {
op: UnOp::BitNot,
operand: Box::new(x.clone()),
},
x,
);
assert_eq!(reduce_expr(&expr), Some(Expr::u32(0)));
}
#[test]
fn bitor_complement_is_all_ones() {
let x = Expr::var("x");
let expr = Expr::bitor(
x.clone(),
Expr::UnOp {
op: UnOp::BitNot,
operand: Box::new(x),
},
);
assert_eq!(reduce_expr(&expr), Some(Expr::u32(u32::MAX)));
}
#[test]
fn bitxor_complement_is_all_ones() {
let x = Expr::var("x");
let expr = Expr::bitxor(
x.clone(),
Expr::UnOp {
op: UnOp::BitNot,
operand: Box::new(x),
},
);
assert_eq!(reduce_expr(&expr), Some(Expr::u32(u32::MAX)));
}
#[test]
fn rotate_left_zero_is_identity() {
let x = Expr::var("x");
let expr = Expr::BinOp {
op: BinOp::RotateLeft,
left: Box::new(x.clone()),
right: Box::new(Expr::u32(0)),
};
assert_eq!(reduce_expr(&expr), Some(x));
}
#[test]
fn rotate_right_zero_is_identity() {
let x = Expr::var("x");
let expr = Expr::BinOp {
op: BinOp::RotateRight,
left: Box::new(x.clone()),
right: Box::new(Expr::u32(0)),
};
assert_eq!(reduce_expr(&expr), Some(x));
}
#[test]
fn rotate_left_32_is_identity() {
let x = Expr::var("x");
let expr = Expr::BinOp {
op: BinOp::RotateLeft,
left: Box::new(x.clone()),
right: Box::new(Expr::u32(32)),
};
assert_eq!(reduce_expr(&expr), Some(x));
}
#[test]
fn absdiff_self_is_zero() {
let x = Expr::var("x");
let expr = Expr::BinOp {
op: BinOp::AbsDiff,
left: Box::new(x.clone()),
right: Box::new(x),
};
assert_eq!(reduce_expr(&expr), Some(Expr::u32(0)));
}
#[test]
fn min_zero_unsigned_is_zero() {
let x = Expr::var("x");
let expr = Expr::BinOp {
op: BinOp::Min,
left: Box::new(x),
right: Box::new(Expr::u32(0)),
};
assert_eq!(reduce_expr(&expr), Some(Expr::u32(0)));
}
#[test]
fn max_zero_unsigned_is_x() {
let x = Expr::var("x");
let expr = Expr::BinOp {
op: BinOp::Max,
left: Box::new(x.clone()),
right: Box::new(Expr::u32(0)),
};
assert_eq!(reduce_expr(&expr), Some(x));
}
#[test]
fn min_max_unsigned_is_x() {
let x = Expr::var("x");
let expr = Expr::BinOp {
op: BinOp::Min,
left: Box::new(x.clone()),
right: Box::new(Expr::u32(u32::MAX)),
};
assert_eq!(reduce_expr(&expr), Some(x));
}
#[test]
fn max_max_unsigned_is_max() {
let x = Expr::var("x");
let expr = Expr::BinOp {
op: BinOp::Max,
left: Box::new(x),
right: Box::new(Expr::u32(u32::MAX)),
};
assert_eq!(reduce_expr(&expr), Some(Expr::u32(u32::MAX)));
}
#[test]
fn lt_zero_unsigned_is_false() {
let x = Expr::var("x");
let expr = Expr::BinOp {
op: BinOp::Lt,
left: Box::new(x),
right: Box::new(Expr::u32(0)),
};
assert_eq!(reduce_expr(&expr), Some(Expr::bool(false)));
}
#[test]
fn ge_zero_unsigned_is_true() {
let x = Expr::var("x");
let expr = Expr::BinOp {
op: BinOp::Ge,
left: Box::new(x),
right: Box::new(Expr::u32(0)),
};
assert_eq!(reduce_expr(&expr), Some(Expr::bool(true)));
}
#[test]
fn zero_gt_x_unsigned_is_false() {
let x = Expr::var("x");
let expr = Expr::BinOp {
op: BinOp::Gt,
left: Box::new(Expr::u32(0)),
right: Box::new(x),
};
assert_eq!(reduce_expr(&expr), Some(Expr::bool(false)));
}
#[test]
fn zero_le_x_unsigned_is_true() {
let x = Expr::var("x");
let expr = Expr::BinOp {
op: BinOp::Le,
left: Box::new(Expr::u32(0)),
right: Box::new(x),
};
assert_eq!(reduce_expr(&expr), Some(Expr::bool(true)));
}