use selen::prelude::*;
#[test]
fn test_validation_invalid_int_domain_reversed_bounds() {
let mut m = Model::default();
let _x = m.int(10, 5);
let result = m.solve();
assert!(result.is_err());
if let Err(e) = result {
let err_str = e.to_string();
assert!(err_str.contains("Invalid domain") || err_str.contains("invalid bounds"));
}
}
#[test]
fn test_validation_invalid_float_domain_reversed_bounds() {
let mut m = Model::default();
let _x = m.float(10.0, 5.0);
let result = m.solve();
assert!(result.is_err());
if let Err(e) = result {
let err_str = e.to_string();
assert!(err_str.contains("Invalid domain") || err_str.contains("invalid bounds"));
}
}
#[test]
fn test_validation_valid_int_domain() {
let mut m = Model::default();
let x = m.int(1, 10);
m.new(x.eq(5));
let result = m.solve();
assert!(result.is_ok());
}
#[test]
fn test_validation_valid_float_domain() {
let mut m = Model::default();
let x = m.float(1.0, 10.0);
m.new(x.eq(5.5));
let result = m.solve();
assert!(result.is_ok());
}
#[test]
fn test_validation_empty_domain_after_constraints() {
let mut m = Model::default();
let x = m.int(1, 5);
m.new(x.lt(2)); m.new(x.gt(4));
let result = m.solve();
assert!(result.is_err());
}
#[test]
fn test_validation_alldiff_with_insufficient_domain() {
let mut m = Model::default();
let x = m.int(1, 2); let y = m.int(1, 2);
let z = m.int(1, 2);
m.alldiff(&[x, y, z]);
let result = m.solve();
assert!(result.is_err(), "Expected unsatisfiable due to insufficient domain size");
}
#[test]
fn test_validation_alldiff_with_sufficient_domain() {
let mut m = Model::default();
let x = m.int(1, 3);
let y = m.int(1, 3);
let z = m.int(1, 3);
m.alldiff(&[x, y, z]);
let result = m.solve();
assert!(result.is_ok());
if let Ok(solution) = result {
let vals = vec![solution.get_int(x), solution.get_int(y), solution.get_int(z)];
assert_ne!(vals[0], vals[1]);
assert_ne!(vals[0], vals[2]);
assert_ne!(vals[1], vals[2]);
}
}
#[test]
fn test_validation_single_variable_alldiff() {
let mut m = Model::default();
let x = m.int(1, 10);
m.alldiff(&[x]);
m.new(x.eq(5));
let result = m.solve();
assert!(result.is_ok());
}
#[test]
fn test_validation_empty_alldiff() {
let mut m = Model::default();
m.alldiff(&[]);
let result = m.solve();
assert!(result.is_ok());
}
#[test]
fn test_validation_alldiff_with_fixed_duplicate_values() {
let mut m = Model::default();
let x = m.int(5, 5); let y = m.int(5, 5);
m.alldiff(&[x, y]);
let result = m.solve();
assert!(result.is_err());
}
#[test]
fn test_validation_multiple_equality_constraints_compatible() {
let mut m = Model::default();
let x = m.int(1, 10);
let y = m.int(1, 10);
m.new(x.eq(5));
m.new(y.eq(5));
let result = m.solve();
assert!(result.is_ok());
}
#[test]
fn test_validation_constraint_with_nonexistent_variable() {
let mut m = Model::default();
let x = m.int(1, 10);
m.new(x.eq(5));
let result = m.solve();
assert!(result.is_ok());
}
#[test]
fn test_validation_zero_width_int_domain() {
let mut m = Model::default();
let x = m.int(5, 5);
m.new(x.eq(5));
let result = m.solve();
assert!(result.is_ok());
}
#[test]
fn test_validation_zero_width_float_domain() {
let mut m = Model::default();
let x = m.float(5.0, 5.0);
m.new(x.eq(5.0));
let result = m.solve();
assert!(result.is_ok());
}
#[test]
fn test_validation_very_large_int_domain() {
let mut m = Model::default();
let x = m.int(1, 10000);
m.new(x.eq(5000));
let result = m.solve();
assert!(result.is_ok());
}
#[test]
fn test_validation_negative_int_domain() {
let mut m = Model::default();
let x = m.int(-100, -1);
m.new(x.eq(-50));
let result = m.solve();
assert!(result.is_ok());
}
#[test]
fn test_validation_negative_float_domain() {
let mut m = Model::default();
let x = m.float(-10.0, -1.0);
m.new(x.eq(-5.5));
let result = m.solve();
assert!(result.is_ok());
}
#[test]
fn test_validation_mixed_positive_negative_domain() {
let mut m = Model::default();
let x = m.int(-50, 50);
m.new(x.eq(0));
let result = m.solve();
assert!(result.is_ok());
}
#[test]
fn test_validation_alldiff_with_overlapping_domains() {
let mut m = Model::default();
let x = m.int(1, 5);
let y = m.int(3, 7);
let z = m.int(5, 9);
m.alldiff(&[x, y, z]);
let result = m.solve();
assert!(result.is_ok());
}
#[test]
fn test_validation_alldiff_with_disjoint_domains() {
let mut m = Model::default();
let x = m.int(1, 3);
let y = m.int(4, 6);
let z = m.int(7, 9);
m.alldiff(&[x, y, z]);
let result = m.solve();
assert!(result.is_ok());
}
#[test]
fn test_validation_bool_variables() {
let mut m = Model::default();
let b1 = m.bool();
let b2 = m.bool();
m.new(b1.eq(1));
m.new(b2.eq(0));
let result = m.solve();
assert!(result.is_ok());
}
#[test]
fn test_validation_bool_alldiff() {
let mut m = Model::default();
let b1 = m.bool();
let b2 = m.bool();
m.alldiff(&[b1, b2]);
let result = m.solve();
assert!(result.is_ok());
if let Ok(solution) = result {
let v1 = solution.get_int(b1);
let v2 = solution.get_int(b2);
assert_ne!(v1, v2);
assert!(v1 == 0 || v1 == 1);
assert!(v2 == 0 || v2 == 1);
}
}
#[test]
fn test_validation_bool_alldiff_three_variables_unsatisfiable() {
let mut m = Model::default();
let b1 = m.bool();
let b2 = m.bool();
let b3 = m.bool();
m.alldiff(&[b1, b2, b3]);
let result = m.solve();
assert!(result.is_err());
}
#[test]
fn test_validation_complex_model_valid() {
let mut m = Model::default();
let x = m.int(1, 10);
let y = m.int(1, 10);
let z = m.int(1, 10);
m.new(x.add(y).eq(z));
m.new(x.lt(y));
m.new(z.le(15));
let result = m.solve();
assert!(result.is_ok());
}
#[test]
fn test_validation_float_with_constraints() {
let mut m = Model::default();
let x = m.float(0.0, 10.0);
let y = m.float(0.0, 10.0);
m.new(x.add(y).eq(15.0));
m.new(x.le(8.0));
let result = m.solve();
assert!(result.is_ok());
}