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

More thorough bigint relational comparison tests #1251

Merged
merged 3 commits into from
Oct 2, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
// Copyright (C) 2017 Josh Wolfe. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
description: Comparisons of BigInt and BigInt values
esid: sec-abstract-relational-comparison
info: |
...
3. If both px and py are Strings, then
...
4. Else,
a. Let nx be ? ToNumeric(px). Because px and py are primitive values evaluation order is not important.
b. Let ny be ? ToNumeric(py).
c. If Type(nx) is Type(ny), return ? Type(nx)::lessThan(nx, ny).
Copy link
Member

Choose a reason for hiding this comment

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

You're hitting this case, right? If so, maybe the below spec text doesn't need to be quoted. Also, you could quote BigInt::lessThan, which is always hit here.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Good catch. The frontmatter needs to be specialized for the different files even more than this. I'll make that update.


sec-numeric-types-bigint-lessThan
BigInt::lessThan (x, y)

The abstract operation BigInt::lessThan with two arguments x and y of BigInt type returns true if x is less than y and false otherwise.

features: [BigInt]
---*/

assert.sameValue(0n >= 0n, true);
assert.sameValue(1n >= 1n, true);
assert.sameValue(-1n >= -1n, true);
assert.sameValue(0n >= -0n, true);
assert.sameValue(-0n >= 0n, true);
assert.sameValue(0n >= 1n, false);
assert.sameValue(1n >= 0n, true);
assert.sameValue(0n >= -1n, true);
assert.sameValue(-1n >= 0n, false);
assert.sameValue(1n >= -1n, true);
assert.sameValue(-1n >= 1n, false);
assert.sameValue(0x1fffffffffffff01n >= 0x1fffffffffffff02n, false);
assert.sameValue(0x1fffffffffffff02n >= 0x1fffffffffffff01n, true);
assert.sameValue(-0x1fffffffffffff01n >= -0x1fffffffffffff02n, true);
assert.sameValue(-0x1fffffffffffff02n >= -0x1fffffffffffff01n, false);
Copy link
Member

Choose a reason for hiding this comment

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

Maybe test some more values, e.g., a combination of long and short BigInt values.

assert.sameValue(0x10000000000000000n >= 0n, true);
assert.sameValue(0n >= 0x10000000000000000n, false);
assert.sameValue(0x10000000000000000n >= 1n, true);
assert.sameValue(1n >= 0x10000000000000000n, false);
assert.sameValue(0x10000000000000000n >= -1n, true);
assert.sameValue(-1n >= 0x10000000000000000n, false);
assert.sameValue(0x10000000000000001n >= 0n, true);
assert.sameValue(0n >= 0x10000000000000001n, false);
assert.sameValue(-0x10000000000000000n >= 0n, false);
assert.sameValue(0n >= -0x10000000000000000n, true);
assert.sameValue(-0x10000000000000000n >= 1n, false);
assert.sameValue(1n >= -0x10000000000000000n, true);
assert.sameValue(-0x10000000000000000n >= -1n, false);
assert.sameValue(-1n >= -0x10000000000000000n, true);
assert.sameValue(-0x10000000000000001n >= 0n, false);
assert.sameValue(0n >= -0x10000000000000001n, true);
assert.sameValue(0x10000000000000000n >= 0x100000000n, true);
assert.sameValue(0x100000000n >= 0x10000000000000000n, false);
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// Copyright (C) 2017 Josh Wolfe. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
description: Comparisons of BigInt and non-finite Number values
esid: sec-abstract-relational-comparison
info: |
...
3. If both px and py are Strings, then
...
4. Else,
a. Let nx be ? ToNumeric(px). Because px and py are primitive values evaluation order is not important.
b. Let ny be ? ToNumeric(py).
c. If Type(nx) is Type(ny), return ? Type(nx)::lessThan(nx, ny).
d. Assert: Type(nx) is BigInt and Type(ny) is Number, or if Type(nx) is Number and Type(ny) is BigInt.
e. If x or y are any of NaN, return undefined.
f. If x is -∞, or y is +∞, return true.
g. If x is +∞, or y is -∞, return false.
features: [BigInt]
---*/

