123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- use js_sys::*;
- use wasm_bindgen::prelude::*;
- use wasm_bindgen::JsCast;
- use wasm_bindgen_test::*;
- #[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_eq!(x.as_f64().unwrap(), 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 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]
- 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()).unwrap();
- 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"));
- }
- #[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_with_args("key, value", "return key === 'hello' ? undefined : value");
- 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_with_args("key, value", "return key === 'hello' ? undefined : value");
- 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"));
- }
|