| <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> |