OpenLayers OpenLayers

root/branches/openlayers/2.5/tests/test_Events.html

Revision 4271, 14.0 kB (checked in by euzuro, 1 year ago)

Here we have finally solved the smashing of the Event object problem. Once and forall. God save the queen when 3.0 comes we're getting rid of this sloppiness. See r4040 for more info on why we've done all this. (Closes #880)

  • Property svn:eol-style set to native
Line 
1 <html>
2 <head>
3   <script src="../lib/OpenLayers.js"></script>
4   <script type="text/javascript">
5     var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
6     var map;
7     var a;
8    
9     function test_01_Events_constructor (t) {
10         var mapDiv = OpenLayers.Util.getElement('map');
11         var obj = {result: 0};
12         var eventTypes = ["doThingA", "doThingB", "doThingC"];
13         var browserTypes = OpenLayers.Events.prototype.BROWSER_EVENTS;
14
15         var totalTests = 5 + eventTypes.length + browserTypes.length;
16
17         t.plan( totalTests );
18
19         events = new OpenLayers.Events(obj, mapDiv, eventTypes);
20
21         t.ok( events instanceof OpenLayers.Events, "new OpenLayers.Control returns object" );
22
23         t.ok(events.object ==obj, " 'object' property correctly set");
24         t.ok(events.element == mapDiv, " 'element' property correctly set");
25         t.ok(events.eventTypes == eventTypes, " 'eventTypes' property correctly set");
26
27
28         for (var i = 0; i < browserTypes.length; i++) {
29             t.ok( events.listeners[browserTypes[i]] instanceof Array,
30                   "browser event: " + browserTypes[i] + " correctly registered" );
31         }
32         for (var i = 0; i < eventTypes.length; i++) {
33             t.ok( events.listeners[eventTypes[i]] instanceof Array,
34                   "custom event: " + eventTypes[i] + " correctly registered");
35         }
36
37         // default/nulls
38         events = new OpenLayers.Events(null, null, null);
39         t.ok( events.listeners != null,
40               "init of Events with null object/element/eventTypes still creates listeners array" );
41     }
42
43     function test_02_Events_register_unregister(t) {
44  
45         t.plan( 18 );
46  
47         var mapDiv = OpenLayers.Util.getElement('map');
48         var obj = {result: 0};
49         var eventTypes = ["doThingA", "doThingB", "doThingC"];
50        
51         events = new OpenLayers.Events(obj, mapDiv, eventTypes);
52        
53         var func = function () { this.result++ }
54         events.register( "doThingA", obj, func );
55
56         var listenerList = events.listeners["doThingA"];
57         t.eq( listenerList.length, 1, "register correctly adds to event.listeners" );
58         t.ok( listenerList[0].obj == obj, "obj property correctly registered");
59         t.ok( listenerList[0].func == func, "func property correctly registered");
60
61         var func2 = function () { this.result-- }
62         events.register( "doThingA", obj, func2 );
63
64         var listenerList = events.listeners["doThingA"];
65         t.eq( listenerList.length, 2, "register correctly appends new callback to event.listeners[doThingA]" );
66         t.ok( listenerList[1].obj == obj, "obj property correctly registered");
67         t.ok( listenerList[1].func == func2, "func property correctly registered");
68
69         var func3 = function () { this.result = this.result + 3; }
70         events.register( "doThingA", null, func3 );
71
72         var listenerList = events.listeners["doThingA"];
73         t.eq( listenerList.length, 3, "register correctly appends new callback to event.listeners[doThingA] even when obj passed in is null" );
74         t.ok( listenerList[2].obj == obj, "obj is correctly set to Events.object default when null is passed in.");
75         t.ok( listenerList[2].func == func3, "func property correctly registered");
76
77         events.register( "doThingA", obj, null);
78
79         var listenerList = events.listeners["doThingA"];
80         t.eq( listenerList.length, 3, "register correctly does not append null callback to event.listeners[doThingA] even when obj passed in is null" );
81
82         events.register( "chicken", obj, func);
83         t.ok( events.listeners["chicken"] == null, "register() does nothing on attempt to register un-enabled event");
84
85         events.unregister("doThingA", obj, null);
86         var listenerList = events.listeners["doThingA"];
87         t.eq( listenerList.length, 3, "trying to unregister a null callback does nothing -- but doesnt crash :-)" );
88    
89         events.unregister("doThingA", obj, func);
90         var found = false;
91         for (var i = 0; i < listenerList.length; i++) {
92             var listener = listenerList[i];
93             if (listener.obj == obj && listener.func == func) {
94                 found = true;
95             }
96         }               
97         t.ok( (listenerList.length == 2) && !found, "unregister correctly removes callback" );
98
99         events.unregister("doThingA", null, func3);
100         var found = false;
101         for (var i = 0; i < listenerList.length; i++) {
102             var listener = listenerList[i];
103             if (listener.obj == obj && listener.func == func) {
104                 found = true;
105             }
106         }               
107         t.ok( (listenerList.length == 1) && !found, "unregister correctly removes callback when no obj specified" );
108        
109         var func4 = function () { this.result = "chicken"; }
110         events.unregister("doThingA", obj, func4);
111         t.ok( (listenerList.length == 1), "unregister does not bomb if you try to remove an unregistered callback" );
112
113         var obj2 = { chicken: 151 };
114         events.unregister("doThingA", obj2, func2);
115         t.ok( (listenerList.length == 1), "unregister does not bomb or accidntally remove if you try to remove a valid callback on a valid event type, but with the wrong context object" );
116
117         events.unregister("doThingA", obj, null);
118         t.ok( (listenerList.length == 1), "unregister does not bomb if you try to remove a null callback" );
119
120         events.unregister("chicken", null, func3);
121         t.ok( events.listeners["chicken"] == null, "unregistering an event that is not enabled does not wierdly enable it -- or cause a script error")
122
123
124     }
125
126     function test_03_Events_remove(t) {
127
128         t.plan( 2 );
129  
130         var mapDiv = OpenLayers.Util.getElement('map');
131         var obj = {result: 0};
132         var eventTypes = ["doThingA", "doThingB", "doThingC"];
133        
134         events = new OpenLayers.Events(obj, mapDiv, eventTypes);
135        
136         var func = function () { this.result++ }
137         var func2 = function () { this.result-- }
138         var func3 = function () { this.result = this.result + 3; }
139
140         events.register( "doThingA", obj, func );
141         events.register( "doThingA", obj, func2 );
142         events.register( "doThingA", null, func3 );
143
144         events.remove("doThingA");
145
146         t.eq( events.listeners["doThingA"].length, 0, "remove() correctly clears the event listeners" );
147
148         events.remove("chicken");
149         t.ok( events.listeners["chicken"] == null, "remove on non-enabled event does not break or accidentally enable the event");
150
151     }
152
153     function test_04_Events_triggerEvent(t) {
154    
155         t.plan( 6 );
156  
157         var mapDiv = OpenLayers.Util.getElement('map');
158         var obj = {result: 0};
159         var eventTypes = ["doThingA", "doThingB", "doThingC"];
160        
161         events = new OpenLayers.Events(obj, mapDiv, eventTypes);
162        
163        
164         var func = function () { this.result++ }
165         events.register( "doThingA", obj, func );
166
167         events.triggerEvent("doThingA", {});
168         t.eq( obj.result, 1, "result is 1 after we call triggerEvent" );
169         events.triggerEvent("doThingA");
170         t.eq( obj.result, 2, "result is 2 after we call triggerEvent with no event" );
171
172         var funcB = function() { this.FUNK = "B"; return false; }
173         events.register( "doThingA", obj, funcB);
174
175         events.triggerEvent("doThingA");
176         t.ok ((obj.result == 3) && (obj.FUNK == "B"), "executing multiple callbacks works")
177
178         var funcZ = function() { this.FUNK = "Z"; }
179         events.register( "doThingA", obj, funcZ);
180
181         events.triggerEvent("doThingA");
182         t.ok ((obj.result == 4) && (obj.FUNK == "B"), "executing multiple callbacks works, and when one returns false, it stops chain correctly")
183
184
185         var func2 = function() { this.result = this.result + 10; }
186         events.register( "doThingB", null, func2);
187        
188         events.triggerEvent("doThingB");
189         t.eq( obj.result, 14, "passing a null object default gets set correctly");
190        
191         //no specific t.ok for this one, but if it breaks, you will know it.
192         events.triggerEvent("chicken");
193
194         events = new OpenLayers.Events(null, mapDiv, eventTypes);
195        
196         // a is global variable (context-irrelevant)
197         a = 0;
198         var func = function () { a = 5; }
199         events.register( "doThingC", null, func );
200         events.triggerEvent("doThingC");
201
202         t.eq(a, 5, "if Events has no object set and an event is registered also with no object, triggerEvent() calls it without trying to set the context to null");       
203     }
204
205     function test_05_Events_destroy (t) {
206         t.plan(2);
207
208         var div   = OpenLayers.Util.getElement('test');
209         var obj   = {};
210         var events = new OpenLayers.Events(obj, div);
211
212         // +1 because of blocking dragstart in attachToElement()
213         t.eq(OpenLayers.Event.observers[div._eventCacheID].length,
214              OpenLayers.Events.prototype.BROWSER_EVENTS.length + 1,
215              "construction creates new arrayin hash, registers appropriate events");
216              
217         events.destroy();
218         events = null;
219         t.eq(OpenLayers.Event.observers["test"], null,
220              "destruction removes the event observer from hash");
221     }
222    
223     function test_06_Event(t) {
224         t.plan(24);
225        
226         var div   = OpenLayers.Util.getElement('test');
227         var name = "mouseover";
228         var func = function() {};
229
230       //1st elem 1st listener       
231         OpenLayers.Event.observe(div, name, func);
232
233         var cacheID = div._eventCacheID;
234         t.ok(cacheID, "element given new cache id");
235        
236         var elementObservers = OpenLayers.Event.observers[cacheID];
237        
238         t.ok(elementObservers, "new cache bucket made for event");
239         t.eq(elementObservers.length, 1, "one listener registered");       
240        
241         var listener = elementObservers[0];
242        
243         t.ok(listener.element == div, "element registered");
244         t.eq(listener.name, name, "name registered");
245         t.ok(listener.observer == func, "function registered");
246         t.eq(listener.useCapture, false, "useCapture defaults to false");
247
248       //1st elem 2nd listener       
249         name = "mouseout";
250         var newFunc = function() {};
251      
252         OpenLayers.Event.observe(div, name, newFunc, true);
253         var newCacheID = div._eventCacheID;
254         t.eq(newCacheID, cacheID, "element's cache id not overridden");
255        
256         t.eq(elementObservers.length, 2, "listener added to existing bucket");       
257        
258         var listener = elementObservers[1];
259        
260         t.ok(listener.element == div, "element registered");
261         t.eq(listener.name, name, "name registered");
262         t.ok(listener.observer == newFunc, "function registered");
263         t.eq(listener.useCapture, true, "useCapture correctly registered");
264
265       //2st elem 1st listener       
266         div = OpenLayers.Util.getElement('test2');
267         OpenLayers.Event.observe(div, name, func);
268
269         var cacheID = div._eventCacheID;
270         t.ok(cacheID, "new element given new cache id");
271         t.ok(cacheID != newCacheID, "new cache id is unique");
272        
273         elementObservers = OpenLayers.Event.observers[cacheID];
274        
275         t.ok(elementObservers, "new cache bucket made for event");
276         t.eq(elementObservers.length, 1, "one listener registered");       
277        
278         var listener = elementObservers[0];
279        
280         t.ok(listener.element == div, "element registered");
281         t.eq(listener.name, name, "name registered");
282         t.ok(listener.observer == func, "function registered");
283         t.eq(listener.useCapture, false, "useCapture defaults to false");
284
285       //stopObservingElement by element
286         OpenLayers.Event.stopObservingElement(div);
287         elementObservers = OpenLayers.Event.observers[cacheID];
288         t.ok(elementObservers == null, "stopObservingElement by elem works");
289
290       //stopObservingElement by id
291         OpenLayers.Event.stopObservingElement("test");
292         elementObservers = OpenLayers.Event.observers[newCacheID];
293         t.ok(elementObservers == null, "stopObservingElement by id works");
294
295
296       //unloadCache by element
297         OpenLayers.Event.observe(div, name, func);
298        
299         OpenLayers.Event.unloadCache();
300
301         elementObservers = OpenLayers.Event.observers[cacheID];
302         t.ok(elementObservers == null, "stopObservingElement by elem works");
303
304        
305     }
306
307     function test_06_Events_addEventType(t) {
308
309         t.plan( 6 );
310  
311         var mapDiv = OpenLayers.Util.getElement('map');
312         var obj = {result: 0};
313         var eventTypes = ["doThingA", "doThingB"];
314
315         events = new OpenLayers.Events(obj, mapDiv, eventTypes);
316
317
318         t.eq( events.listeners["doThingA"].length, 0, "event type passed as passed as param to OpenLayers.Events constructor correctly set up" );
319         t.eq( events.listeners["doThingB"].length, 0, "event type passed as passed as param to OpenLayers.Events constructor correctly set up" );
320
321         var newEventType = "onFoo";
322         t.ok( events.listeners[newEventType] == null, "event type not yet registered has null entry in listeners array");
323
324         events.addEventType(newEventType);
325         t.eq( events.listeners[newEventType].length, 0, "event type passed to addEventType correctly set up" );
326        
327         var func = function () {};
328         events.register( "doThingA", obj, func );
329         t.eq( events.listeners["doThingA"].length, 1, "listener correctly registered" );
330
331         events.addEventType("doThingsA");
332         t.eq( events.listeners["doThingA"].length, 1, "event type passed to addEventType correctly does nothing if clashes with already defined event type" );
333     }
334
335     /** HACK HACK HACK Deprecated This test should be removed in 3.0 **/
336     function test_Events_globalEventObject(t) {
337         t.plan(1);
338         t.ok(Event.stop, "a stop() function exists on the global JS Event object, if indeed it exists. This is legacy deprecated and will be gone in 3.0");
339     }
340    
341
342   </script>
343 </head>
344 <body>
345     <div id="map" style="width: 1024px; height: 512px;"/>
346     <div id="test"></div>
347     <div id="test2"></div>
348 </body>
349 </html>
Note: See TracBrowser for help on using the browser.