|
|
|
#![allow(clippy::float_cmp)]
|
|
|
|
|
|
|
|
use crate::{exec::Interpreter, forward, forward_val, realm::Realm};
|
|
|
|
use std::f64;
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn abs() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.abs(3 - 5);
|
|
|
|
var b = Math.abs(1.23456 - 7.89012);
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward_val(&mut engine, "a").unwrap();
|
|
|
|
let b = forward_val(&mut engine, "b").unwrap();
|
|
|
|
|
|
|
|
assert_eq!(a.to_number(&mut engine).unwrap(), 2.0);
|
|
|
|
assert_eq!(b.to_number(&mut engine).unwrap(), 6.655_559_999_999_999_5);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn acos() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.acos(8 / 10);
|
|
|
|
var b = Math.acos(5 / 3);
|
|
|
|
var c = Math.acos(1);
|
|
|
|
var d = Math.acos(2);
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward_val(&mut engine, "a").unwrap();
|
|
|
|
let b = forward(&mut engine, "b");
|
|
|
|
let c = forward_val(&mut engine, "c").unwrap();
|
|
|
|
let d = forward(&mut engine, "d");
|
|
|
|
|
|
|
|
assert_eq!(a.to_number(&mut engine).unwrap(), 0.643_501_108_793_284_3);
|
|
|
|
assert_eq!(b, "NaN");
|
|
|
|
assert_eq!(c.to_number(&mut engine).unwrap(), 0_f64);
|
|
|
|
assert_eq!(d, "NaN");
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn acosh() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.acosh(2);
|
|
|
|
var b = Math.acosh(-1);
|
|
|
|
var c = Math.acosh(0.5);
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward_val(&mut engine, "a").unwrap();
|
|
|
|
let b = forward(&mut engine, "b");
|
|
|
|
let c = forward(&mut engine, "c");
|
|
|
|
|
|
|
|
assert_eq!(a.to_number(&mut engine).unwrap(), 1.316_957_896_924_816_6);
|
|
|
|
assert_eq!(b, "NaN");
|
|
|
|
assert_eq!(c, "NaN");
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn asin() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.asin(6 / 10);
|
|
|
|
var b = Math.asin(5 / 3);
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward_val(&mut engine, "a").unwrap();
|
|
|
|
let b = forward(&mut engine, "b");
|
|
|
|
|
|
|
|
assert_eq!(a.to_number(&mut engine).unwrap(), 0.643_501_108_793_284_4);
|
|
|
|
assert_eq!(b, String::from("NaN"));
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn asinh() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.asinh(1);
|
|
|
|
var b = Math.asinh(0);
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward_val(&mut engine, "a").unwrap();
|
|
|
|
let b = forward_val(&mut engine, "b").unwrap();
|
|
|
|
|
|
|
|
assert_eq!(a.to_number(&mut engine).unwrap(), 0.881_373_587_019_542_9);
|
|
|
|
assert_eq!(b.to_number(&mut engine).unwrap(), 0_f64);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn atan() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.atan(1);
|
|
|
|
var b = Math.atan(0);
|
|
|
|
var c = Math.atan(-0);
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward_val(&mut engine, "a").unwrap();
|
|
|
|
let b = forward_val(&mut engine, "b").unwrap();
|
|
|
|
let c = forward_val(&mut engine, "c").unwrap();
|
|
|
|
|
|
|
|
assert_eq!(a.to_number(&mut engine).unwrap(), f64::consts::FRAC_PI_4);
|
|
|
|
assert_eq!(b.to_number(&mut engine).unwrap(), 0_f64);
|
|
|
|
assert_eq!(c.to_number(&mut engine).unwrap(), f64::from(-0));
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn atan2() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.atan2(90, 15);
|
|
|
|
var b = Math.atan2(15, 90);
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward_val(&mut engine, "a").unwrap();
|
|
|
|
let b = forward_val(&mut engine, "b").unwrap();
|
|
|
|
|
|
|
|
assert_eq!(a.to_number(&mut engine).unwrap(), 1.405_647_649_380_269_9);
|
|
|
|
assert_eq!(b.to_number(&mut engine).unwrap(), 0.165_148_677_414_626_83);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn cbrt() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.cbrt(64);
|
|
|
|
var b = Math.cbrt(-1);
|
|
|
|
var c = Math.cbrt(1);
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward_val(&mut engine, "a").unwrap();
|
|
|
|
let b = forward_val(&mut engine, "b").unwrap();
|
|
|
|
let c = forward_val(&mut engine, "c").unwrap();
|
|
|
|
|
|
|
|
assert_eq!(a.to_number(&mut engine).unwrap(), 4_f64);
|
|
|
|
assert_eq!(b.to_number(&mut engine).unwrap(), -1_f64);
|
|
|
|
assert_eq!(c.to_number(&mut engine).unwrap(), 1_f64);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn ceil() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.ceil(1.95);
|
|
|
|
var b = Math.ceil(4);
|
|
|
|
var c = Math.ceil(-7.004);
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward_val(&mut engine, "a").unwrap();
|
|
|
|
let b = forward_val(&mut engine, "b").unwrap();
|
|
|
|
let c = forward_val(&mut engine, "c").unwrap();
|
|
|
|
|
|
|
|
assert_eq!(a.to_number(&mut engine).unwrap(), 2_f64);
|
|
|
|
assert_eq!(b.to_number(&mut engine).unwrap(), 4_f64);
|
|
|
|
assert_eq!(c.to_number(&mut engine).unwrap(), -7_f64);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
#[allow(clippy::many_single_char_names)]
|
|
|
|
fn clz32() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.clz32();
|
|
|
|
var b = Math.clz32({});
|
|
|
|
var c = Math.clz32(-173);
|
|
|
|
var d = Math.clz32("1");
|
|
|
|
var e = Math.clz32(2147483647);
|
|
|
|
var f = Math.clz32(Infinity);
|
|
|
|
var g = Math.clz32(true);
|
|
|
|
var h = Math.clz32(0);
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward_val(&mut engine, "a").unwrap();
|
|
|
|
let b = forward_val(&mut engine, "b").unwrap();
|
|
|
|
let c = forward_val(&mut engine, "c").unwrap();
|
|
|
|
let d = forward_val(&mut engine, "d").unwrap();
|
|
|
|
let e = forward_val(&mut engine, "e").unwrap();
|
|
|
|
let f = forward_val(&mut engine, "f").unwrap();
|
|
|
|
let g = forward_val(&mut engine, "g").unwrap();
|
|
|
|
let h = forward_val(&mut engine, "h").unwrap();
|
|
|
|
|
|
|
|
assert_eq!(a.to_number(&mut engine).unwrap(), 32_f64);
|
|
|
|
assert_eq!(b.to_number(&mut engine).unwrap(), 32_f64);
|
|
|
|
assert_eq!(c.to_number(&mut engine).unwrap(), 0_f64);
|
|
|
|
assert_eq!(d.to_number(&mut engine).unwrap(), 31_f64);
|
|
|
|
assert_eq!(e.to_number(&mut engine).unwrap(), 1_f64);
|
|
|
|
assert_eq!(f.to_number(&mut engine).unwrap(), 32_f64);
|
|
|
|
assert_eq!(g.to_number(&mut engine).unwrap(), 31_f64);
|
|
|
|
assert_eq!(h.to_number(&mut engine).unwrap(), 32_f64);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn cos() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.cos(0);
|
|
|
|
var b = Math.cos(1);
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward_val(&mut engine, "a").unwrap();
|
|
|
|
let b = forward_val(&mut engine, "b").unwrap();
|
|
|
|
|
|
|
|
assert_eq!(a.to_number(&mut engine).unwrap(), 1_f64);
|
|
|
|
assert_eq!(b.to_number(&mut engine).unwrap(), 0.540_302_305_868_139_8);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn cosh() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.cosh(0);
|
|
|
|
var b = Math.cosh(1);
|
|
|
|
var c = Math.cosh(-1);
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward_val(&mut engine, "a").unwrap();
|
|
|
|
let b = forward_val(&mut engine, "b").unwrap();
|
|
|
|
let c = forward_val(&mut engine, "c").unwrap();
|
|
|
|
|
|
|
|
assert_eq!(a.to_number(&mut engine).unwrap(), 1_f64);
|
|
|
|
assert_eq!(b.to_number(&mut engine).unwrap(), 1.543_080_634_815_243_7);
|
|
|
|
assert_eq!(c.to_number(&mut engine).unwrap(), 1.543_080_634_815_243_7);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn exp() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.exp(0);
|
|
|
|
var b = Math.exp(-1);
|
|
|
|
var c = Math.exp(2);
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward_val(&mut engine, "a").unwrap();
|
|
|
|
let b = forward_val(&mut engine, "b").unwrap();
|
|
|
|
let c = forward_val(&mut engine, "c").unwrap();
|
|
|
|
|
|
|
|
assert_eq!(a.to_number(&mut engine).unwrap(), 1_f64);
|
|
|
|
assert_eq!(b.to_number(&mut engine).unwrap(), 0.367_879_441_171_442_33);
|
|
|
|
assert_eq!(c.to_number(&mut engine).unwrap(), 7.389_056_098_930_65);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
#[allow(clippy::many_single_char_names)]
|
|
|
|
fn expm1() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.expm1();
|
|
|
|
var b = Math.expm1({});
|
|
|
|
var c = Math.expm1(1);
|
|
|
|
var d = Math.expm1(-1);
|
|
|
|
var e = Math.expm1(0);
|
|
|
|
var f = Math.expm1(2);
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward(&mut engine, "a");
|
|
|
|
let b = forward(&mut engine, "b");
|
|
|
|
let c = forward_val(&mut engine, "c").unwrap();
|
|
|
|
let d = forward_val(&mut engine, "d").unwrap();
|
|
|
|
let e = forward_val(&mut engine, "e").unwrap();
|
|
|
|
let f = forward_val(&mut engine, "f").unwrap();
|
|
|
|
|
|
|
|
assert_eq!(a, String::from("NaN"));
|
|
|
|
assert_eq!(b, String::from("NaN"));
|
|
|
|
assert!(float_cmp::approx_eq!(
|
|
|
|
f64,
|
|
|
|
c.to_number(&mut engine).unwrap(),
|
|
|
|
1.718_281_828_459_045
|
|
|
|
));
|
|
|
|
assert!(float_cmp::approx_eq!(
|
|
|
|
f64,
|
|
|
|
d.to_number(&mut engine).unwrap(),
|
|
|
|
-0.632_120_558_828_557_7
|
|
|
|
));
|
|
|
|
assert!(float_cmp::approx_eq!(
|
|
|
|
f64,
|
|
|
|
e.to_number(&mut engine).unwrap(),
|
|
|
|
0_f64
|
|
|
|
));
|
|
|
|
assert!(float_cmp::approx_eq!(
|
|
|
|
f64,
|
|
|
|
f.to_number(&mut engine).unwrap(),
|
|
|
|
6.389_056_098_930_65
|
|
|
|
));
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn floor() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.floor(1.95);
|
|
|
|
var b = Math.floor(-3.01);
|
|
|
|
var c = Math.floor(3.01);
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward_val(&mut engine, "a").unwrap();
|
|
|
|
let b = forward_val(&mut engine, "b").unwrap();
|
|
|
|
let c = forward_val(&mut engine, "c").unwrap();
|
|
|
|
|
|
|
|
assert_eq!(a.to_number(&mut engine).unwrap(), 1_f64);
|
|
|
|
assert_eq!(b.to_number(&mut engine).unwrap(), -4_f64);
|
|
|
|
assert_eq!(c.to_number(&mut engine).unwrap(), 3_f64);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
#[allow(clippy::many_single_char_names)]
|
|
|
|
fn fround() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.fround(NaN);
|
|
|
|
var b = Math.fround(Infinity);
|
|
|
|
var c = Math.fround(5);
|
|
|
|
var d = Math.fround(5.5);
|
|
|
|
var e = Math.fround(5.05);
|
|
|
|
var f = Math.fround(-5.05);
|
|
|
|
var g = Math.fround();
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward(&mut engine, "a");
|
|
|
|
let b = forward(&mut engine, "b");
|
|
|
|
let c = forward_val(&mut engine, "c").unwrap();
|
|
|
|
let d = forward_val(&mut engine, "d").unwrap();
|
|
|
|
let e = forward_val(&mut engine, "e").unwrap();
|
|
|
|
let f = forward_val(&mut engine, "f").unwrap();
|
|
|
|
let g = forward(&mut engine, "g");
|
|
|
|
|
|
|
|
assert_eq!(a, String::from("NaN"));
|
|
|
|
assert_eq!(b, String::from("Infinity"));
|
|
|
|
assert_eq!(c.to_number(&mut engine).unwrap(), 5f64);
|
|
|
|
assert_eq!(d.to_number(&mut engine).unwrap(), 5.5f64);
|
|
|
|
assert_eq!(e.to_number(&mut engine).unwrap(), 5.050_000_190_734_863);
|
|
|
|
assert_eq!(f.to_number(&mut engine).unwrap(), -5.050_000_190_734_863);
|
|
|
|
assert_eq!(g, String::from("NaN"));
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
#[allow(clippy::many_single_char_names)]
|
|
|
|
fn hypot() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.hypot();
|
|
|
|
var b = Math.hypot(3, 4);
|
|
|
|
var c = Math.hypot(5, 12);
|
|
|
|
var d = Math.hypot(3, 4, -5);
|
|
|
|
var e = Math.hypot(4, [5], 6);
|
|
|
|
var f = Math.hypot(3, -Infinity);
|
|
|
|
var g = Math.hypot(12);
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward_val(&mut engine, "a").unwrap();
|
|
|
|
let b = forward_val(&mut engine, "b").unwrap();
|
|
|
|
let c = forward_val(&mut engine, "c").unwrap();
|
|
|
|
let d = forward_val(&mut engine, "d").unwrap();
|
|
|
|
let e = forward_val(&mut engine, "e").unwrap();
|
|
|
|
let f = forward_val(&mut engine, "f").unwrap();
|
|
|
|
let g = forward_val(&mut engine, "g").unwrap();
|
|
|
|
|
|
|
|
assert_eq!(a.to_number(&mut engine).unwrap(), 0f64);
|
|
|
|
assert_eq!(b.to_number(&mut engine).unwrap(), 5f64);
|
|
|
|
assert_eq!(c.to_number(&mut engine).unwrap(), 13f64);
|
|
|
|
assert_eq!(d.to_number(&mut engine).unwrap(), 7.071_067_811_865_475_5);
|
|
|
|
assert_eq!(e.to_number(&mut engine).unwrap(), 8.774964387392123);
|
|
|
|
assert!(f.to_number(&mut engine).unwrap().is_infinite());
|
|
|
|
assert_eq!(g.to_number(&mut engine).unwrap(), 12f64);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
#[allow(clippy::many_single_char_names)]
|
|
|
|
fn imul() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.imul(3, 4);
|
|
|
|
var b = Math.imul(-5, 12);
|
|
|
|
var c = Math.imul(0xffffffff, 5);
|
|
|
|
var d = Math.imul(0xfffffffe, 5);
|
|
|
|
var e = Math.imul(12);
|
|
|
|
var f = Math.imul();
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward_val(&mut engine, "a").unwrap();
|
|
|
|
let b = forward_val(&mut engine, "b").unwrap();
|
|
|
|
let c = forward_val(&mut engine, "c").unwrap();
|
|
|
|
let d = forward_val(&mut engine, "d").unwrap();
|
|
|
|
let e = forward_val(&mut engine, "e").unwrap();
|
|
|
|
let f = forward_val(&mut engine, "f").unwrap();
|
|
|
|
|
|
|
|
assert_eq!(a.to_number(&mut engine).unwrap(), 12f64);
|
|
|
|
assert_eq!(b.to_number(&mut engine).unwrap(), -60f64);
|
|
|
|
assert_eq!(c.to_number(&mut engine).unwrap(), -5f64);
|
|
|
|
assert_eq!(d.to_number(&mut engine).unwrap(), -10f64);
|
|
|
|
assert_eq!(e.to_number(&mut engine).unwrap(), 0f64);
|
|
|
|
assert_eq!(f.to_number(&mut engine).unwrap(), 0f64);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn log() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.log(1);
|
|
|
|
var b = Math.log(10);
|
|
|
|
var c = Math.log(-1);
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward_val(&mut engine, "a").unwrap();
|
|
|
|
let b = forward_val(&mut engine, "b").unwrap();
|
|
|
|
let c = forward(&mut engine, "c");
|
|
|
|
|
|
|
|
assert_eq!(a.to_number(&mut engine).unwrap(), 0_f64);
|
|
|
|
assert_eq!(b.to_number(&mut engine).unwrap(), f64::consts::LN_10);
|
|
|
|
assert_eq!(c, String::from("NaN"));
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
#[allow(clippy::many_single_char_names)]
|
|
|
|
fn log1p() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.log1p(1);
|
|
|
|
var b = Math.log1p(0);
|
|
|
|
var c = Math.log1p(-0.9999999999999999);
|
|
|
|
var d = Math.log1p(-1);
|
|
|
|
var e = Math.log1p(-1.000000000000001);
|
|
|
|
var f = Math.log1p(-2);
|
|
|
|
var g = Math.log1p();
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward_val(&mut engine, "a").unwrap();
|
|
|
|
let b = forward_val(&mut engine, "b").unwrap();
|
|
|
|
let c = forward_val(&mut engine, "c").unwrap();
|
|
|
|
let d = forward(&mut engine, "d");
|
|
|
|
let e = forward(&mut engine, "e");
|
|
|
|
let f = forward(&mut engine, "f");
|
|
|
|
let g = forward(&mut engine, "g");
|
|
|
|
|
|
|
|
assert_eq!(a.to_number(&mut engine).unwrap(), f64::consts::LN_2);
|
|
|
|
assert_eq!(b.to_number(&mut engine).unwrap(), 0f64);
|
|
|
|
assert_eq!(c.to_number(&mut engine).unwrap(), -36.736_800_569_677_1);
|
|
|
|
assert_eq!(d, "-Infinity");
|
|
|
|
assert_eq!(e, String::from("NaN"));
|
|
|
|
assert_eq!(f, String::from("NaN"));
|
|
|
|
assert_eq!(g, String::from("NaN"));
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn log10() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.log10(2);
|
|
|
|
var b = Math.log10(1);
|
|
|
|
var c = Math.log10(-2);
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward_val(&mut engine, "a").unwrap();
|
|
|
|
let b = forward_val(&mut engine, "b").unwrap();
|
|
|
|
let c = forward(&mut engine, "c");
|
|
|
|
|
|
|
|
assert_eq!(a.to_number(&mut engine).unwrap(), f64::consts::LOG10_2);
|
|
|
|
assert_eq!(b.to_number(&mut engine).unwrap(), 0_f64);
|
|
|
|
assert_eq!(c, String::from("NaN"));
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn log2() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.log2(3);
|
|
|
|
var b = Math.log2(1);
|
|
|
|
var c = Math.log2(-2);
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward_val(&mut engine, "a").unwrap();
|
|
|
|
let b = forward_val(&mut engine, "b").unwrap();
|
|
|
|
let c = forward(&mut engine, "c");
|
|
|
|
|
|
|
|
assert_eq!(a.to_number(&mut engine).unwrap(), 1.584_962_500_721_156);
|
|
|
|
assert_eq!(b.to_number(&mut engine).unwrap(), 0_f64);
|
|
|
|
assert_eq!(c, String::from("NaN"));
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn max() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.max(10, 20);
|
|
|
|
var b = Math.max(-10, -20);
|
|
|
|
var c = Math.max(-10, 20);
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward_val(&mut engine, "a").unwrap();
|
|
|
|
let b = forward_val(&mut engine, "b").unwrap();
|
|
|
|
let c = forward_val(&mut engine, "c").unwrap();
|
|
|
|
|
|
|
|
assert_eq!(a.to_number(&mut engine).unwrap(), 20_f64);
|
|
|
|
assert_eq!(b.to_number(&mut engine).unwrap(), -10_f64);
|
|
|
|
assert_eq!(c.to_number(&mut engine).unwrap(), 20_f64);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn min() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.min(10, 20);
|
|
|
|
var b = Math.min(-10, -20);
|
|
|
|
var c = Math.min(-10, 20);
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward_val(&mut engine, "a").unwrap();
|
|
|
|
let b = forward_val(&mut engine, "b").unwrap();
|
|
|
|
let c = forward_val(&mut engine, "c").unwrap();
|
|
|
|
|
|
|
|
assert_eq!(a.to_number(&mut engine).unwrap(), 10_f64);
|
|
|
|
assert_eq!(b.to_number(&mut engine).unwrap(), -20_f64);
|
|
|
|
assert_eq!(c.to_number(&mut engine).unwrap(), -10_f64);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn pow() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.pow(2, 10);
|
|
|
|
var b = Math.pow(-7, 2);
|
|
|
|
var c = Math.pow(4, 0.5);
|
|
|
|
var d = Math.pow(7, -2);
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward_val(&mut engine, "a").unwrap();
|
|
|
|
let b = forward_val(&mut engine, "b").unwrap();
|
|
|
|
let c = forward_val(&mut engine, "c").unwrap();
|
|
|
|
let d = forward_val(&mut engine, "d").unwrap();
|
|
|
|
|
|
|
|
assert_eq!(a.to_number(&mut engine).unwrap(), 1_024_f64);
|
|
|
|
assert_eq!(b.to_number(&mut engine).unwrap(), 49_f64);
|
|
|
|
assert_eq!(c.to_number(&mut engine).unwrap(), 2.0);
|
|
|
|
assert_eq!(d.to_number(&mut engine).unwrap(), 0.020_408_163_265_306_12);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn round() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.round(20.5);
|
|
|
|
var b = Math.round(-20.3);
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward_val(&mut engine, "a").unwrap();
|
|
|
|
let b = forward_val(&mut engine, "b").unwrap();
|
|
|
|
|
|
|
|
assert_eq!(a.to_number(&mut engine).unwrap(), 21.0);
|
|
|
|
assert_eq!(b.to_number(&mut engine).unwrap(), -20.0);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn sign() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.sign(3);
|
|
|
|
var b = Math.sign(-3);
|
|
|
|
var c = Math.sign(0);
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward_val(&mut engine, "a").unwrap();
|
|
|
|
let b = forward_val(&mut engine, "b").unwrap();
|
|
|
|
let c = forward_val(&mut engine, "c").unwrap();
|
|
|
|
|
|
|
|
assert_eq!(a.to_number(&mut engine).unwrap(), 1_f64);
|
|
|
|
assert_eq!(b.to_number(&mut engine).unwrap(), -1_f64);
|
|
|
|
assert_eq!(c.to_number(&mut engine).unwrap(), 0_f64);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn sin() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.sin(0);
|
|
|
|
var b = Math.sin(1);
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward_val(&mut engine, "a").unwrap();
|
|
|
|
let b = forward_val(&mut engine, "b").unwrap();
|
|
|
|
|
|
|
|
assert_eq!(a.to_number(&mut engine).unwrap(), 0_f64);
|
|
|
|
assert_eq!(b.to_number(&mut engine).unwrap(), 0.841_470_984_807_896_5);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn sinh() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.sinh(0);
|
|
|
|
var b = Math.sinh(1);
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward_val(&mut engine, "a").unwrap();
|
|
|
|
let b = forward_val(&mut engine, "b").unwrap();
|
|
|
|
|
|
|
|
assert_eq!(a.to_number(&mut engine).unwrap(), 0_f64);
|
|
|
|
assert_eq!(b.to_number(&mut engine).unwrap(), 1.175_201_193_643_801_4);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn sqrt() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.sqrt(0);
|
|
|
|
var b = Math.sqrt(2);
|
|
|
|
var c = Math.sqrt(9);
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward_val(&mut engine, "a").unwrap();
|
|
|
|
let b = forward_val(&mut engine, "b").unwrap();
|
|
|
|
let c = forward_val(&mut engine, "c").unwrap();
|
|
|
|
|
|
|
|
assert_eq!(a.to_number(&mut engine).unwrap(), 0_f64);
|
|
|
|
assert_eq!(b.to_number(&mut engine).unwrap(), f64::consts::SQRT_2);
|
|
|
|
assert_eq!(c.to_number(&mut engine).unwrap(), 3_f64);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn tan() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.tan(1.1);
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward_val(&mut engine, "a").unwrap();
|
|
|
|
|
|
|
|
assert!(float_cmp::approx_eq!(
|
|
|
|
f64,
|
|
|
|
a.to_number(&mut engine).unwrap(),
|
|
|
|
1.964_759_657_248_652_5
|
|
|
|
));
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn tanh() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.tanh(1);
|
|
|
|
var b = Math.tanh(0);
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward_val(&mut engine, "a").unwrap();
|
|
|
|
let b = forward_val(&mut engine, "b").unwrap();
|
|
|
|
|
|
|
|
assert_eq!(a.to_number(&mut engine).unwrap(), 0.761_594_155_955_764_9);
|
|
|
|
assert_eq!(b.to_number(&mut engine).unwrap(), 0_f64);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn trunc() {
|
|
|
|
let realm = Realm::create();
|
|
|
|
let mut engine = Interpreter::new(realm);
|
|
|
|
let init = r#"
|
|
|
|
var a = Math.trunc(13.37);
|
|
|
|
var b = Math.trunc(0.123);
|
|
|
|
"#;
|
|
|
|
|
|
|
|
eprintln!("{}", forward(&mut engine, init));
|
|
|
|
|
|
|
|
let a = forward_val(&mut engine, "a").unwrap();
|
|
|
|
let b = forward_val(&mut engine, "b").unwrap();
|
|
|
|
|
|
|
|
assert_eq!(a.to_number(&mut engine).unwrap(), 13_f64);
|
|
|
|
assert_eq!(b.to_number(&mut engine).unwrap(), 0_f64);
|
|
|
|
}
|