PageRenderTime 47ms CodeModel.GetById 23ms RepoModel.GetById 1ms app.codeStats 0ms

/media/js/mochikit/tests/test_Signal.js

https://github.com/ccnmtl/smart_sa
JavaScript | 448 lines | 356 code | 82 blank | 10 comment | 20 complexity | 63bf404b878728d01ed41bafdef930df MD5 | raw file
Possible License(s): GPL-3.0
  1. if (typeof(dojo) != 'undefined') { dojo.require('MochiKit.Signal'); }
  2. if (typeof(JSAN) != 'undefined') { JSAN.use('MochiKit.Signal'); }
  3. if (typeof(tests) == 'undefined') { tests = {}; }
  4. tests.test_Signal = function (t) {
  5. var submit = MochiKit.DOM.getElement('submit');
  6. var ident = null;
  7. var i = 0;
  8. var aFunction = function() {
  9. t.ok(this === submit, "aFunction should have 'this' as submit");
  10. i++;
  11. if (typeof(this.someVar) != 'undefined') {
  12. i += this.someVar;
  13. }
  14. };
  15. var aObject = {};
  16. aObject.aMethod = function() {
  17. t.ok(this === aObject, "aMethod should have 'this' as aObject");
  18. i++;
  19. };
  20. ident = connect('submit', 'onclick', aFunction);
  21. MochiKit.DOM.getElement('submit').click();
  22. t.is(i, 1, 'HTML onclick event can be connected to a function');
  23. disconnect(ident);
  24. MochiKit.DOM.getElement('submit').click();
  25. t.is(i, 1, 'HTML onclick can be disconnected from a function');
  26. var submit = MochiKit.DOM.getElement('submit');
  27. ident = connect(submit, 'onclick', aFunction);
  28. submit.click();
  29. t.is(i, 2, 'Checking that a DOM element can be connected to a function');
  30. disconnect(ident);
  31. submit.click();
  32. t.is(i, 2, '...and then disconnected');
  33. if (MochiKit.DOM.getElement('submit').fireEvent ||
  34. (document.createEvent &&
  35. typeof(document.createEvent('MouseEvents').initMouseEvent) == 'function')) {
  36. /*
  37. Adapted from:
  38. http://www.devdaily.com/java/jwarehouse/jforum/tests/selenium/javascript/htmlutils.js.shtml
  39. License: Apache
  40. Copyright: Copyright 2004 ThoughtWorks, Inc
  41. */
  42. var triggerMouseEvent = function(element, eventType, canBubble) {
  43. element = MochiKit.DOM.getElement(element);
  44. canBubble = (typeof(canBubble) == 'undefined') ? true : canBubble;
  45. if (element.fireEvent) {
  46. var newEvt = document.createEventObject();
  47. newEvt.clientX = 1;
  48. newEvt.clientY = 1;
  49. newEvt.button = 1;
  50. element.fireEvent('on' + eventType, newEvt);
  51. } else if (document.createEvent && (typeof(document.createEvent('MouseEvents').initMouseEvent) == 'function')) {
  52. var evt = document.createEvent('MouseEvents');
  53. evt.initMouseEvent(eventType, canBubble, true, // event, bubbles, cancelable
  54. document.defaultView, 1, // view, # of clicks
  55. 1, 0, 0, 0, // screenX, screenY, clientX, clientY
  56. false, false, false, false, // ctrlKey, altKey, shiftKey, metaKey
  57. 0, null); // buttonCode, relatedTarget
  58. element.dispatchEvent(evt);
  59. }
  60. };
  61. var eventTest = function(e) {
  62. i++;
  63. t.ok((typeof(e.event()) === 'object'), 'checking that event() is an object');
  64. t.ok((typeof(e.type()) === 'string'), 'checking that type() is a string');
  65. t.ok((e.target() === MochiKit.DOM.getElement('submit')), 'checking that target is "submit"');
  66. t.ok((typeof(e.modifier()) === 'object'), 'checking that modifier() is an object');
  67. t.ok(e.modifier().alt === false, 'checking that modifier().alt is defined, but false');
  68. t.ok(e.modifier().ctrl === false, 'checking that modifier().ctrl is defined, but false');
  69. t.ok(e.modifier().meta === false, 'checking that modifier().meta is defined, but false');
  70. t.ok(e.modifier().shift === false, 'checking that modifier().shift is defined, but false');
  71. t.ok((typeof(e.mouse()) === 'object'), 'checking that mouse() is an object');
  72. t.ok((typeof(e.mouse().button) === 'object'), 'checking that mouse().button is an object');
  73. t.ok(e.mouse().button.left === true, 'checking that mouse().button.left is true');
  74. t.ok(e.mouse().button.middle === false, 'checking that mouse().button.middle is false');
  75. t.ok(e.mouse().button.right === false, 'checking that mouse().button.right is false');
  76. t.ok((typeof(e.mouse().page) === 'object'), 'checking that mouse().page is an object');
  77. t.ok((typeof(e.mouse().page.x) === 'number'), 'checking that mouse().page.x is a number');
  78. t.ok((typeof(e.mouse().page.y) === 'number'), 'checking that mouse().page.y is a number');
  79. t.ok((typeof(e.mouse().client) === 'object'), 'checking that mouse().client is an object');
  80. t.ok((typeof(e.mouse().client.x) === 'number'), 'checking that mouse().client.x is a number');
  81. t.ok((typeof(e.mouse().client.y) === 'number'), 'checking that mouse().client.y is a number');
  82. /* these should not be defined */
  83. t.ok((typeof(e.relatedTarget()) === 'undefined'), 'checking that relatedTarget() is undefined');
  84. t.ok((typeof(e.key()) === 'undefined'), 'checking that key() is undefined');
  85. };
  86. ident = connect('submit', 'onmousedown', eventTest);
  87. triggerMouseEvent('submit', 'mousedown', false);
  88. t.is(i, 3, 'Connecting an event to an HTML object and firing a synthetic event');
  89. disconnect(ident);
  90. triggerMouseEvent('submit', 'mousedown', false);
  91. t.is(i, 3, 'Disconnecting an event to an HTML object and firing a synthetic event');
  92. }
  93. // non-DOM tests
  94. var hasNoSignals = {};
  95. var hasSignals = {someVar: 1};
  96. var i = 0;
  97. var aFunction = function() {
  98. i++;
  99. if (typeof(this.someVar) != 'undefined') {
  100. i += this.someVar;
  101. }
  102. };
  103. var bFunction = function(someArg, someOtherArg) {
  104. i += someArg + someOtherArg;
  105. };
  106. var aObject = {};
  107. aObject.aMethod = function() {
  108. i++;
  109. };
  110. aObject.bMethod = function() {
  111. i++;
  112. };
  113. var bObject = {};
  114. bObject.bMethod = function() {
  115. i++;
  116. };
  117. ident = connect(hasSignals, 'signalOne', aFunction);
  118. signal(hasSignals, 'signalOne');
  119. t.is(i, 2, 'Connecting function');
  120. i = 0;
  121. disconnect(ident);
  122. signal(hasSignals, 'signalOne');
  123. t.is(i, 0, 'New style disconnecting function');
  124. i = 0;
  125. ident = connect(hasSignals, 'signalOne', bFunction);
  126. signal(hasSignals, 'signalOne', 1, 2);
  127. t.is(i, 3, 'Connecting function');
  128. i = 0;
  129. disconnect(ident);
  130. signal(hasSignals, 'signalOne', 1, 2);
  131. t.is(i, 0, 'New style disconnecting function');
  132. i = 0;
  133. connect(hasSignals, 'signalOne', aFunction);
  134. signal(hasSignals, 'signalOne');
  135. t.is(i, 2, 'Connecting function');
  136. i = 0;
  137. disconnect(hasSignals, 'signalOne', aFunction);
  138. signal(hasSignals, 'signalOne');
  139. t.is(i, 0, 'Old style disconnecting function');
  140. i = 0;
  141. ident = connect(hasSignals, 'signalOne', aObject, aObject.aMethod);
  142. signal(hasSignals, 'signalOne');
  143. t.is(i, 1, 'Connecting obj-function');
  144. i = 0;
  145. disconnect(ident);
  146. signal(hasSignals, 'signalOne');
  147. t.is(i, 0, 'New style disconnecting obj-function');
  148. i = 0;
  149. connect(hasSignals, 'signalOne', aObject, aObject.aMethod);
  150. signal(hasSignals, 'signalOne');
  151. t.is(i, 1, 'Connecting obj-function');
  152. i = 0;
  153. disconnect(hasSignals, 'signalOne', aObject, aObject.aMethod);
  154. signal(hasSignals, 'signalOne');
  155. t.is(i, 0, 'Disconnecting obj-function');
  156. i = 0;
  157. ident = connect(hasSignals, 'signalTwo', aObject, 'aMethod');
  158. signal(hasSignals, 'signalTwo');
  159. t.is(i, 1, 'Connecting obj-string');
  160. i = 0;
  161. disconnect(ident);
  162. signal(hasSignals, 'signalTwo');
  163. t.is(i, 0, 'New style disconnecting obj-string');
  164. i = 0;
  165. connect(hasSignals, 'signalTwo', aObject, 'aMethod');
  166. signal(hasSignals, 'signalTwo');
  167. t.is(i, 1, 'Connecting obj-string');
  168. i = 0;
  169. disconnect(hasSignals, 'signalTwo', aObject, 'aMethod');
  170. signal(hasSignals, 'signalTwo');
  171. t.is(i, 0, 'Old style disconnecting obj-string');
  172. i = 0;
  173. var shouldRaise = function() { return undefined.attr; };
  174. try {
  175. connect(hasSignals, 'signalOne', shouldRaise);
  176. signal(hasSignals, 'signalOne');
  177. t.ok(false, 'An exception was not raised');
  178. } catch (e) {
  179. t.ok(true, 'An exception was raised');
  180. }
  181. disconnect(hasSignals, 'signalOne', shouldRaise);
  182. t.is(i, 0, 'Exception raised, signal should not have fired');
  183. i = 0;
  184. connect(hasSignals, 'signalOne', aObject, 'aMethod');
  185. connect(hasSignals, 'signalOne', aObject, 'bMethod');
  186. signal(hasSignals, 'signalOne');
  187. t.is(i, 2, 'Connecting one signal to two slots in one object');
  188. i = 0;
  189. disconnect(hasSignals, 'signalOne', aObject, 'aMethod');
  190. disconnect(hasSignals, 'signalOne', aObject, 'bMethod');
  191. signal(hasSignals, 'signalOne');
  192. t.is(i, 0, 'Disconnecting one signal from two slots in one object');
  193. i = 0;
  194. connect(hasSignals, 'signalOne', aObject, 'aMethod');
  195. connect(hasSignals, 'signalOne', bObject, 'bMethod');
  196. signal(hasSignals, 'signalOne');
  197. t.is(i, 2, 'Connecting one signal to two slots in two objects');
  198. i = 0;
  199. disconnect(hasSignals, 'signalOne', aObject, 'aMethod');
  200. disconnect(hasSignals, 'signalOne', bObject, 'bMethod');
  201. signal(hasSignals, 'signalOne');
  202. t.is(i, 0, 'Disconnecting one signal from two slots in two objects');
  203. i = 0;
  204. try {
  205. connect(nothing, 'signalOne', aObject, 'aMethod');
  206. signal(nothing, 'signalOne');
  207. t.ok(false, 'An exception was not raised when connecting undefined');
  208. } catch (e) {
  209. t.ok(true, 'An exception was raised when connecting undefined');
  210. }
  211. try {
  212. disconnect(nothing, 'signalOne', aObject, 'aMethod');
  213. t.ok(false, 'An exception was not raised when disconnecting undefined');
  214. } catch (e) {
  215. t.ok(true, 'An exception was raised when disconnecting undefined');
  216. }
  217. try {
  218. connect(hasSignals, 'signalOne', nothing);
  219. signal(hasSignals, 'signalOne');
  220. t.ok(false, 'An exception was not raised when connecting an undefined function');
  221. } catch (e) {
  222. t.ok(true, 'An exception was raised when connecting an undefined function');
  223. }
  224. try {
  225. disconnect(hasSignals, 'signalOne', nothing);
  226. t.ok(false, 'An exception was not raised when disconnecting an undefined function');
  227. } catch (e) {
  228. t.ok(true, 'An exception was raised when disconnecting an undefined function');
  229. }
  230. try {
  231. connect(hasSignals, 'signalOne', aObject, aObject.nothing);
  232. signal(hasSignals, 'signalOne');
  233. t.ok(false, 'An exception was not raised when connecting an undefined method');
  234. } catch (e) {
  235. t.ok(true, 'An exception was raised when connecting an undefined method');
  236. }
  237. try {
  238. connect(hasSignals, 'signalOne', aObject, 'nothing');
  239. signal(hasSignals, 'signalOne');
  240. t.ok(false, 'An exception was not raised when connecting an undefined method (as string)');
  241. } catch (e) {
  242. t.ok(true, 'An exception was raised when connecting an undefined method (as string)');
  243. }
  244. t.is(i, 0, 'Signals should not have fired');
  245. connect(hasSignals, 'signalOne', aFunction);
  246. connect(hasSignals, 'signalOne', aObject, 'aMethod');
  247. disconnectAll(hasSignals, 'signalOne');
  248. signal(hasSignals, 'signalOne');
  249. t.is(i, 0, 'disconnectAll works with single explicit signal');
  250. i = 0;
  251. connect(hasSignals, 'signalOne', aFunction);
  252. connect(hasSignals, 'signalOne', aObject, 'aMethod');
  253. connect(hasSignals, 'signalTwo', aFunction);
  254. connect(hasSignals, 'signalTwo', aObject, 'aMethod');
  255. disconnectAll(hasSignals, 'signalOne');
  256. signal(hasSignals, 'signalOne');
  257. t.is(i, 0, 'disconnectAll works with single explicit signal');
  258. signal(hasSignals, 'signalTwo');
  259. t.is(i, 3, 'disconnectAll does not disconnect unrelated signals');
  260. i = 0;
  261. connect(hasSignals, 'signalOne', aFunction);
  262. connect(hasSignals, 'signalOne', aObject, 'aMethod');
  263. connect(hasSignals, 'signalTwo', aFunction);
  264. connect(hasSignals, 'signalTwo', aObject, 'aMethod');
  265. disconnectAll(hasSignals, 'signalOne', 'signalTwo');
  266. signal(hasSignals, 'signalOne');
  267. signal(hasSignals, 'signalTwo');
  268. t.is(i, 0, 'disconnectAll works with two explicit signals');
  269. i = 0;
  270. connect(hasSignals, 'signalOne', aFunction);
  271. connect(hasSignals, 'signalOne', aObject, 'aMethod');
  272. connect(hasSignals, 'signalTwo', aFunction);
  273. connect(hasSignals, 'signalTwo', aObject, 'aMethod');
  274. disconnectAll(hasSignals, ['signalOne', 'signalTwo']);
  275. signal(hasSignals, 'signalOne');
  276. signal(hasSignals, 'signalTwo');
  277. t.is(i, 0, 'disconnectAll works with two explicit signals as a list');
  278. i = 0;
  279. connect(hasSignals, 'signalOne', aFunction);
  280. connect(hasSignals, 'signalOne', aObject, 'aMethod');
  281. connect(hasSignals, 'signalTwo', aFunction);
  282. connect(hasSignals, 'signalTwo', aObject, 'aMethod');
  283. disconnectAll(hasSignals);
  284. signal(hasSignals, 'signalOne');
  285. signal(hasSignals, 'signalTwo');
  286. t.is(i, 0, 'disconnectAll works with implicit signals');
  287. i = 0;
  288. var toggle = function() {
  289. disconnectAll(hasSignals, 'signalOne');
  290. connect(hasSignals, 'signalOne', aFunction);
  291. i++;
  292. };
  293. connect(hasSignals, 'signalOne', aFunction);
  294. connect(hasSignals, 'signalTwo', function() { i++; });
  295. connect(hasSignals, 'signalTwo', toggle);
  296. connect(hasSignals, 'signalTwo', function() { i++; }); // #147
  297. connect(hasSignals, 'signalTwo', function() { i++; });
  298. signal(hasSignals, 'signalTwo');
  299. t.is(i, 4, 'disconnectAll fired in a signal loop works');
  300. i = 0;
  301. disconnectAll('signalOne');
  302. disconnectAll('signalTwo');
  303. var testfunc = function () { arguments.callee.count++; };
  304. testfunc.count = 0;
  305. var testObj = {
  306. methOne: function () { this.countOne++; }, countOne: 0,
  307. methTwo: function () { this.countTwo++; }, countTwo: 0
  308. };
  309. connect(hasSignals, 'signalOne', testfunc);
  310. connect(hasSignals, 'signalTwo', testfunc);
  311. signal(hasSignals, 'signalOne');
  312. signal(hasSignals, 'signalTwo');
  313. t.is(testfunc.count, 2, 'disconnectAllTo func precondition');
  314. disconnectAllTo(testfunc);
  315. signal(hasSignals, 'signalOne');
  316. signal(hasSignals, 'signalTwo');
  317. t.is(testfunc.count, 2, 'disconnectAllTo func');
  318. connect(hasSignals, 'signalOne', testObj, 'methOne');
  319. connect(hasSignals, 'signalTwo', testObj, 'methTwo');
  320. signal(hasSignals, 'signalOne');
  321. signal(hasSignals, 'signalTwo');
  322. t.is(testObj.countOne, 1, 'disconnectAllTo obj precondition');
  323. t.is(testObj.countTwo, 1, 'disconnectAllTo obj precondition');
  324. disconnectAllTo(testObj);
  325. signal(hasSignals, 'signalOne');
  326. signal(hasSignals, 'signalTwo');
  327. t.is(testObj.countOne, 1, 'disconnectAllTo obj');
  328. t.is(testObj.countTwo, 1, 'disconnectAllTo obj');
  329. testObj.countOne = testObj.countTwo = 0;
  330. connect(hasSignals, 'signalOne', testObj, 'methOne');
  331. connect(hasSignals, 'signalTwo', testObj, 'methTwo');
  332. disconnectAllTo(testObj, 'methOne');
  333. signal(hasSignals, 'signalOne');
  334. signal(hasSignals, 'signalTwo');
  335. t.is(testObj.countOne, 0, 'disconnectAllTo obj+str');
  336. t.is(testObj.countTwo, 1, 'disconnectAllTo obj+str');
  337. has__Connect = {
  338. count: 0,
  339. __connect__: function (ident) {
  340. this.count += arguments.length;
  341. disconnect(ident);
  342. }
  343. };
  344. connect(has__Connect, 'signalOne', aFunction);
  345. t.is(has__Connect.count, 3, '__connect__ is called when it exists');
  346. signal(has__Connect, 'signalOne');
  347. t.is(has__Connect.count, 3, '__connect__ can disconnect the signal');
  348. var events = {};
  349. var test_ident = connect(events, "test", function() {
  350. var fail_ident = connect(events, "fail", function () {
  351. events.failed = true;
  352. });
  353. disconnect(fail_ident);
  354. signal(events, "fail");
  355. });
  356. signal(events, "test");
  357. t.is(events.failed, undefined, 'disconnected slots do not fire');
  358. var sink = {f: function (ev) { this.ev = ev; }};
  359. var src = {};
  360. bindMethods(sink);
  361. connect(src, 'signal', sink.f);
  362. signal(src, 'signal', 'worked');
  363. t.is(sink.ev, 'worked', 'custom signal does not re-bind methods');
  364. };