14514f5e3Sopenharmony_ci/* 24514f5e3Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 34514f5e3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 44514f5e3Sopenharmony_ci * you may not use this file except in compliance with the License. 54514f5e3Sopenharmony_ci * You may obtain a copy of the License at 64514f5e3Sopenharmony_ci * 74514f5e3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 84514f5e3Sopenharmony_ci * 94514f5e3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 104514f5e3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 114514f5e3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 124514f5e3Sopenharmony_ci * See the License for the specific language governing permissions and 134514f5e3Sopenharmony_ci * limitations under the License. 144514f5e3Sopenharmony_ci */ 154514f5e3Sopenharmony_ci 164514f5e3Sopenharmony_ci/* 174514f5e3Sopenharmony_ci * @tc.name:sendablemap 184514f5e3Sopenharmony_ci * @tc.desc:test sendablemap 194514f5e3Sopenharmony_ci * @tc.type: FUNC 204514f5e3Sopenharmony_ci * @tc.require: issue#I93TZC 214514f5e3Sopenharmony_ci */ 224514f5e3Sopenharmony_ci 234514f5e3Sopenharmony_ci// @ts-nocheck 244514f5e3Sopenharmony_cideclare function print(str: any): string; 254514f5e3Sopenharmony_ci 264514f5e3Sopenharmony_cifunction FillMap(map: SendableMap): void { 274514f5e3Sopenharmony_ci for (let i = 0; i < 5; i++) { 284514f5e3Sopenharmony_ci map.set(i, 'value' + i); 294514f5e3Sopenharmony_ci } 304514f5e3Sopenharmony_ci} 314514f5e3Sopenharmony_cilet sharedMap: SendableMap = new SendableMap<number, string>(); 324514f5e3Sopenharmony_ci 334514f5e3Sopenharmony_ci// Basic tests 344514f5e3Sopenharmony_ciprint("===Basic test begin===") 354514f5e3Sopenharmony_ciFillMap(sharedMap); 364514f5e3Sopenharmony_ciprint("map size is " + sharedMap.size); 374514f5e3Sopenharmony_ciprint(SendableMap[Symbol.species] == SendableMap); 384514f5e3Sopenharmony_ciprint(SendableMap.name == 'SendableMap'); 394514f5e3Sopenharmony_ciprint(SendableMap[Symbol.species] == Map); 404514f5e3Sopenharmony_ci 414514f5e3Sopenharmony_ciconst keyIter = sharedMap.keys(); 424514f5e3Sopenharmony_cilet nextEntry = keyIter.next(); 434514f5e3Sopenharmony_ciprint("keys next:" + nextEntry.value + ", done: " + nextEntry.done); 444514f5e3Sopenharmony_cinextEntry = keyIter.next(); 454514f5e3Sopenharmony_ciprint("keys next:" + nextEntry.value + ", done: " + nextEntry.done); 464514f5e3Sopenharmony_cinextEntry = keyIter.next(); 474514f5e3Sopenharmony_ciprint("keys next:" + nextEntry.value + ", done: " + nextEntry.done); 484514f5e3Sopenharmony_cinextEntry = keyIter.next(); 494514f5e3Sopenharmony_ciprint("keys next:" + nextEntry.value + ", done: " + nextEntry.done); 504514f5e3Sopenharmony_cinextEntry = keyIter.next(); 514514f5e3Sopenharmony_ciprint("keys next:" + nextEntry.value + ", done: " + nextEntry.done); 524514f5e3Sopenharmony_cinextEntry = keyIter.next(); 534514f5e3Sopenharmony_ciprint("keys next:" + nextEntry.value + ", done: " + nextEntry.done); 544514f5e3Sopenharmony_ci 554514f5e3Sopenharmony_ciconst valueIter = sharedMap.values(); 564514f5e3Sopenharmony_cinextEntry = valueIter.next(); 574514f5e3Sopenharmony_ciprint("values next:" + nextEntry.value + ", done: " + nextEntry.done); 584514f5e3Sopenharmony_cinextEntry = valueIter.next(); 594514f5e3Sopenharmony_ciprint("values next:" + nextEntry.value + ", done: " + nextEntry.done); 604514f5e3Sopenharmony_cinextEntry = valueIter.next(); 614514f5e3Sopenharmony_ciprint("values next:" + nextEntry.value + ", done: " + nextEntry.done); 624514f5e3Sopenharmony_cinextEntry = valueIter.next(); 634514f5e3Sopenharmony_ciprint("values next:" + nextEntry.value + ", done: " + nextEntry.done); 644514f5e3Sopenharmony_cinextEntry = valueIter.next(); 654514f5e3Sopenharmony_ciprint("values next:" + nextEntry.value + ", done: " + nextEntry.done); 664514f5e3Sopenharmony_cinextEntry = valueIter.next(); 674514f5e3Sopenharmony_ciprint("values next:" + nextEntry.value + ", done: " + nextEntry.done); 684514f5e3Sopenharmony_ci 694514f5e3Sopenharmony_cisharedMap.forEach((value: string, key: number, map: SendableMap) => { 704514f5e3Sopenharmony_ci print('map key[forEach]:' + 'key:' + key + ', value:' + value); 714514f5e3Sopenharmony_ci}); 724514f5e3Sopenharmony_ci 734514f5e3Sopenharmony_ciprint(sharedMap[Symbol.toStringTag] == 'SendableMap'); 744514f5e3Sopenharmony_cifor (let iter of sharedMap[Symbol.iterator]()) { 754514f5e3Sopenharmony_ci print("map key[Symbol.iterator]:" + iter); 764514f5e3Sopenharmony_ci} 774514f5e3Sopenharmony_cifor (let [key, value] of sharedMap.entries()) { 784514f5e3Sopenharmony_ci print("map entries:[" + key +", " + value + "]"); 794514f5e3Sopenharmony_ci} 804514f5e3Sopenharmony_ciprint(sharedMap[Symbol.iterator] == sharedMap.entries); 814514f5e3Sopenharmony_ciprint(sharedMap[Symbol.iterator] == sharedMap.keys); 824514f5e3Sopenharmony_ciprint(sharedMap[Symbol.iterator] == sharedMap.values); 834514f5e3Sopenharmony_ci 844514f5e3Sopenharmony_ciprint(sharedMap.has(4)); 854514f5e3Sopenharmony_cisharedMap.set(4, "value4"); 864514f5e3Sopenharmony_ciprint(sharedMap.size == 5); 874514f5e3Sopenharmony_ciprint(sharedMap.has(10)); 884514f5e3Sopenharmony_cisharedMap.set(10, "value10"); 894514f5e3Sopenharmony_ciprint(sharedMap.get(10) == "value10"); 904514f5e3Sopenharmony_ciprint(sharedMap.size == 6); 914514f5e3Sopenharmony_ciprint(sharedMap.has(10)); 924514f5e3Sopenharmony_cisharedMap.delete(10); 934514f5e3Sopenharmony_ciprint(sharedMap.has(10)); 944514f5e3Sopenharmony_ciprint(sharedMap.size == 5); 954514f5e3Sopenharmony_cisharedMap.clear(); 964514f5e3Sopenharmony_ciprint(sharedMap.size == 0); 974514f5e3Sopenharmony_ciprint("===Basic test end==="); 984514f5e3Sopenharmony_ci 994514f5e3Sopenharmony_ci// No expected Concurrent modification exception while iterating using iterators 1004514f5e3Sopenharmony_ciprint("===Concurrent modification during iteration Test(iterator) begin===") 1014514f5e3Sopenharmony_cisharedMap.clear(); 1024514f5e3Sopenharmony_ciFillMap(sharedMap); 1034514f5e3Sopenharmony_ciprint("map size is " + sharedMap.size); 1044514f5e3Sopenharmony_ci 1054514f5e3Sopenharmony_ciconst iterator = sharedMap.entries(); 1064514f5e3Sopenharmony_cifor (const [key, _] of iterator) { 1074514f5e3Sopenharmony_ci print("map key[for-of]: " + key); 1084514f5e3Sopenharmony_ci} 1094514f5e3Sopenharmony_citry { 1104514f5e3Sopenharmony_ci const iterator = sharedMap.entries(); 1114514f5e3Sopenharmony_ci for (const [key, _] of iterator) { 1124514f5e3Sopenharmony_ci if (key == 1) { 1134514f5e3Sopenharmony_ci sharedMap.set(key + 5, "value" + key + 5); 1144514f5e3Sopenharmony_ci } 1154514f5e3Sopenharmony_ci } 1164514f5e3Sopenharmony_ci print("Set Scenario[for-of] updated size: " + sharedMap.size); 1174514f5e3Sopenharmony_ci} catch (e) { 1184514f5e3Sopenharmony_ci print("Set Scenario[for-of]: " + e); 1194514f5e3Sopenharmony_ci} 1204514f5e3Sopenharmony_citry { 1214514f5e3Sopenharmony_ci const iterator = sharedMap.entries(); 1224514f5e3Sopenharmony_ci for (const [key, _] of iterator) { 1234514f5e3Sopenharmony_ci if (key % 2 == 0) { 1244514f5e3Sopenharmony_ci sharedMap.delete(key); 1254514f5e3Sopenharmony_ci } 1264514f5e3Sopenharmony_ci } 1274514f5e3Sopenharmony_ci print("Delete Scenario[for-of] updated size: " + sharedMap.size); 1284514f5e3Sopenharmony_ci} catch (e) { 1294514f5e3Sopenharmony_ci print("Delete Scenario[for-of]: " + e); 1304514f5e3Sopenharmony_ci} 1314514f5e3Sopenharmony_citry { 1324514f5e3Sopenharmony_ci const iterator = sharedMap.entries(); 1334514f5e3Sopenharmony_ci for (const [key, _] of iterator) { 1344514f5e3Sopenharmony_ci sharedMap.clear(); 1354514f5e3Sopenharmony_ci } 1364514f5e3Sopenharmony_ci print("Clear Scenario[for-of] updated size: " + sharedMap.size); 1374514f5e3Sopenharmony_ci} catch (e) { 1384514f5e3Sopenharmony_ci print("Clear Scenario[for-of]: " + e); 1394514f5e3Sopenharmony_ci} 1404514f5e3Sopenharmony_ci 1414514f5e3Sopenharmony_cisharedMap.clear(); 1424514f5e3Sopenharmony_ciFillMap(sharedMap); 1434514f5e3Sopenharmony_ciprint("map size is " + sharedMap.size); 1444514f5e3Sopenharmony_citry { 1454514f5e3Sopenharmony_ci const iterator = sharedMap.entries(); 1464514f5e3Sopenharmony_ci sharedMap.set(6, "value6"); 1474514f5e3Sopenharmony_ci iterator.next(); 1484514f5e3Sopenharmony_ci print("Set Scenario[next()] updated size: " + sharedMap.size); 1494514f5e3Sopenharmony_ci} catch (e) { 1504514f5e3Sopenharmony_ci print("Set Scenario[next()]: " + e); 1514514f5e3Sopenharmony_ci} 1524514f5e3Sopenharmony_citry { 1534514f5e3Sopenharmony_ci const iterator = sharedMap.entries(); 1544514f5e3Sopenharmony_ci sharedMap.delete(6); 1554514f5e3Sopenharmony_ci iterator.next(); 1564514f5e3Sopenharmony_ci print("Delete Scenario[next()] updated size: " + sharedMap.size); 1574514f5e3Sopenharmony_ci} catch (e) { 1584514f5e3Sopenharmony_ci print("Delete Scenario[next()]: " + e); 1594514f5e3Sopenharmony_ci} 1604514f5e3Sopenharmony_citry { 1614514f5e3Sopenharmony_ci const iterator = sharedMap.entries(); 1624514f5e3Sopenharmony_ci sharedMap.clear(); 1634514f5e3Sopenharmony_ci iterator.next(); 1644514f5e3Sopenharmony_ci print("Clear Scenario[next()] updated size: " + sharedMap.size); 1654514f5e3Sopenharmony_ci} catch (e) { 1664514f5e3Sopenharmony_ci print("Clear Scenario[next()]: " + e); 1674514f5e3Sopenharmony_ci} 1684514f5e3Sopenharmony_ciprint("===Concurrent modification during iteration Test(iterator) end===") 1694514f5e3Sopenharmony_ci 1704514f5e3Sopenharmony_ci// Expected Concurrent modification exception while iterating using forEach 1714514f5e3Sopenharmony_ciprint("===Concurrent modification during iteration Test(forEach) begin===") 1724514f5e3Sopenharmony_cisharedMap.clear(); 1734514f5e3Sopenharmony_ciFillMap(sharedMap); 1744514f5e3Sopenharmony_ciprint("map size is " + sharedMap.size); 1754514f5e3Sopenharmony_cisharedMap.forEach((_: string, key: number, map: SendableMap) => { 1764514f5e3Sopenharmony_ci print('map key[forEach]: ' + key); 1774514f5e3Sopenharmony_ci}); 1784514f5e3Sopenharmony_citry { 1794514f5e3Sopenharmony_ci sharedMap.forEach((_: string, key: number, map: SendableMap) => { 1804514f5e3Sopenharmony_ci map.set(key + 5, 'value' + key + 5); 1814514f5e3Sopenharmony_ci }); 1824514f5e3Sopenharmony_ci} catch (e) { 1834514f5e3Sopenharmony_ci print("Set Scenario[forEach]: " + e + ", errCode: " + e.code); 1844514f5e3Sopenharmony_ci} 1854514f5e3Sopenharmony_citry { 1864514f5e3Sopenharmony_ci sharedMap.forEach((_: string, key: number, map: SendableMap) => { 1874514f5e3Sopenharmony_ci if (key % 2 == 0) { 1884514f5e3Sopenharmony_ci map.delete(key); 1894514f5e3Sopenharmony_ci } 1904514f5e3Sopenharmony_ci }); 1914514f5e3Sopenharmony_ci} catch (e) { 1924514f5e3Sopenharmony_ci print("Delete Scenario[forEach]: " + e + ", errCode: " + e.code); 1934514f5e3Sopenharmony_ci} 1944514f5e3Sopenharmony_citry { 1954514f5e3Sopenharmony_ci sharedMap.forEach((_: string, key: number, map: SendableMap) => { 1964514f5e3Sopenharmony_ci map.clear(); 1974514f5e3Sopenharmony_ci }); 1984514f5e3Sopenharmony_ci} catch (e) { 1994514f5e3Sopenharmony_ci print("Clear Scenario[forEach]: " + e + ", errCode: " + e.code); 2004514f5e3Sopenharmony_ci} 2014514f5e3Sopenharmony_ciprint("===Concurrent modification during iteration Test(forEach) end==="); 2024514f5e3Sopenharmony_ci 2034514f5e3Sopenharmony_ciprint("===Type check begin==="); 2044514f5e3Sopenharmony_ciclass SObject { 2054514f5e3Sopenharmony_ci constructor() { 2064514f5e3Sopenharmony_ci "use sendable" 2074514f5e3Sopenharmony_ci } 2084514f5e3Sopenharmony_ci}; 2094514f5e3Sopenharmony_ci 2104514f5e3Sopenharmony_citry { 2114514f5e3Sopenharmony_ci let sObj = new SObject(); 2124514f5e3Sopenharmony_ci sharedMap = new SendableMap([ 2134514f5e3Sopenharmony_ci ['str', 1], 2144514f5e3Sopenharmony_ci [sObj, undefined], 2154514f5e3Sopenharmony_ci [true, null], 2164514f5e3Sopenharmony_ci ]); 2174514f5e3Sopenharmony_ci print("sharedMap set[shared] element success"); 2184514f5e3Sopenharmony_ci} catch (e) { 2194514f5e3Sopenharmony_ci print("sharedMap set[unshared]: " + e + ", errCode: " + e.code); 2204514f5e3Sopenharmony_ci} 2214514f5e3Sopenharmony_ci 2224514f5e3Sopenharmony_citry { 2234514f5e3Sopenharmony_ci let obj = {} 2244514f5e3Sopenharmony_ci sharedMap = new SendableMap([ 2254514f5e3Sopenharmony_ci ['str', 1], 2264514f5e3Sopenharmony_ci [obj, 2], 2274514f5e3Sopenharmony_ci ]); 2284514f5e3Sopenharmony_ci} catch (e) { 2294514f5e3Sopenharmony_ci print("sharedMap set[unshared]: " + e + ", errCode: " + e.code); 2304514f5e3Sopenharmony_ci} 2314514f5e3Sopenharmony_ci 2324514f5e3Sopenharmony_citry { 2334514f5e3Sopenharmony_ci let sym = Symbol("testSymbol") 2344514f5e3Sopenharmony_ci sharedMap = new SendableMap([ 2354514f5e3Sopenharmony_ci ['str', 1], 2364514f5e3Sopenharmony_ci [sym, 2], 2374514f5e3Sopenharmony_ci ]); 2384514f5e3Sopenharmony_ci} catch (e) { 2394514f5e3Sopenharmony_ci print("sharedMap set[unshared]: " + e + ", errCode: " + e.code); 2404514f5e3Sopenharmony_ci} 2414514f5e3Sopenharmony_ciprint("===Type check end==="); 2424514f5e3Sopenharmony_ci 2434514f5e3Sopenharmony_ciprint("===Class inheritance test begin ==="); 2444514f5e3Sopenharmony_ciclass SubSendableMap<K, V> extends SendableMap { 2454514f5e3Sopenharmony_ci desc: string = "I'am SubSendableMap"; 2464514f5e3Sopenharmony_ci constructor(entries?: [K, V][] | null) { 2474514f5e3Sopenharmony_ci 'use sendable'; 2484514f5e3Sopenharmony_ci super(entries); 2494514f5e3Sopenharmony_ci } 2504514f5e3Sopenharmony_ci} 2514514f5e3Sopenharmony_ci 2524514f5e3Sopenharmony_cilet subSendableMap = new SubSendableMap<number, string>(); 2534514f5e3Sopenharmony_cisubSendableMap.set(1, 'one'); 2544514f5e3Sopenharmony_ciprint(subSendableMap.has(1)); 2554514f5e3Sopenharmony_ciprint(subSendableMap.size); 2564514f5e3Sopenharmony_ci 2574514f5e3Sopenharmony_citry { 2584514f5e3Sopenharmony_ci subSendableMap['extension'] = 'value'; 2594514f5e3Sopenharmony_ci} catch(e) { 2604514f5e3Sopenharmony_ci print("add extension(.): " + e); 2614514f5e3Sopenharmony_ci} 2624514f5e3Sopenharmony_citry { 2634514f5e3Sopenharmony_ci subSendableMap.extension = 'value'; 2644514f5e3Sopenharmony_ci} catch(e) { 2654514f5e3Sopenharmony_ci print("add extension([]): " + e); 2664514f5e3Sopenharmony_ci} 2674514f5e3Sopenharmony_ci 2684514f5e3Sopenharmony_citry { 2694514f5e3Sopenharmony_ci let obj = {}; 2704514f5e3Sopenharmony_ci subSendableMap = new SubSendableMap<string, Object>([['object', obj]]); 2714514f5e3Sopenharmony_ci print(subSendableMap.size); 2724514f5e3Sopenharmony_ci} catch (e) { 2734514f5e3Sopenharmony_ci print('SubSendableMap set[unshared]: ' + e + ', errCode: ' + e.code); 2744514f5e3Sopenharmony_ci} 2754514f5e3Sopenharmony_ci 2764514f5e3Sopenharmony_cisubSendableMap = new SubSendableMap<number, string>([ 2774514f5e3Sopenharmony_ci [1, 'one'], 2784514f5e3Sopenharmony_ci [2, 'two'], 2794514f5e3Sopenharmony_ci [3, 'three'], 2804514f5e3Sopenharmony_ci]); 2814514f5e3Sopenharmony_ciprint(subSendableMap.size); 2824514f5e3Sopenharmony_cifor (const [key, value] of subSendableMap.entries()) { 2834514f5e3Sopenharmony_ci print('SubSendableMap [key, value][for-of]: ' + '[' + key + ', ' + value + ']'); 2844514f5e3Sopenharmony_ci} 2854514f5e3Sopenharmony_ci 2864514f5e3Sopenharmony_citry { 2874514f5e3Sopenharmony_ci subSendableMap.forEach((value: string, key: number, map: SubSendableMap) => { 2884514f5e3Sopenharmony_ci if (key % 2 == 0) { 2894514f5e3Sopenharmony_ci map.delete(key); 2904514f5e3Sopenharmony_ci } 2914514f5e3Sopenharmony_ci }); 2924514f5e3Sopenharmony_ci} catch (e) { 2934514f5e3Sopenharmony_ci print('SubSendableMap Delete Scenario[forEach]: ' + e + ', errCode: ' + e.code); 2944514f5e3Sopenharmony_ci} 2954514f5e3Sopenharmony_ci 2964514f5e3Sopenharmony_ciclass SubSubSendableMap<K, V> extends SubSendableMap { 2974514f5e3Sopenharmony_ci constructor(entries?: [K, V][] | null) { 2984514f5e3Sopenharmony_ci 'use sendable'; 2994514f5e3Sopenharmony_ci super(entries); 3004514f5e3Sopenharmony_ci } 3014514f5e3Sopenharmony_ci} 3024514f5e3Sopenharmony_ci 3034514f5e3Sopenharmony_cilet subSubSendableMap = new SubSubSendableMap<number, string>(); 3044514f5e3Sopenharmony_cisubSubSendableMap.set(1, 'one'); 3054514f5e3Sopenharmony_ciprint(subSubSendableMap.has(1)); 3064514f5e3Sopenharmony_ciprint(subSubSendableMap.size); 3074514f5e3Sopenharmony_ci 3084514f5e3Sopenharmony_citry { 3094514f5e3Sopenharmony_ci let obj = {}; 3104514f5e3Sopenharmony_ci subSubSendableMap = new SubSubSendableMap<string, Object>([['object', obj]]); 3114514f5e3Sopenharmony_ci print(subSubSendableMap.size); 3124514f5e3Sopenharmony_ci} catch (e) { 3134514f5e3Sopenharmony_ci print('SubSubSendableMap set[unshared]: ' + e + ', errCode: ' + e.code); 3144514f5e3Sopenharmony_ci} 3154514f5e3Sopenharmony_ci 3164514f5e3Sopenharmony_cisubSubSendableMap = new SubSubSendableMap<number, string>([ 3174514f5e3Sopenharmony_ci [1, 'one'], 3184514f5e3Sopenharmony_ci [2, 'two'], 3194514f5e3Sopenharmony_ci [3, 'three'], 3204514f5e3Sopenharmony_ci]); 3214514f5e3Sopenharmony_ciprint(subSendableMap.size); 3224514f5e3Sopenharmony_cifor (const [key, value] of subSendableMap.entries()) { 3234514f5e3Sopenharmony_ci print('SubSubSendableMap [key, value][for-of]: ' + '[' + key + ', ' + value + ']'); 3244514f5e3Sopenharmony_ci} 3254514f5e3Sopenharmony_ci 3264514f5e3Sopenharmony_citry { 3274514f5e3Sopenharmony_ci subSubSendableMap.forEach((value: string, key: number, map: SubSubSendableMap) => { 3284514f5e3Sopenharmony_ci if (key % 2 == 0) { 3294514f5e3Sopenharmony_ci map.delete(key); 3304514f5e3Sopenharmony_ci } 3314514f5e3Sopenharmony_ci }); 3324514f5e3Sopenharmony_ci} catch (e) { 3334514f5e3Sopenharmony_ci print('SubSubSendableMap Delete Scenario[forEach]: ' + e + ', errCode: ' + e.code); 3344514f5e3Sopenharmony_ci} 3354514f5e3Sopenharmony_ci 3364514f5e3Sopenharmony_ciprint("=== An iterable object to convert to an ArkTS Map begin===") 3374514f5e3Sopenharmony_cisharedMap.clear(); 3384514f5e3Sopenharmony_ciFillMap(sharedMap); 3394514f5e3Sopenharmony_ciprint("map size is " + sharedMap.size); 3404514f5e3Sopenharmony_citry { 3414514f5e3Sopenharmony_ci const iterator = sharedMap.entries(); 3424514f5e3Sopenharmony_ci let sharedMap1: SendableMap = new SendableMap(iterator); 3434514f5e3Sopenharmony_ci sharedMap1.forEach((value: string, key: number, map: SendableMap) => { 3444514f5e3Sopenharmony_ci print("map key[forEach]:" + "key:" + key + ", value:" + value); 3454514f5e3Sopenharmony_ci }); 3464514f5e3Sopenharmony_ci} catch (e) { 3474514f5e3Sopenharmony_ci print("SendableMapConstructor Scenario[next()]: " + e); 3484514f5e3Sopenharmony_ci} 3494514f5e3Sopenharmony_ci 3504514f5e3Sopenharmony_ciprint("===Class inheritance test end ==="); 351