blob: a8d09e272e0ad7e06b5cfe8aee1bacb86345114d [file] [log] [blame]
<sky>
<import src="../resources/chai.sky" />
<import src="../resources/mocha.sky" />
<script>
describe("ES6 classes", function() {
it("should create instances", function() {
class Example {}
var instance = new Example();
assert.instanceOf(instance, Example);
});
it("should create subclasses", function() {
class Parent {}
class Child extends Parent {}
var instance = new Child();
assert.instanceOf(instance, Child);
assert.instanceOf(instance, Parent);
});
it("should create anonymous classes", function() {
var Parent = class {}
var Child = class extends Parent {}
var instance = new Child();
assert.instanceOf(instance, Child);
assert.instanceOf(instance, Parent);
});
it("should put methods on the prototype", function() {
class Test {
exampleMethod() { }
}
var instance = new Test();
assert.isFalse(instance.hasOwnProperty("exampleMethod"));
var proto = Object.getPrototypeOf(instance);
assert.isTrue(proto.hasOwnProperty("exampleMethod"));
});
it("should call methods with |this|", function() {
class Adder {
constructor(value) {
this.value = value;
}
add(other) {
return this.value + other;
}
}
var adder = new Adder(10);
assert.equal(adder.add(15), 25);
});
it("should let toMethod rebind super", function() {
var getValue = function() {
assert.isFunction(this.value);
assert.isFunction(this.superValue);
return this.value() + super.superValue();
}
class HolderParent {
superValue() {
return 5;
}
}
class Holder extends HolderParent {
constructor() {
this.value_ = 5;
}
value() {
return this.value_;
}
}
var holder = new Holder();
var getValueMethod = getValue.toMethod(Holder.prototype);
assert.equal(getValueMethod.call(holder), 10);
});
it("should support super() constructor calls", function() {
class Parent {
constructor(value) {
this.value = value;
}
}
class Child extends Parent {
constructor(value) {
super(value + 5);
}
}
var child = new Child(10);
assert.equal(child.value, 15);
});
it("should automatically call super() in default constructor", function() {
class Parent {
constructor() {
this.value = 10;
}
}
class Child extends Parent {
}
var child = new Child();
assert.equal(child.value, 10);
});
it("should call super.method()", function() {
class Parent {
value() {
return 10;
}
}
class Child extends Parent {
value() {
return super.value() + 5;
}
}
var child = new Child();
assert.equal(child.value(), 15);
});
it("should support getters and setters", function() {
class Variable {
constructor(value) {
this.value_ = value;
}
get value() {
return this.value_;
}
set value(newValue) {
this.value_ = newValue;
}
}
var variable = new Variable("first");
// Methods are on the prototype.
var proto = Object.getPrototypeOf(variable);
var descriptor = Object.getOwnPropertyDescriptor(proto, "value");
assert.isObject(descriptor);
assert.isFunction(descriptor.get);
assert.isFunction(descriptor.set);
assert.isUndefined(descriptor.value);
// Getter and setter should not be on the instance.
assert.isUndefined(Object.getOwnPropertyDescriptor(variable, "value"));
assert.equal(variable.value, "first");
assert.equal(variable.value_, "first");
variable.value = "second";
assert.equal(variable.value, "second");
assert.equal(variable.value_, "second");
});
});
</script>
</sky>