js-sys: JSON::stringify_with_replacer[_and_space]

This commit adds two new externs for `JSON.stringify`:
`JSON::stringify_with_replacer` and
`JSON::stringify_with_replacer_and_space`.

Fixes #1186
This commit is contained in:
Liam Curry
2019-01-16 18:03:03 -05:00
parent 0d3f9eb02b
commit 6226e6959f
2 changed files with 161 additions and 7 deletions

View File

@ -59,9 +59,13 @@ fn stringify() {
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\"]");
let str1: String = JSON::stringify(&JsValue::from(arr)).unwrap().into();
assert_eq!(str1, "[1,true,\"hello\"]");
let obj = Object::new();
Reflect::set(obj.as_ref(), &JsValue::from("foo"), &JsValue::from("bar")).unwrap();
let str2: String = JSON::stringify(&JsValue::from(obj)).unwrap().into();
assert_eq!(str2, "{\"foo\":\"bar\"}");
}
#[wasm_bindgen_test]
@ -79,6 +83,122 @@ fn stringify_error() {
assert!(err_msg.contains("rust really rocks"));
}
#[wasm_bindgen_test]
fn stringify_with_replacer() {
let obj = Object::new();
Reflect::set(obj.as_ref(), &JsValue::from("foo"), &JsValue::from("bar")).unwrap();
Reflect::set(
obj.as_ref(),
&JsValue::from("hello"),
&JsValue::from("world"),
)
.unwrap();
let replacer_array = Array::new();
replacer_array.push(&JsValue::from("hello"));
let output1: String =
JSON::stringify_with_replacer(&JsValue::from(obj.clone()), &JsValue::from(replacer_array))
.unwrap()
.into();
assert_eq!(output1, "{\"hello\":\"world\"}");
let replacer_func =
Function::new_no_args("return arguments[0] === 'hello' ? undefined : arguments[1]");
let output2: String =
JSON::stringify_with_replacer(&JsValue::from(obj), &JsValue::from(replacer_func))
.unwrap()
.into();
assert_eq!(output2, "{\"foo\":\"bar\"}");
}
#[wasm_bindgen_test]
fn stringify_with_replacer_error() {
let arr = Array::new();
arr.push(&JsValue::from(1));
arr.push(&JsValue::from(true));
arr.push(&JsValue::from("hello"));
let replacer = Function::new_no_args("throw new Error(\"rust really rocks\")");
let result = JSON::stringify_with_replacer(&JsValue::from(arr), &JsValue::from(replacer));
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"));
}
#[wasm_bindgen_test]
fn stringify_with_replacer_and_space() {
let arr = Array::new();
arr.push(&JsValue::from(1));
arr.push(&JsValue::from(true));
arr.push(&JsValue::from("hello"));
let output1: String = JSON::stringify_with_replacer_and_space(
&JsValue::from(arr),
&JsValue::NULL,
&JsValue::from(4),
)
.unwrap()
.into();
assert_eq!(output1, "[\n 1,\n true,\n \"hello\"\n]");
let obj = Object::new();
Reflect::set(obj.as_ref(), &JsValue::from("foo"), &JsValue::from("bar")).unwrap();
Reflect::set(
obj.as_ref(),
&JsValue::from("hello"),
&JsValue::from("world"),
)
.unwrap();
let replacer_array = Array::new();
replacer_array.push(&JsValue::from("hello"));
let output2: String = JSON::stringify_with_replacer_and_space(
&JsValue::from(obj.clone()),
&JsValue::from(replacer_array),
&JsValue::from(4),
)
.unwrap()
.into();
assert_eq!(output2, "{\n \"hello\": \"world\"\n}");
let replacer_func =
Function::new_no_args("return arguments[0] === 'hello' ? undefined : arguments[1]");
let output3: String = JSON::stringify_with_replacer_and_space(
&JsValue::from(obj),
&JsValue::from(replacer_func),
&JsValue::from(4),
)
.unwrap()
.into();
assert_eq!(output3, "{\n \"foo\": \"bar\"\n}");
}
#[wasm_bindgen_test]
fn stringify_with_replacer_and_space_error() {
let arr = Array::new();
arr.push(&JsValue::from(1));
arr.push(&JsValue::from(true));
arr.push(&JsValue::from("hello"));
let replacer = Function::new_no_args("throw new Error(\"rust really rocks\")");
let result = JSON::stringify_with_replacer_and_space(
&JsValue::from(arr),
&JsValue::from(replacer),
&JsValue::from(4),
);
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"));
}
#[wasm_bindgen_test]
fn json_extends() {
#[wasm_bindgen]