From 6255cf4642f97478fbf05f7b2cff1a1934364983 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Sun, 21 May 2023 21:14:48 +0200 Subject: [PATCH] chore: add tests for N-API symbol (#19205) --- test_napi/src/lib.rs | 2 ++ test_napi/src/symbol.rs | 39 ++++++++++++++++++++++++++++++++ test_napi/symbol_test.js | 49 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+) create mode 100644 test_napi/src/symbol.rs create mode 100644 test_napi/symbol_test.js diff --git a/test_napi/src/lib.rs b/test_napi/src/lib.rs index 8c467d307c..8fa7d9ef69 100644 --- a/test_napi/src/lib.rs +++ b/test_napi/src/lib.rs @@ -23,6 +23,7 @@ pub mod primitives; pub mod promise; pub mod properties; pub mod strings; +pub mod symbol; pub mod tsfn; pub mod typedarray; @@ -160,6 +161,7 @@ unsafe extern "C" fn napi_register_module_v1( tsfn::init(env, exports); mem::init(env, exports); bigint::init(env, exports); + symbol::init(env, exports); init_cleanup_hook(env, exports); diff --git a/test_napi/src/symbol.rs b/test_napi/src/symbol.rs new file mode 100644 index 0000000000..5f404d5904 --- /dev/null +++ b/test_napi/src/symbol.rs @@ -0,0 +1,39 @@ +// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. + +use crate::assert_napi_ok; +use crate::napi_get_callback_info; +use crate::napi_new_property; +use napi_sys::ValueType::napi_string; +use napi_sys::*; + +extern "C" fn symbol_new( + env: napi_env, + info: napi_callback_info, +) -> napi_value { + let (args, argc, _) = napi_get_callback_info!(env, info, 1); + + let mut description: napi_value = std::ptr::null_mut(); + + if argc >= 1 { + let mut ty = -1; + assert_napi_ok!(napi_typeof(env, args[0], &mut ty)); + assert_eq!(ty, napi_string); + description = args[0]; + } + + let mut symbol: napi_value = std::ptr::null_mut(); + assert_napi_ok!(napi_create_symbol(env, description, &mut symbol)); + + symbol +} + +pub fn init(env: napi_env, exports: napi_value) { + let properties = &[napi_new_property!(env, "symbolNew", symbol_new)]; + + assert_napi_ok!(napi_define_properties( + env, + exports, + properties.len(), + properties.as_ptr() + )); +} diff --git a/test_napi/symbol_test.js b/test_napi/symbol_test.js new file mode 100644 index 0000000000..00c3edda22 --- /dev/null +++ b/test_napi/symbol_test.js @@ -0,0 +1,49 @@ +// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. + +import { assert, assertEquals, loadTestLibrary } from "./common.js"; + +const testSymbol = loadTestLibrary(); + +Deno.test("napi symbol1", () => { + const sym = testSymbol.symbolNew("test"); + assertEquals(sym.toString(), "Symbol(test)"); + + const myObj = {}; + const fooSym = testSymbol.symbolNew("foo"); + const otherSym = testSymbol.symbolNew("bar"); + myObj.foo = "bar"; + myObj[fooSym] = "baz"; + myObj[otherSym] = "bing"; + assertEquals(myObj.foo, "bar"); + assertEquals(myObj[fooSym], "baz"); + assertEquals(myObj[otherSym], "bing"); +}); + +Deno.test("napi symbol2", () => { + const sym = testSymbol.symbolNew("test"); + assertEquals(sym.toString(), "Symbol(test)"); + + const myObj = {}; + const fooSym = testSymbol.symbolNew("foo"); + myObj.foo = "bar"; + myObj[fooSym] = "baz"; + + assertEquals(Object.keys(myObj), ["foo"]); + assertEquals(Object.getOwnPropertyNames(myObj), ["foo"]); + assertEquals(Object.getOwnPropertySymbols(myObj), [fooSym]); +}); + +Deno.test("napi symbol3", () => { + assert(testSymbol.symbolNew() !== testSymbol.symbolNew()); + assert(testSymbol.symbolNew("foo") !== testSymbol.symbolNew("foo")); + assert(testSymbol.symbolNew("foo") !== testSymbol.symbolNew("bar")); + + const foo1 = testSymbol.symbolNew("foo"); + const foo2 = testSymbol.symbolNew("foo"); + const object = { + [foo1]: 1, + [foo2]: 2, + }; + assertEquals(object[foo1], 1); + assertEquals(object[foo2], 2); +});