/
inheritance.js
115 lines (110 loc) · 3.26 KB
/
inheritance.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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
const Class = require('../Class.js');
describe('test inheritance', () => {
it('test extend function', () => {
expect(Class.extend instanceof Function).toBeTruthy();
});
it('test extend', () => {
const SuperClass = Class.create({});
expect(() => {
Class.extend(SuperClass, {});
}).not.toThrow();
expect(() => {
Class.extend(SuperClass);
}).not.toThrow();
expect(() => {
Class.extend({});
}).not.toThrow();
expect(() => {
SuperClass.extend({});
}).not.toThrow();
});
it('test call parent constructor', () => {
var beCalled = false;
const SuperClass = Class.create({
init: function() {
beCalled = true;
}
});
const SubClass = Class.extend(SuperClass, {
init: function(self) {
self.$super();
}
});
expect(beCalled).toBeFalsy();
new SubClass();
expect(beCalled).toBeTruthy();
});
it('test parent constructor argument', () => {
var input = {};
var output;
const SuperClass = Class.create({
init: function(self, arg) {
output = arg;
}
});
const SubClass = Class.extend(SuperClass, {
init: function(self, arg) {
expect(arg).toBe(input);
self.$super(arguments);
}
});
expect(output).toBeUndefined();
new SubClass(input);
expect(output).toBe(input);
});
it('test call parent method', () => {
var beCalled = false;
const SuperClass = Class.create({
method: function() {
beCalled = true;
}
});
const SubClass = Class.extend(SuperClass, {
method: function(self) {
self.$callSuper('method');
},
callNotExitMethod: function(self){
self.$callSuper('xxxadsdsad');
}
});
expect(beCalled).toBeFalsy();
new SubClass().method();
expect(beCalled).toBeTruthy();
expect(function(){
new SubClass().callNotExitMethod();
}).toThrow();
});
it('test constructor call sequence', () => {
let flag = 0;
const RootClass = Class.create({
init: function(self) {
self.$super(arguments);
expect(++flag).toBe(1);
}
});
const ParentClass = Class.extend(RootClass, {
init: function(self) {
self.$super(arguments);
expect(++flag).toBe(2);
}
});
const SubClass = Class.extend(ParentClass, {
init: function(self) {
self.$super(arguments);
expect(++flag).toBe(3);
}
});
new SubClass();
expect(flag).toBe(3);
});
it('test inheritance of static members', () => {
const STATIC_VALUE = {};
const Parent = Class.create({
statics: {
VALUE: STATIC_VALUE
}
});
const Sub = Class.extend(Parent,{});
expect(Sub.VALUE).toBe(STATIC_VALUE);
});
});