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_ci/*
174514f5e3Sopenharmony_ci * @tc.name:jsonstringifier
184514f5e3Sopenharmony_ci * @tc.desc:test JSON.stringify
194514f5e3Sopenharmony_ci * @tc.type: FUNC
204514f5e3Sopenharmony_ci * @tc.require: issue#I7DFJC
214514f5e3Sopenharmony_ci */
224514f5e3Sopenharmony_ci
234514f5e3Sopenharmony_citry {
244514f5e3Sopenharmony_ci    const v0 = [1, 2, 3, 4]
254514f5e3Sopenharmony_ci    function Foo(a) {
264514f5e3Sopenharmony_ci        Object.defineProperty(this, "ownKeys", { configurable: true, enumerable: true, value: a });
274514f5e3Sopenharmony_ci    }
284514f5e3Sopenharmony_ci    const v1 = new Foo("2060681564", v0, 9.53248718923);
294514f5e3Sopenharmony_ci    const v2 = new Proxy({}, v1);
304514f5e3Sopenharmony_ci    JSON.stringify(v2);
314514f5e3Sopenharmony_ci} catch (e) {
324514f5e3Sopenharmony_ci    print("test successful");
334514f5e3Sopenharmony_ci}
344514f5e3Sopenharmony_ci
354514f5e3Sopenharmony_civar obj = {
364514f5e3Sopenharmony_ci    2147483648: 2289
374514f5e3Sopenharmony_ci}
384514f5e3Sopenharmony_ciprint(JSON.stringify(obj));
394514f5e3Sopenharmony_ci
404514f5e3Sopenharmony_ciconst a = new Uint32Array(0x10);
414514f5e3Sopenharmony_cilet  b = a.__proto__;
424514f5e3Sopenharmony_cib[1073741823] = {}
434514f5e3Sopenharmony_ciprint(JSON.stringify(a))
444514f5e3Sopenharmony_ci
454514f5e3Sopenharmony_cilet o = {
464514f5e3Sopenharmony_ci    get g() {
474514f5e3Sopenharmony_ci        this[1225] |= 4294967295;
484514f5e3Sopenharmony_ci        return 9;
494514f5e3Sopenharmony_ci    },
504514f5e3Sopenharmony_ci    "f1":1,
514514f5e3Sopenharmony_ci    "f2":1,
524514f5e3Sopenharmony_ci    "f3":1,
534514f5e3Sopenharmony_ci    "f4":1,
544514f5e3Sopenharmony_ci    "f5":1,
554514f5e3Sopenharmony_ci    "f6":1,
564514f5e3Sopenharmony_ci    "f7":1,
574514f5e3Sopenharmony_ci    "f8":1,
584514f5e3Sopenharmony_ci}
594514f5e3Sopenharmony_ciprint(JSON.stringify(o))
604514f5e3Sopenharmony_cilet o2 = {
614514f5e3Sopenharmony_ci    get g() {
624514f5e3Sopenharmony_ci        delete this.f1;
634514f5e3Sopenharmony_ci        return 8;
644514f5e3Sopenharmony_ci    },
654514f5e3Sopenharmony_ci    "f1":1,
664514f5e3Sopenharmony_ci    "f2":1,
674514f5e3Sopenharmony_ci}
684514f5e3Sopenharmony_ciprint(JSON.stringify(o2))
694514f5e3Sopenharmony_civar handler2 = {
704514f5e3Sopenharmony_ci    get:function(target,name) {
714514f5e3Sopenharmony_ci        delete parent2.c;
724514f5e3Sopenharmony_ci        return name.toUpperCase();
734514f5e3Sopenharmony_ci    },
744514f5e3Sopenharmony_ci}
754514f5e3Sopenharmony_civar proxy2 = new Proxy({},handler2);
764514f5e3Sopenharmony_civar parent2 = {a:proxy2,c:"remove"};
774514f5e3Sopenharmony_ciprint(JSON.stringify(parent2))
784514f5e3Sopenharmony_ci
794514f5e3Sopenharmony_civar obj={
804514f5e3Sopenharmony_ci    get 1() {
814514f5e3Sopenharmony_ci        delete this['2'];
824514f5e3Sopenharmony_ci    },
834514f5e3Sopenharmony_ci    2:2,
844514f5e3Sopenharmony_ci    3:3,
854514f5e3Sopenharmony_ci}
864514f5e3Sopenharmony_ciprint(JSON.stringify(obj))
874514f5e3Sopenharmony_ci
884514f5e3Sopenharmony_civar List = undefined;
894514f5e3Sopenharmony_civar LinkedList = undefined;
904514f5e3Sopenharmony_ciif (globalThis["ArkPrivate"] != undefined) {
914514f5e3Sopenharmony_ci    List = ArkPrivate.Load(ArkPrivate.List);
924514f5e3Sopenharmony_ci    let list = new List();
934514f5e3Sopenharmony_ci    list.add({"f1": 1});
944514f5e3Sopenharmony_ci    list.add({"f2": 2});
954514f5e3Sopenharmony_ci    print(JSON.stringify(list));
964514f5e3Sopenharmony_ci
974514f5e3Sopenharmony_ci    LinkedList = ArkPrivate.Load(ArkPrivate.LinkedList);
984514f5e3Sopenharmony_ci    let linkList = new LinkedList();
994514f5e3Sopenharmony_ci    linkList.add({"f3": 3});
1004514f5e3Sopenharmony_ci    linkList.add({"f4": 4});
1014514f5e3Sopenharmony_ci    print(JSON.stringify(linkList));
1024514f5e3Sopenharmony_ci}
1034514f5e3Sopenharmony_ci
1044514f5e3Sopenharmony_civar v6="123456789\u0000";
1054514f5e3Sopenharmony_ciprint(JSON.stringify([{}],[String],v6))
1064514f5e3Sopenharmony_ci
1074514f5e3Sopenharmony_civar handler2 = {
1084514f5e3Sopenharmony_ci  get: function(target, name) {
1094514f5e3Sopenharmony_ci    delete parent2.c;
1104514f5e3Sopenharmony_ci    return name.toUpperCase();
1114514f5e3Sopenharmony_ci  }
1124514f5e3Sopenharmony_ci}
1134514f5e3Sopenharmony_civar proxy2 = new Proxy({}, handler2);
1144514f5e3Sopenharmony_civar parent2 = { a: "delete", b: proxy2, c: "remove" };
1154514f5e3Sopenharmony_ciprint(JSON.stringify(parent2))
1164514f5e3Sopenharmony_ciparent2.c = "remove";  // Revert side effect.
1174514f5e3Sopenharmony_ciprint(JSON.stringify(parent2))
1184514f5e3Sopenharmony_ciReflect.defineProperty(globalThis,"c",{
1194514f5e3Sopenharmony_ci    get:()=>{
1204514f5e3Sopenharmony_ci        delete this["d"];
1214514f5e3Sopenharmony_ci        return "c";
1224514f5e3Sopenharmony_ci    },
1234514f5e3Sopenharmony_ci    enumerable:true,
1244514f5e3Sopenharmony_ci});
1254514f5e3Sopenharmony_ciReflect.set(globalThis,"d","d");
1264514f5e3Sopenharmony_ciJSON.stringify(globalThis);
1274514f5e3Sopenharmony_ciprint("end JSON.stringify(globalThis)")
1284514f5e3Sopenharmony_ci
1294514f5e3Sopenharmony_cilet str1="\uD83D";
1304514f5e3Sopenharmony_cilet str2="\uDE0E";
1314514f5e3Sopenharmony_cilet str3="\uDE0E\"测试";
1324514f5e3Sopenharmony_cilet str4=new String("\uDE0E\"测试2")
1334514f5e3Sopenharmony_cilet str=str1+str2
1344514f5e3Sopenharmony_ciobj={};
1354514f5e3Sopenharmony_ciobj[str1]=str1;
1364514f5e3Sopenharmony_ciobj[str2]=str2;
1374514f5e3Sopenharmony_ciobj[str3]=str3;
1384514f5e3Sopenharmony_ciobj[str4]=str4;
1394514f5e3Sopenharmony_ciobj[str]=str
1404514f5e3Sopenharmony_ciprint(JSON.stringify(obj))
1414514f5e3Sopenharmony_ci
1424514f5e3Sopenharmony_ciprint(JSON.stringify(str))
1434514f5e3Sopenharmony_ciprint(JSON.stringify(str1))
1444514f5e3Sopenharmony_ciprint(JSON.stringify(str2))
1454514f5e3Sopenharmony_ciprint(JSON.stringify(str3))
1464514f5e3Sopenharmony_ciprint(JSON.stringify(str4))
1474514f5e3Sopenharmony_ci
1484514f5e3Sopenharmony_ci{
1494514f5e3Sopenharmony_ci  var actual = [];
1504514f5e3Sopenharmony_ci  var test_obj = {o: false};
1514514f5e3Sopenharmony_ci  var replaced = {o: false, replaced: true};
1524514f5e3Sopenharmony_ci
1534514f5e3Sopenharmony_ci  function replacer(key, value) {
1544514f5e3Sopenharmony_ci      actual.push({ holder: this, key, value });
1554514f5e3Sopenharmony_ci      if (actual.length === 1) return replaced;
1564514f5e3Sopenharmony_ci      if (key === "o") return true;
1574514f5e3Sopenharmony_ci      return value;
1584514f5e3Sopenharmony_ci  }
1594514f5e3Sopenharmony_ci  print(`{"o":true,"replaced":true}` == JSON.stringify(test_obj, replacer));
1604514f5e3Sopenharmony_ci  const expect = [
1614514f5e3Sopenharmony_ci      {
1624514f5e3Sopenharmony_ci        holder: { "": { o: false } },
1634514f5e3Sopenharmony_ci        key: "",
1644514f5e3Sopenharmony_ci        value: { o: false }
1654514f5e3Sopenharmony_ci      },
1664514f5e3Sopenharmony_ci      {
1674514f5e3Sopenharmony_ci        holder: { o: false, replaced: true },
1684514f5e3Sopenharmony_ci        key: "o",
1694514f5e3Sopenharmony_ci        value: false
1704514f5e3Sopenharmony_ci      },
1714514f5e3Sopenharmony_ci      {
1724514f5e3Sopenharmony_ci        holder: { o: false, replaced: true },
1734514f5e3Sopenharmony_ci        key: "replaced",
1744514f5e3Sopenharmony_ci        value: true
1754514f5e3Sopenharmony_ci      }
1764514f5e3Sopenharmony_ci    ];
1774514f5e3Sopenharmony_ci  print(JSON.stringify(expect) == JSON.stringify(actual));
1784514f5e3Sopenharmony_ci  print(actual[0].holder[""] == test_obj);
1794514f5e3Sopenharmony_ci};
1804514f5e3Sopenharmony_ci{
1814514f5e3Sopenharmony_ci  var actual = [];
1824514f5e3Sopenharmony_ci  var test_obj = {o: false, toJSON };
1834514f5e3Sopenharmony_ci  var nested = { toJSON: nestedToJSON };
1844514f5e3Sopenharmony_ci  var toJSON1 = {o: false, toJSON1: true }
1854514f5e3Sopenharmony_ci  var replaced = {o: false, replaced: true, nested };
1864514f5e3Sopenharmony_ci  var toJSON2 = { toJSON2: true };
1874514f5e3Sopenharmony_ci
1884514f5e3Sopenharmony_ci  function toJSON(key, value) {
1894514f5e3Sopenharmony_ci    return toJSON1;
1904514f5e3Sopenharmony_ci  }
1914514f5e3Sopenharmony_ci  function nestedToJSON(key, value) {
1924514f5e3Sopenharmony_ci    return toJSON2;
1934514f5e3Sopenharmony_ci  }
1944514f5e3Sopenharmony_ci  function replacer(key, value) {
1954514f5e3Sopenharmony_ci      actual.push({ holder: this, key, value });
1964514f5e3Sopenharmony_ci      if (actual.length === 1) return replaced;
1974514f5e3Sopenharmony_ci      if (key === "o") return true;
1984514f5e3Sopenharmony_ci      return value;
1994514f5e3Sopenharmony_ci  }
2004514f5e3Sopenharmony_ci  print(`{"o":true,"replaced":true,"nested":{"toJSON2":true}}` ==
2014514f5e3Sopenharmony_ci              JSON.stringify(test_obj, replacer));
2024514f5e3Sopenharmony_ci  const expect = [
2034514f5e3Sopenharmony_ci      {
2044514f5e3Sopenharmony_ci        holder: { "": { o: false, toJSON: toJSON } },
2054514f5e3Sopenharmony_ci        key: "",
2064514f5e3Sopenharmony_ci        value: { o: false, toJSON1: true }
2074514f5e3Sopenharmony_ci      },
2084514f5e3Sopenharmony_ci      {
2094514f5e3Sopenharmony_ci        holder: { o: false, replaced: true, nested: { toJSON: nestedToJSON } },
2104514f5e3Sopenharmony_ci        key: "o",
2114514f5e3Sopenharmony_ci        value: false
2124514f5e3Sopenharmony_ci      },
2134514f5e3Sopenharmony_ci      {
2144514f5e3Sopenharmony_ci        holder: { o: false, replaced: true, nested: { toJSON: nestedToJSON } },
2154514f5e3Sopenharmony_ci        key: "replaced",
2164514f5e3Sopenharmony_ci        value: true
2174514f5e3Sopenharmony_ci      },
2184514f5e3Sopenharmony_ci      {
2194514f5e3Sopenharmony_ci        holder: { o: false, replaced: true, nested: { toJSON: nestedToJSON } },
2204514f5e3Sopenharmony_ci        key: "nested",
2214514f5e3Sopenharmony_ci        value: { toJSON2: true }
2224514f5e3Sopenharmony_ci      },
2234514f5e3Sopenharmony_ci      {
2244514f5e3Sopenharmony_ci        holder: { toJSON2: true },
2254514f5e3Sopenharmony_ci        key: "toJSON2",
2264514f5e3Sopenharmony_ci        value: true
2274514f5e3Sopenharmony_ci      }
2284514f5e3Sopenharmony_ci  ];
2294514f5e3Sopenharmony_ci  print(JSON.stringify(expect) == JSON.stringify(actual));
2304514f5e3Sopenharmony_ci  print(actual[0].holder[""] == test_obj);
2314514f5e3Sopenharmony_ci};
2324514f5e3Sopenharmony_cilet obj1 = {
2334514f5e3Sopenharmony_ci  get a(){
2344514f5e3Sopenharmony_ci      this[102400] = 1;
2354514f5e3Sopenharmony_ci      return "a";
2364514f5e3Sopenharmony_ci  },
2374514f5e3Sopenharmony_ci  b:"b",
2384514f5e3Sopenharmony_ci}
2394514f5e3Sopenharmony_ciObject.keys(obj1);
2404514f5e3Sopenharmony_ciprint(JSON.stringify(obj1));
2414514f5e3Sopenharmony_ci
2424514f5e3Sopenharmony_citry {
2434514f5e3Sopenharmony_ci  let loop = {};
2444514f5e3Sopenharmony_ci  loop.obj = loop;
2454514f5e3Sopenharmony_ci  JSON.stringify(loop);
2464514f5e3Sopenharmony_ci} catch (err) {
2474514f5e3Sopenharmony_ci  print(err.name);
2484514f5e3Sopenharmony_ci  print(err.message.includes("circular structure"));
2494514f5e3Sopenharmony_ci}
2504514f5e3Sopenharmony_ci
2514514f5e3Sopenharmony_citry {
2524514f5e3Sopenharmony_ci    let arkPrivate = globalThis.ArkPrivate;
2534514f5e3Sopenharmony_ci    var List = arkPrivate.Load(arkPrivate.List);
2544514f5e3Sopenharmony_ci    const v10 = new List();
2554514f5e3Sopenharmony_ci    v10.add(v10);
2564514f5e3Sopenharmony_ci    print(JSON.stringify(v10));
2574514f5e3Sopenharmony_ci} catch (err) {
2584514f5e3Sopenharmony_ci    print(err);
2594514f5e3Sopenharmony_ci}
260