bindings for isFinite(), Number.isFinite() and Number.isSafeInteger() (#420)

* bindings for isFinite()

* bindings for Number.isFiniter(), refactoring of Number.isInteger()

* bindings for Number.isSafeInteger()
This commit is contained in:
Alexander Kryvomaz 2018-07-08 18:03:10 +03:00 committed by Alex Crichton
parent 6561fba947
commit 6758525980
3 changed files with 121 additions and 3 deletions

View File

@ -80,6 +80,13 @@ extern "C" {
/// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval
#[wasm_bindgen(catch)]
pub fn eval(js_source_text: &str) -> Result<JsValue, JsValue>;
/// The global isFinite() function determines whether the passed value is a finite number.
/// If needed, the parameter is first converted to a number.
///
/// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isFinite
#[wasm_bindgen(js_name = isFinite)]
pub fn is_finite(value: &JsValue) -> bool;
}
// UInt8Array
@ -746,11 +753,24 @@ extern "C" {
extern "C" {
pub type Number;
/// The Number.isFinite() method determines whether the passed value is a finite number.
///
/// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite
#[wasm_bindgen(static_method_of = Number, js_name = isFinite)]
pub fn is_finite(value: &JsValue) -> bool;
/// The Number.isInteger() method determines whether the passed value is an integer.
///
/// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger
#[wasm_bindgen(static_method_of = Number, js_name = isInteger)]
pub fn is_integer(object: &Object) -> bool;
pub fn is_integer(value: &JsValue) -> bool;
/// The Number.isSafeInteger() method determines whether the provided value is a number
/// that is a safe integer.
///
/// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isSafeInteger
#[wasm_bindgen(static_method_of = Number, js_name = isSafeInteger)]
pub fn is_safe_integer(value: &JsValue) -> bool;
/// The `Number` JavaScript object is a wrapper object allowing
/// you to work with numerical values. A `Number` object is

View File

@ -2,6 +2,36 @@
use super::project;
#[test]
fn is_finite() {
project()
.file("src/lib.rs", r#"
#![feature(proc_macro, wasm_custom_section)]
extern crate wasm_bindgen;
use wasm_bindgen::prelude::*;
use wasm_bindgen::js;
#[wasm_bindgen]
pub fn is_finite(value: &JsValue) -> bool {
js::Number::is_finite(value)
}
"#)
.file("test.js", r#"
import * as assert from "assert";
import * as wasm from "./out";
export function test() {
assert.equal(wasm.is_finite(42), true);
assert.equal(wasm.is_finite(42.1), true);
assert.equal(wasm.is_finite('42'), false);
assert.equal(wasm.is_finite(NaN), false);
assert.equal(wasm.is_finite(Infinity), false);
}
"#)
.test()
}
#[test]
fn is_integer() {
project()
@ -13,8 +43,8 @@ fn is_integer() {
use wasm_bindgen::js;
#[wasm_bindgen]
pub fn is_integer(obj: &js::Object) -> bool {
js::Number::is_integer(&obj)
pub fn is_integer(value: &JsValue) -> bool {
js::Number::is_integer(value)
}
"#)
.file("test.js", r#"
@ -29,6 +59,38 @@ fn is_integer() {
.test()
}
#[test]
fn is_safe_integer() {
project()
.file("src/lib.rs", r#"
#![feature(proc_macro, wasm_custom_section)]
extern crate wasm_bindgen;
use wasm_bindgen::prelude::*;
use wasm_bindgen::js;
#[wasm_bindgen]
pub fn is_safe_integer(value: &JsValue) -> bool {
js::Number::is_safe_integer(value)
}
"#)
.file("test.js", r#"
import * as assert from "assert";
import * as wasm from "./out";
export function test() {
assert.equal(wasm.is_safe_integer(42), true);
assert.equal(wasm.is_safe_integer(Math.pow(2, 53) - 1), true);
assert.equal(wasm.is_safe_integer(Math.pow(2, 53)), false);
assert.equal(wasm.is_safe_integer('42'), false);
assert.equal(wasm.is_safe_integer(42.1), false);
assert.equal(wasm.is_safe_integer(NaN), false);
assert.equal(wasm.is_safe_integer(Infinity), false);
}
"#)
.test()
}
#[test]
fn new() {
project()

View File

@ -150,3 +150,39 @@ fn eval() {
)
.test();
}
#[test]
fn is_finite() {
project()
.file(
"src/lib.rs",
r#"
#![feature(proc_macro, wasm_custom_section)]
extern crate wasm_bindgen;
use wasm_bindgen::prelude::*;
use wasm_bindgen::js;
#[wasm_bindgen]
pub fn is_finite(value: &JsValue) -> bool {
js::is_finite(value)
}
"#,
)
.file(
"test.js",
r#"
import * as assert from "assert";
import * as wasm from "./out";
export function test() {
assert.equal(wasm.is_finite(42), true);
assert.equal(wasm.is_finite(42.1), true);
assert.equal(wasm.is_finite('42'), true);
assert.equal(wasm.is_finite(NaN), false);
assert.equal(wasm.is_finite(Infinity), false);
}
"#,
)
.test();
}