mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-24 16:17:29 +09:00
Issue #2551 - Add toSorted test and do some final tweaks to toSorted to be compliant
This commit is contained in:
parent
4edeca8c62
commit
d3764451e2
3 changed files with 119 additions and 6 deletions
|
|
@ -265,10 +265,9 @@ function ArrayToSorted(comparefn) {
|
||||||
var len = ToLength(O.length);
|
var len = ToLength(O.length);
|
||||||
|
|
||||||
var items = new List();
|
var items = new List();
|
||||||
var itemsLen = 0;
|
var itemsLen = len;
|
||||||
for (var k = 0; k < len; k++) {
|
for (var k = 0; k < len; k++) {
|
||||||
if (k in O)
|
items[k] = O[k];
|
||||||
items[itemsLen++] = O[k];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var wrappedCompareFn = comparefn;
|
var wrappedCompareFn = comparefn;
|
||||||
|
|
@ -303,9 +302,7 @@ function ArrayToSorted(comparefn) {
|
||||||
if (itemsLen > 1)
|
if (itemsLen > 1)
|
||||||
MergeSort(items, itemsLen, sortCompare);
|
MergeSort(items, itemsLen, sortCompare);
|
||||||
|
|
||||||
var A = ArraySpeciesCreate(O, 0);
|
var A = ArraySpeciesCreate(O, len);
|
||||||
A.length = len;
|
|
||||||
|
|
||||||
for (var j = 0; j < itemsLen; j++)
|
for (var j = 0; j < itemsLen; j++)
|
||||||
_DefineDataProperty(A, j, items[j]);
|
_DefineDataProperty(A, j, items[j]);
|
||||||
|
|
||||||
|
|
|
||||||
59
js/src/tests/ecma_6/Array/toSorted.html
Normal file
59
js/src/tests/ecma_6/Array/toSorted.html
Normal file
|
|
@ -0,0 +1,59 @@
|
||||||
|
<!doctype html>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Array.prototype.toSorted test</title>
|
||||||
|
<style>
|
||||||
|
body { font: 14px/1.4 sans-serif; padding: 16px; }
|
||||||
|
.pass { color: #0a0; }
|
||||||
|
.fail { color: #c00; }
|
||||||
|
pre { white-space: pre-wrap; }
|
||||||
|
</style>
|
||||||
|
<pre id="log"></pre>
|
||||||
|
<script>
|
||||||
|
(function() {
|
||||||
|
const log = document.getElementById("log");
|
||||||
|
function write(msg, cls) {
|
||||||
|
const line = document.createElement("div");
|
||||||
|
if (cls) line.className = cls;
|
||||||
|
line.textContent = msg;
|
||||||
|
log.appendChild(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
window.assertEq = function(actual, expected, msg) {
|
||||||
|
if (actual !== expected) {
|
||||||
|
throw new Error((msg ? msg + ": " : "") +
|
||||||
|
"expected " + expected + ", got " + actual);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
window.assertThrowsInstanceOf = function(fn, ctor, msg) {
|
||||||
|
let threw = false;
|
||||||
|
try {
|
||||||
|
fn();
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof ctor) {
|
||||||
|
threw = true;
|
||||||
|
} else {
|
||||||
|
throw new Error((msg ? msg + ": " : "") +
|
||||||
|
"threw " + e + ", expected " + ctor.name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!threw) {
|
||||||
|
throw new Error((msg ? msg + ": " : "") + "did not throw");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
window.reportCompare = function() {};
|
||||||
|
|
||||||
|
let hadError = false;
|
||||||
|
window.addEventListener("error", function(e) {
|
||||||
|
hadError = true;
|
||||||
|
write("FAIL: " + e.message, "fail");
|
||||||
|
});
|
||||||
|
window.addEventListener("load", function() {
|
||||||
|
write("PASS: toSorted.js loaded", "pass");
|
||||||
|
if (!hadError)
|
||||||
|
write("PASS: all toSorted tests passed", "pass");
|
||||||
|
});
|
||||||
|
})();
|
||||||
|
</script>
|
||||||
|
<script src="toSorted.js"></script>
|
||||||
57
js/src/tests/ecma_6/Array/toSorted.js
Normal file
57
js/src/tests/ecma_6/Array/toSorted.js
Normal file
|
|
@ -0,0 +1,57 @@
|
||||||
|
/* Any copyright is dedicated to the Public Domain.
|
||||||
|
* http://creativecommons.org/licenses/publicdomain/ */
|
||||||
|
|
||||||
|
assertEq(typeof Array.prototype.toSorted, "function");
|
||||||
|
|
||||||
|
// Non-mutating behavior.
|
||||||
|
let original = [3, 1, 2];
|
||||||
|
let sorted = original.toSorted();
|
||||||
|
assertEq(original !== sorted, true);
|
||||||
|
assertEq(original.join(","), "3,1,2");
|
||||||
|
assertEq(sorted.join(","), "1,2,3");
|
||||||
|
|
||||||
|
// Compare function.
|
||||||
|
let nums = [10, 1, 5];
|
||||||
|
let desc = nums.toSorted((a, b) => b - a);
|
||||||
|
assertEq(desc.join(","), "10,5,1");
|
||||||
|
|
||||||
|
// Stable sort.
|
||||||
|
let stableInput = [
|
||||||
|
{v: 1, id: "a"},
|
||||||
|
{v: 1, id: "b"},
|
||||||
|
{v: 1, id: "c"}
|
||||||
|
];
|
||||||
|
let stableSorted = stableInput.toSorted((x, y) => x.v - y.v);
|
||||||
|
assertEq(stableSorted.map(o => o.id).join(""), "abc");
|
||||||
|
|
||||||
|
// Holes are treated as undefined (properties are created).
|
||||||
|
let sparse = [3, , 1];
|
||||||
|
let sparseSorted = sparse.toSorted();
|
||||||
|
assertEq(sparseSorted.length, 3);
|
||||||
|
assertEq(sparseSorted[0], 1);
|
||||||
|
assertEq(sparseSorted[1], 3);
|
||||||
|
assertEq(2 in sparseSorted, true);
|
||||||
|
assertEq(sparseSorted[2], undefined);
|
||||||
|
|
||||||
|
// Array-like input.
|
||||||
|
let arrayLike = {0: 2, 1: 1, length: 2};
|
||||||
|
let arrayLikeSorted = Array.prototype.toSorted.call(arrayLike);
|
||||||
|
assertEq(Array.isArray(arrayLikeSorted), true);
|
||||||
|
assertEq(arrayLikeSorted.join(","), "1,2");
|
||||||
|
|
||||||
|
// Getter access order (ascending indices).
|
||||||
|
let accessLog = [];
|
||||||
|
let getterArr = {
|
||||||
|
length: 3,
|
||||||
|
get 0() { accessLog.push(0); return 3; },
|
||||||
|
get 1() { accessLog.push(1); return 1; },
|
||||||
|
get 2() { accessLog.push(2); return 2; }
|
||||||
|
};
|
||||||
|
Array.prototype.toSorted.call(getterArr);
|
||||||
|
assertEq(accessLog.join(","), "0,1,2");
|
||||||
|
|
||||||
|
// Comparator errors propagate.
|
||||||
|
assertThrowsInstanceOf(() => [1, 2].toSorted(1), TypeError);
|
||||||
|
|
||||||
|
if (typeof reportCompare === "function")
|
||||||
|
reportCompare(0, 0);
|
||||||
Loading…
Add table
Add a link
Reference in a new issue