/tst/Model-suite.js

http://github.com/petermichaux/maria · JavaScript · 408 lines · 352 code · 55 blank · 1 comment · 0 complexity · 1d023c3d409dc4ed4eaa4ded3ee784ea MD5 · raw file

  1. (function () {
  2. buster.testCase('Model Suite', {
  3. "test Model has superConstructor evento.EventTarget": function () {
  4. assert.same(evento.EventTarget, maria.Model.superConstructor);
  5. },
  6. "test models have EventTarget interface": function () {
  7. var m = new maria.Model();
  8. assert.isFunction(m.addEventListener, 'should have addEventListener');
  9. assert.isFunction(m.removeEventListener, 'should have removeEventListener');
  10. assert.isFunction(m.dispatchEvent, 'should have dispatchEvent');
  11. assert.isFunction(m.addParentEventTarget, 'should have addParentEventTarget');
  12. assert.isFunction(m.removeParentEventTarget, 'should have removeParentEventTarget');
  13. },
  14. "test models dispatch a destroy event when destroy method is called": function () {
  15. var m = new maria.Model();
  16. var called = false;
  17. m.addEventListener('destroy', function () {called = true;});
  18. m.destroy();
  19. assert.same(true, called);
  20. },
  21. "test reset calls only methods with 'reset' prefix": function () {
  22. var m = new maria.Model();
  23. var getACalled = false,
  24. resetACalled = false,
  25. resetBCalled = false;
  26. m.getA = function () {
  27. getACalled = true;
  28. };
  29. m.resetA = function () {
  30. resetACalled = true;
  31. };
  32. m.resetB = function () {
  33. resetBCalled = true;
  34. };
  35. m.reset();
  36. assert.same(false, getACalled, 'getA method should not have been called');
  37. assert.same(true, resetACalled, 'resetA method should have been called');
  38. assert.same(true, resetBCalled, 'resetB method should have been called');
  39. },
  40. "test toJSON calls only methods with 'ToJSON' suffix": function () {
  41. var m = new maria.Model();
  42. var getACalled = false,
  43. aToJSONCalled = false,
  44. bToJSONCalled = false;
  45. m.getA = function () {
  46. getACalled = true;
  47. };
  48. m.aToJSON = function () {
  49. aToJSONCalled = true;
  50. };
  51. m.bToJSON = function () {
  52. bToJSONCalled = true;
  53. };
  54. m.toJSON();
  55. assert.same(false, getACalled, 'getA method should not have been called');
  56. assert.same(true, aToJSONCalled, 'aToJSON method should have been called');
  57. assert.same(true, bToJSONCalled, 'bToJSON method should have been called');
  58. },
  59. "test toJSON produces object suitable to be serialized to JSON": function () {
  60. var m = new maria.Model();
  61. m.aToJSON = function () {
  62. return "123";
  63. };
  64. m.bToJSON = function () {
  65. return 456;
  66. };
  67. var obj = m.toJSON();
  68. assert.same(obj.a, "123");
  69. assert.same(obj.b, 456);
  70. },
  71. "test fromJSON calls only methods with 'FromJSON' suffix": function () {
  72. var m = new maria.Model();
  73. var getACalled = false,
  74. aFromJSONCalled = false,
  75. bFromJSONCalled = false,
  76. cFromJSONCalled = false,
  77. a,
  78. b;
  79. m.getA = function () {
  80. getACalled = true;
  81. };
  82. m.aFromJSON = function (val) {
  83. aFromJSONCalled = true;
  84. a = val;
  85. };
  86. m.bFromJSON = function (val) {
  87. bFromJSONCalled = true;
  88. b = val;
  89. };
  90. m.cFromJSON = function () {
  91. bFromJSONCalled = true;
  92. };
  93. var obj = m.fromJSON({
  94. a: 1,
  95. b: 2
  96. });
  97. assert.same(false, getACalled, 'getA method should not have been called');
  98. assert.same(true, aFromJSONCalled, 'aFromJSON method should have been called');
  99. assert.same(1, a, 'aFromJSON method was not called with correct value');
  100. assert.same(true, bFromJSONCalled, 'bFromJSON method should have been called');
  101. assert.same(2, b, 'bFromJSON method was not called with the correct value');
  102. assert.same(false, cFromJSONCalled, 'cFromJSON method should not have been called');
  103. },
  104. "test class-level fromJSON": function () {
  105. var a;
  106. maria.Model.prototype.aFromJSON = function (val) {
  107. a = val;
  108. };
  109. var m = maria.Model.fromJSON({
  110. a: 44
  111. });
  112. assert.same(44, a, 'a not set correctly');
  113. delete maria.Model.prototype.aFromJSON;
  114. },
  115. "test maria.mixinAttribute": function () {
  116. var m = new maria.Model();
  117. maria.mixinAttribute(m, 'name', {
  118. guard: function (value) {
  119. // coerce any input to string
  120. return '' + value;
  121. }
  122. });
  123. assert.same(m.getName(), undefined);
  124. m.setName('Adam');
  125. assert.same(m.getName(), 'Adam');
  126. m.resetName();
  127. assert.same(m.getName(), undefined);
  128. m.setName(123);
  129. assert.same(m.getName(), '123');
  130. },
  131. "test maria.mixinBooleanAttribute": function () {
  132. var m = new maria.Model();
  133. maria.mixinBooleanAttribute(m, 'agreed');
  134. assert.same(m.getAgreed(), false);
  135. m.setAgreed(true);
  136. assert.same(m.getAgreed(), true);
  137. assert.same(m.isAgreed(), true);
  138. m.resetAgreed();
  139. assert.same(m.getAgreed(), false);
  140. assert.same(m.agreedToJSON(), false);
  141. m.agreedFromJSON(true);
  142. assert.same(m.agreedToJSON(), true);
  143. m.toggleAgreed();
  144. assert.same(m.agreedToJSON(), false);
  145. },
  146. "test maria.mixinStringAttribute": function () {
  147. var m = new maria.Model();
  148. maria.mixinStringAttribute(m, 'color');
  149. assert.same(m.getColor(), '');
  150. m.setColor('red');
  151. assert.same(m.getColor(), 'red');
  152. m.setColor(' green ');
  153. assert.same(m.getColor(), ' green ');
  154. assert.exception(function () {
  155. m.setColor(123);
  156. });
  157. },
  158. "test maria.mixinStringAttribute coerce": function () {
  159. var m = new maria.Model();
  160. maria.mixinStringAttribute(m, 'color', {
  161. 'default': 'red',
  162. coerce: true
  163. });
  164. assert.same(m.getColor(), 'red');
  165. m.setColor(123);
  166. assert.same(m.getColor(), '123');
  167. },
  168. "test maria.mixinStringAttribute trim": function () {
  169. var m = new maria.Model();
  170. maria.mixinStringAttribute(m, 'color', {
  171. 'default': 'red',
  172. trim: true
  173. });
  174. assert.same(m.getColor(), 'red');
  175. m.setColor(' blue ');
  176. assert.same(m.getColor(), 'blue');
  177. },
  178. "test maria.mixinStringAttribute enumeration": function () {
  179. var m = new maria.Model();
  180. maria.mixinStringAttribute(m, 'color', {
  181. 'default': 'red',
  182. enumeration: ['red', 'green', 'blue']
  183. });
  184. assert.same(m.getColor(), 'red');
  185. m.setColor('green');
  186. assert.same(m.getColor(), 'green');
  187. m.resetColor();
  188. assert.same(m.getColor(), 'red');
  189. assert.exception(function () {
  190. m.setColor('purple');
  191. });
  192. },
  193. "test maria.mixinStringAttribute maxlen": function () {
  194. var m = new maria.Model();
  195. maria.mixinStringAttribute(m, 'color', {
  196. 'default': 'red',
  197. maxlen: 4
  198. });
  199. assert.same(m.getColor(), 'red');
  200. m.setColor('blue');
  201. assert.same(m.getColor(), 'blue');
  202. assert.exception(function () {
  203. m.setColor('green');
  204. });
  205. },
  206. "test maria.mixinStringAttribute minlen": function () {
  207. var m = new maria.Model();
  208. maria.mixinStringAttribute(m, 'color', {
  209. 'default': 'blue',
  210. minlen: 4
  211. });
  212. assert.same(m.getColor(), 'blue');
  213. m.setColor('green');
  214. assert.same(m.getColor(), 'green');
  215. assert.exception(function () {
  216. m.setColor('red');
  217. });
  218. },
  219. "test maria.mixinStringAttribute blank": function () {
  220. var m = new maria.Model();
  221. maria.mixinStringAttribute(m, 'color', {
  222. 'default': 'blue',
  223. blank: false
  224. });
  225. assert.same(m.getColor(), 'blue');
  226. m.setColor('green');
  227. assert.same(m.getColor(), 'green');
  228. assert.exception(function () {
  229. m.setColor('');
  230. });
  231. },
  232. "test maria.mixinStringAttribute regexp": function () {
  233. var m = new maria.Model();
  234. maria.mixinStringAttribute(m, 'color', {
  235. 'default': 'blue',
  236. regexp: /red|blue/
  237. });
  238. assert.same(m.getColor(), 'blue');
  239. m.setColor('red');
  240. assert.same(m.getColor(), 'red');
  241. assert.exception(function () {
  242. m.setColor('green');
  243. });
  244. },
  245. "test maria.mixinNumberAttribute": function () {
  246. var m = new maria.Model();
  247. maria.mixinNumberAttribute(m, 'height');
  248. assert.same(m.getHeight(), 0);
  249. m.setHeight(123);
  250. assert.same(m.getHeight(), 123);
  251. assert.exception(function () {
  252. m.setHeight('red');
  253. });
  254. },
  255. "test maria.mixinNumberAttribute coerce": function () {
  256. var m = new maria.Model();
  257. maria.mixinNumberAttribute(m, 'height', {
  258. 'default': 123,
  259. coerce: true
  260. });
  261. assert.same(m.getHeight(), 123);
  262. m.setHeight('777');
  263. assert.same(m.getHeight(), 777);
  264. },
  265. "test maria.mixinNumberAttribute round": function () {
  266. var m = new maria.Model();
  267. maria.mixinNumberAttribute(m, 'height', {
  268. 'default': 123,
  269. round: true,
  270. integer: true
  271. });
  272. assert.same(m.getHeight(), 123);
  273. m.setHeight(333.3);
  274. assert.same(m.getHeight(), 333);
  275. },
  276. "test maria.mixinNumberAttribute floor": function () {
  277. var m = new maria.Model();
  278. maria.mixinNumberAttribute(m, 'height', {
  279. 'default': 123,
  280. floor: true,
  281. integer: true
  282. });
  283. assert.same(m.getHeight(), 123);
  284. m.setHeight(888.88);
  285. assert.same(m.getHeight(), 888);
  286. },
  287. "test maria.mixinNumberAttribute ceil": function () {
  288. var m = new maria.Model();
  289. maria.mixinNumberAttribute(m, 'height', {
  290. 'default': 123,
  291. ceil: true,
  292. integer: true
  293. });
  294. assert.same(m.getHeight(), 123);
  295. m.setHeight(444.44);
  296. assert.same(m.getHeight(), 445);
  297. },
  298. "test maria.mixinNumberAttribute integer": function () {
  299. var m = new maria.Model();
  300. maria.mixinNumberAttribute(m, 'height', {
  301. 'default': 456,
  302. integer: true
  303. });
  304. assert.same(m.getHeight(), 456);
  305. m.setHeight(789);
  306. assert.same(m.getHeight(), 789);
  307. assert.exception(function () {
  308. m.setHeight(9.9);
  309. });
  310. },
  311. "test maria.mixinNumberAttribute enumeration": function () {
  312. var m = new maria.Model();
  313. maria.mixinNumberAttribute(m, 'height', {
  314. 'default': 123,
  315. enumeration: [123, 456, 789]
  316. });
  317. assert.same(m.getHeight(), 123);
  318. m.setHeight(789);
  319. assert.same(m.getHeight(), 789);
  320. m.resetHeight();
  321. assert.same(m.getHeight(), 123);
  322. assert.exception(function () {
  323. m.setHeight(111);
  324. });
  325. },
  326. "test maria.mixinNumberAttribute min": function () {
  327. var m = new maria.Model();
  328. maria.mixinNumberAttribute(m, 'height', {
  329. 'default': 456,
  330. min: 4
  331. });
  332. assert.same(m.getHeight(), 456);
  333. m.setHeight(789);
  334. assert.same(m.getHeight(), 789);
  335. assert.exception(function () {
  336. m.setHeight(3.9);
  337. });
  338. },
  339. "test maria.mixinNumberAttribute max": function () {
  340. var m = new maria.Model();
  341. maria.mixinNumberAttribute(m, 'height', {
  342. 'default': 1.3,
  343. max: 4
  344. });
  345. assert.same(m.getHeight(), 1.3);
  346. m.setHeight(2.2);
  347. assert.same(m.getHeight(), 2.2);
  348. assert.exception(function () {
  349. m.setHeight(4.1);
  350. });
  351. }
  352. });
  353. }());