1 if (typeof(dojo
) != 'undefined') { dojo
.require('MochiKit.Signal'); }
2 if (typeof(JSAN
) != 'undefined') { JSAN
.use('MochiKit.Signal'); }
3 if (typeof(tests
) == 'undefined') { tests
= {}; }
5 tests
.test_Signal = function (t
) {
7 var submit
= MochiKit
.DOM
.getElement('submit');
10 var aFunction = function() {
11 t
.ok(this === submit
, "aFunction should have 'this' as submit");
13 if (typeof(this.someVar
) != 'undefined') {
19 aObject
.aMethod = function() {
20 t
.ok(this === aObject
, "aMethod should have 'this' as aObject");
24 ident
= connect('submit', 'onclick', aFunction
);
25 MochiKit
.DOM
.getElement('submit').click();
26 t
.is(i
, 1, 'HTML onclick event can be connected to a function');
29 MochiKit
.DOM
.getElement('submit').click();
30 t
.is(i
, 1, 'HTML onclick can be disconnected from a function');
32 var submit
= MochiKit
.DOM
.getElement('submit');
34 ident
= connect(submit
, 'onclick', aFunction
);
36 t
.is(i
, 2, 'Checking that a DOM element can be connected to a function');
40 t
.is(i
, 2, '...and then disconnected');
42 if (MochiKit
.DOM
.getElement('submit').fireEvent
||
43 (document
.createEvent
&&
44 typeof(document
.createEvent('MouseEvents').initMouseEvent
) == 'function')) {
49 http://www.devdaily.com/java/jwarehouse/jforum/tests/selenium/javascript/htmlutils.js.shtml
51 Copyright: Copyright 2004 ThoughtWorks, Inc
54 var triggerMouseEvent = function(element
, eventType
, canBubble
) {
55 element
= MochiKit
.DOM
.getElement(element
);
56 canBubble
= (typeof(canBubble
) == 'undefined') ? true : canBubble
;
57 if (element
.fireEvent
) {
58 var newEvt
= document
.createEventObject();
62 element
.fireEvent('on' + eventType
, newEvt
);
63 } else if (document
.createEvent
&& (typeof(document
.createEvent('MouseEvents').initMouseEvent
) == 'function')) {
64 var evt
= document
.createEvent('MouseEvents');
65 evt
.initMouseEvent(eventType
, canBubble
, true, // event, bubbles, cancelable
66 document
.defaultView
, 1, // view, # of clicks
67 1, 0, 0, 0, // screenX, screenY, clientX, clientY
68 false, false, false, false, // ctrlKey, altKey, shiftKey, metaKey
69 0, null); // buttonCode, relatedTarget
70 element
.dispatchEvent(evt
);
74 var eventTest = function(e
) {
76 t
.ok((typeof(e
.event()) === 'object'), 'checking that event() is an object');
77 t
.ok((typeof(e
.type()) === 'string'), 'checking that type() is a string');
78 t
.ok((e
.target() === MochiKit
.DOM
.getElement('submit')), 'checking that target is "submit"');
79 t
.ok((typeof(e
.modifier()) === 'object'), 'checking that modifier() is an object');
80 t
.ok(e
.modifier().alt
=== false, 'checking that modifier().alt is defined, but false');
81 t
.ok(e
.modifier().ctrl
=== false, 'checking that modifier().ctrl is defined, but false');
82 t
.ok(e
.modifier().meta
=== false, 'checking that modifier().meta is defined, but false');
83 t
.ok(e
.modifier().shift
=== false, 'checking that modifier().shift is defined, but false');
84 t
.ok((typeof(e
.mouse()) === 'object'), 'checking that mouse() is an object');
85 t
.ok((typeof(e
.mouse().button
) === 'object'), 'checking that mouse().button is an object');
86 t
.ok(e
.mouse().button
.left
=== true, 'checking that mouse().button.left is true');
87 t
.ok(e
.mouse().button
.middle
=== false, 'checking that mouse().button.middle is false');
88 t
.ok(e
.mouse().button
.right
=== false, 'checking that mouse().button.right is false');
89 t
.ok((typeof(e
.mouse().page
) === 'object'), 'checking that mouse().page is an object');
90 t
.ok((typeof(e
.mouse().page
.x
) === 'number'), 'checking that mouse().page.x is a number');
91 t
.ok((typeof(e
.mouse().page
.y
) === 'number'), 'checking that mouse().page.y is a number');
92 t
.ok((typeof(e
.mouse().client
) === 'object'), 'checking that mouse().client is an object');
93 t
.ok((typeof(e
.mouse().client
.x
) === 'number'), 'checking that mouse().client.x is a number');
94 t
.ok((typeof(e
.mouse().client
.y
) === 'number'), 'checking that mouse().client.y is a number');
96 /* these should not be defined */
97 t
.ok((typeof(e
.relatedTarget()) === 'undefined'), 'checking that relatedTarget() is undefined');
98 t
.ok((typeof(e
.key()) === 'undefined'), 'checking that key() is undefined');
102 ident
= connect('submit', 'onmousedown', eventTest
);
103 triggerMouseEvent('submit', 'mousedown', false);
104 t
.is(i
, 3, 'Connecting an event to an HTML object and firing a synthetic event');
107 triggerMouseEvent('submit', 'mousedown', false);
108 t
.is(i
, 3, 'Disconnecting an event to an HTML object and firing a synthetic event');
116 var hasNoSignals
= {};
118 var hasSignals
= {someVar
: 1};
122 var aFunction = function() {
124 if (typeof(this.someVar
) != 'undefined') {
129 var bFunction = function(someArg
, someOtherArg
) {
130 i
+= someArg
+ someOtherArg
;
135 aObject
.aMethod = function() {
139 aObject
.bMethod = function() {
144 bObject
.bMethod = function() {
149 ident
= connect(hasSignals
, 'signalOne', aFunction
);
150 signal(hasSignals
, 'signalOne');
151 t
.is(i
, 2, 'Connecting function');
155 signal(hasSignals
, 'signalOne');
156 t
.is(i
, 0, 'New style disconnecting function');
160 ident
= connect(hasSignals
, 'signalOne', bFunction
);
161 signal(hasSignals
, 'signalOne', 1, 2);
162 t
.is(i
, 3, 'Connecting function');
166 signal(hasSignals
, 'signalOne', 1, 2);
167 t
.is(i
, 0, 'New style disconnecting function');
171 connect(hasSignals
, 'signalOne', aFunction
);
172 signal(hasSignals
, 'signalOne');
173 t
.is(i
, 2, 'Connecting function');
176 disconnect(hasSignals
, 'signalOne', aFunction
);
177 signal(hasSignals
, 'signalOne');
178 t
.is(i
, 0, 'Old style disconnecting function');
182 ident
= connect(hasSignals
, 'signalOne', aObject
, aObject
.aMethod
);
183 signal(hasSignals
, 'signalOne');
184 t
.is(i
, 1, 'Connecting obj-function');
188 signal(hasSignals
, 'signalOne');
189 t
.is(i
, 0, 'New style disconnecting obj-function');
192 connect(hasSignals
, 'signalOne', aObject
, aObject
.aMethod
);
193 signal(hasSignals
, 'signalOne');
194 t
.is(i
, 1, 'Connecting obj-function');
197 disconnect(hasSignals
, 'signalOne', aObject
, aObject
.aMethod
);
198 signal(hasSignals
, 'signalOne');
199 t
.is(i
, 0, 'Disconnecting obj-function');
203 ident
= connect(hasSignals
, 'signalTwo', aObject
, 'aMethod');
204 signal(hasSignals
, 'signalTwo');
205 t
.is(i
, 1, 'Connecting obj-string');
209 signal(hasSignals
, 'signalTwo');
210 t
.is(i
, 0, 'New style disconnecting obj-string');
214 connect(hasSignals
, 'signalTwo', aObject
, 'aMethod');
215 signal(hasSignals
, 'signalTwo');
216 t
.is(i
, 1, 'Connecting obj-string');
219 disconnect(hasSignals
, 'signalTwo', aObject
, 'aMethod');
220 signal(hasSignals
, 'signalTwo');
221 t
.is(i
, 0, 'Old style disconnecting obj-string');
225 var shouldRaise = function() { return undefined.attr
; };
228 connect(hasSignals
, 'signalOne', shouldRaise
);
229 signal(hasSignals
, 'signalOne');
230 t
.ok(false, 'An exception was not raised');
232 t
.ok(true, 'An exception was raised');
234 disconnect(hasSignals
, 'signalOne', shouldRaise
);
235 t
.is(i
, 0, 'Exception raised, signal should not have fired');
239 connect(hasSignals
, 'signalOne', aObject
, 'aMethod');
240 connect(hasSignals
, 'signalOne', aObject
, 'bMethod');
241 signal(hasSignals
, 'signalOne');
242 t
.is(i
, 2, 'Connecting one signal to two slots in one object');
245 disconnect(hasSignals
, 'signalOne', aObject
, 'aMethod');
246 disconnect(hasSignals
, 'signalOne', aObject
, 'bMethod');
247 signal(hasSignals
, 'signalOne');
248 t
.is(i
, 0, 'Disconnecting one signal from two slots in one object');
252 connect(hasSignals
, 'signalOne', aObject
, 'aMethod');
253 connect(hasSignals
, 'signalOne', bObject
, 'bMethod');
254 signal(hasSignals
, 'signalOne');
255 t
.is(i
, 2, 'Connecting one signal to two slots in two objects');
258 disconnect(hasSignals
, 'signalOne', aObject
, 'aMethod');
259 disconnect(hasSignals
, 'signalOne', bObject
, 'bMethod');
260 signal(hasSignals
, 'signalOne');
261 t
.is(i
, 0, 'Disconnecting one signal from two slots in two objects');
266 connect(nothing
, 'signalOne', aObject
, 'aMethod');
267 signal(nothing
, 'signalOne');
268 t
.ok(false, 'An exception was not raised when connecting undefined');
270 t
.ok(true, 'An exception was raised when connecting undefined');
274 disconnect(nothing
, 'signalOne', aObject
, 'aMethod');
275 t
.ok(false, 'An exception was not raised when disconnecting undefined');
277 t
.ok(true, 'An exception was raised when disconnecting undefined');
282 connect(hasSignals
, 'signalOne', nothing
);
283 signal(hasSignals
, 'signalOne');
284 t
.ok(false, 'An exception was not raised when connecting an undefined function');
286 t
.ok(true, 'An exception was raised when connecting an undefined function');
290 disconnect(hasSignals
, 'signalOne', nothing
);
291 t
.ok(false, 'An exception was not raised when disconnecting an undefined function');
293 t
.ok(true, 'An exception was raised when disconnecting an undefined function');
298 connect(hasSignals
, 'signalOne', aObject
, aObject
.nothing
);
299 signal(hasSignals
, 'signalOne');
300 t
.ok(false, 'An exception was not raised when connecting an undefined method');
302 t
.ok(true, 'An exception was raised when connecting an undefined method');
306 connect(hasSignals
, 'signalOne', aObject
, 'nothing');
307 signal(hasSignals
, 'signalOne');
308 t
.ok(false, 'An exception was not raised when connecting an undefined method (as string)');
310 t
.ok(true, 'An exception was raised when connecting an undefined method (as string)');
313 t
.is(i
, 0, 'Signals should not have fired');
315 connect(hasSignals
, 'signalOne', aFunction
);
316 connect(hasSignals
, 'signalOne', aObject
, 'aMethod');
317 disconnectAll(hasSignals
, 'signalOne');
318 signal(hasSignals
, 'signalOne');
319 t
.is(i
, 0, 'disconnectAll works with single explicit signal');
322 connect(hasSignals
, 'signalOne', aFunction
);
323 connect(hasSignals
, 'signalOne', aObject
, 'aMethod');
324 connect(hasSignals
, 'signalTwo', aFunction
);
325 connect(hasSignals
, 'signalTwo', aObject
, 'aMethod');
326 disconnectAll(hasSignals
, 'signalOne');
327 signal(hasSignals
, 'signalOne');
328 t
.is(i
, 0, 'disconnectAll works with single explicit signal');
329 signal(hasSignals
, 'signalTwo');
330 t
.is(i
, 3, 'disconnectAll does not disconnect unrelated signals');
333 connect(hasSignals
, 'signalOne', aFunction
);
334 connect(hasSignals
, 'signalOne', aObject
, 'aMethod');
335 connect(hasSignals
, 'signalTwo', aFunction
);
336 connect(hasSignals
, 'signalTwo', aObject
, 'aMethod');
337 disconnectAll(hasSignals
, 'signalOne', 'signalTwo');
338 signal(hasSignals
, 'signalOne');
339 signal(hasSignals
, 'signalTwo');
340 t
.is(i
, 0, 'disconnectAll works with two explicit signals');
343 connect(hasSignals
, 'signalOne', aFunction
);
344 connect(hasSignals
, 'signalOne', aObject
, 'aMethod');
345 connect(hasSignals
, 'signalTwo', aFunction
);
346 connect(hasSignals
, 'signalTwo', aObject
, 'aMethod');
347 disconnectAll(hasSignals
, ['signalOne', 'signalTwo']);
348 signal(hasSignals
, 'signalOne');
349 signal(hasSignals
, 'signalTwo');
350 t
.is(i
, 0, 'disconnectAll works with two explicit signals as a list');
353 connect(hasSignals
, 'signalOne', aFunction
);
354 connect(hasSignals
, 'signalOne', aObject
, 'aMethod');
355 connect(hasSignals
, 'signalTwo', aFunction
);
356 connect(hasSignals
, 'signalTwo', aObject
, 'aMethod');
357 disconnectAll(hasSignals
);
358 signal(hasSignals
, 'signalOne');
359 signal(hasSignals
, 'signalTwo');
360 t
.is(i
, 0, 'disconnectAll works with implicit signals');
363 var toggle = function() {
364 disconnectAll(hasSignals
, 'signalOne');
365 connect(hasSignals
, 'signalOne', aFunction
);
369 connect(hasSignals
, 'signalOne', aFunction
);
370 connect(hasSignals
, 'signalTwo', function() { i
++; });
371 connect(hasSignals
, 'signalTwo', toggle
);
372 connect(hasSignals
, 'signalTwo', function() { i
++; }); // #147
373 connect(hasSignals
, 'signalTwo', function() { i
++; });
374 signal(hasSignals
, 'signalTwo');
375 t
.is(i
, 4, 'disconnectAll fired in a signal loop works');
377 disconnectAll('signalOne');
378 disconnectAll('signalTwo');