5c4d885699eab32b6a66ce6adfa31df50ee70a0e
[WebKit-https.git] / LayoutTests / js / script-tests / es6-function-properties.js
1 description('Tests for ES6 class method and constructor properties');
2
3 function shouldThrow(s, message) {
4     var threw = false;
5     try {
6         eval(s);
7     } catch(e) {
8         threw = true;
9         if (!message || e.toString() === eval(message))
10             testPassed(s + ":::" + e.toString());
11         else
12             testFailed(s);
13     }
14     if (!threw)
15         testFailed(s);
16 }
17
18 function shouldBe(a, b) {
19     var r1 = eval(a);
20     var r2 = eval(b)
21     if (r1 === r2)
22         testPassed(a + ":::" + b);
23     else
24         testFailed(r1 + ":::" + r2);
25 }
26
27  var typeErrorText = '"TypeError: \'arguments\', \'callee\', and \'caller\' cannot be accessed in strict mode."';
28
29 class A { };
30 class B extends A { };
31 class C extends A { constructor () {super();}}
32 class D { constructor () {}}
33 class E { getItem() { return 'text';} }
34 class F extends E { getElement() { return 'text'}}
35 class G extends E { get item() { return 'text'} }
36
37 var wrongPropertyInAList = '';
38
39 var check = function (text) {
40     shouldThrow(text + '.caller', typeErrorText);
41     shouldThrow(text + '.arguments', typeErrorText);
42     shouldThrow(text + '["caller"]', typeErrorText);
43     shouldThrow(text + '["arguments"]', typeErrorText);
44     shouldThrow(text + '.caller = function () {}', typeErrorText);
45     shouldThrow(text + '.arguments = function () {}', typeErrorText);
46     shouldThrow(text + '["caller"] = function () {}', typeErrorText);
47     shouldThrow(text + '["arguments"] = function () {}', typeErrorText);
48
49     shouldBe(text + '.hasOwnProperty("caller")', 'false');
50     shouldBe(text + '.hasOwnProperty("arguments")', 'false');
51     var object = eval(text);
52
53     for (var propertyName in object) {
54         wrongPropertyInAList = propertyName === 'caller' || propertyName === 'arguments';
55         if (wrongPropertyInAList)
56            shouldBe('wrongPropertyInAList', 'false');
57     }
58
59     shouldBe('Object.getOwnPropertyDescriptor(' + text + ', "caller")', 'undefined');
60     shouldBe('Object.getOwnPropertyDescriptor(' + text + ', "arguments")', 'undefined');
61     shouldBe('delete ' + text +'.caller', true);
62     shouldBe('delete ' + text +'["caller"]', true);
63     shouldBe('delete ' + text +'.arguments', true);
64     shouldBe('delete ' + text +'["arguments"]', true);
65 }
66
67 var checkProperties = function (value, expected, text) { 
68     debug(text);
69     var properties = Object.getOwnPropertyNames(value).toString();
70     shouldBe("'" + properties + "'", "'" + expected + "'");
71 };
72
73 var a = new A;
74
75 checkProperties(a.constructor, "length,name,prototype", "a.constructor");
76 checkProperties((new A()).constructor, "length,name,prototype", "(new A()).constructor");
77
78 check('a.constructor');
79 check('a.constructor');
80 check('(new A()).constructor');
81
82 var b = new B;
83
84 checkProperties(b.constructor, "length,name,prototype", "b.constructor");
85 checkProperties((new B()).constructor, "length,name,prototype", "(new B()).constructor");
86
87 check('b.constructor');
88 check('(new B()).constructor');
89
90 var c = new C;
91
92 checkProperties(c.constructor, "length,name,prototype", "c.constructor");
93 checkProperties((new C()).constructor, "length,name,prototype", "(new C()).constructor");
94
95 check('c.constructor');
96 check('(new C()).constructor');
97
98 var d = new D;
99
100 checkProperties(d.constructor, "length,name,prototype", "c.constructor");
101 checkProperties((new D()).constructor, "length,name,prototype", "(new D()).constructor");
102
103 check('d.constructor');
104 check('(new D()).constructor');
105
106 var e = new E;
107
108 checkProperties(e.constructor, "length,name,prototype", "e.constructor");
109 checkProperties((new E()).getItem, "length,name,prototype", "(new E()).getItem");
110
111 check('e.constructor');
112 check('(new E()).getItem');
113
114 var f = new F;
115
116 checkProperties(f.getItem, "length,name,prototype", "f.getItem");
117 checkProperties(f.getElement, "length,name,prototype", "f.getElement");
118
119 check('f.getItem');
120 check('f.getElement');
121
122 checkProperties((new F()).getItem, "length,name,prototype", "(new F()).getItem");
123 checkProperties((new F()).getElement, "length,name,prototype", "(new F()).getElement");
124
125 check('(new F()).getItem');
126 check('(new F()).getElement');
127
128 var arr = ()=>{};
129
130 checkProperties(arr, "length,name", "arr");
131 checkProperties((()=>{}), "length,name", "()=>{}");
132
133 check('arr');
134 check('(()=>{})');
135
136 var g = new G;
137 shouldBe('g.item.caller', 'undefined');
138 shouldBe('g.item.arguments', 'undefined');
139 shouldBe('(new G()).item.caller', 'undefined');
140 shouldBe('(new G()).item.arguments', 'undefined');
141
142 class H {
143     caller() { return 'value'; }
144     arguments() { return 'value'; }
145 }
146
147 check('H');
148
149 var h = new H;
150
151 shouldBe('h.caller()', '"value"');
152 shouldBe('h.arguments()', '"value"');
153
154 checkProperties(h.caller, "length,name,prototype", "h.caller");
155 checkProperties(h.arguments, "length,name,prototype", "h.arguments");
156
157 check('h.caller');
158
159 shouldBe('(new H()).caller()', '"value"');
160 shouldBe('(new H()).arguments()', '"value"');
161
162 check('(new H()).caller', "length,name,prototype");
163
164 class J {
165     *gen() {yield;}
166     static *gen() {yield;}
167     *get() {}
168     static *get() {}
169 }
170
171 checkProperties(J.gen, "length,name,prototype", "J.gen");
172 checkProperties(J.get, "length,name,prototype", "J.get");
173
174 check('J.gen');
175 check('J.get');
176
177 var j = new J;
178
179 checkProperties(j.gen, "length,name,prototype", "j.gen");
180 checkProperties(j.get, "length,name,prototype", "j.get");
181
182 check('j.gen');
183 check('j.get');
184
185 checkProperties((new J).gen, "length,name,prototype", "(new J).gen");
186 checkProperties((new J).get, "length,name,prototype", "(new J).get");
187
188 check('(new J).gen');
189 check('(new J).get');
190
191 var successfullyParsed = true;