//@ runBigIntEnabled // Original tests from https://github.com/tc39/test262/blob/master/test/language/expressions/unary-minus/bigint.js function assert(a, b, message) { if (a !== b) throw new Error(message); } function assertNotEqual(a, b, message) { if (a === b) throw new Error(message); } assert(-0n, 0n, "-0n === 0n"); assert(-(0n), 0n, "-(0n) === 0n"); assertNotEqual(-1n, 1n, "-1n !== 1n"); assert(-(1n), -1n, "-(1n) === -1n"); assertNotEqual(-(1n), 1n, "-(1n) !== 1n"); assert(-(-1n), 1n, "-(-1n) === 1n"); assertNotEqual(-(-1n), -1n, "-(-1n) !== -1n"); assert(- - 1n, 1n, "- - 1n === 1n"); assertNotEqual(- - 1n, -1n, "- - 1n !== -1n"); assert(-(0x1fffffffffffff01n), -0x1fffffffffffff01n, "-(0x1fffffffffffff01n) === -0x1fffffffffffff01n"); assertNotEqual(-(0x1fffffffffffff01n), 0x1fffffffffffff01n, "-(0x1fffffffffffff01n) !== 0x1fffffffffffff01n"); assertNotEqual(-(0x1fffffffffffff01n), -0x1fffffffffffff00n, "-(0x1fffffffffffff01n) !== -0x1fffffffffffff00n"); // Non-primitive cases assert(-Object(1n), -1n, "-Object(1n) === -1n"); assertNotEqual(-Object(1n), 1n, "-Object(1n) !== 1n"); assertNotEqual(-Object(1n), Object(-1n), "-Object(1n) !== Object(-1n)"); assert(-Object(-1n), 1n, "-Object(-1n) === 1n"); assertNotEqual(-Object(-1n), -1n, "-Object(-1n) !== -1n"); assertNotEqual(-Object(-1n), Object(1n), "-Object(-1n) !== Object(1n)"); let obj = { [Symbol.toPrimitive]: function() { return 1n; }, valueOf: function() { throw new Error("Should never be called"); }, toString: function() { throw new Error("Should never be called"); } }; assert(-obj, -1n, "@@toPrimitive not called properly"); obj = { valueOf: function() { return 1n; }, toString: function() { throw new Error("Should never be called"); } } assert(-obj, -1n, "valueOf not called properly"); obj = { toString: function() { return 1n; } }; assert(-obj, -1n, "-{toString: function() { return 1n; }} === -1n"); let x = 1n; let y = -x; let z = -y; assert(x, z, "-(-x) !== z");