PageRenderTime 68ms CodeModel.GetById 33ms RepoModel.GetById 0ms app.codeStats 0ms

/test/unit/enumerable_test.js

https://github.com/wwag110465/prototype
JavaScript | 420 lines | 350 code | 66 blank | 4 comment | 12 complexity | 6064ffbdcec6da199cc82a6113c1dbfc MD5 | raw file
  1. function prime(value) {
  2. for (var i = 2; i < value; i++)
  3. if (value % i == 0) return false;
  4. return true;
  5. }
  6. new Test.Unit.Runner({
  7. testEachBreak: function() {
  8. var result = 0;
  9. Fixtures.Basic.each(function(value) {
  10. if ((result = value) == 2) throw $break;
  11. });
  12. this.assertEqual(2, result);
  13. },
  14. testEachReturnActsAsContinue: function() {
  15. var results = [];
  16. Fixtures.Basic.each(function(value) {
  17. if (value == 2) return;
  18. results.push(value);
  19. });
  20. this.assertEqual('1, 3', results.join(', '));
  21. },
  22. "test #each passes value, index and collection to the iterator": function() {
  23. var i = 0;
  24. Fixtures.Basic.each(function(value, index, collection) {
  25. this.assertIdentical(Fixtures.Basic[i], value);
  26. this.assertIdentical(i, index);
  27. this.assertIdentical(Fixtures.Basic, collection);
  28. i++;
  29. }, this);
  30. },
  31. testEachChaining: function() {
  32. this.assertEqual(Fixtures.Primes, Fixtures.Primes.each(Prototype.emptyFunction));
  33. this.assertEqual(3, Fixtures.Basic.each(Prototype.emptyFunction).length);
  34. },
  35. testEnumContext: function() {
  36. var results = [];
  37. Fixtures.Basic.each(function(value) {
  38. results.push(value * this.i);
  39. }, { i: 2 });
  40. this.assertEqual('2 4 6', results.join(' '));
  41. this.assert(Fixtures.Basic.all(function(value){
  42. return value >= this.min && value <= this.max;
  43. }, { min: 1, max: 3 }));
  44. this.assert(!Fixtures.Basic.all(function(value){
  45. return value >= this.min && value <= this.max;
  46. }));
  47. this.assert(Fixtures.Basic.any(function(value){
  48. return value == this.target_value;
  49. }, { target_value: 2 }));
  50. },
  51. testAny: function() {
  52. this.assert(!([].any()));
  53. this.assert([true, true, true].any());
  54. this.assert([true, false, false].any());
  55. this.assert(![false, false, false].any());
  56. this.assert(Fixtures.Basic.any(function(value) {
  57. return value > 2;
  58. }));
  59. this.assert(!Fixtures.Basic.any(function(value) {
  60. return value > 5;
  61. }));
  62. },
  63. "test #any passes value, index and collection to the iterator": function() {
  64. var i = 0;
  65. Fixtures.Basic.any(function(value, index, collection) {
  66. this.assertIdentical(Fixtures.Basic[i], value);
  67. this.assertIdentical(i, index);
  68. this.assertIdentical(Fixtures.Basic, collection);
  69. i++;
  70. // Iterate over all values
  71. return value > 5;
  72. }, this);
  73. },
  74. testAll: function() {
  75. this.assert([].all());
  76. this.assert([true, true, true].all());
  77. this.assert(![true, false, false].all());
  78. this.assert(![false, false, false].all());
  79. this.assert(Fixtures.Basic.all(function(value) {
  80. return value > 0;
  81. }));
  82. this.assert(!Fixtures.Basic.all(function(value) {
  83. return value > 1;
  84. }));
  85. },
  86. "test #all passes value, index and collection to the iterator": function() {
  87. var i = 0;
  88. Fixtures.Basic.all(function(value, index, collection) {
  89. this.assertIdentical(Fixtures.Basic[i], value);
  90. this.assertIdentical(i, index);
  91. this.assertIdentical(Fixtures.Basic, collection);
  92. i++;
  93. // Iterate over all values
  94. return value > 0;
  95. }, this);
  96. },
  97. testCollect: function() {
  98. this.assertEqual(Fixtures.Nicknames.join(', '),
  99. Fixtures.People.collect(function(person) {
  100. return person.nickname;
  101. }).join(", "));
  102. this.assertEqual(26, Fixtures.Primes.map().length);
  103. },
  104. "test #collect passes value, index and collection to the iterator": function() {
  105. var i = 0;
  106. Fixtures.Basic.collect(function(value, index, collection) {
  107. this.assertIdentical(Fixtures.Basic[i], value);
  108. this.assertIdentical(i, index);
  109. this.assertIdentical(Fixtures.Basic, collection);
  110. i++;
  111. return value;
  112. }, this);
  113. },
  114. testDetect: function() {
  115. this.assertEqual('Marcel Molina Jr.',
  116. Fixtures.People.detect(function(person) {
  117. return person.nickname.match(/no/);
  118. }).name);
  119. },
  120. "test #detect passes value, index and collection to the iterator": function() {
  121. var i = 0;
  122. Fixtures.Basic.detect(function(value, index, collection) {
  123. this.assertIdentical(Fixtures.Basic[i], value);
  124. this.assertIdentical(i, index);
  125. this.assertIdentical(Fixtures.Basic, collection);
  126. i++;
  127. // Iterate over all values
  128. return value > 5;
  129. }, this);
  130. },
  131. testEachSlice: function() {
  132. this.assertEnumEqual([], [].eachSlice(2));
  133. this.assertEqual(1, [1].eachSlice(1).length);
  134. this.assertEnumEqual([1], [1].eachSlice(1)[0]);
  135. this.assertEqual(2, Fixtures.Basic.eachSlice(2).length);
  136. this.assertEnumEqual(
  137. [3, 2, 1, 11, 7, 5, 19, 17, 13, 31, 29, 23, 43, 41, 37, 59, 53, 47, 71, 67, 61, 83, 79, 73, 97, 89],
  138. Fixtures.Primes.eachSlice( 3, function(slice){ return slice.reverse() }).flatten()
  139. );
  140. this.assertEnumEqual(Fixtures.Basic, Fixtures.Basic.eachSlice(-10));
  141. this.assertEnumEqual(Fixtures.Basic, Fixtures.Basic.eachSlice(0));
  142. this.assertNotIdentical(Fixtures.Basic, Fixtures.Basic.eachSlice(0));
  143. },
  144. testEachWithIndex: function() {
  145. var nicknames = [], indexes = [];
  146. Fixtures.People.each(function(person, index) {
  147. nicknames.push(person.nickname);
  148. indexes.push(index);
  149. });
  150. this.assertEqual(Fixtures.Nicknames.join(', '),
  151. nicknames.join(', '));
  152. this.assertEqual('0, 1, 2, 3', indexes.join(', '));
  153. },
  154. testFindAll: function() {
  155. this.assertEqual(Fixtures.Primes.join(', '),
  156. Fixtures.Z.findAll(prime).join(', '));
  157. },
  158. "test #findAll passes value, index and collection to the iterator": function() {
  159. var i = 0;
  160. Fixtures.Basic.findAll(function(value, index, collection) {
  161. this.assertIdentical(Fixtures.Basic[i], value);
  162. this.assertIdentical(i, index);
  163. this.assertIdentical(Fixtures.Basic, collection);
  164. i++;
  165. return value > 5;
  166. }, this);
  167. },
  168. testGrep: function() {
  169. this.assertEqual('noradio, htonl',
  170. Fixtures.Nicknames.grep(/o/).join(", "));
  171. this.assertEqual('NORADIO, HTONL',
  172. Fixtures.Nicknames.grep(/o/, function(nickname) {
  173. return nickname.toUpperCase();
  174. }).join(", "))
  175. this.assertEnumEqual($('grepHeader', 'grepCell'),
  176. $('grepTable', 'grepTBody', 'grepRow', 'grepHeader', 'grepCell').grep(new Selector('.cell')));
  177. // troublesome characters
  178. this.assertEnumEqual(['?a', 'c?'], ['?a','b','c?'].grep('?'));
  179. this.assertEnumEqual(['*a', 'c*'], ['*a','b','c*'].grep('*'));
  180. this.assertEnumEqual(['+a', 'c+'], ['+a','b','c+'].grep('+'));
  181. this.assertEnumEqual(['{1}a', 'c{1}'], ['{1}a','b','c{1}'].grep('{1}'));
  182. this.assertEnumEqual(['(a', 'c('], ['(a','b','c('].grep('('));
  183. this.assertEnumEqual(['|a', 'c|'], ['|a','b','c|'].grep('|'));
  184. },
  185. "test #grep passes value, index and collection to the iterator": function() {
  186. var i = 0;
  187. Fixtures.Basic.grep(/\d/, function(value, index, collection) {
  188. this.assertIdentical(Fixtures.Basic[i], value);
  189. this.assertIdentical(i, index);
  190. this.assertIdentical(Fixtures.Basic, collection);
  191. i++;
  192. return value;
  193. }, this);
  194. },
  195. testInclude: function() {
  196. this.assert(Fixtures.Nicknames.include('sam-'));
  197. this.assert(Fixtures.Nicknames.include('noradio'));
  198. this.assert(!Fixtures.Nicknames.include('gmosx'));
  199. this.assert(Fixtures.Basic.include(2));
  200. this.assert(Fixtures.Basic.include('2'));
  201. this.assert(!Fixtures.Basic.include('4'));
  202. },
  203. testInGroupsOf: function() {
  204. this.assertEnumEqual([], [].inGroupsOf(3));
  205. var arr = [1, 2, 3, 4, 5, 6].inGroupsOf(3);
  206. this.assertEqual(2, arr.length);
  207. this.assertEnumEqual([1, 2, 3], arr[0]);
  208. this.assertEnumEqual([4, 5, 6], arr[1]);
  209. arr = [1, 2, 3, 4, 5, 6].inGroupsOf(4);
  210. this.assertEqual(2, arr.length);
  211. this.assertEnumEqual([1, 2, 3, 4], arr[0]);
  212. this.assertEnumEqual([5, 6, null, null], arr[1]);
  213. var basic = Fixtures.Basic
  214. arr = basic.inGroupsOf(4,'x');
  215. this.assertEqual(1, arr.length);
  216. this.assertEnumEqual([1, 2, 3, 'x'], arr[0]);
  217. this.assertEnumEqual([1,2,3,'a'], basic.inGroupsOf(2, 'a').flatten());
  218. arr = basic.inGroupsOf(5, '');
  219. this.assertEqual(1, arr.length);
  220. this.assertEnumEqual([1, 2, 3, '', ''], arr[0]);
  221. this.assertEnumEqual([1,2,3,0], basic.inGroupsOf(2, 0).flatten());
  222. this.assertEnumEqual([1,2,3,false], basic.inGroupsOf(2, false).flatten());
  223. },
  224. testInject: function() {
  225. this.assertEqual(1061,
  226. Fixtures.Primes.inject(0, function(sum, value) {
  227. return sum + value;
  228. }));
  229. },
  230. "test #inject passes memo, value, index and collection to the iterator": function() {
  231. var i = 0;
  232. Fixtures.Basic.inject(0, function(memo, value, index, collection) {
  233. this.assertIdentical(Fixtures.Basic[i], value);
  234. this.assertIdentical(i, index);
  235. this.assertIdentical(Fixtures.Basic, collection);
  236. i++;
  237. return memo + value;
  238. }, this);
  239. },
  240. testInvoke: function() {
  241. var result = [[2, 1, 3], [6, 5, 4]].invoke('sort');
  242. this.assertEqual(2, result.length);
  243. this.assertEqual('1, 2, 3', result[0].join(', '));
  244. this.assertEqual('4, 5, 6', result[1].join(', '));
  245. result = result.invoke('invoke', 'toString', 2);
  246. this.assertEqual('1, 10, 11', result[0].join(', '));
  247. this.assertEqual('100, 101, 110', result[1].join(', '));
  248. },
  249. testMax: function() {
  250. this.assertEqual(100, Fixtures.Z.max());
  251. this.assertEqual(97, Fixtures.Primes.max());
  252. this.assertEqual(2, [ -9, -8, -7, -6, -4, -3, -2, 0, -1, 2 ].max());
  253. this.assertEqual('sam-', Fixtures.Nicknames.max()); // ?s > ?U
  254. },
  255. "test #max passes value, index and collection to the iterator": function() {
  256. var i = 0;
  257. Fixtures.Basic.max(function(value, index, collection) {
  258. this.assertIdentical(Fixtures.Basic[i], value);
  259. this.assertIdentical(i, index);
  260. this.assertIdentical(Fixtures.Basic, collection);
  261. i++;
  262. return value;
  263. }, this);
  264. },
  265. testMin: function() {
  266. this.assertEqual(1, Fixtures.Z.min());
  267. this.assertEqual(0, [ 1, 2, 3, 4, 5, 6, 7, 8, 0, 9 ].min());
  268. this.assertEqual('Ulysses', Fixtures.Nicknames.min()); // ?U < ?h
  269. },
  270. "test #min passes value, index and collection to the iterator": function() {
  271. var i = 0;
  272. Fixtures.Basic.min(function(value, index, collection) {
  273. this.assertIdentical(Fixtures.Basic[i], value);
  274. this.assertIdentical(i, index);
  275. this.assertIdentical(Fixtures.Basic, collection);
  276. i++;
  277. return value;
  278. }, this);
  279. },
  280. testPartition: function() {
  281. var result = Fixtures.People.partition(function(person) {
  282. return person.name.length < 15;
  283. }).invoke('pluck', 'nickname');
  284. this.assertEqual(2, result.length);
  285. this.assertEqual('sam-, htonl', result[0].join(', '));
  286. this.assertEqual('noradio, Ulysses', result[1].join(', '));
  287. },
  288. "test #partition passes value, index and collection to the iterator": function() {
  289. var i = 0;
  290. Fixtures.Basic.partition(function(value, index, collection) {
  291. this.assertIdentical(Fixtures.Basic[i], value);
  292. this.assertIdentical(i, index);
  293. this.assertIdentical(Fixtures.Basic, collection);
  294. i++;
  295. return value < 2;
  296. }, this);
  297. },
  298. testPluck: function() {
  299. this.assertEqual(Fixtures.Nicknames.join(', '),
  300. Fixtures.People.pluck('nickname').join(', '));
  301. },
  302. testReject: function() {
  303. this.assertEqual(0,
  304. Fixtures.Nicknames.reject(Prototype.K).length);
  305. this.assertEqual('sam-, noradio, htonl',
  306. Fixtures.Nicknames.reject(function(nickname) {
  307. return nickname != nickname.toLowerCase();
  308. }).join(', '));
  309. },
  310. "test #reject passes value, index and collection to the iterator": function() {
  311. var i = 0;
  312. Fixtures.Basic.reject(function(value, index, collection) {
  313. this.assertIdentical(Fixtures.Basic[i], value);
  314. this.assertIdentical(i, index);
  315. this.assertIdentical(Fixtures.Basic, collection);
  316. i++;
  317. return value < 2;
  318. }, this);
  319. },
  320. testSortBy: function() {
  321. this.assertEqual('htonl, noradio, sam-, Ulysses',
  322. Fixtures.People.sortBy(function(value) {
  323. return value.nickname.toLowerCase();
  324. }).pluck('nickname').join(', '));
  325. },
  326. "test #sortBy passes value, index and collection to the iterator": function() {
  327. var i = 0;
  328. Fixtures.Basic.sortBy(function(value, index, collection) {
  329. this.assertIdentical(Fixtures.Basic[i], value);
  330. this.assertIdentical(i, index);
  331. this.assertIdentical(Fixtures.Basic, collection);
  332. i++;
  333. return value;
  334. }, this);
  335. },
  336. testToArray: function() {
  337. var result = Fixtures.People.toArray();
  338. this.assert(result != Fixtures.People); // they're different objects...
  339. this.assertEqual(Fixtures.Nicknames.join(', '),
  340. result.pluck('nickname').join(', ')); // but the values are the same
  341. },
  342. testZip: function() {
  343. var result = [1, 2, 3].zip([4, 5, 6], [7, 8, 9]);
  344. this.assertEqual('[[1, 4, 7], [2, 5, 8], [3, 6, 9]]', result.inspect());
  345. result = [1, 2, 3].zip([4, 5, 6], [7, 8, 9], function(array) { return array.reverse() });
  346. this.assertEqual('[[7, 4, 1], [8, 5, 2], [9, 6, 3]]', result.inspect());
  347. },
  348. testSize: function() {
  349. this.assertEqual(4, Fixtures.People.size());
  350. this.assertEqual(4, Fixtures.Nicknames.size());
  351. this.assertEqual(26, Fixtures.Primes.size());
  352. this.assertEqual(0, [].size());
  353. }
  354. });