assert.sameValue(1n >= Infinity, false);
assert.sameValue(Infinity >= 1n, true);
assert.sameValue(-1n >= Infinity, false);
assert.sameValue(Infinity >= -1n, true);
assert.sameValue(1n >= -Infinity, true);
assert.sameValue(-Infinity >= 1n, false);
assert.sameValue(-1n >= -Infinity, true);
assert.sameValue(-Infinity >= -1n, false);
assert.sameValue(0n >= NaN, false);
assert.sameValue(NaN >= 0n, false);
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
// Copyright (C) 2017 Josh Wolfe. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
description: Comparisons of large BigInt and Number values
esid: sec-abstract-relational-comparison
info: |
...
3. If both px and py are Strings, then
...
4. Else,
a. Let nx be ? ToNumeric(px). Because px and py are primitive values evaluation order is not important.
b. Let ny be ? ToNumeric(py).
c. If Type(nx) is Type(ny), return ? Type(nx)::lessThan(nx, ny).
d. Assert: Type(nx) is BigInt and Type(ny) is Number, or if Type(nx) is Number and Type(ny) is BigInt.
e. If x or y are any of NaN, return undefined.
f. If x is -∞, or y is +∞, return true.
g. If x is +∞, or y is -∞, return false.
h. If the mathematical value of nx is less than the mathematical value of ny, return true, otherwise return false.
features: [BigInt]
---*/

assert.sameValue(1n >= Number.MAX_VALUE, false);
assert.sameValue(Number.MAX_VALUE >= 1n, true);
assert.sameValue(1n >= -Number.MAX_VALUE, true);
assert.sameValue(-Number.MAX_VALUE >= 1n, false);
assert.sameValue(
0xfffffffffffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn >= Number.MAX_VALUE,
false);
assert.sameValue(
Number.MAX_VALUE >= 0xfffffffffffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn,
true);
assert.sameValue(
0xfffffffffffff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001n >= Number.MAX_VALUE,
true);
assert.sameValue(
Number.MAX_VALUE >= 0xfffffffffffff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001n,
false);
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,23 @@ info: |
features: [BigInt]
---*/

assert.sameValue(0n >= 0, true);
assert.sameValue(0 >= 0n, true);
assert.sameValue(0n >= -0, true);
assert.sameValue(-0 >= 0n, true);
assert.sameValue(0n >= 0.000000000001, false);
assert.sameValue(0.000000000001 >= 0n, true);
assert.sameValue(0n >= 1, false);
assert.sameValue(1 >= 0n, true);
assert.sameValue(1n >= 0, true);
assert.sameValue(0 >= 1n, false);
assert.sameValue(1n >= 0.999999999999, true);
assert.sameValue(1 >= 0n, true);
assert.sameValue(0.000000000001 >= 0n, true);
assert.sameValue(0.999999999999 >= 1n, false);
assert.sameValue(1n >= 1, true);
assert.sameValue(1 >= 1n, true);
assert.sameValue(0n >= 1, false);
assert.sameValue(0 >= 1n, false);
assert.sameValue(0 >= 0n, true);
assert.sameValue(0n >= 0, true);
assert.sameValue(1n >= Number.MAX_VALUE, false);
assert.sameValue(0n >= Number.MIN_VALUE, false);
assert.sameValue(Number.MIN_VALUE >= 0n, true);
assert.sameValue(0n >= -Number.MIN_VALUE, true);
assert.sameValue(-Number.MIN_VALUE >= 0n, false);
assert.sameValue(-10n >= Number.MIN_VALUE, false);
assert.sameValue(Number.MAX_VALUE >= 10000000000n, true);
assert.sameValue(Number.MIN_VALUE >= -10n, true);
56 changes: 56 additions & 0 deletions test/language/expressions/greater-than/bigint-and-bigint.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
// Copyright (C) 2017 Josh Wolfe. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
description: Comparisons of BigInt and BigInt values
esid: sec-abstract-relational-comparison
info: |
...
3. If both px and py are Strings, then
...
4. Else,
a. Let nx be ? ToNumeric(px). Because px and py are primitive values evaluation order is not important.
b. Let ny be ? ToNumeric(py).
c. If Type(nx) is Type(ny), return ? Type(nx)::lessThan(nx, ny).

sec-numeric-types-bigint-lessThan
BigInt::lessThan (x, y)

The abstract operation BigInt::lessThan with two arguments x and y of BigInt type returns true if x is less than y and false otherwise.

features: [BigInt]
---*/

