151 lines
2.9 KiB
Plaintext
151 lines
2.9 KiB
Plaintext
'use strict';
|
|
|
|
var hasOwn = require('hasown');
|
|
|
|
module.exports = function (toSorted, t) {
|
|
var nums = [2, 1, 3];
|
|
var result = toSorted(nums);
|
|
t.deepEqual(
|
|
result,
|
|
[1, 2, 3],
|
|
'array is sorted'
|
|
);
|
|
t.notEqual(nums, result, 'original array is not returned');
|
|
t.deepEqual(nums, [2, 1, 3], 'original array is unchanged');
|
|
|
|
nums.sort();
|
|
t.deepEqual(nums, result, 'mutated original matches result');
|
|
|
|
t.deepEqual(
|
|
toSorted('acab'),
|
|
['a', 'a', 'b', 'c'],
|
|
'string sorts to array'
|
|
);
|
|
|
|
var halfPoo = '\uD83D';
|
|
var endPoo = '\uDCA9';
|
|
var poo = halfPoo + endPoo;
|
|
t.deepEqual(
|
|
toSorted('a' + poo + 'c'),
|
|
['a', 'c', halfPoo, endPoo],
|
|
'code point is sorted as expected'
|
|
);
|
|
|
|
var arrayLikeLengthValueOf = {
|
|
length: {
|
|
valueOf: function () { return 2; }
|
|
},
|
|
0: 4,
|
|
1: 0,
|
|
2: 1
|
|
};
|
|
t.deepEqual(toSorted(arrayLikeLengthValueOf), [0, 4]);
|
|
|
|
t.test('not positive integer lengths', function (st) {
|
|
st.deepEqual(toSorted({ length: -2 }), []);
|
|
st.deepEqual(toSorted({ length: 'dog' }), []);
|
|
st.deepEqual(toSorted({ length: NaN }), []);
|
|
|
|
st.end();
|
|
});
|
|
|
|
t.test('getters', { skip: !Object.defineProperty }, function (st) {
|
|
var getCalls = [];
|
|
|
|
var arrayLike = {
|
|
0: 2,
|
|
1: 1,
|
|
2: 3,
|
|
length: 3
|
|
};
|
|
Object.defineProperty(arrayLike, '0', {
|
|
get: function () {
|
|
getCalls.push(0);
|
|
return 2;
|
|
}
|
|
});
|
|
Object.defineProperty(arrayLike, '1', {
|
|
get: function () {
|
|
getCalls.push(1);
|
|
return 1;
|
|
}
|
|
});
|
|
Object.defineProperty(arrayLike, '2', {
|
|
get: function () {
|
|
getCalls.push(2);
|
|
return 3;
|
|
}
|
|
});
|
|
|
|
var up = { gross: true };
|
|
st['throws'](
|
|
function () {
|
|
toSorted(arrayLike, function () {
|
|
throw up;
|
|
});
|
|
},
|
|
up
|
|
);
|
|
st.deepEqual(getCalls, [0, 1, 2]);
|
|
|
|
var arr1 = [5, 0, 3];
|
|
Object.defineProperty(arr1, '0', {
|
|
get: function () {
|
|
arr1.push(1);
|
|
return 5;
|
|
}
|
|
});
|
|
st.deepEqual(toSorted(arr1), [0, 3, 5]);
|
|
|
|
var arr = [5, 1, 4, 6, 3];
|
|
Array.prototype[3] = 2; // eslint-disable-line no-extend-native
|
|
st.teardown(function () {
|
|
delete Array.prototype[3];
|
|
});
|
|
|
|
Object.defineProperty(arr, '2', {
|
|
get: function () {
|
|
arr.length = 1;
|
|
return 4;
|
|
}
|
|
});
|
|
|
|
st.deepEqual(toSorted(arr), [1, 2, 4, 5, undefined]);
|
|
|
|
st.end();
|
|
});
|
|
|
|
t.test('too-large lengths', function (st) {
|
|
var arrayLike = {
|
|
0: 0,
|
|
4294967295: 4294967295,
|
|
4294967296: 4294967296,
|
|
length: Math.pow(2, 32)
|
|
};
|
|
|
|
st['throws'](
|
|
function () { toSorted(arrayLike); },
|
|
RangeError
|
|
);
|
|
|
|
st.end();
|
|
});
|
|
|
|
t.deepEqual(toSorted(true), [], 'true yields empty array');
|
|
t.deepEqual(toSorted(false), [], 'false yields empty array');
|
|
|
|
t.test('holes', function (st) {
|
|
var arr = [3, /* hole */, 4, /* hole */, 1]; // eslint-disable-line no-sparse-arrays
|
|
Array.prototype[3] = 2; // eslint-disable-line no-extend-native
|
|
st.teardown(function () {
|
|
delete Array.prototype[3];
|
|
});
|
|
|
|
var sorted = toSorted(arr);
|
|
st.deepEqual(sorted, [1, 2, 3, 4, undefined]);
|
|
st.ok(hasOwn(sorted, 4));
|
|
|
|
st.end();
|
|
});
|
|
};
|