Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add tests for Array.prototype.sort stability #1977

Merged
merged 3 commits into from
Dec 6, 2018
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions test/built-ins/Array/prototype/sort/stability-11-elements.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// Copyright (C) 2018 Mathias Bynens. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
esid: sec-array.prototype.sort
description: >
Stability of Array.prototype.sort for an array with 11 elements.
info: |
The sort is required to be stable (that is, elements that compare equal
remain in their original order).
The array length of 11 was chosen because V8 used an unstable
QuickSort for arrays with more than 10 elements until v7.0 (September
2018). https://v8.dev/blog/array-sort
---*/

const array = [
{ name: 'A', rating: 2 },
{ name: 'B', rating: 3 },
{ name: 'C', rating: 2 },
{ name: 'D', rating: 4 },
{ name: 'E', rating: 3 },
{ name: 'F', rating: 3 },
{ name: 'G', rating: 4 },
{ name: 'H', rating: 3 },
{ name: 'I', rating: 2 },
{ name: 'J', rating: 2 },
{ name: 'K', rating: 2 },
];
assert.sameValue(array.length, 11);

// Sort the elements by `rating` in descending order.
// (This updates `array` in place.)
array.sort((a, b) => b.rating - a.rating);

const reduced = array.reduce((acc, element) => acc + element.name, '');
const isProbablyStable = reduced === 'DGBEFHACIJK';
assert(isProbablyStable);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can we use assert.sameValue(reduced, 'DGBEFHACIJK') instead? same for the other tests.

the current way is also correct but we could use sameValue here for convention, please.

Copy link
Member Author

@mathiasbynens mathiasbynens Dec 1, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I did it this way intentionally, as it’s important to clarify that this is only a best-effort test. An engine could implement a completely randomized sorting algorithm, and still sometimes get lucky and pass the test. There is no way to write a single test that actually proves stability. The isProbablyStable name is important, IMHO.

I guess I’ll turn it into a comment.

28 changes: 28 additions & 0 deletions test/built-ins/Array/prototype/sort/stability-5-elements.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// Copyright (C) 2018 Mathias Bynens. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
esid: sec-array.prototype.sort
description: >
Stability of Array.prototype.sort for an array with 5 elements.
info: |
The sort is required to be stable (that is, elements that compare equal
remain in their original order).
---*/

const array = [
{ name: 'A', rating: 2 },
{ name: 'B', rating: 3 },
{ name: 'C', rating: 2 },
{ name: 'D', rating: 3 },
{ name: 'E', rating: 3 },
];
assert.sameValue(array.length, 5);

// Sort the elements by `rating` in descending order.
// (This updates `array` in place.)
array.sort((a, b) => b.rating - a.rating);

const reduced = array.reduce((acc, element) => acc + element.name, '');
const isProbablyStable = reduced === 'BDEAC';
assert(isProbablyStable);
Loading