assert.sameValue(0n > 0n, false);
assert.sameValue(1n > 1n, false);
assert.sameValue(-1n > -1n, false);
assert.sameValue(0n > -0n, false);
assert.sameValue(-0n > 0n, false);
assert.sameValue(0n > 1n, false);
assert.sameValue(1n > 0n, true);
assert.sameValue(0n > -1n, true);
assert.sameValue(-1n > 0n, false);
assert.sameValue(1n > -1n, true);
assert.sameValue(-1n > 1n, false);
assert.sameValue(0x1fffffffffffff01n > 0x1fffffffffffff02n, false);
assert.sameValue(0x1fffffffffffff02n > 0x1fffffffffffff01n, true);
assert.sameValue(-0x1fffffffffffff01n > -0x1fffffffffffff02n, true);
assert.sameValue(-0x1fffffffffffff02n > -0x1fffffffffffff01n, false);
assert.sameValue(0x10000000000000000n > 0n, true);
assert.sameValue(0n > 0x10000000000000000n, false);
assert.sameValue(0x10000000000000000n > 1n, true);
assert.sameValue(1n > 0x10000000000000000n, false);
assert.sameValue(0x10000000000000000n > -1n, true);
assert.sameValue(-1n > 0x10000000000000000n, false);
assert.sameValue(0x10000000000000001n > 0n, true);
assert.sameValue(0n > 0x10000000000000001n, false);
assert.sameValue(-0x10000000000000000n > 0n, false);
assert.sameValue(0n > -0x10000000000000000n, true);
assert.sameValue(-0x10000000000000000n > 1n, false);
assert.sameValue(1n > -0x10000000000000000n, true);
assert.sameValue(-0x10000000000000000n > -1n, false);
assert.sameValue(-1n > -0x10000000000000000n, true);
assert.sameValue(-0x10000000000000001n > 0n, false);
assert.sameValue(0n > -0x10000000000000001n, true);
assert.sameValue(0x10000000000000000n > 0x100000000n, true);
assert.sameValue(0x100000000n > 0x10000000000000000n, false);
31 changes: 31 additions & 0 deletions test/language/expressions/greater-than/bigint-and-non-finite.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// Copyright (C) 2017 Josh Wolfe. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
description: Comparisons of BigInt and non-finite Number values
esid: sec-abstract-relational-comparison
info: |
...
3. If both px and py are Strings, then
...
4. Else,
a. Let nx be ? ToNumeric(px). Because px and py are primitive values evaluation order is not important.
b. Let ny be ? ToNumeric(py).
c. If Type(nx) is Type(ny), return ? Type(nx)::lessThan(nx, ny).
d. Assert: Type(nx) is BigInt and Type(ny) is Number, or if Type(nx) is Number and Type(ny) is BigInt.
e. If x or y are any of NaN, return undefined.
f. If x is -∞, or y is +∞, return true.
g. If x is +∞, or y is -∞, return false.
features: [BigInt]
---*/

assert.sameValue(1n > Infinity, false);
assert.sameValue(Infinity > 1n, true);
assert.sameValue(-1n > Infinity, false);
assert.sameValue(Infinity > -1n, true);
assert.sameValue(1n > -Infinity, true);
assert.sameValue(-Infinity > 1n, false);
assert.sameValue(-1n > -Infinity, true);
assert.sameValue(-Infinity > -1n, false);
assert.sameValue(0n > NaN, false);
assert.sameValue(NaN > 0n, false);
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
// Copyright (C) 2017 Josh Wolfe. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
description: Comparisons of BigInt and Number values
esid: sec-abstract-relational-comparison
info: |
...
3. If both px and py are Strings, then
...
4. Else,
a. Let nx be ? ToNumeric(px). Because px and py are primitive values evaluation order is not important.
b. Let ny be ? ToNumeric(py).
c. If Type(nx) is Type(ny), return ? Type(nx)::lessThan(nx, ny).
d. Assert: Type(nx) is BigInt and Type(ny) is Number, or if Type(nx) is Number and Type(ny) is BigInt.
e. If x or y are any of NaN, return undefined.
f. If x is -∞, or y is +∞, return true.
g. If x is +∞, or y is -∞, return false.
h. If the mathematical value of nx is less than the mathematical value of ny, return true, otherwise return false.
features: [BigInt]
---*/

assert.sameValue(1n > Number.MAX_VALUE, false);
assert.sameValue(Number.MAX_VALUE > 1n, true);
assert.sameValue(1n > -Number.MAX_VALUE, true);
assert.sameValue(-Number.MAX_VALUE > 1n, false);
assert.sameValue(
0xfffffffffffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn > Number.MAX_VALUE,
false);
assert.sameValue(
Number.MAX_VALUE > 0xfffffffffffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn,
true);
assert.sameValue(
0xfffffffffffff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001n > Number.MAX_VALUE,
true);
assert.sameValue(
Number.MAX_VALUE > 0xfffffffffffff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001n,
false);
22 changes: 14 additions & 8 deletions test/language/expressions/greater-than/bigint-and-number.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,23 @@ info: |
features: [BigInt]
---*/

