/app/node_modules/underscore.string/test/test_underscore/arrays.js

https://bitbucket.org/jorritposthuma/inventory-counter-mobile · JavaScript · 166 lines · 139 code · 27 blank · 0 comment · 4 complexity · 86cad9f0ce59bfeca09765383d2bebcb MD5 · raw file

  1. $(document).ready(function() {
  2. module("Arrays");
  3. test("arrays: first", function() {
  4. equals(_.first([1,2,3]), 1, 'can pull out the first element of an array');
  5. equals(_([1, 2, 3]).first(), 1, 'can perform OO-style "first()"');
  6. equals(_.first([1,2,3], 0).join(', '), "", 'can pass an index to first');
  7. equals(_.first([1,2,3], 2).join(', '), '1, 2', 'can pass an index to first');
  8. equals(_.first([1,2,3], 5).join(', '), '1, 2, 3', 'can pass an index to first');
  9. var result = (function(){ return _.first(arguments); })(4, 3, 2, 1);
  10. equals(result, 4, 'works on an arguments object.');
  11. result = _.map([[1,2,3],[1,2,3]], _.first);
  12. equals(result.join(','), '1,1', 'works well with _.map');
  13. });
  14. test("arrays: rest", function() {
  15. var numbers = [1, 2, 3, 4];
  16. equals(_.rest(numbers).join(", "), "2, 3, 4", 'working rest()');
  17. equals(_.rest(numbers, 0).join(", "), "1, 2, 3, 4", 'working rest(0)');
  18. equals(_.rest(numbers, 2).join(', '), '3, 4', 'rest can take an index');
  19. var result = (function(){ return _(arguments).tail(); })(1, 2, 3, 4);
  20. equals(result.join(', '), '2, 3, 4', 'aliased as tail and works on arguments object');
  21. result = _.map([[1,2,3],[1,2,3]], _.rest);
  22. equals(_.flatten(result).join(','), '2,3,2,3', 'works well with _.map');
  23. });
  24. test("arrays: initial", function() {
  25. equals(_.initial([1,2,3,4,5]).join(", "), "1, 2, 3, 4", 'working initial()');
  26. equals(_.initial([1,2,3,4],2).join(", "), "1, 2", 'initial can take an index');
  27. var result = (function(){ return _(arguments).initial(); })(1, 2, 3, 4);
  28. equals(result.join(", "), "1, 2, 3", 'initial works on arguments object');
  29. result = _.map([[1,2,3],[1,2,3]], _.initial);
  30. equals(_.flatten(result).join(','), '1,2,1,2', 'initial works with _.map');
  31. });
  32. test("arrays: last", function() {
  33. equals(_.last([1,2,3]), 3, 'can pull out the last element of an array');
  34. equals(_.last([1,2,3], 0).join(', '), "", 'can pass an index to last');
  35. equals(_.last([1,2,3], 2).join(', '), '2, 3', 'can pass an index to last');
  36. equals(_.last([1,2,3], 5).join(', '), '1, 2, 3', 'can pass an index to last');
  37. var result = (function(){ return _(arguments).last(); })(1, 2, 3, 4);
  38. equals(result, 4, 'works on an arguments object');
  39. result = _.map([[1,2,3],[1,2,3]], _.last);
  40. equals(result.join(','), '3,3', 'works well with _.map');
  41. });
  42. test("arrays: compact", function() {
  43. equals(_.compact([0, 1, false, 2, false, 3]).length, 3, 'can trim out all falsy values');
  44. var result = (function(){ return _(arguments).compact().length; })(0, 1, false, 2, false, 3);
  45. equals(result, 3, 'works on an arguments object');
  46. });
  47. test("arrays: flatten", function() {
  48. if (window.JSON) {
  49. var list = [1, [2], [3, [[[4]]]]];
  50. equals(JSON.stringify(_.flatten(list)), '[1,2,3,4]', 'can flatten nested arrays');
  51. equals(JSON.stringify(_.flatten(list, true)), '[1,2,3,[[[4]]]]', 'can shallowly flatten nested arrays');
  52. var result = (function(){ return _.flatten(arguments); })(1, [2], [3, [[[4]]]]);
  53. equals(JSON.stringify(result), '[1,2,3,4]', 'works on an arguments object');
  54. }
  55. });
  56. test("arrays: without", function() {
  57. var list = [1, 2, 1, 0, 3, 1, 4];
  58. equals(_.without(list, 0, 1).join(', '), '2, 3, 4', 'can remove all instances of an object');
  59. var result = (function(){ return _.without(arguments, 0, 1); })(1, 2, 1, 0, 3, 1, 4);
  60. equals(result.join(', '), '2, 3, 4', 'works on an arguments object');
  61. var list = [{one : 1}, {two : 2}];
  62. ok(_.without(list, {one : 1}).length == 2, 'uses real object identity for comparisons.');
  63. ok(_.without(list, list[0]).length == 1, 'ditto.');
  64. });
  65. test("arrays: uniq", function() {
  66. var list = [1, 2, 1, 3, 1, 4];
  67. equals(_.uniq(list).join(', '), '1, 2, 3, 4', 'can find the unique values of an unsorted array');
  68. var list = [1, 1, 1, 2, 2, 3];
  69. equals(_.uniq(list, true).join(', '), '1, 2, 3', 'can find the unique values of a sorted array faster');
  70. var list = [{name:'moe'}, {name:'curly'}, {name:'larry'}, {name:'curly'}];
  71. var iterator = function(value) { return value.name; };
  72. equals(_.map(_.uniq(list, false, iterator), iterator).join(', '), 'moe, curly, larry', 'can find the unique values of an array using a custom iterator');
  73. var iterator = function(value) { return value +1; };
  74. var list = [1, 2, 2, 3, 4, 4];
  75. equals(_.uniq(list, true, iterator).join(', '), '1, 2, 3, 4', 'iterator works with sorted array');
  76. var result = (function(){ return _.uniq(arguments); })(1, 2, 1, 3, 1, 4);
  77. equals(result.join(', '), '1, 2, 3, 4', 'works on an arguments object');
  78. });
  79. test("arrays: intersection", function() {
  80. var stooges = ['moe', 'curly', 'larry'], leaders = ['moe', 'groucho'];
  81. equals(_.intersection(stooges, leaders).join(''), 'moe', 'can take the set intersection of two arrays');
  82. equals(_(stooges).intersection(leaders).join(''), 'moe', 'can perform an OO-style intersection');
  83. var result = (function(){ return _.intersection(arguments, leaders); })('moe', 'curly', 'larry');
  84. equals(result.join(''), 'moe', 'works on an arguments object');
  85. });
  86. test("arrays: union", function() {
  87. var result = _.union([1, 2, 3], [2, 30, 1], [1, 40]);
  88. equals(result.join(' '), '1 2 3 30 40', 'takes the union of a list of arrays');
  89. var result = _.union([1, 2, 3], [2, 30, 1], [1, 40, [1]]);
  90. equals(result.join(' '), '1 2 3 30 40 1', 'takes the union of a list of nested arrays');
  91. });
  92. test("arrays: difference", function() {
  93. var result = _.difference([1, 2, 3], [2, 30, 40]);
  94. equals(result.join(' '), '1 3', 'takes the difference of two arrays');
  95. var result = _.difference([1, 2, 3, 4], [2, 30, 40], [1, 11, 111]);
  96. equals(result.join(' '), '3 4', 'takes the difference of three arrays');
  97. });
  98. test('arrays: zip', function() {
  99. var names = ['moe', 'larry', 'curly'], ages = [30, 40, 50], leaders = [true];
  100. var stooges = _.zip(names, ages, leaders);
  101. equals(String(stooges), 'moe,30,true,larry,40,,curly,50,', 'zipped together arrays of different lengths');
  102. });
  103. test("arrays: indexOf", function() {
  104. var numbers = [1, 2, 3];
  105. numbers.indexOf = null;
  106. equals(_.indexOf(numbers, 2), 1, 'can compute indexOf, even without the native function');
  107. var result = (function(){ return _.indexOf(arguments, 2); })(1, 2, 3);
  108. equals(result, 1, 'works on an arguments object');
  109. equals(_.indexOf(null, 2), -1, 'handles nulls properly');
  110. var numbers = [10, 20, 30, 40, 50], num = 35;
  111. var index = _.indexOf(numbers, num, true);
  112. equals(index, -1, '35 is not in the list');
  113. numbers = [10, 20, 30, 40, 50]; num = 40;
  114. index = _.indexOf(numbers, num, true);
  115. equals(index, 3, '40 is in the list');
  116. numbers = [1, 40, 40, 40, 40, 40, 40, 40, 50, 60, 70]; num = 40;
  117. index = _.indexOf(numbers, num, true);
  118. equals(index, 1, '40 is in the list');
  119. });
  120. test("arrays: lastIndexOf", function() {
  121. var numbers = [1, 0, 1, 0, 0, 1, 0, 0, 0];
  122. numbers.lastIndexOf = null;
  123. equals(_.lastIndexOf(numbers, 1), 5, 'can compute lastIndexOf, even without the native function');
  124. equals(_.lastIndexOf(numbers, 0), 8, 'lastIndexOf the other element');
  125. var result = (function(){ return _.lastIndexOf(arguments, 1); })(1, 0, 1, 0, 0, 1, 0, 0, 0);
  126. equals(result, 5, 'works on an arguments object');
  127. equals(_.indexOf(null, 2), -1, 'handles nulls properly');
  128. });
  129. test("arrays: range", function() {
  130. equals(_.range(0).join(''), '', 'range with 0 as a first argument generates an empty array');
  131. equals(_.range(4).join(' '), '0 1 2 3', 'range with a single positive argument generates an array of elements 0,1,2,...,n-1');
  132. equals(_.range(5, 8).join(' '), '5 6 7', 'range with two arguments a & b, a<b generates an array of elements a,a+1,a+2,...,b-2,b-1');
  133. equals(_.range(8, 5).join(''), '', 'range with two arguments a & b, b<a generates an empty array');
  134. equals(_.range(3, 10, 3).join(' '), '3 6 9', 'range with three arguments a & b & c, c < b-a, a < b generates an array of elements a,a+c,a+2c,...,b - (multiplier of a) < c');
  135. equals(_.range(3, 10, 15).join(''), '3', 'range with three arguments a & b & c, c > b-a, a < b generates an array with a single element, equal to a');
  136. equals(_.range(12, 7, -2).join(' '), '12 10 8', 'range with three arguments a & b & c, a > b, c < 0 generates an array of elements a,a-c,a-2c and ends with the number not less than b');
  137. equals(_.range(0, -10, -1).join(' '), '0 -1 -2 -3 -4 -5 -6 -7 -8 -9', 'final example in the Python docs');
  138. });
  139. });