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