@@ -11,9 +11,13 @@ fn __init_test_logger() {
1111#[ cfg( test) ]
1212mod symbol_additional_tests {
1313 use super :: * ;
14+ use std:: sync:: { Mutex , OnceLock } ;
15+
16+ static TEST_MUTEX : OnceLock < Mutex < ( ) > > = OnceLock :: new ( ) ;
1417
1518 #[ test]
1619 fn test_symbol_typeof ( ) {
20+ let _guard = TEST_MUTEX . get_or_init ( || Mutex :: new ( ( ) ) ) . lock ( ) . unwrap ( ) ;
1721 let script = r#"
1822 typeof Symbol('x')
1923 "# ;
@@ -24,8 +28,38 @@ mod symbol_additional_tests {
2428 }
2529 }
2630
31+ #[ test]
32+ fn debug_descriptor_array ( ) {
33+ let _guard = TEST_MUTEX . get_or_init ( || Mutex :: new ( ( ) ) ) . lock ( ) . unwrap ( ) ;
34+ let script = r#"
35+ let s = Symbol('k');
36+ let o = { a: 1 };
37+ o[s] = 2;
38+ let d = Object.getOwnPropertyDescriptors(o);
39+ [d.a.value === 1, d[s].value === 2, d.a.writable === true]
40+ "# ;
41+ let result = evaluate_script ( script) ;
42+ match result {
43+ Ok ( Value :: Object ( arr) ) => {
44+ let a = arr. borrow ( ) . get ( & "0" . into ( ) ) . unwrap ( ) ;
45+ let b = arr. borrow ( ) . get ( & "1" . into ( ) ) . unwrap ( ) ;
46+ let c = arr. borrow ( ) . get ( & "2" . into ( ) ) . unwrap ( ) ;
47+ match ( & * a. borrow ( ) , & * b. borrow ( ) , & * c. borrow ( ) ) {
48+ ( Value :: Number ( na) , Value :: Number ( nb) , Value :: Number ( nc) ) => {
49+ assert_eq ! ( * na, 1.0 ) ;
50+ assert_eq ! ( * nb, 1.0 ) ;
51+ assert_eq ! ( * nc, 1.0 ) ;
52+ }
53+ _ => panic ! ( "Expected numeric truthy results for descriptors" ) ,
54+ }
55+ }
56+ _ => panic ! ( "Expected array result from descriptors test, got {:?}" , result) ,
57+ }
58+ }
59+
2760 #[ test]
2861 fn test_symbol_to_string_and_description ( ) {
62+ let _guard = TEST_MUTEX . get_or_init ( || Mutex :: new ( ( ) ) ) . lock ( ) . unwrap ( ) ;
2963 let script = r#"
3064 let a = Symbol('my-desc');
3165 let b = Symbol();
@@ -49,6 +83,7 @@ mod symbol_additional_tests {
4983
5084 #[ test]
5185 fn test_symbol_uniqueness ( ) {
86+ let _guard = TEST_MUTEX . get_or_init ( || Mutex :: new ( ( ) ) ) . lock ( ) . unwrap ( ) ;
5287 let script = r#"
5388 Symbol() !== Symbol()
5489 "# ;
@@ -61,6 +96,7 @@ mod symbol_additional_tests {
6196
6297 #[ test]
6398 fn test_json_stringify_ignores_symbol_keys ( ) {
99+ let _guard = TEST_MUTEX . get_or_init ( || Mutex :: new ( ( ) ) ) . lock ( ) . unwrap ( ) ;
64100 let script = r#"
65101 let s = Symbol('k');
66102 let o = {};
@@ -77,14 +113,15 @@ mod symbol_additional_tests {
77113 #[ test]
78114 fn test_object_keys_values_ignore_symbol_keys ( ) {
79115 // Object.keys and Object.values should not include symbol-keyed properties
116+ let _guard = TEST_MUTEX . get_or_init ( || Mutex :: new ( ( ) ) ) . lock ( ) . unwrap ( ) ;
80117 let script = r#"
81118 let s = Symbol('k');
82119 let o = { a: 1 };
83120 o[s] = 2;
84121 [Object.keys(o).length, Object.values(o).length]
85122 "# ;
86123 let result = evaluate_script ( script) ;
87- match result {
124+ match & result {
88125 Ok ( Value :: Object ( arr) ) => {
89126 // Expect [1, 1]
90127 let k = arr. borrow ( ) . get ( & "0" . into ( ) ) . unwrap ( ) ;
@@ -103,6 +140,7 @@ mod symbol_additional_tests {
103140
104141 #[ test]
105142 fn test_object_assign_ignores_symbol_keys ( ) {
143+ let _guard = TEST_MUTEX . get_or_init ( || Mutex :: new ( ( ) ) ) . lock ( ) . unwrap ( ) ;
106144 let script = r#"
107145 let s = Symbol('k');
108146 let src = { a: 1 };
@@ -127,6 +165,7 @@ mod symbol_additional_tests {
127165 'error'
128166 }
129167 "# ;
168+ let _guard = TEST_MUTEX . get_or_init ( || Mutex :: new ( ( ) ) ) . lock ( ) . unwrap ( ) ;
130169 let result = evaluate_script ( script) ;
131170 match result {
132171 Ok ( Value :: String ( s) ) => assert_eq ! ( String :: from_utf16_lossy( & s) , "error" ) ,
@@ -140,6 +179,7 @@ mod symbol_additional_tests {
140179 let s = Symbol('k');
141180 s.valueOf() === s
142181 "# ;
182+ let _guard = TEST_MUTEX . get_or_init ( || Mutex :: new ( ( ) ) ) . lock ( ) . unwrap ( ) ;
143183 let result = evaluate_script ( script) ;
144184 match result {
145185 Ok ( Value :: Number ( n) ) => assert_eq ! ( n, 1.0 ) ,
@@ -161,6 +201,7 @@ mod symbol_additional_tests {
161201 [init, after, fromProto]
162202 "# ;
163203
204+ let _guard = TEST_MUTEX . get_or_init ( || Mutex :: new ( ( ) ) ) . lock ( ) . unwrap ( ) ;
164205 let result = evaluate_script ( script) ;
165206 match result {
166207 Ok ( Value :: Object ( arr) ) => {
@@ -194,6 +235,7 @@ mod symbol_additional_tests {
194235 [ownLen, protoLen, same]
195236 "# ;
196237
238+ let _guard = TEST_MUTEX . get_or_init ( || Mutex :: new ( ( ) ) ) . lock ( ) . unwrap ( ) ;
197239 let result = evaluate_script ( script) ;
198240 match result {
199241 Ok ( Value :: Object ( arr) ) => {
@@ -223,6 +265,7 @@ mod symbol_additional_tests {
223265 [arr.length, arr[0] === s]
224266 "# ;
225267
268+ let _guard = TEST_MUTEX . get_or_init ( || Mutex :: new ( ( ) ) ) . lock ( ) . unwrap ( ) ;
226269 let result = evaluate_script ( script) ;
227270 match result {
228271 Ok ( Value :: Object ( arr) ) => {
@@ -239,4 +282,59 @@ mod symbol_additional_tests {
239282 _ => panic ! ( "Expected array from getOwnPropertySymbols on object test" ) ,
240283 }
241284 }
285+
286+ #[ test]
287+ fn test_get_own_property_descriptors ( ) {
288+ // Part 1: string and symbol keys
289+ let script = r#"
290+ let s = Symbol('k');
291+ let o = { a: 1 };
292+ o[s] = 2;
293+ let d = Object.getOwnPropertyDescriptors(o);
294+ [d.a.value === 1, d[s].value === 2, d.a.writable === true]
295+ "# ;
296+
297+ let result = evaluate_script ( script) ;
298+ match result {
299+ Ok ( Value :: Object ( arr) ) => {
300+ let a = arr. borrow ( ) . get ( & "0" . into ( ) ) . unwrap ( ) ;
301+ let b = arr. borrow ( ) . get ( & "1" . into ( ) ) . unwrap ( ) ;
302+ let c = arr. borrow ( ) . get ( & "2" . into ( ) ) . unwrap ( ) ;
303+ match ( & * a. borrow ( ) , & * b. borrow ( ) , & * c. borrow ( ) ) {
304+ ( Value :: Number ( na) , Value :: Number ( nb) , Value :: Number ( nc) ) => {
305+ assert_eq ! ( * na, 1.0 ) ;
306+ assert_eq ! ( * nb, 1.0 ) ;
307+ assert_eq ! ( * nc, 1.0 ) ;
308+ }
309+ _ => panic ! ( "Expected numeric truthy results for descriptors" ) ,
310+ }
311+ }
312+ _ => panic ! ( "Expected array result from descriptors test, got {:?}" , result) ,
313+ }
314+
315+ // Part 2: accessor descriptors (getters/setters)
316+ let script2 = r#"
317+ let o = { get x() { return 9; }, set x(v) { this._x = v } };
318+ let d = Object.getOwnPropertyDescriptors(o);
319+ [typeof d.x.get, typeof d.x.set]
320+ "# ;
321+
322+ let result2 = evaluate_script ( script2) ;
323+ match result2 {
324+ Ok ( Value :: Object ( arr) ) => {
325+ let a = arr. borrow ( ) . get ( & "0" . into ( ) ) . unwrap ( ) ;
326+ let b = arr. borrow ( ) . get ( & "1" . into ( ) ) . unwrap ( ) ;
327+ match ( & * a. borrow ( ) , & * b. borrow ( ) ) {
328+ ( Value :: String ( sa) , Value :: String ( sb) ) => {
329+ assert_eq ! ( String :: from_utf16_lossy( sa) , "function" ) ;
330+ assert_eq ! ( String :: from_utf16_lossy( sb) , "function" ) ;
331+ }
332+ _ => panic ! ( "Expected string results for accessor descriptor types" ) ,
333+ }
334+ }
335+ _ => panic ! ( "Expected array result from accessor descriptors test" ) ,
336+ }
337+ }
338+
339+ // debug test removed
242340}
0 commit comments