| Index: sky/tests/js/classes.sky
|
| diff --git a/sky/tests/js/classes.sky b/sky/tests/js/classes.sky
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..a8d09e272e0ad7e06b5cfe8aee1bacb86345114d
|
| --- /dev/null
|
| +++ b/sky/tests/js/classes.sky
|
| @@ -0,0 +1,163 @@
|
| +<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>
|
|
|