14514f5e3Sopenharmony_ci/*
24514f5e3Sopenharmony_ci * Copyright (c) 2023 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_cilet arr = Array.from("abcd");
174514f5e3Sopenharmony_ciprint(arr);
184514f5e3Sopenharmony_ciarr = Array.from("abcd");
194514f5e3Sopenharmony_ciprint(arr);
204514f5e3Sopenharmony_ciarr[1] = 'e';
214514f5e3Sopenharmony_ciprint(arr);
224514f5e3Sopenharmony_ciarr = Array.from("abcd");
234514f5e3Sopenharmony_ciprint(arr);
244514f5e3Sopenharmony_ci
254514f5e3Sopenharmony_ciarr = Array.from("01234567890123456789012");
264514f5e3Sopenharmony_ciprint(arr)
274514f5e3Sopenharmony_ciarr = Array.from("方舟")
284514f5e3Sopenharmony_ciprint(arr);
294514f5e3Sopenharmony_ciarr = Array.from("方舟")
304514f5e3Sopenharmony_ciprint(arr);
314514f5e3Sopenharmony_ciarr = Array.from("")
324514f5e3Sopenharmony_ciprint(arr.length)
334514f5e3Sopenharmony_ciarr[0] = 'a'
344514f5e3Sopenharmony_ciarr = Array.from("")
354514f5e3Sopenharmony_ciprint(arr.length)
364514f5e3Sopenharmony_ci
374514f5e3Sopenharmony_civar src = new Uint8Array(10000);
384514f5e3Sopenharmony_cifor(var i = 0; i < 10000; i++)
394514f5e3Sopenharmony_ci{
404514f5e3Sopenharmony_ci    src[i] = 1;
414514f5e3Sopenharmony_ci}
424514f5e3Sopenharmony_ciarr = Array.from(src);
434514f5e3Sopenharmony_ciprint(arr[666]);
444514f5e3Sopenharmony_ciprint(arr[999]);
454514f5e3Sopenharmony_ciprint(arr.length);
464514f5e3Sopenharmony_ci
474514f5e3Sopenharmony_ciconst v1 = new Map();
484514f5e3Sopenharmony_ciprint(Array.from(v1.keys()))
494514f5e3Sopenharmony_ci
504514f5e3Sopenharmony_ci{
514514f5e3Sopenharmony_ci    let mp=new Map();
524514f5e3Sopenharmony_ci    let mpIter = mp.entries();
534514f5e3Sopenharmony_ci    mpIter.__proto__=[1,2,3,4];
544514f5e3Sopenharmony_ci    let res=Array.from(mpIter);
554514f5e3Sopenharmony_ci    print(res);
564514f5e3Sopenharmony_ci}
574514f5e3Sopenharmony_ci
584514f5e3Sopenharmony_ci{
594514f5e3Sopenharmony_ci    class MyArray1 extends Array {
604514f5e3Sopenharmony_ci        constructor(...args) {
614514f5e3Sopenharmony_ci            super(...args);
624514f5e3Sopenharmony_ci            return {};
634514f5e3Sopenharmony_ci        }
644514f5e3Sopenharmony_ci    }
654514f5e3Sopenharmony_ci    let arr1 = MyArray1.from([1,2,3,4]);
664514f5e3Sopenharmony_ci    print(JSON.stringify(arr1));
674514f5e3Sopenharmony_ci
684514f5e3Sopenharmony_ci    class MyArray2 extends Array {
694514f5e3Sopenharmony_ci        constructor(...args) {
704514f5e3Sopenharmony_ci            super(...args);
714514f5e3Sopenharmony_ci            return new Proxy({}, {
724514f5e3Sopenharmony_ci                get(o, k) {
734514f5e3Sopenharmony_ci                    print("get",k);
744514f5e3Sopenharmony_ci                    return o[k];
754514f5e3Sopenharmony_ci                 },
764514f5e3Sopenharmony_ci                set(o, k, v) {
774514f5e3Sopenharmony_ci                    print("set",k);
784514f5e3Sopenharmony_ci                    return o[k]=v;
794514f5e3Sopenharmony_ci                },
804514f5e3Sopenharmony_ci                defineProperty(o, k, v) {
814514f5e3Sopenharmony_ci                    print("defineProperty",k);
824514f5e3Sopenharmony_ci                    return Object.defineProperty(o,k,v);
834514f5e3Sopenharmony_ci                 }
844514f5e3Sopenharmony_ci            });
854514f5e3Sopenharmony_ci        }
864514f5e3Sopenharmony_ci    }
874514f5e3Sopenharmony_ci    let arr2 = MyArray2.from([1,2,3,4]);
884514f5e3Sopenharmony_ci    print(JSON.stringify(arr2));
894514f5e3Sopenharmony_ci
904514f5e3Sopenharmony_ci    class MyArray3 extends Array {
914514f5e3Sopenharmony_ci        constructor(...args) {
924514f5e3Sopenharmony_ci            super(...args);
934514f5e3Sopenharmony_ci            return new Proxy(this, {
944514f5e3Sopenharmony_ci                get(o, k) {
954514f5e3Sopenharmony_ci                    print("get",k);
964514f5e3Sopenharmony_ci                    return o[k];
974514f5e3Sopenharmony_ci                 },
984514f5e3Sopenharmony_ci                set(o, k, v) {
994514f5e3Sopenharmony_ci                    print("set",k);
1004514f5e3Sopenharmony_ci                    return o[k]=v;
1014514f5e3Sopenharmony_ci                },
1024514f5e3Sopenharmony_ci                defineProperty(o, k, v) {
1034514f5e3Sopenharmony_ci                    print("defineProperty",k);
1044514f5e3Sopenharmony_ci                    return Object.defineProperty(o,k,v);
1054514f5e3Sopenharmony_ci                 }
1064514f5e3Sopenharmony_ci            });
1074514f5e3Sopenharmony_ci        }
1084514f5e3Sopenharmony_ci    }
1094514f5e3Sopenharmony_ci    let arr3 = MyArray3.from([1,2,3,4]);
1104514f5e3Sopenharmony_ci    print(JSON.stringify(arr3));
1114514f5e3Sopenharmony_ci}
1124514f5e3Sopenharmony_ci
1134514f5e3Sopenharmony_ci{
1144514f5e3Sopenharmony_ci    let arrIterBak = Array.prototype[Symbol.iterator];
1154514f5e3Sopenharmony_ci    let obj = {
1164514f5e3Sopenharmony_ci        get length() {
1174514f5e3Sopenharmony_ci            print("get length");
1184514f5e3Sopenharmony_ci            return 10;
1194514f5e3Sopenharmony_ci        },
1204514f5e3Sopenharmony_ci        set length(x) {
1214514f5e3Sopenharmony_ci            print("set length", x);
1224514f5e3Sopenharmony_ci            return true;
1234514f5e3Sopenharmony_ci        },
1244514f5e3Sopenharmony_ci        get 0() {
1254514f5e3Sopenharmony_ci            print('get 0');
1264514f5e3Sopenharmony_ci            return 0;
1274514f5e3Sopenharmony_ci        },
1284514f5e3Sopenharmony_ci        get 1() {
1294514f5e3Sopenharmony_ci            print('get 1');
1304514f5e3Sopenharmony_ci            return 1;
1314514f5e3Sopenharmony_ci        },
1324514f5e3Sopenharmony_ci        get 2() {
1334514f5e3Sopenharmony_ci            print('get 2');
1344514f5e3Sopenharmony_ci            return 2;
1354514f5e3Sopenharmony_ci        },
1364514f5e3Sopenharmony_ci        get [Symbol.iterator]() {
1374514f5e3Sopenharmony_ci            print("get iterator");
1384514f5e3Sopenharmony_ci            return arrIterBak;
1394514f5e3Sopenharmony_ci        }
1404514f5e3Sopenharmony_ci    }
1414514f5e3Sopenharmony_ci    let res = Array.from(obj);
1424514f5e3Sopenharmony_ci    print(JSON.stringify(res));
1434514f5e3Sopenharmony_ci}
1444514f5e3Sopenharmony_ci
1454514f5e3Sopenharmony_ci{
1464514f5e3Sopenharmony_ci    let arr = [1, 2, 3, 4, 5, 6];
1474514f5e3Sopenharmony_ci    Object.defineProperty(arr, 0, {
1484514f5e3Sopenharmony_ci        get() {
1494514f5e3Sopenharmony_ci            print("get 0");
1504514f5e3Sopenharmony_ci            arr.pop();
1514514f5e3Sopenharmony_ci            return "x";
1524514f5e3Sopenharmony_ci        }
1534514f5e3Sopenharmony_ci    });
1544514f5e3Sopenharmony_ci    let res = Array.from(arr);
1554514f5e3Sopenharmony_ci    print(JSON.stringify(res))
1564514f5e3Sopenharmony_ci}
1574514f5e3Sopenharmony_ci{
1584514f5e3Sopenharmony_ci    let arrIterBak = Array.prototype[Symbol.iterator];
1594514f5e3Sopenharmony_ci    let arr = new Object(1);
1604514f5e3Sopenharmony_ci    arr[1] = 1;
1614514f5e3Sopenharmony_ci    arr.length = 10;
1624514f5e3Sopenharmony_ci    arr[Symbol.iterator] = arrIterBak;
1634514f5e3Sopenharmony_ci    print(arr.constructor)
1644514f5e3Sopenharmony_ci    let res = Array.from(arr);
1654514f5e3Sopenharmony_ci    print(JSON.stringify(res))
1664514f5e3Sopenharmony_ci}
1674514f5e3Sopenharmony_ci{
1684514f5e3Sopenharmony_ci    let arrIterBak = Array.prototype[Symbol.iterator];
1694514f5e3Sopenharmony_ci    Number.prototype.__proto__ = {
1704514f5e3Sopenharmony_ci        get length() {
1714514f5e3Sopenharmony_ci            print("get length");
1724514f5e3Sopenharmony_ci            return 10;
1734514f5e3Sopenharmony_ci        },
1744514f5e3Sopenharmony_ci        set length(x) {
1754514f5e3Sopenharmony_ci            print("set length", x);
1764514f5e3Sopenharmony_ci            return true;
1774514f5e3Sopenharmony_ci        },
1784514f5e3Sopenharmony_ci        get 0() {
1794514f5e3Sopenharmony_ci            print('get 0');
1804514f5e3Sopenharmony_ci            return 0;
1814514f5e3Sopenharmony_ci        },
1824514f5e3Sopenharmony_ci        get 1() {
1834514f5e3Sopenharmony_ci            print('get 1');
1844514f5e3Sopenharmony_ci            return 1;
1854514f5e3Sopenharmony_ci        },
1864514f5e3Sopenharmony_ci        get 2() {
1874514f5e3Sopenharmony_ci            print('get 2');
1884514f5e3Sopenharmony_ci            return 2;
1894514f5e3Sopenharmony_ci        },
1904514f5e3Sopenharmony_ci        get [Symbol.iterator]() {
1914514f5e3Sopenharmony_ci            print("get iterator");
1924514f5e3Sopenharmony_ci            return arrIterBak;
1934514f5e3Sopenharmony_ci        }
1944514f5e3Sopenharmony_ci    };
1954514f5e3Sopenharmony_ci    let arr = 1
1964514f5e3Sopenharmony_ci    let res = Array.from(arr);
1974514f5e3Sopenharmony_ci    print(JSON.stringify(res))
1984514f5e3Sopenharmony_ci}
1994514f5e3Sopenharmony_ci
2004514f5e3Sopenharmony_ci{
2014514f5e3Sopenharmony_ci    let arr = [1,2,3];
2024514f5e3Sopenharmony_ci    let res = Array.from(arr.values());
2034514f5e3Sopenharmony_ci    print(JSON.stringify(res));
2044514f5e3Sopenharmony_ci}
2054514f5e3Sopenharmony_ci
2064514f5e3Sopenharmony_ci// array.from by arrayLike with mapFunc
2074514f5e3Sopenharmony_ci{
2084514f5e3Sopenharmony_ci    let res = Array.from({length : 3}, () => {});
2094514f5e3Sopenharmony_ci    print(JSON.stringify(res));
2104514f5e3Sopenharmony_ci}
2114514f5e3Sopenharmony_ci
2124514f5e3Sopenharmony_ci{
2134514f5e3Sopenharmony_ci    let res = Array.from({length : 3}, () => ({}));
2144514f5e3Sopenharmony_ci    print(JSON.stringify(res));
2154514f5e3Sopenharmony_ci}
2164514f5e3Sopenharmony_ci
2174514f5e3Sopenharmony_ci{
2184514f5e3Sopenharmony_ci    let res = Array.from({length : 3}, () => []);
2194514f5e3Sopenharmony_ci    print(JSON.stringify(res));
2204514f5e3Sopenharmony_ci}
2214514f5e3Sopenharmony_ci
2224514f5e3Sopenharmony_ci{
2234514f5e3Sopenharmony_ci    let res = Array.from({length : 3}, () => [1,2,3]);
2244514f5e3Sopenharmony_ci    print(JSON.stringify(res));
2254514f5e3Sopenharmony_ci}
2264514f5e3Sopenharmony_ci
2274514f5e3Sopenharmony_ci{
2284514f5e3Sopenharmony_ci    let res = Array.from({length : 3}, () => 0);
2294514f5e3Sopenharmony_ci    print(JSON.stringify(res));
2304514f5e3Sopenharmony_ci}
2314514f5e3Sopenharmony_ci
2324514f5e3Sopenharmony_ci{
2334514f5e3Sopenharmony_ci    let num = 1;
2344514f5e3Sopenharmony_ci    let len = 1025;
2354514f5e3Sopenharmony_ci    let res = Array.from({length : len}, () => num);
2364514f5e3Sopenharmony_ci    print(res.length == len);
2374514f5e3Sopenharmony_ci    let flag = true;
2384514f5e3Sopenharmony_ci    for (let i = 0; i < res.length; ++i) {
2394514f5e3Sopenharmony_ci      if (res[i] != num) {
2404514f5e3Sopenharmony_ci        flag = false;
2414514f5e3Sopenharmony_ci        break;
2424514f5e3Sopenharmony_ci      }
2434514f5e3Sopenharmony_ci    }
2444514f5e3Sopenharmony_ci    if (flag) {
2454514f5e3Sopenharmony_ci      print("get JSArray from arrayLike Success");
2464514f5e3Sopenharmony_ci    }
2474514f5e3Sopenharmony_ci}
2484514f5e3Sopenharmony_ci
2494514f5e3Sopenharmony_ci{
2504514f5e3Sopenharmony_ci    function example() {
2514514f5e3Sopenharmony_ci      let res = Array.from(arguments);
2524514f5e3Sopenharmony_ci      print(JSON.stringify(res));
2534514f5e3Sopenharmony_ci    }
2544514f5e3Sopenharmony_ci    example(1, 2, 3);
2554514f5e3Sopenharmony_ci}
2564514f5e3Sopenharmony_ci
2574514f5e3Sopenharmony_ci{
2584514f5e3Sopenharmony_ci    let arrayLike = {0:1.1, 1:12, 2:'ss', length: 3}
2594514f5e3Sopenharmony_ci    let res = Array.from(arrayLike, x => x + x);
2604514f5e3Sopenharmony_ci    print(JSON.stringify(res));
2614514f5e3Sopenharmony_ci}
2624514f5e3Sopenharmony_ci
2634514f5e3Sopenharmony_ci{
2644514f5e3Sopenharmony_ci    let res = Array.from({length : 3}, (_, index) => [index * 2]);
2654514f5e3Sopenharmony_ci    print(JSON.stringify(res));
2664514f5e3Sopenharmony_ci}
2674514f5e3Sopenharmony_ci
2684514f5e3Sopenharmony_ci{
2694514f5e3Sopenharmony_ci    const nonConstructor = {}
2704514f5e3Sopenharmony_ci    let res = Array.from.call(nonConstructor, {length : 3}, (_, index) => [index * 2]);
2714514f5e3Sopenharmony_ci    print(JSON.stringify(res));
2724514f5e3Sopenharmony_ci}
2734514f5e3Sopenharmony_ci
2744514f5e3Sopenharmony_ci//array.from by JSArray
2754514f5e3Sopenharmony_ci{
2764514f5e3Sopenharmony_ci    const nonConstructor = {}
2774514f5e3Sopenharmony_ci    let num = 1
2784514f5e3Sopenharmony_ci    let len = 1025 // may transfer to dictionary elements type
2794514f5e3Sopenharmony_ci    let myArray = new Array(1025).fill(num)
2804514f5e3Sopenharmony_ci    let res = Array.from.call(nonConstructor, myArray);
2814514f5e3Sopenharmony_ci    print(res.length == len);
2824514f5e3Sopenharmony_ci    let flag = true;
2834514f5e3Sopenharmony_ci    for (let i = 0; i < res.length; ++i) {
2844514f5e3Sopenharmony_ci      if (res[i] != num || res.at(i) != num) {
2854514f5e3Sopenharmony_ci        flag = false;
2864514f5e3Sopenharmony_ci        break;
2874514f5e3Sopenharmony_ci      }
2884514f5e3Sopenharmony_ci    }
2894514f5e3Sopenharmony_ci    if (flag) {
2904514f5e3Sopenharmony_ci      print("get JSArray from JSArray Success!")
2914514f5e3Sopenharmony_ci    }
2924514f5e3Sopenharmony_ci}
2934514f5e3Sopenharmony_ci
2944514f5e3Sopenharmony_ci{
2954514f5e3Sopenharmony_ci    const nonConstructor = {}
2964514f5e3Sopenharmony_ci    let myArray = new Array(1,2,3,4,5)
2974514f5e3Sopenharmony_ci    let res = Array.from.call(nonConstructor, myArray);
2984514f5e3Sopenharmony_ci    print(JSON.stringify(res));
2994514f5e3Sopenharmony_ci}
3004514f5e3Sopenharmony_ci
3014514f5e3Sopenharmony_ci{
3024514f5e3Sopenharmony_ci    let res = Array.from([1,2,3,4,5]);
3034514f5e3Sopenharmony_ci    print(JSON.stringify(res));
3044514f5e3Sopenharmony_ci}
3054514f5e3Sopenharmony_ci
3064514f5e3Sopenharmony_ci// test for String with mapFunc
3074514f5e3Sopenharmony_ci{
3084514f5e3Sopenharmony_ci    let str = 'a'.repeat(10)
3094514f5e3Sopenharmony_ci    let res = Array.from(str, x => x + 's');
3104514f5e3Sopenharmony_ci    print(JSON.stringify(res));
3114514f5e3Sopenharmony_ci}
3124514f5e3Sopenharmony_ci
3134514f5e3Sopenharmony_ci{
3144514f5e3Sopenharmony_ci    let len = 1025
3154514f5e3Sopenharmony_ci    const head = 'h'
3164514f5e3Sopenharmony_ci    const tail = '_tail'
3174514f5e3Sopenharmony_ci    let str = head.repeat(len)
3184514f5e3Sopenharmony_ci    let res = Array.from(str, x => x + tail);
3194514f5e3Sopenharmony_ci    let flag = true;
3204514f5e3Sopenharmony_ci    for (let i = 0; i < res.length; ++i) {
3214514f5e3Sopenharmony_ci      if (res[i] != head + tail) {
3224514f5e3Sopenharmony_ci        flag = false;
3234514f5e3Sopenharmony_ci        break;
3244514f5e3Sopenharmony_ci      }
3254514f5e3Sopenharmony_ci    }
3264514f5e3Sopenharmony_ci    if (res.length == len && flag) {
3274514f5e3Sopenharmony_ci      print("result check successfully");
3284514f5e3Sopenharmony_ci    } else {
3294514f5e3Sopenharmony_ci      print("result check failed");
3304514f5e3Sopenharmony_ci    }
3314514f5e3Sopenharmony_ci}
3324514f5e3Sopenharmony_ci
3334514f5e3Sopenharmony_ci// test for Set with mapFunc
3344514f5e3Sopenharmony_ci{
3354514f5e3Sopenharmony_ci    let set = new Set(['test', 'for', 'array', 'from', 'set'])
3364514f5e3Sopenharmony_ci    let res = Array.from(set, x => x);
3374514f5e3Sopenharmony_ci    print(JSON.stringify(res));
3384514f5e3Sopenharmony_ci}
3394514f5e3Sopenharmony_ci
3404514f5e3Sopenharmony_ci// test for Map with mapFunc
3414514f5e3Sopenharmony_ci{
3424514f5e3Sopenharmony_ci    let map = new Map([[1, 'test'], [2, 'for'], [3, 'array'], [4, 'from'], [5, 'map']]);
3434514f5e3Sopenharmony_ci    let res = Array.from(map, x => x);
3444514f5e3Sopenharmony_ci    print(JSON.stringify(res));
3454514f5e3Sopenharmony_ci}
3464514f5e3Sopenharmony_ci
3474514f5e3Sopenharmony_ci// test for TypedArray with mapFunc
3484514f5e3Sopenharmony_ci{
3494514f5e3Sopenharmony_ci    let mapFunc = x => x + x;
3504514f5e3Sopenharmony_ci    let uint8Array = new Uint8Array([1, 2, 3, 4, 5, 6]);
3514514f5e3Sopenharmony_ci    let res = Array.from(uint8Array, mapFunc);
3524514f5e3Sopenharmony_ci    print(JSON.stringify(res));
3534514f5e3Sopenharmony_ci}
3544514f5e3Sopenharmony_ci
3554514f5e3Sopenharmony_ci{
3564514f5e3Sopenharmony_ci    let mapFunc = x => x + x;
3574514f5e3Sopenharmony_ci    let uint16Array = new Uint16Array([1, 2, 3, 4, 5, 6]);
3584514f5e3Sopenharmony_ci    let res = Array.from(uint16Array, mapFunc);
3594514f5e3Sopenharmony_ci    print(JSON.stringify(res));
3604514f5e3Sopenharmony_ci}
3614514f5e3Sopenharmony_ci
3624514f5e3Sopenharmony_ci{
3634514f5e3Sopenharmony_ci    let mapFunc = x => x + x;
3644514f5e3Sopenharmony_ci    let uint32Array = new Uint32Array([1, 2, 3, 4, 5, 6]);
3654514f5e3Sopenharmony_ci    let res = Array.from(uint32Array, mapFunc);
3664514f5e3Sopenharmony_ci    print(JSON.stringify(res));
3674514f5e3Sopenharmony_ci}
3684514f5e3Sopenharmony_ci
3694514f5e3Sopenharmony_ci{
3704514f5e3Sopenharmony_ci    let mapFunc = x => x + x;
3714514f5e3Sopenharmony_ci    let float32Array = new Float32Array([1, 2, 3, 4, 5, 6]);
3724514f5e3Sopenharmony_ci    let res = Array.from(float32Array, mapFunc);
3734514f5e3Sopenharmony_ci    print(JSON.stringify(res));
3744514f5e3Sopenharmony_ci}
3754514f5e3Sopenharmony_ci
3764514f5e3Sopenharmony_ci{
3774514f5e3Sopenharmony_ci    let mapFunc = x => x + x;
3784514f5e3Sopenharmony_ci    let float64Array = new Float64Array([1, 2, 3, 4, 5, 6]);
3794514f5e3Sopenharmony_ci    let res = Array.from(float64Array, mapFunc);
3804514f5e3Sopenharmony_ci    print(JSON.stringify(res));
3814514f5e3Sopenharmony_ci}