Merge pull request #683 from eminence/json

Add initial support and tests for JSON
This commit is contained in:
Nick Fitzgerald 2018-08-10 13:27:40 -07:00 committed by GitHub
commit 2a3d01c380
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 110 additions and 0 deletions

View File

@ -2683,6 +2683,31 @@ extern "C" {
pub fn validate(bufferSource: &JsValue) -> Result<bool, JsValue>;
}
// JSON
#[wasm_bindgen]
extern "C" {
#[derive(Clone, Debug)]
pub type JSON;
/// The `JSON.parse()` method parses a JSON string, constructing the
/// JavaScript value or object described by the string.
///
/// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse
#[wasm_bindgen(catch, static_method_of = JSON)]
pub fn parse(text: &str) -> Result<JsValue, JsValue>;
/// The JSON.stringify() method converts a JavaScript value to a JSON string,
/// optionally replacing values if a replacer function is specified or
/// optionally including only the specified properties if a replacer array is
/// specified.
///
/// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify
#[wasm_bindgen(catch, static_method_of = JSON)]
pub fn stringify(obj: &JsValue) -> Result<JsString, JsValue>;
}
// JsString
#[wasm_bindgen]
extern "C" {

View File

@ -0,0 +1,84 @@
use wasm_bindgen::JsValue;
use wasm_bindgen_test::*;
use wasm_bindgen::JsCast;
use js_sys::*;
#[wasm_bindgen_test]
fn parse_array() {
let js_array = JSON::parse("[1, 2, 3]").unwrap();;
assert!(Array::is_array(&js_array));
let array = Array::from(&js_array);
assert_eq!(array.length(), 3);
assert_eq!(array.pop(), 3);
assert_eq!(array.pop(), 2);
assert_eq!(array.pop(), 1);
}
#[wasm_bindgen_test]
fn parse_object() {
let js_object = JSON::parse("{\"x\": 5, \"y\": true, \"z\": [\"foo\", \"bar\"]}").unwrap();
assert!(js_object.is_object());
let obj = Object::from(js_object);
let keys = Object::keys(&obj);
assert_eq!(keys.length(), 3);
assert_eq!(keys.pop().as_string().unwrap(), "z");
assert_eq!(keys.pop().as_string().unwrap(), "y");
assert_eq!(keys.pop().as_string().unwrap(), "x");
let values = Object::values(&obj);
assert_eq!(values.length(), 3);
let z = values.pop();
assert!(Array::is_array(&z));
let z_array = Array::from(&z);
assert_eq!(z_array.length(), 2);
let y = values.pop();
assert_eq!(y.as_bool(), Some(true));
let x = values.pop();
assert!(Number::is_integer(&x));
let x_num = Number::new(&x);
assert_eq!(x_num.value_of(), 5.0);
}
#[wasm_bindgen_test]
fn parse_error() {
let js_object = JSON::parse("invalid json");
assert!(js_object.is_err());
let err = js_object.unwrap_err();
assert!(err.is_instance_of::<Error>());
}
#[wasm_bindgen_test]
fn stringify() {
let arr = Array::new();
arr.push(&JsValue::from(1));
arr.push(&JsValue::from(true));
arr.push(&JsValue::from("hello"));
let str = JSON::stringify(&JsValue::from(arr)).unwrap();
let rust_str: String = From::from(str);
assert_eq!(rust_str, "[1,true,\"hello\"]");
}
#[wasm_bindgen_test]
fn stringify_error() {
let func = Function::new_no_args("throw new Error(\"rust really rocks\")");
let obj = Object::new();
Reflect::set(obj.as_ref(), &JsValue::from("toJSON"), func.as_ref());
let result = JSON::stringify(&JsValue::from(obj));
assert!(result.is_err());
let err_obj = result.unwrap_err();
assert!(err_obj.is_instance_of::<Error>());
let err: &Error = err_obj.dyn_ref().unwrap();
let err_msg: String = From::from(err.message());
assert!(err_msg.contains("rust really rocks"));
}

View File

@ -19,6 +19,7 @@ pub mod Function;
pub mod Generator;
pub mod Intl;
pub mod JsString;
pub mod JSON;
pub mod Map;
pub mod MapIterator;
pub mod Math;