]> git.proxmox.com Git - extjs.git/blame - extjs/packages/core/test/specs/class/Base.js
add extjs 6.0.1 sources
[extjs.git] / extjs / packages / core / test / specs / class / Base.js
CommitLineData
6527f429
DM
1describe("Ext.Base", function() {\r
2 var cls;\r
3 \r
4 afterEach(function() {\r
5 cls = null;\r
6 });\r
7\r
8 describe("deprecated", function() {\r
9 afterEach(function() {\r
10 delete Ext.versions.foo;\r
11 delete Ext.compatVersions.foo;\r
12 });\r
13\r
14 function declareClass (compatVersion) {\r
15 Ext.setCompatVersion('foo', compatVersion);\r
16\r
17 cls = Ext.define(null, {\r
18 foo: function () {\r
19 return 'a';\r
20 },\r
21\r
22 deprecated: {\r
23 name: 'foo',\r
24 5: {\r
25 methods: {\r
26 bar: 'foo',\r
27 foo: function () {\r
28 return this.callParent() + 'd';\r
29 }\r
30 }\r
31 },\r
32\r
33 5.1: {\r
34 methods: {\r
35 foo: {\r
36 fn: function () {\r
37 return this.callParent() + 'c';\r
38 }\r
39 }\r
40 }\r
41 },\r
42\r
43 '5.2': {\r
44 methods: {\r
45 foo: {\r
46 message: 'Foo is bad',\r
47 fn: function () {\r
48 return this.callParent() + 'b';\r
49 }\r
50 }\r
51 }\r
52 }\r
53 }\r
54 });\r
55 }\r
56\r
57 describe('no backward compatibility', function () {\r
58 beforeEach(function () {\r
59 declareClass('5.2');\r
60 });\r
61\r
62 it("should not activate methods when compatVersion equals curVersion", function() {\r
63 var obj = new cls();\r
64 var s = obj.foo();\r
65 expect(s).toBe('a');\r
66 });\r
67\r
68 it("should install error shim from old block", function() {\r
69 var obj = new cls();\r
70 var s = 'No exception';\r
71\r
72 // Silence console error\r
73 spyOn(Ext, 'log');\r
74\r
75 try {\r
76 obj.bar();\r
77 } catch (e) {\r
78 s = e.message;\r
79 }\r
80 expect(s).toBe('"#bar" is deprecated. Please use "foo" instead.');\r
81 });\r
82 });\r
83\r
84 describe('one increment of backward compatibility', function () {\r
85 beforeEach(function () {\r
86 declareClass('5.1');\r
87 });\r
88\r
89 it("should activate just one block", function() {\r
90 var obj = new cls();\r
91 var s = obj.foo();\r
92 expect(s).toBe('ab');\r
93 });\r
94\r
95 it("should install error shim from old block", function() {\r
96 var obj = new cls();\r
97 var s = 'No exception';\r
98\r
99 // Silence console error\r
100 spyOn(Ext, 'log');\r
101\r
102 try {\r
103 obj.bar();\r
104 } catch (e) {\r
105 s = e.message;\r
106 }\r
107 expect(s).toBe('"#bar" is deprecated. Please use "foo" instead.');\r
108 });\r
109 });\r
110\r
111 describe('two increments of backward compatibility', function () {\r
112 beforeEach(function () {\r
113 declareClass('5');\r
114 });\r
115\r
116 it("should activate just two blocks", function() {\r
117 var obj = new cls();\r
118 var s = obj.foo();\r
119 expect(s).toBe('abc');\r
120 });\r
121\r
122 it("should install error shim from old block", function() {\r
123 var obj = new cls();\r
124 var s = 'No exception';\r
125 \r
126 // Silence console error\r
127 spyOn(Ext, 'log');\r
128\r
129 try {\r
130 obj.bar();\r
131 } catch (e) {\r
132 s = e.message;\r
133 }\r
134 expect(s).toBe('"#bar" is deprecated. Please use "foo" instead.');\r
135 });\r
136 });\r
137\r
138 describe('full backward compatibility', function () {\r
139 beforeEach(function () {\r
140 declareClass('4.2');\r
141 });\r
142\r
143 it("should activate all three blocks", function() {\r
144 var obj = new cls();\r
145 var s = obj.foo();\r
146 expect(s).toBe('abcd');\r
147 });\r
148\r
149 it("should install alias", function() {\r
150 var obj = new cls();\r
151 var s = obj.bar();\r
152 expect(s).toBe('abcd');\r
153 });\r
154 });\r
155 });\r
156\r
157 describe("borrow", function() {\r
158 beforeEach(function() {\r
159 Ext.define("spec.Foo", {\r
160 a: function() {\r
161 return 'foo a';\r
162 },\r
163 b: function() {\r
164 return 'foo b';\r
165 },\r
166 c: function() {\r
167 return 'foo c';\r
168 }\r
169 });\r
170 Ext.define("spec.Bar", {\r
171 a: function() {\r
172 return 'bar a';\r
173 }\r
174 });\r
175 });\r
176\r
177 afterEach(function() {\r
178 Ext.undefine('spec.Foo');\r
179 Ext.undefine('spec.Bar');\r
180 });\r
181 \r
182 it("should borrow methods", function() {\r
183 spec.Bar.borrow(spec.Foo, ['b', 'c']);\r
184 \r
185 var bar = new spec.Bar();\r
186 expect(bar.a()).toEqual('bar a');\r
187 expect(bar.b()).toEqual('foo b');\r
188 expect(bar.c()).toEqual('foo c');\r
189 });\r
190 });\r
191 \r
192 describe("createAlias", function() {\r
193 var o;\r
194 \r
195 function makeCls(fn, name) {\r
196 var o = {};\r
197 o[name || 'oldFn'] = fn;\r
198 cls = Ext.define(null, o);\r
199 }\r
200 \r
201 afterEach(function() {\r
202 o = null;\r
203 });\r
204 \r
205 it("should create a method on the prototype", function() {\r
206 makeCls(function(){});\r
207 cls.createAlias('newFn', 'oldFn');\r
208 expect(Ext.isFunction(cls.prototype.newFn)).toBe(true);\r
209 });\r
210 \r
211 it("should call through to the old method with the passed arguments", function() {\r
212 var a, b;\r
213 makeCls(function(arg1, arg2) {\r
214 a = arg1;\r
215 b = arg2;\r
216 }); \r
217 cls.createAlias('newFn', 'oldFn');\r
218 o = new cls();\r
219 o.newFn('Val', 17);\r
220 expect(a).toBe('Val');\r
221 expect(b).toBe(17); \r
222 });\r
223 \r
224 it("should dynamically resolve the old method at runtime", function() {\r
225 var values = [];\r
226 makeCls(function() {\r
227 values.push(1);\r
228 }); \r
229 cls.createAlias('newFn', 'oldFn');\r
230 o = new cls();\r
231 o.newFn();\r
232 \r
233 cls.override({\r
234 oldFn: function() {\r
235 values.push(2);\r
236 }\r
237 });\r
238 o.newFn();\r
239 \r
240 o.oldFn = function() {\r
241 values.push(3); \r
242 };\r
243 o.newFn();\r
244 expect(values).toEqual([1, 2, 3]);\r
245 });\r
246 });\r
247 \r
248 describe("override", function() {\r
249 describe("mixins", function() {\r
250 var aFn, bFn;\r
251 beforeEach(function() {\r
252 aFn = function() {};\r
253 bFn = function() {};\r
254 \r
255 Ext.define('spec.Mix1', {\r
256 extend: 'Ext.Mixin',\r
257 mixinConfig: {\r
258 id: 'mix1'\r
259 },\r
260 \r
261 a: aFn\r
262 });\r
263 \r
264 Ext.define('spec.Mix2', {\r
265 extend: 'Ext.Mixin',\r
266 mixinConfig: {\r
267 id: 'mix2'\r
268 },\r
269 \r
270 b: bFn\r
271 });\r
272 });\r
273 \r
274 afterEach(function() {\r
275 aFn = bFn = null;\r
276 Ext.undefine('spec.Mix1');\r
277 Ext.undefine('spec.Mix2');\r
278 Ext.undefine('spec.MyBase');\r
279 });\r
280 \r
281 it("should add mixins on a class without mixins", function() {\r
282 cls = Ext.define('spec.MyBase', {\r
283 });\r
284 \r
285 Ext.define(null, {\r
286 override: 'spec.MyBase',\r
287 mixins : ['spec.Mix1']\r
288 });\r
289 \r
290 expect(cls.prototype.a).toBe(aFn);\r
291 expect(cls.prototype.mixins.mix1).toBe(spec.Mix1.prototype);\r
292 });\r
293 \r
294 it("should add mixins on a class with existing mixins", function() {\r
295 cls = Ext.define('spec.MyBase', {\r
296 mixins: ['spec.Mix1']\r
297 });\r
298 \r
299 Ext.define(null, {\r
300 override: 'spec.MyBase',\r
301 mixins : ['spec.Mix2']\r
302 });\r
303 \r
304 expect(cls.prototype.a).toBe(aFn);\r
305 expect(cls.prototype.mixins.mix1).toBe(spec.Mix1.prototype);\r
306 \r
307 expect(cls.prototype.b).toBe(bFn);\r
308 expect(cls.prototype.mixins.mix2).toBe(spec.Mix2.prototype);\r
309 });\r
310 \r
311 it("should add mixins when the type differs", function() {\r
312 cls = Ext.define('spec.MyBase', {\r
313 mixins: {\r
314 mixFoo: 'spec.Mix1'\r
315 }\r
316 });\r
317 \r
318 Ext.define(null, {\r
319 override: 'spec.MyBase',\r
320 mixins : ['spec.Mix2']\r
321 });\r
322 \r
323 expect(cls.prototype.a).toBe(aFn);\r
324 expect(cls.prototype.mixins.mixFoo).toBe(spec.Mix1.prototype);\r
325 \r
326 expect(cls.prototype.b).toBe(bFn);\r
327 expect(cls.prototype.mixins.mix2).toBe(spec.Mix2.prototype);\r
328 });\r
329 });\r
330 });\r
331 \r
332});\r