use javascript::{Value, evaluate_script};
#[test]
fn bigint_vs_number_comparison_edgecases() {
let r1 = evaluate_script("1n == 1", None::<&std::path::Path>);
match r1 {
Ok(Value::Boolean(b)) => assert!(b),
Ok(Value::Number(n)) => assert_eq!(n, 1.0),
other => panic!("unexpected result for 1n == 1: {:?}", other),
}
let r2 = evaluate_script("1n == 1.5", None::<&std::path::Path>);
match r2 {
Ok(Value::Boolean(b)) => assert!(!b),
Ok(Value::Number(n)) => assert_eq!(n, 0.0),
other => panic!("unexpected result for 1n == 1.5: {:?}", other),
}
let r3 = evaluate_script("9007199254740991n == 9007199254740991", None::<&std::path::Path>);
match r3 {
Ok(Value::Boolean(b)) => assert!(b),
Ok(Value::Number(n)) => assert_eq!(n, 1.0),
other => panic!("unexpected result for equality of representable integer and BigInt: {:?}", other),
}
let r3b = evaluate_script("123456789123456789n == 123456789123456789", None::<&std::path::Path>);
match r3b {
Ok(Value::Boolean(b)) => assert!(!b),
Ok(Value::Number(n)) => assert_eq!(n, 0.0),
other => panic!("unexpected result for equality of imprecise integer and BigInt: {:?}", other),
}
let r4 = evaluate_script("1n < 1.5", None::<&std::path::Path>);
match r4 {
Ok(Value::Boolean(b)) => assert!(b),
Ok(Value::Number(n)) => assert_eq!(n, 1.0),
other => panic!("unexpected result for 1n < 1.5: {:?}", other),
}
let r5 = evaluate_script("123456789123456789123456789n > 1e20", None::<&std::path::Path>);
match r5 {
Ok(Value::Boolean(b)) => assert!(b),
Ok(Value::Number(n)) => assert_eq!(n, 1.0),
other => panic!("unexpected result for huge BigInt vs 1e20: {:?}", other),
}
let r6 = evaluate_script("(0n - 123456789123456789123456789n) < -1e20", None::<&std::path::Path>);
match r6 {
Ok(Value::Boolean(b)) => assert!(b),
Ok(Value::Number(n)) => assert_eq!(n, 1.0),
other => panic!("unexpected result for negative huge BigInt vs -1e20: {:?}", other),
}
}