diff options
Diffstat (limited to 'serde_v8/tests/magic.rs')
-rw-r--r-- | serde_v8/tests/magic.rs | 192 |
1 files changed, 0 insertions, 192 deletions
diff --git a/serde_v8/tests/magic.rs b/serde_v8/tests/magic.rs deleted file mode 100644 index e3ed1d330..000000000 --- a/serde_v8/tests/magic.rs +++ /dev/null @@ -1,192 +0,0 @@ -// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. -use serde::Deserialize; -use serde::Serialize; - -use serde_v8::utils::js_exec; -use serde_v8::utils::v8_do; -use serde_v8::Result; - -#[derive(Deserialize)] -struct MagicOp<'s> { - #[allow(unused)] - pub a: u64, - #[allow(unused)] - pub b: u64, - pub c: serde_v8::Value<'s>, - #[allow(unused)] - pub operator: Option<String>, -} - -#[derive(Serialize)] -struct MagicContainer<'s> { - pub magic: bool, - pub contains: serde_v8::Value<'s>, -} - -#[test] -fn magic_basic() { - v8_do(|| { - let isolate = &mut v8::Isolate::new(v8::CreateParams::default()); - let handle_scope = &mut v8::HandleScope::new(isolate); - let context = v8::Context::new(handle_scope); - let scope = &mut v8::ContextScope::new(handle_scope, context); - - // Decode - let v = js_exec(scope, "({a: 1, b: 3, c: 'abracadabra'})"); - let mop: MagicOp = serde_v8::from_v8(scope, v).unwrap(); - // Check string - let v8_value: v8::Local<v8::Value> = mop.c.into(); - let vs = v8::Local::<v8::String>::try_from(v8_value).unwrap(); - let s = vs.to_rust_string_lossy(scope); - assert_eq!(s, "abracadabra"); - - // Encode - let container = MagicContainer { - magic: true, - contains: v.into(), - }; - let vc = serde_v8::to_v8(scope, container).unwrap(); - // JSON stringify & check - let json = v8::json::stringify(scope, vc).unwrap(); - let s2 = json.to_rust_string_lossy(scope); - assert_eq!( - s2, - r#"{"magic":true,"contains":{"a":1,"b":3,"c":"abracadabra"}}"# - ); - }) -} - -#[test] -fn magic_buffer() { - v8_do(|| { - // Init isolate - let isolate = &mut v8::Isolate::new(v8::CreateParams::default()); - let handle_scope = &mut v8::HandleScope::new(isolate); - let context = v8::Context::new(handle_scope); - let scope = &mut v8::ContextScope::new(handle_scope, context); - let global = context.global(scope); - - // Simple buffer - let v8_array = js_exec(scope, "new Uint8Array([1,2,3,4,5])"); - let zbuf: serde_v8::JsBuffer = serde_v8::from_v8(scope, v8_array).unwrap(); - assert_eq!(&*zbuf, &[1, 2, 3, 4, 5]); - - // Multi buffers - let v8_arrays = - js_exec(scope, "[new Uint8Array([1,2]), new Uint8Array([3,4,5])]"); - let (z1, z2): (serde_v8::JsBuffer, serde_v8::JsBuffer) = - serde_v8::from_v8(scope, v8_arrays).unwrap(); - assert_eq!(&*z1, &[1, 2]); - assert_eq!(&*z2, &[3, 4, 5]); - - // Wrapped in option, like our current op-ABI - let v8_array = js_exec(scope, "new Uint8Array([1,2,3,4,5])"); - let zbuf: Option<serde_v8::JsBuffer> = - serde_v8::from_v8(scope, v8_array).unwrap(); - assert_eq!(&*zbuf.unwrap(), &[1, 2, 3, 4, 5]); - - // Observe mutation in JS - let v8_array = js_exec(scope, "new Uint8Array([1,2,3,4,5])"); - let mut zbuf: serde_v8::JsBuffer = - serde_v8::from_v8(scope, v8_array).unwrap(); - let key = serde_v8::to_v8(scope, "t1").unwrap(); - global.set(scope, key, v8_array); - (&mut *zbuf)[2] = 42; - let eq = js_exec(scope, "t1[2] === 42"); - assert!(eq.is_true()); - - // Shared buffers - let v8_array = - js_exec(scope, "new Uint8Array(new SharedArrayBuffer([1,2,3,4,5]))"); - let zbuf: Result<serde_v8::JsBuffer> = serde_v8::from_v8(scope, v8_array); - assert!(zbuf.is_err()); - - // Serialization - let buf: Vec<u8> = vec![1, 2, 3, 99, 5]; - let zbuf: serde_v8::ToJsBuffer = buf.into(); - let v8_value = serde_v8::to_v8(scope, zbuf).unwrap(); - let key = serde_v8::to_v8(scope, "t2").unwrap(); - global.set(scope, key, v8_value); - let eq = js_exec(scope, "t2[3] === 99"); - assert!(eq.is_true()); - - // Composite Serialization - #[derive(serde::Serialize)] - struct Wrapper { - a: serde_v8::ToJsBuffer, - b: serde_v8::ToJsBuffer, - } - let buf1: Vec<u8> = vec![1, 2, 33, 4, 5]; - let buf2: Vec<u8> = vec![5, 4, 3, 2, 11]; - let wrapped = Wrapper { - a: buf1.into(), - b: buf2.into(), - }; - let v8_value = serde_v8::to_v8(scope, wrapped).unwrap(); - let key = serde_v8::to_v8(scope, "t3").unwrap(); - global.set(scope, key, v8_value); - let eq = js_exec(scope, "t3.a[2] === 33"); - assert!(eq.is_true()); - let eq = js_exec(scope, "t3.b[4] === 11"); - assert!(eq.is_true()); - - // JsBuffer as bytes::Bytes - let v8_array = js_exec(scope, "new Uint8Array([1,2,3,4,5])"); - let zbuf: serde_v8::JsBuffer = serde_v8::from_v8(scope, v8_array).unwrap(); - let buf: bytes::Bytes = zbuf.into(); - assert_eq!(buf, bytes::Bytes::from_static(&[1, 2, 3, 4, 5])); - assert_eq!(buf, bytes::Bytes::from_static(&[1, 2, 3, 4, 5])); - assert_eq!(buf.slice(0..2), bytes::Bytes::from_static(&[1, 2])); - assert_eq!(buf.slice(2..), bytes::Bytes::from_static(&[3, 4, 5])); - // We're specifically testing that slices are preserved post-clone - #[allow(clippy::redundant_clone)] - let buf2 = buf.slice(2..).clone(); - assert_eq!(buf2, bytes::Bytes::from_static(&[3, 4, 5])); - }) -} - -#[test] -fn magic_byte_string() { - v8_do(|| { - // Init isolate - let isolate = &mut v8::Isolate::new(v8::CreateParams::default()); - let handle_scope = &mut v8::HandleScope::new(isolate); - let context = v8::Context::new(handle_scope); - let scope = &mut v8::ContextScope::new(handle_scope, context); - let global = context.global(scope); - - // JS string to ByteString - let v8_string = js_exec(scope, "'test \\0\\t\\n\\r\\x7F\\x80áþÆñ'"); - let rust_reflex: serde_v8::ByteString = - serde_v8::from_v8(scope, v8_string).unwrap(); - assert_eq!( - rust_reflex.as_slice(), - b"test \0\t\n\r\x7F\x80\xE1\xFE\xC6\xF1" - ); - - // Non-Latin-1 characters - let v8_string = js_exec(scope, "'日本語'"); - let rust_reflex: Result<serde_v8::ByteString> = - serde_v8::from_v8(scope, v8_string); - assert!(rust_reflex.is_err()); - - // Windows-1252 characters that aren't Latin-1 - let v8_string = js_exec(scope, "'œ'"); - let rust_reflex: Result<serde_v8::ByteString> = - serde_v8::from_v8(scope, v8_string); - assert!(rust_reflex.is_err()); - - // ByteString to JS string - let expected = "a\x00sf:~\x7Fá\u{009C}þ\u{008A}"; - let buf: Vec<u8> = b"a\x00sf:~\x7F\xE1\x9C\xFE\x8A".as_ref().into(); - let zbuf = serde_v8::ByteString::from(buf); - let v8_value = serde_v8::to_v8(scope, zbuf).unwrap(); - let key = serde_v8::to_v8(scope, "actual").unwrap(); - global.set(scope, key, v8_value); - let v8_value_expected = serde_v8::to_v8(scope, expected).unwrap(); - let key_expected = serde_v8::to_v8(scope, "expected").unwrap(); - global.set(scope, key_expected, v8_value_expected); - let eq = js_exec(scope, "actual === expected"); - assert!(eq.is_true()); - }) -} |