1/*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16/*
17 * @tc.name:setobjectwithproto
18 * @tc.desc:test set object with proto
19 * @tc.type: FUNC
20 * @tc.require: issueI5NO8G
21 */
22var object = {
23    __proto__: null
24};
25
26print(Object.getPrototypeOf(object));
27
28class C32 extends String {
29
30}
31let obj1 = new C32();
32print(obj1.__proto__ == C32.prototype);
33print(C32.__proto__ == String);
34C32.__proto__ = Array;
35let obj2 = new C32();
36print(obj2.__proto__ == C32.prototype);
37print(C32.__proto__ == Array);
38
39Float64Array.__proto__ = Float32Array
40new Float64Array();
41print("test new Float64Array Suc")
42
43var normalValues = [
44    1,
45    true,
46    'string',
47    Symbol()
48];
49
50function getObjects() {
51    function func() {}
52    return [
53      func,
54      new func(),
55      {x: 5},
56      /regexp/,
57      ['array'],
58      new Date(),
59      new Number(1),
60      new Boolean(true),
61      new String('str'),
62      Object(Symbol())
63    ];
64}
65
66function TestSetPrototypeOf1() {
67    var object = {};
68    var oldProto = {
69      x: 'old x',
70      y: 'old y'
71    };
72    Object.setPrototypeOf(object, oldProto);
73    print(object.x);
74    print(object.y);
75    var newProto = {
76      x: 'new x'
77    };
78    Object.setPrototypeOf(object, newProto);
79    print(object.x);
80}
81TestSetPrototypeOf1();
82
83function TestSetPrototypeOf2() {
84    for (var i = 0; i < normalValues.length; i++) {
85      var value = normalValues[i];
86      var proto = Object.getPrototypeOf(value);
87      if (Object.setPrototypeOf(value, {}) != value) {
88        return false;
89      }
90      if (proto != Object.getPrototypeOf(value)) {
91        return false;
92      }
93    }
94    return true;
95}
96
97print(TestSetPrototypeOf2());
98
99function TestSetPrototypeOf(object, proto) {
100    return (Object.setPrototypeOf(object, proto) === object) &&
101           (Object.getPrototypeOf(object) === proto);
102}
103
104function TestSetPrototypeOf3() {
105    var objects1 = getObjects();
106    var objects2 = getObjects();
107    for (var i = 0; i < objects1.length; i++) {
108        for (var j = 0; j < objects2.length; j++) {
109        if (!TestSetPrototypeOf(objects1[i], objects2[j])) {
110            return false;
111        }
112        }
113    }
114    return true;
115}
116print(TestSetPrototypeOf3());