01332ebead
The rationale is this: the spec string describes the expected behavior unconditionally. The code examples, on the other hand, set up an expectation that is tested with the call to the expect method. The code examples can violate the expectation, but the spec string does not. The value of the spec string is as clearly as possible describing the behavior. Including “should” in that description adds no value. (From http://rubyspec.org/style_guide/)
157 lines
3.4 KiB
JavaScript
157 lines
3.4 KiB
JavaScript
describe("Class", function() {
|
|
|
|
describe("#extend", function() {
|
|
var Klass,
|
|
constructor,
|
|
method;
|
|
|
|
beforeEach(function() {
|
|
constructor = jasmine.createSpy("Klass constructor");
|
|
method = jasmine.createSpy("Klass#bar method");
|
|
|
|
Klass = L.Class.extend({
|
|
statics: {bla: 1},
|
|
includes: {mixin: true},
|
|
|
|
initialize: constructor,
|
|
foo: 5,
|
|
bar: method
|
|
});
|
|
});
|
|
|
|
it("creates a class with the given constructor & properties", function() {
|
|
var a = new Klass();
|
|
|
|
expect(constructor).toHaveBeenCalled();
|
|
expect(a.foo).toEqual(5);
|
|
|
|
a.bar();
|
|
|
|
expect(method).toHaveBeenCalled();
|
|
});
|
|
|
|
it("inherits parent classes' constructor & properties", function() {
|
|
var Klass2 = Klass.extend({baz: 2});
|
|
|
|
var b = new Klass2();
|
|
|
|
expect(b instanceof Klass).toBeTruthy();
|
|
expect(b instanceof Klass2).toBeTruthy();
|
|
|
|
expect(constructor).toHaveBeenCalled();
|
|
expect(b.baz).toEqual(2);
|
|
|
|
b.bar();
|
|
|
|
expect(method).toHaveBeenCalled();
|
|
});
|
|
|
|
it("supports static properties", function() {
|
|
expect(Klass.bla).toEqual(1);
|
|
});
|
|
|
|
it("inherits parent static properties", function() {
|
|
var Klass2 = Klass.extend({});
|
|
|
|
expect(Klass2.bla).toEqual(1);
|
|
});
|
|
|
|
it("overrides parent static properties", function() {
|
|
var Klass2 = Klass.extend({statics: {bla: 2}});
|
|
|
|
expect(Klass2.bla).toEqual(2);
|
|
});
|
|
|
|
it("includes the given mixin", function() {
|
|
var a = new Klass();
|
|
expect(a.mixin).toBeTruthy();
|
|
});
|
|
|
|
it("includes multiple mixins", function() {
|
|
var Klass2 = L.Class.extend({
|
|
includes: [{mixin: true}, {mixin2: true}]
|
|
});
|
|
var a = new Klass2();
|
|
|
|
expect(a.mixin).toBeTruthy();
|
|
expect(a.mixin2).toBeTruthy();
|
|
});
|
|
|
|
it("grants the ability to include the given mixin", function() {
|
|
Klass.include({mixin2: true});
|
|
|
|
var a = new Klass();
|
|
expect(a.mixin2).toBeTruthy();
|
|
});
|
|
|
|
it("merges options instead of replacing them", function() {
|
|
var KlassWithOptions1 = L.Class.extend({
|
|
options: {
|
|
foo1: 1,
|
|
foo2: 2
|
|
}
|
|
});
|
|
var KlassWithOptions2 = KlassWithOptions1.extend({
|
|
options: {
|
|
foo2: 3,
|
|
foo3: 4
|
|
}
|
|
});
|
|
|
|
var a = new KlassWithOptions2();
|
|
|
|
expect(a.options).toEqual({
|
|
foo1: 1,
|
|
foo2: 3,
|
|
foo3: 4
|
|
});
|
|
});
|
|
|
|
it("adds constructor hooks correctly", function () {
|
|
var spy1 = jasmine.createSpy("init hook 1");
|
|
|
|
Klass.addInitHook(spy1);
|
|
Klass.addInitHook('bar', 1, 2, 3);
|
|
|
|
var a = new Klass();
|
|
|
|
expect(spy1).toHaveBeenCalled();
|
|
expect(method).toHaveBeenCalledWith(1, 2, 3);
|
|
});
|
|
|
|
it("inherits constructor hooks", function () {
|
|
var spy1 = jasmine.createSpy("init hook 1"),
|
|
spy2 = jasmine.createSpy("init hook 2");
|
|
|
|
var Klass2 = Klass.extend({});
|
|
|
|
Klass.addInitHook(spy1);
|
|
Klass2.addInitHook(spy2);
|
|
|
|
var a = new Klass2();
|
|
|
|
expect(spy1).toHaveBeenCalled();
|
|
expect(spy2).toHaveBeenCalled();
|
|
});
|
|
|
|
it("does not call child constructor hooks", function () {
|
|
var spy1 = jasmine.createSpy("init hook 1"),
|
|
spy2 = jasmine.createSpy("init hook 2");
|
|
|
|
var Klass2 = Klass.extend({});
|
|
|
|
Klass.addInitHook(spy1);
|
|
Klass2.addInitHook(spy2);
|
|
|
|
var a = new Klass();
|
|
|
|
expect(spy1).toHaveBeenCalled();
|
|
expect(spy2).not.toHaveBeenCalled();
|
|
});
|
|
});
|
|
|
|
// TODO Class.include
|
|
|
|
// TODO Class.mergeOptions
|
|
});
|