Skip to content

Commit e47baed

Browse files
committed
tests: add BigInt vs Number comparison edge-case tests (large & non-integer cases)
1 parent 7c2c0b4 commit e47baed

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
use javascript::{Value, evaluate_script};
2+
3+
#[test]
4+
fn bigint_vs_number_comparison_edgecases() {
5+
// 1n == 1
6+
let r1 = evaluate_script("1n == 1");
7+
match r1 {
8+
Ok(Value::Boolean(b)) => assert!(b),
9+
Ok(Value::Number(n)) => assert_eq!(n, 1.0),
10+
other => panic!("unexpected result for 1n == 1: {:?}", other),
11+
}
12+
13+
// 1n == 1.5 -> false
14+
let r2 = evaluate_script("1n == 1.5");
15+
match r2 {
16+
Ok(Value::Boolean(b)) => assert!(!b),
17+
Ok(Value::Number(n)) => assert_eq!(n, 0.0),
18+
other => panic!("unexpected result for 1n == 1.5: {:?}", other),
19+
}
20+
21+
// Integer conversion path: for integers that are exactly representable in Number
22+
// (e.g. 2^53-1) comparison with BigInt should succeed
23+
let r3 = evaluate_script("9007199254740991n == 9007199254740991");
24+
match r3 {
25+
Ok(Value::Boolean(b)) => assert!(b),
26+
Ok(Value::Number(n)) => assert_eq!(n, 1.0),
27+
other => panic!("unexpected result for equality of representable integer and BigInt: {:?}", other),
28+
}
29+
30+
// But if a Number literal cannot represent the integer exactly, equality should be false
31+
let r3b = evaluate_script("123456789123456789n == 123456789123456789");
32+
match r3b {
33+
Ok(Value::Boolean(b)) => assert!(!b),
34+
Ok(Value::Number(n)) => assert_eq!(n, 0.0),
35+
other => panic!("unexpected result for equality of imprecise integer and BigInt: {:?}", other),
36+
}
37+
38+
// Non-integer number with BigInt: should compare numerically -> 1n < 1.5 true
39+
let r4 = evaluate_script("1n < 1.5");
40+
match r4 {
41+
Ok(Value::Boolean(b)) => assert!(b),
42+
Ok(Value::Number(n)) => assert_eq!(n, 1.0),
43+
other => panic!("unexpected result for 1n < 1.5: {:?}", other),
44+
}
45+
46+
// Very large BigInt vs a large Number (1e20): expect BigInt which is larger to compare greater
47+
let r5 = evaluate_script("123456789123456789123456789n > 1e20");
48+
match r5 {
49+
Ok(Value::Boolean(b)) => assert!(b),
50+
Ok(Value::Number(n)) => assert_eq!(n, 1.0),
51+
other => panic!("unexpected result for huge BigInt vs 1e20: {:?}", other),
52+
}
53+
54+
// Conversely, a huge negative BigInt < a negative floating number
55+
// Note: parser currently doesn't treat unary - on BigInt as a bigint literal, use 0n - Xn
56+
let r6 = evaluate_script("(0n - 123456789123456789123456789n) < -1e20");
57+
match r6 {
58+
Ok(Value::Boolean(b)) => assert!(b),
59+
Ok(Value::Number(n)) => assert_eq!(n, 1.0),
60+
other => panic!("unexpected result for negative huge BigInt vs -1e20: {:?}", other),
61+
}
62+
}

0 commit comments

Comments
 (0)