]>
Commit | Line | Data |
---|---|---|
6527f429 DM |
1 | describe("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 |