21d8f198a7ba5b9d46b196791d4fd29dc49e726c
[WebKit-https.git] / JSTests / stress / arrowfunction-lexical-bind-supercall-4.js
1 var testCase = function (actual, expected, message) {
2     if (actual !== expected) {
3         throw message + ". Expected '" + expected + "', but was '" + actual + "'";
4     }
5 };
6
7 var testValue  = 'test-value';
8
9 var A = class A {
10     constructor() {
11         this.idValue = testValue;
12     }
13 };
14
15 var B = class B extends A {
16   constructor (beforeSuper) {
17
18       var arrow = () => eval('(() => super())()');
19
20       if (beforeSuper) {
21           arrow();
22           testCase(this.idValue, testValue, "Error: super() should create this and put value into idValue property");
23       } else {
24           testCase(this.idValue, testValue, "Error: has to be TDZ error");
25           arrow();
26       }
27   }
28 };
29
30 var C = class C extends A {
31     constructor () {
32         var arrow = () => eval('(() => super())()');
33         arrow();
34         return {
35           value : 'constructor-value'
36         };
37     }
38 };
39
40 var D = class D extends A {
41     constructor () {
42         var arrow = () => eval('(() => super())()');
43         arrow();
44         eval('this.id="new-value"');
45     }
46 };
47
48 var E = class E extends A {
49     constructor () {
50         var arrow = () => eval("eval('(() => super())()')");
51         arrow();
52         eval('eval("this.id=\'new-value\'")');
53     }
54 };
55
56
57 for (var i=0; i < 1000; i++) {
58     new B(true);
59     var c = new C();
60     testCase(c.value, 'constructor-value', 'Error during set value in eval #1.0');
61     testCase(typeof c.id, 'undefined', 'Error during set value in eval #1.1');
62     var d = new D();
63     testCase(d.idValue, testValue, 'Error during set value in eval #2.0');
64     testCase(d.id, 'new-value', 'Error during set value in eval #2.1');
65     var e = new E();
66     testCase(e.idValue, testValue, 'Error during set value in eval #3.0');
67     testCase(e.id, 'new-value', 'Error during set value in eval #3.0');
68 }
69
70 var testException = function (Klass, value, index) {
71     var exception;
72     try {
73         new Klass(value);
74     } catch (e) {
75         exception = e;
76         if (!(e instanceof ReferenceError))
77             throw "Exception thrown was not a reference error";
78     }
79
80     if (!exception)
81         throw "Exception not thrown for an unitialized this at iteration #" + index;
82 }
83
84 for (var i=0; i < 1000; i++) {
85     testException(B, false, i);
86 }
87
88 class F extends A {
89     constructor() {
90       var arr_after = () => {
91         this.idValue  = 'this-value';
92       };
93       var arr_before = () => {
94         return 'not-some-value';
95       };
96       arr_before();
97       super();
98       arr_after();
99     }
100 }
101
102 let f = new F();
103 testCase(f.idValue, 'this-value', 'Error: not correct binding of this in constructor');
104
105 class G extends A {
106     constructor() {
107         var arr_simple = () => {
108             return 'not-some-value';
109         };
110         var arr_super = () => {
111             super();
112         };
113         arr_simple();
114         arr_super();
115     }
116 }
117
118 let g = new G();
119 testCase(g.idValue, testValue, 'Error: not correct binding super&this in constructor');
120
121 class A_this_Prop extends A {
122     getValue () {
123         return this.idValue;
124     }
125 }
126
127 class H extends A_this_Prop {
128     constructor() {
129         var arr_simple = () => {
130             return 'not-some-value';
131         };
132         var arr_super = () => {
133             super();
134         };
135         var arr_value = () => super.getValue();
136         arr_simple();
137         arr_super();
138         this.someValue = arr_value();
139     }
140 }
141
142 let h = new H();
143 testCase(h.someValue, testValue, 'Error: not correct binding superProperty&this in constructor');
144
145 class I extends A {
146   constructor (beforeSuper) {
147       if (beforeSuper) {
148           eval('(() => super())()');
149           testCase(this.idValue, testValue, "Error: super() should create this and put value into idValue property");
150       } else {
151           this.idValue = 'testValue';
152           eval('(() => super())()');
153       }
154   }
155 };
156
157 let ic = new I(true);
158 testCase(ic.idValue, testValue, 'Error: not correct binding superProperty&this in constructor');
159
160 for (var i=0; i < 1000; i++) {
161     testException(I, false, i);
162 }