assert.sameValue(0n > 0, false);
assert.sameValue(0 > 0n, false);
assert.sameValue(0n > -0, false);
assert.sameValue(-0 > 0n, false);
assert.sameValue(0n > 0.000000000001, false);
assert.sameValue(0.000000000001 > 0n, true);
assert.sameValue(0n > 1, false);
assert.sameValue(1 > 0n, true);
assert.sameValue(1n > 0, true);
assert.sameValue(0 > 1n, false);
assert.sameValue(1n > 0.999999999999, true);
assert.sameValue(1 > 0n, true);
assert.sameValue(0.000000000001 > 0n, true);
assert.sameValue(0.999999999999 > 1n, false);
assert.sameValue(1n > 1, false);
assert.sameValue(1 > 1n, false);
assert.sameValue(0n > 1, false);
assert.sameValue(0 > 1n, false);
assert.sameValue(0 > 0n, false);
assert.sameValue(0n > 0, false);
assert.sameValue(1n > Number.MAX_VALUE, false);
assert.sameValue(0n > Number.MIN_VALUE, false);
assert.sameValue(Number.MIN_VALUE > 0n, true);
assert.sameValue(0n > -Number.MIN_VALUE, true);
assert.sameValue(-Number.MIN_VALUE > 0n, false);
assert.sameValue(-10n > Number.MIN_VALUE, false);
assert.sameValue(Number.MAX_VALUE > 10000000000n, true);
assert.sameValue(Number.MIN_VALUE > -10n, true);
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
// Copyright (C) 2017 Josh Wolfe. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
description: Comparisons of BigInt and BigInt values
esid: sec-abstract-relational-comparison
info: |
...
3. If both px and py are Strings, then
...
4. Else,
a. Let nx be ? ToNumeric(px). Because px and py are primitive values evaluation order is not important.
b. Let ny be ? ToNumeric(py).
c. If Type(nx) is Type(ny), return ? Type(nx)::lessThan(nx, ny).

sec-numeric-types-bigint-lessThan
BigInt::lessThan (x, y)

The abstract operation BigInt::lessThan with two arguments x and y of BigInt type returns true if x is less than y and false otherwise.

features: [BigInt]
---*/

assert.sameValue(0n <= 0n, true);
assert.sameValue(1n <= 1n, true);
assert.sameValue(-1n <= -1n, true);
assert.sameValue(0n <= -0n, true);
assert.sameValue(-0n <= 0n, true);
assert.sameValue(0n <= 1n, true);
assert.sameValue(1n <= 0n, false);
assert.sameValue(0n <= -1n, false);
assert.sameValue(-1n <= 0n, true);
assert.sameValue(1n <= -1n, false);
assert.sameValue(-1n <= 1n, true);
assert.sameValue(0x1fffffffffffff01n <= 0x1fffffffffffff02n, true);
assert.sameValue(0x1fffffffffffff02n <= 0x1fffffffffffff01n, false);
assert.sameValue(-0x1fffffffffffff01n <= -0x1fffffffffffff02n, false);
assert.sameValue(-0x1fffffffffffff02n <= -0x1fffffffffffff01n, true);
assert.sameValue(0x10000000000000000n <= 0n, false);
assert.sameValue(0n <= 0x10000000000000000n, true);
assert.sameValue(0x10000000000000000n <= 1n, false);
assert.sameValue(1n <= 0x10000000000000000n, true);
assert.sameValue(0x10000000000000000n <= -1n, false);
assert.sameValue(-1n <= 0x10000000000000000n, true);
assert.sameValue(0x10000000000000001n <= 0n, false);
assert.sameValue(0n <= 0x10000000000000001n, true);
assert.sameValue(-0x10000000000000000n <= 0n, true);
assert.sameValue(0n <= -0x10000000000000000n, false);
assert.sameValue(-0x10000000000000000n <= 1n, true);
assert.sameValue(1n <= -0x10000000000000000n, false);
assert.sameValue(-0x10000000000000000n <= -1n, true);
assert.sameValue(-1n <= -0x10000000000000000n, false);
assert.sameValue(-0x10000000000000001n <= 0n, true);
assert.sameValue(0n <= -0x10000000000000001n, false);
assert.sameValue(0x10000000000000000n <= 0x100000000n, false);
assert.sameValue(0x100000000n <= 0x10000000000000000n, true);
Loading