-
Notifications
You must be signed in to change notification settings - Fork 28
/
test-force-mixin.js
59 lines (45 loc) · 1.36 KB
/
test-force-mixin.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
var common = require('../common');
var oop = common.oop;
var assert = require('assert');
function Friendly() {
// Properties from the mixed in class should be copied
this.friendly = true;
this.overWriteMe = 'Friendly';
// Methods of the mixed in class should be callable from the constructor
this.greet();
}
Friendly.prototype.greet = function() {
};
function Tall() {
this.tall = true;
this.overWriteMe = 'Tall';
this.slamdunk();
}
Tall.prototype.slamdunk = function() {
}
function Person() {
// The properties of the mixin target should be kept
this.person = true;
// Unless they are overwritten by one of the mixins
this.overWriteMe = 'Person';
// Mixins are runtime created
oop.forceMixin(this, Friendly, Tall);
}
Person.prototype.whimper = function() {
}
var person = new Person();
// Make sure all properties got copied
assert.ok(person.person);
assert.ok(person.friendly);
assert.ok(person.tall);
// Make sure overWriteMe got overwritten by the last mixin
assert.strictEqual(person.overWriteMe, 'Tall');
// Make sure all methods got copied
person.whimper();
person.greet();
person.slamdunk();
// Make sure only the properties are enumerable
var properties = Object.keys(person);
assert.deepEqual(properties, ['person', 'overWriteMe', 'friendly', 'tall']);
// Make sure mixin is an alias of forceMixin
assert.strictEqual(oop.mixin, oop.forceMixin);