blob: a8bad15a82cd7629a4908a9d122270cbbfb0d817 [file] [log] [blame]
var testCase = function (actual, expected, message) {
if (actual !== expected) {
throw message + ". Expected '" + expected + "', but was '" + actual + "'";
}
};
var testValue = 'test-value';
var A = class A {
constructor() {
this.value = testValue;
}
getConstValue () {
return testValue;
}
getValue () {
return this.value;
}
setValue (value) {
this.value = value;
}
};
var B = class B extends A {
getParentValue() {
var arrow = () => super.getValue();
return arrow();
}
};
var C = class C {
constructor() {
this.value = testValue;
}
static getStaticValue() {
return testValue;
}
};
var D = class D extends C {
static getParentStaticValue() {
var arrow = () => super.getStaticValue();
return arrow();
}
};
var E = class E extends A {
constructor() {
super();
}
get prop() {
var arrow = () => super.getConstValue() + '-' + this.value;
return arrow();
}
set prop(value) {
var arrow = (newVal) => super.setValue(newVal);
arrow(value);
}
setInitValue() {
this.value = testValue;
}
};
var b = new B();
for (var i = 0; i < 10000; i++) {
testCase(b.getParentValue(), testValue, i);
}
for (var i = 0; i < 10000; i++) {
testCase(D.getParentStaticValue(), testValue, i);
}
var e = new E();
for (var i = 0; i < 10000; i++) {
e.setInitValue();
testCase(e.prop, testValue+'-'+testValue, i);
e.prop = 'new-test-value';
testCase(e.prop, testValue+'-new-test-value', i);
}
var F = class F extends A {
newMethod() {
var arrow = () => eval('super.getValue()');
var r = arrow();
return r;
}
};
var f = new F();
for (var i=0; i < 10000; i++) {
try {
var result = f.newMethod();
testCase(result, testValue, i);
} catch(e) {
if (!(e instanceof SyntaxError))
throw e;
}
}
var G = class G extends A {
constructor() {
super();
}
get prop() {
var arrow = () => () => super.getConstValue() + '-' + this.value;
return arrow()();
}
set prop(value) {
var arrow = () => (newVal) => this.value = newVal;
arrow()(value);
}
setInitValue() {
this.value = testValue;
}
getValueCB() {
var arrow = () => super.getValue();
return arrow;
}
setValueCB() {
var arrow = (newVal) => this.value = newVal;
return arrow;
}
getParentValue() {
return super.getValue();
}
};
var g = new G();
for (var i = 0; i < 10000; i++) {
g.setInitValue();
testCase(g.prop, testValue + '-' + testValue, 'Error: Some problem with using arrow and "super" inside of the method');
g.prop = 'new-test-value';
testCase(g.prop, testValue + '-new-test-value', 'Error: Some problem with using arrow and "super" inside of the getter and setter');
}
var g1 = new G();
for (var i = 0; i < 10000; i++) {
g1.setInitValue();
let getValue = g1.getValueCB();
testCase(getValue(), testValue, 'Error: Some problem with using arrow and "super" inside of the method that retun arrow function');
let setValue = g1.setValueCB();
setValue('new-value');
testCase(getValue(), 'new-value', 'Error: Some problem with using arrow and "super" inside of the method that retun arrow function');
}
var H = class H extends A {
constructor() {
var arrow = () => () => super.getValue();
super();
this.newValue = arrow()();
}
};
for (var i = 0; i < 10000; i++) {
let h = new H();
testCase(h.newValue, testValue, 'Error: Some problem with using "super" inside of the constructor');
}
var I = class I extends A {
constructor (beforeSuper) {
var arrow = () => super.getValue();
if (beforeSuper) {
this._value = arrow();
super();
} else {
super();
this._value = arrow();
}
}
}
var J = class J extends A {
constructor (beforeSuper) {
var _value;
var arrow = () => super.getConstValue();
if (beforeSuper) {
_value = arrow();
super();
} else {
super();
_value = arrow();
}
this._value = _value;
}
}
for (var i = 0; i < 10000; i++) {
let i = new I(false);
testCase(i._value, testValue, 'Error: Some problem with using "super" inside of the constructor');
let j = new J(false);
testCase(j._value, testValue, 'Error: Some problem with using "super" inside of the constructor');
// FIXME: Problem with access to the super before super() in constructor
// https://bugs.webkit.org/show_bug.cgi?id=152108
//let j2 = new J(true);
//testCase(j2._value, testValue, 'Error: Some problem with using "super" inside of the constructor');
error = false;
try {
new I(true);
} catch (e) {
error = e instanceof ReferenceError;
}
testCase(error, true, 'Error: using "super" property before super() should lead to error');
}