use selen::prelude::*;
#[test]
fn test_implies_true_implies_true() {
let mut m = Model::default();
let a = m.bool();
let b = m.bool();
m.implies(a, b); m.new(a.eq(bool(true)));
let solution = m.solve().unwrap();
assert_eq!(solution.get_bool(a).unwrap(), true);
assert_eq!(solution.get_bool(b).unwrap(), true);
}
#[test]
fn test_implies_false_allows_anything() {
let mut m = Model::default();
let a = m.bool();
let b = m.bool();
m.implies(a, b); m.new(a.eq(bool(false)));
let solution = m.solve().unwrap();
assert_eq!(solution.get_bool(a).unwrap(), false);
let _ = solution.get_bool(b).unwrap();
}
#[test]
fn test_implies_violation() {
let mut m = Model::default();
let a = m.bool();
let b = m.bool();
m.implies(a, b); m.new(a.eq(bool(true))); m.new(b.eq(bool(false)));
assert!(m.solve().is_err());
}
#[test]
fn test_implies_chain() {
let mut m = Model::default();
let a = m.bool();
let b = m.bool();
let c = m.bool();
m.implies(a, b); m.implies(b, c); m.new(a.eq(bool(true)));
let solution = m.solve().unwrap();
assert_eq!(solution.get_bool(a).unwrap(), true);
assert_eq!(solution.get_bool(b).unwrap(), true);
assert_eq!(solution.get_bool(c).unwrap(), true);
}
#[test]
fn test_implies_multiple() {
let mut m = Model::default();
let a = m.bool();
let b = m.bool();
let c = m.bool();
m.implies(a, b); m.implies(a, c); m.new(a.eq(bool(true)));
let solution = m.solve().unwrap();
assert_eq!(solution.get_bool(a).unwrap(), true);
assert_eq!(solution.get_bool(b).unwrap(), true);
assert_eq!(solution.get_bool(c).unwrap(), true);
}
#[test]
fn test_implies_biconditional() {
let mut m = Model::default();
let a = m.bool();
let b = m.bool();
m.implies(a, b);
m.implies(b, a);
m.new(a.eq(bool(true)));
let solution = m.solve().unwrap();
assert_eq!(solution.get_bool(a).unwrap(), true);
assert_eq!(solution.get_bool(b).unwrap(), true);
}
#[test]
fn test_implies_with_int_conditions() {
let mut m = Model::default();
let x = m.int(1, 10);
let y = m.int(1, 10);
let a = m.bool();
let b = m.bool();
let five = m.int(5, 5);
m.gt_reif(x, five, a);
m.gt_reif(y, five, b);
m.implies(a, b);
m.new(x.eq(int(7)));
let solution = m.solve().unwrap();
assert_eq!(solution.get_int(x), 7);
assert_eq!(solution.get_bool(a).unwrap(), true);
assert_eq!(solution.get_bool(b).unwrap(), true);
assert!(solution.get_int(y) > 5);
}