Remove modernie from specs
[mootools.git] / Specs / Element / Element.Event.js
blobfbfef6b50aaa457ec671edf553f5ed398aa57600
1 /*
2 ---
3 name: Element.Event
4 requires: ~
5 provides: ~
6 ...
7 */
9 (function(){
11 var Local = Local || {};
13 var fire = 'fireEvent', create = function(){
14         return new Element('div');
17 describe('Events API: Element', function(){
19         beforeEach(function(){
20                 Local.called = 0;
21                 Local.fn = function(){
22                         return Local.called++;
23                 };
24         });
26         it('should add an Event to the Class', function(){
27                 var object = create();
29                 object.addEvent('event', Local.fn)[fire]('event');
31                 expect(Local.called).toEqual(1);
32         });
34         it('should add multiple Events to the Class', function(){
35                 create().addEvents({
36                         event1: Local.fn,
37                         event2: Local.fn
38                 })[fire]('event1')[fire]('event2');
40                 expect(Local.called).toEqual(2);
41         });
43         it('should remove a specific method for an event', function(){
44                 var object = create();
45                 var x = 0, fn = function(){ x++; };
47                 object.addEvent('event', Local.fn).addEvent('event', fn).removeEvent('event', Local.fn)[fire]('event');
49                 expect(x).toEqual(1);
50                 expect(Local.called).toEqual(0);
51         });
53         it('should remove an event and its methods', function(){
54                 var object = create();
55                 var x = 0, fn = function(){ x++; };
57                 object.addEvent('event', Local.fn).addEvent('event', fn).removeEvents('event')[fire]('event');
59                 expect(x).toEqual(0);
60                 expect(Local.called).toEqual(0);
61         });
63         it('should remove all events', function(){
64                 var object = create();
65                 var x = 0, fn = function(){ x++; };
67                 object.addEvent('event1', Local.fn).addEvent('event2', fn).removeEvents();
68                 object[fire]('event1')[fire]('event2');
70                 // Should not fail
71                 object.removeEvents()[fire]('event1')[fire]('event2');
73                 expect(x).toEqual(0);
74                 expect(Local.called).toEqual(0);
75         });
77         it('should remove events with an object', function(){
78                 var object = create();
79                 var events = {
80                         event1: Local.fn,
81                         event2: Local.fn
82                 };
84                 object.addEvent('event1', function(){ Local.fn(); }).addEvents(events)[fire]('event1');
85                 expect(Local.called).toEqual(2);
87                 object.removeEvents(events);
88                 object[fire]('event1');
89                 expect(Local.called).toEqual(3);
91                 object[fire]('event2');
92                 expect(Local.called).toEqual(3);
93         });
95         it('should remove an event immediately', function(){
96                 var object = create();
98                 var methods = [];
100                 var three = function(){
101                         methods.push(3);
102                 };
104                 object.addEvent('event', function(){
105                         methods.push(1);
106                         this.removeEvent('event', three);
107                 }).addEvent('event', function(){
108                         methods.push(2);
109                 }).addEvent('event', three);
111                 object[fire]('event');
112                 expect(methods).toEqual([1, 2]);
114                 object[fire]('event');
115                 expect(methods).toEqual([1, 2, 1, 2]);
116         });
118         it('should be able to remove itself', function(){
119                 var object = create();
121                 var methods = [];
123                 var one = function(){
124                         object.removeEvent('event', one);
125                         methods.push(1);
126                 };
127                 var two = function(){
128                         object.removeEvent('event', two);
129                         methods.push(2);
130                 };
131                 var three = function(){
132                         methods.push(3);
133                 };
135                 object.addEvent('event', one).addEvent('event', two).addEvent('event', three);
137                 object[fire]('event');
138                 expect(methods).toEqual([1, 2, 3]);
140                 object[fire]('event');
141                 expect(methods).toEqual([1, 2, 3, 3]);
142         });
146 var fragment = document.createDocumentFragment();
148 // Restore native fireEvent in IE for Syn
149 var createElement = function(tag, props){
150         var el = new Element(tag);
151         if (el._fireEvent) el.fireEvent = el._fireEvent;
152         return el.set(props);
155 describe('Element.Event', function(){
157         it('Should trigger the click event', function(){
159                 var callback = jasmine.createSpy('Element.Event click');
161                 var el = createElement('a', {
162                         text: 'test',
163                         styles: {
164                                 display: 'block',
165                                 overflow: 'hidden',
166                                 height: '1px'
167                         },
168                         events: {
169                                 click: callback
170                         }
171                 }).inject(document.body);
173                 Syn.trigger('click', null, el);
175                 expect(callback).toHaveBeenCalled();
176                 el.destroy();
177         });
179         it('Should trigger the click event and prevent the default behavior', function(){
181                 var callback = jasmine.createSpy('Element.Event click with prevent');
183                 var el = createElement('a', {
184                         text: 'test',
185                         styles: {
186                                 display: 'block',
187                                 overflow: 'hidden',
188                                 height: '1px'
189                         },
190                         events: {
191                                 click: function(event){
192                                         event.preventDefault();
193                                         callback();
194                                 }
195                         }
196                 }).inject(document.body);
198                 Syn.trigger('click', null, el);
200                 expect(callback).toHaveBeenCalled();
201                 el.destroy();
203         });
205         // Only run this spec in browsers other than IE6-8 because they can't properly simulate key events
206         it('Should watch for a key-down event', function(){
208                 var callback = jasmine.createSpy('keydown');
210                 var div = createElement('div').addEvent('keydown', function(event){
211                         callback(event.key);
212                 }).inject(document.body);
214                 Syn.key('a', div);
216                 expect(callback).toHaveBeenCalledWith('a');
217                 div.destroy();
218         });
220         it('should clone events of an element', function(){
222                 var calls = 0;
224                 var element = new Element('div').addEvent('click', function(){ calls++; });
225                 element.fireEvent('click');
227                 expect(calls).toBe(1);
229                 var clone = new Element('div').cloneEvents(element, 'click');
230                 clone.fireEvent('click');
232                 expect(calls).toBe(2);
234                 element.addEvent('custom', function(){ calls += 2; }).fireEvent('custom');
236                 expect(calls).toBe(4);
238                 clone.cloneEvents(element);
239                 clone.fireEvent('click');
241                 expect(calls).toBe(5);
243                 clone.fireEvent('custom');
245                 expect(calls).toBe(7);
246         });
250 describe('Element.Event', function(){
251         // This is private API. Do not use.
253         it('should pass the name of the custom event to the callbacks', function(){
254                 var callbacks = 0;
255                 var callback = jasmine.createSpy('Element.Event custom');
257                 var fn = function(anything, type){
258                         expect(type).toEqual('customEvent');
259                         callbacks++;
260                 };
261                 Element.Events.customEvent = {
263                         base: 'click',
265                         condition: function(event, type){
266                                 fn(null, type);
267                                 return true;
268                         },
270                         onAdd: fn,
271                         onRemove: fn
273                 };
275                 var div = createElement('div').addEvent('customEvent', callback).inject(document.body);
277                 Syn.trigger('click', null, div);
279                 expect(callback).toHaveBeenCalled();
280                 div.removeEvent('customEvent', callback).destroy();
281                 expect(callbacks).toEqual(3);
282         });
286 describe('Element.Event.change', function(){
288         it('should not fire "change" for any property', function(){
289                 var callback = jasmine.createSpy('Element.Event.change');
291                 var radio = new Element('input', {
292                         'type': 'radio',
293                         'class': 'someClass',
294                         'checked': 'checked'
295                 }).addEvent('change', callback).inject(document.body);
297                 radio.removeClass('someClass');
298                 expect(callback).not.toHaveBeenCalled();
300                 var checkbox = new Element('input', {
301                         'type': 'checkbox',
302                         'class': 'someClass',
303                         'checked': 'checked'
304                 }).addEvent('change', callback).inject(document.body);
306                 checkbox.removeClass('someClass');
307                 expect(callback).not.toHaveBeenCalled();
309                 var text = new Element('input', {
310                         'type': 'text',
311                         'class': 'otherClass',
312                         'value': 'text value'
313                 }).addEvent('change', callback).inject(document.body);
315                 text.removeClass('otherClass');
316                 expect(callback).not.toHaveBeenCalled();
318                 [radio, checkbox, text].invoke('destroy');
319         });
323 describe('Element.Event keyup with f<key>', function(){
325         it('should pass event.key == f2 when pressing f2 on keyup and keydown', function(){
327                 var keydown = jasmine.createSpy('keydown');
328                 var keyup = jasmine.createSpy('keyup');
330                 var div = createElement('div')
331                         .addEvent('keydown', function(event){
332                                 keydown(event.key);
333                         })
334                         .addEvent('keyup', function(event){
335                                 keyup(event.key);
336                         })
337                         .inject(document.body);
339                 Syn.trigger('keydown', 'f2', div);
340                 Syn.trigger('keyup', 'f2', div);
342                 expect(keydown).toHaveBeenCalledWith('f2');
343                 expect(keyup).toHaveBeenCalledWith('f2');
345                 div.destroy();
347         });
351 describe('Element.removeEvent', function(){
353         it('should remove the onunload method', function(){
354                 var text;
355                 var handler = function(){ text = 'nope'; };
356                 window.addEvent('unload', handler);
357                 window.removeEvent('unload', handler);
358                 window.fireEvent('unload');
359                 expect(text).toBe(undefined);
360         });
365 })();