// Copyright (C) 2017 Robin Templeton. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
esid: sec-multiplicative-operators-runtime-semantics-evaluation
description: BigInt remainder arithmetic
features: [BigInt]
---*/

function testMod(x, y, z) {
    assert.sameValue(x % y, z, x + " % " + y + " = " + z);
}

testMod(0xFEDCBA9876543210n, 0xFEDCBA9876543210n, 0x0n);
testMod(0xFEDCBA9876543210n, 0xFEDCBA987654320Fn, 0x1n);
testMod(0xFEDCBA9876543210n, 0xFEDCBA98n, 0x76543210n);
testMod(0xFEDCBA9876543210n, 0xFEDCBA97n, 0x77777779n);
testMod(0xFEDCBA9876543210n, 0x1234n, 0x960n);
testMod(0xFEDCBA9876543210n, 0x3n, 0x0n);
testMod(0xFEDCBA9876543210n, 0x2n, 0x0n);
testMod(0xFEDCBA9876543210n, 0x1n, 0x0n);
testMod(0xFEDCBA9876543210n, -0x1n, 0x0n);
testMod(0xFEDCBA9876543210n, -0x2n, 0x0n);
testMod(0xFEDCBA9876543210n, -0x3n, 0x0n);
testMod(0xFEDCBA9876543210n, -0x1234n, 0x960n);
testMod(0xFEDCBA9876543210n, -0xFEDCBA97n, 0x77777779n);
testMod(0xFEDCBA9876543210n, -0xFEDCBA98n, 0x76543210n);
testMod(0xFEDCBA9876543210n, -0xFEDCBA987654320Fn, 0x1n);
testMod(0xFEDCBA9876543210n, -0xFEDCBA9876543210n, 0x0n);
testMod(0xFEDCBA987654320Fn, 0xFEDCBA9876543210n, 0xFEDCBA987654320Fn);
testMod(0xFEDCBA987654320Fn, 0xFEDCBA987654320Fn, 0x0n);
testMod(0xFEDCBA987654320Fn, 0xFEDCBA98n, 0x7654320Fn);
testMod(0xFEDCBA987654320Fn, 0xFEDCBA97n, 0x77777778n);
testMod(0xFEDCBA987654320Fn, 0x1234n, 0x95Fn);
testMod(0xFEDCBA987654320Fn, 0x3n, 0x2n);
testMod(0xFEDCBA987654320Fn, 0x2n, 0x1n);
testMod(0xFEDCBA987654320Fn, 0x1n, 0x0n);
testMod(0xFEDCBA987654320Fn, -0x1n, 0x0n);
testMod(0xFEDCBA987654320Fn, -0x2n, 0x1n);
testMod(0xFEDCBA987654320Fn, -0x3n, 0x2n);
testMod(0xFEDCBA987654320Fn, -0x1234n, 0x95Fn);
testMod(0xFEDCBA987654320Fn, -0xFEDCBA97n, 0x77777778n);
testMod(0xFEDCBA987654320Fn, -0xFEDCBA98n, 0x7654320Fn);
testMod(0xFEDCBA987654320Fn, -0xFEDCBA987654320Fn, 0x0n);
testMod(0xFEDCBA987654320Fn, -0xFEDCBA9876543210n, 0xFEDCBA987654320Fn);
testMod(0xFEDCBA98n, 0xFEDCBA9876543210n, 0xFEDCBA98n);
testMod(0xFEDCBA98n, 0xFEDCBA987654320Fn, 0xFEDCBA98n);
testMod(0xFEDCBA98n, 0xFEDCBA98n, 0x0n);
testMod(0xFEDCBA98n, 0xFEDCBA97n, 0x1n);
testMod(0xFEDCBA98n, 0x1234n, 0x930n);
testMod(0xFEDCBA98n, 0x3n, 0x2n);
testMod(0xFEDCBA98n, 0x2n, 0x0n);
testMod(0xFEDCBA98n, 0x1n, 0x0n);
testMod(0xFEDCBA98n, -0x1n, 0x0n);
testMod(0xFEDCBA98n, -0x2n, 0x0n);
testMod(0xFEDCBA98n, -0x3n, 0x2n);
testMod(0xFEDCBA98n, -0x1234n, 0x930n);
testMod(0xFEDCBA98n, -0xFEDCBA97n, 0x1n);
testMod(0xFEDCBA98n, -0xFEDCBA98n, 0x0n);
testMod(0xFEDCBA98n, -0xFEDCBA987654320Fn, 0xFEDCBA98n);
testMod(0xFEDCBA98n, -0xFEDCBA9876543210n, 0xFEDCBA98n);
testMod(0xFEDCBA97n, 0xFEDCBA9876543210n, 0xFEDCBA97n);
testMod(0xFEDCBA97n, 0xFEDCBA987654320Fn, 0xFEDCBA97n);
testMod(0xFEDCBA97n, 0xFEDCBA98n, 0xFEDCBA97n);
testMod(0xFEDCBA97n, 0xFEDCBA97n, 0x0n);
testMod(0xFEDCBA97n, 0x1234n, 0x92Fn);
testMod(0xFEDCBA97n, 0x3n, 0x1n);
testMod(0xFEDCBA97n, 0x2n, 0x1n);
testMod(0xFEDCBA97n, 0x1n, 0x0n);
testMod(0xFEDCBA97n, -0x1n, 0x0n);
testMod(0xFEDCBA97n, -0x2n, 0x1n);
testMod(0xFEDCBA97n, -0x3n, 0x1n);
testMod(0xFEDCBA97n, -0x1234n, 0x92Fn);
testMod(0xFEDCBA97n, -0xFEDCBA97n, 0x0n);
testMod(0xFEDCBA97n, -0xFEDCBA98n, 0xFEDCBA97n);
testMod(0xFEDCBA97n, -0xFEDCBA987654320Fn, 0xFEDCBA97n);
testMod(0xFEDCBA97n, -0xFEDCBA9876543210n, 0xFEDCBA97n);
testMod(0x1234n, 0xFEDCBA9876543210n, 0x1234n);
testMod(0x1234n, 0xFEDCBA987654320Fn, 0x1234n);
testMod(0x1234n, 0xFEDCBA98n, 0x1234n);
testMod(0x1234n, 0xFEDCBA97n, 0x1234n);
testMod(0x1234n, 0x1234n, 0x0n);
testMod(0x1234n, 0x3n, 0x1n);
testMod(0x1234n, 0x2n, 0x0n);
testMod(0x1234n, 0x1n, 0x0n);
testMod(0x1234n, -0x1n, 0x0n);
testMod(0x1234n, -0x2n, 0x0n);
testMod(0x1234n, -0x3n, 0x1n);
testMod(0x1234n, -0x1234n, 0x0n);
testMod(0x1234n, -0xFEDCBA97n, 0x1234n);
testMod(0x1234n, -0xFEDCBA98n, 0x1234n);
testMod(0x1234n, -0xFEDCBA987654320Fn, 0x1234n);
testMod(0x1234n, -0xFEDCBA9876543210n, 0x1234n);
testMod(0x3n, 0xFEDCBA9876543210n, 0x3n);
testMod(0x3n, 0xFEDCBA987654320Fn, 0x3n);
testMod(0x3n, 0xFEDCBA98n, 0x3n);
testMod(0x3n, 0xFEDCBA97n, 0x3n);
testMod(0x3n, 0x1234n, 0x3n);
testMod(0x3n, 0x3n, 0x0n);
testMod(0x3n, 0x2n, 0x1n);
testMod(0x3n, 0x1n, 0x0n);
testMod(0x3n, -0x1n, 0x0n);
testMod(0x3n, -0x2n, 0x1n);
testMod(0x3n, -0x3n, 0x0n);
testMod(0x3n, -0x1234n, 0x3n);
testMod(0x3n, -0xFEDCBA97n, 0x3n);
testMod(0x3n, -0xFEDCBA98n, 0x3n);
testMod(0x3n, -0xFEDCBA987654320Fn, 0x3n);
testMod(0x3n, -0xFEDCBA9876543210n, 0x3n);
testMod(0x2n, 0xFEDCBA9876543210n, 0x2n);
testMod(0x2n, 0xFEDCBA987654320Fn, 0x2n);
testMod(0x2n, 0xFEDCBA98n, 0x2n);
testMod(0x2n, 0xFEDCBA97n, 0x2n);
testMod(0x2n, 0x1234n, 0x2n);
testMod(0x2n, 0x3n, 0x2n);
testMod(0x2n, 0x2n, 0x0n);
testMod(0x2n, 0x1n, 0x0n);
testMod(0x2n, -0x1n, 0x0n);
testMod(0x2n, -0x2n, 0x0n);
testMod(0x2n, -0x3n, 0x2n);
testMod(0x2n, -0x1234n, 0x2n);
testMod(0x2n, -0xFEDCBA97n, 0x2n);
testMod(0x2n, -0xFEDCBA98n, 0x2n);
testMod(0x2n, -0xFEDCBA987654320Fn, 0x2n);
testMod(0x2n, -0xFEDCBA9876543210n, 0x2n);
testMod(0x1n, 0xFEDCBA9876543210n, 0x1n);
testMod(0x1n, 0xFEDCBA987654320Fn, 0x1n);
testMod(0x1n, 0xFEDCBA98n, 0x1n);
testMod(0x1n, 0xFEDCBA97n, 0x1n);
testMod(0x1n, 0x1234n, 0x1n);
testMod(0x1n, 0x3n, 0x1n);
testMod(0x1n, 0x2n, 0x1n);
testMod(0x1n, 0x1n, 0x0n);
testMod(0x1n, -0x1n, 0x0n);
testMod(0x1n, -0x2n, 0x1n);
testMod(0x1n, -0x3n, 0x1n);
testMod(0x1n, -0x1234n, 0x1n);
testMod(0x1n, -0xFEDCBA97n, 0x1n);
testMod(0x1n, -0xFEDCBA98n, 0x1n);
testMod(0x1n, -0xFEDCBA987654320Fn, 0x1n);
testMod(0x1n, -0xFEDCBA9876543210n, 0x1n);
testMod(-0x1n, 0xFEDCBA9876543210n, -0x1n);
testMod(-0x1n, 0xFEDCBA987654320Fn, -0x1n);
testMod(-0x1n, 0xFEDCBA98n, -0x1n);
testMod(-0x1n, 0xFEDCBA97n, -0x1n);
testMod(-0x1n, 0x1234n, -0x1n);
testMod(-0x1n, 0x3n, -0x1n);
testMod(-0x1n, 0x2n, -0x1n);
testMod(-0x1n, 0x1n, 0x0n);
testMod(-0x1n, -0x1n, 0x0n);
testMod(-0x1n, -0x2n, -0x1n);
testMod(-0x1n, -0x3n, -0x1n);
testMod(-0x1n, -0x1234n, -0x1n);
testMod(-0x1n, -0xFEDCBA97n, -0x1n);
testMod(-0x1n, -0xFEDCBA98n, -0x1n);
testMod(-0x1n, -0xFEDCBA987654320Fn, -0x1n);
testMod(-0x1n, -0xFEDCBA9876543210n, -0x1n);
testMod(-0x2n, 0xFEDCBA9876543210n, -0x2n);
testMod(-0x2n, 0xFEDCBA987654320Fn, -0x2n);
testMod(-0x2n, 0xFEDCBA98n, -0x2n);
testMod(-0x2n, 0xFEDCBA97n, -0x2n);
testMod(-0x2n, 0x1234n, -0x2n);
testMod(-0x2n, 0x3n, -0x2n);
testMod(-0x2n, 0x2n, 0x0n);
testMod(-0x2n, 0x1n, 0x0n);
testMod(-0x2n, -0x1n, 0x0n);
testMod(-0x2n, -0x2n, 0x0n);
testMod(-0x2n, -0x3n, -0x2n);
testMod(-0x2n, -0x1234n, -0x2n);
testMod(-0x2n, -0xFEDCBA97n, -0x2n);
testMod(-0x2n, -0xFEDCBA98n, -0x2n);
testMod(-0x2n, -0xFEDCBA987654320Fn, -0x2n);
testMod(-0x2n, -0xFEDCBA9876543210n, -0x2n);
testMod(-0x3n, 0xFEDCBA9876543210n, -0x3n);
testMod(-0x3n, 0xFEDCBA987654320Fn, -0x3n);
testMod(-0x3n, 0xFEDCBA98n, -0x3n);
testMod(-0x3n, 0xFEDCBA97n, -0x3n);
testMod(-0x3n, 0x1234n, -0x3n);
testMod(-0x3n, 0x3n, 0x0n);
testMod(-0x3n, 0x2n, -0x1n);
testMod(-0x3n, 0x1n, 0x0n);
testMod(-0x3n, -0x1n, 0x0n);
testMod(-0x3n, -0x2n, -0x1n);
testMod(-0x3n, -0x3n, 0x0n);
testMod(-0x3n, -0x1234n, -0x3n);
testMod(-0x3n, -0xFEDCBA97n, -0x3n);
testMod(-0x3n, -0xFEDCBA98n, -0x3n);
testMod(-0x3n, -0xFEDCBA987654320Fn, -0x3n);
testMod(-0x3n, -0xFEDCBA9876543210n, -0x3n);
testMod(-0x1234n, 0xFEDCBA9876543210n, -0x1234n);
testMod(-0x1234n, 0xFEDCBA987654320Fn, -0x1234n);
testMod(-0x1234n, 0xFEDCBA98n, -0x1234n);
testMod(-0x1234n, 0xFEDCBA97n, -0x1234n);
testMod(-0x1234n, 0x1234n, 0x0n);
testMod(-0x1234n, 0x3n, -0x1n);
testMod(-0x1234n, 0x2n, 0x0n);
testMod(-0x1234n, 0x1n, 0x0n);
testMod(-0x1234n, -0x1n, 0x0n);
testMod(-0x1234n, -0x2n, 0x0n);
testMod(-0x1234n, -0x3n, -0x1n);
testMod(-0x1234n, -0x1234n, 0x0n);
testMod(-0x1234n, -0xFEDCBA97n, -0x1234n);
testMod(-0x1234n, -0xFEDCBA98n, -0x1234n);
testMod(-0x1234n, -0xFEDCBA987654320Fn, -0x1234n);
testMod(-0x1234n, -0xFEDCBA9876543210n, -0x1234n);
testMod(-0xFEDCBA97n, 0xFEDCBA9876543210n, -0xFEDCBA97n);
testMod(-0xFEDCBA97n, 0xFEDCBA987654320Fn, -0xFEDCBA97n);
testMod(-0xFEDCBA97n, 0xFEDCBA98n, -0xFEDCBA97n);
testMod(-0xFEDCBA97n, 0xFEDCBA97n, 0x0n);
testMod(-0xFEDCBA97n, 0x1234n, -0x92Fn);
testMod(-0xFEDCBA97n, 0x3n, -0x1n);
testMod(-0xFEDCBA97n, 0x2n, -0x1n);
testMod(-0xFEDCBA97n, 0x1n, 0x0n);
testMod(-0xFEDCBA97n, -0x1n, 0x0n);
testMod(-0xFEDCBA97n, -0x2n, -0x1n);
testMod(-0xFEDCBA97n, -0x3n, -0x1n);
testMod(-0xFEDCBA97n, -0x1234n, -0x92Fn);
testMod(-0xFEDCBA97n, -0xFEDCBA97n, 0x0n);
testMod(-0xFEDCBA97n, -0xFEDCBA98n, -0xFEDCBA97n);
testMod(-0xFEDCBA97n, -0xFEDCBA987654320Fn, -0xFEDCBA97n);
testMod(-0xFEDCBA97n, -0xFEDCBA9876543210n, -0xFEDCBA97n);
testMod(-0xFEDCBA98n, 0xFEDCBA9876543210n, -0xFEDCBA98n);
testMod(-0xFEDCBA98n, 0xFEDCBA987654320Fn, -0xFEDCBA98n);
testMod(-0xFEDCBA98n, 0xFEDCBA98n, 0x0n);
testMod(-0xFEDCBA98n, 0xFEDCBA97n, -0x1n);
testMod(-0xFEDCBA98n, 0x1234n, -0x930n);
testMod(-0xFEDCBA98n, 0x3n, -0x2n);
testMod(-0xFEDCBA98n, 0x2n, 0x0n);
testMod(-0xFEDCBA98n, 0x1n, 0x0n);
testMod(-0xFEDCBA98n, -0x1n, 0x0n);
testMod(-0xFEDCBA98n, -0x2n, 0x0n);
testMod(-0xFEDCBA98n, -0x3n, -0x2n);
testMod(-0xFEDCBA98n, -0x1234n, -0x930n);
testMod(-0xFEDCBA98n, -0xFEDCBA97n, -0x1n);
testMod(-0xFEDCBA98n, -0xFEDCBA98n, 0x0n);
testMod(-0xFEDCBA98n, -0xFEDCBA987654320Fn, -0xFEDCBA98n);
testMod(-0xFEDCBA98n, -0xFEDCBA9876543210n, -0xFEDCBA98n);
testMod(-0xFEDCBA987654320Fn, 0xFEDCBA9876543210n, -0xFEDCBA987654320Fn);
testMod(-0xFEDCBA987654320Fn, 0xFEDCBA987654320Fn, 0x0n);
testMod(-0xFEDCBA987654320Fn, 0xFEDCBA98n, -0x7654320Fn);
testMod(-0xFEDCBA987654320Fn, 0xFEDCBA97n, -0x77777778n);
testMod(-0xFEDCBA987654320Fn, 0x1234n, -0x95Fn);
testMod(-0xFEDCBA987654320Fn, 0x3n, -0x2n);
testMod(-0xFEDCBA987654320Fn, 0x2n, -0x1n);
testMod(-0xFEDCBA987654320Fn, 0x1n, 0x0n);
testMod(-0xFEDCBA987654320Fn, -0x1n, 0x0n);
testMod(-0xFEDCBA987654320Fn, -0x2n, -0x1n);
testMod(-0xFEDCBA987654320Fn, -0x3n, -0x2n);
testMod(-0xFEDCBA987654320Fn, -0x1234n, -0x95Fn);
testMod(-0xFEDCBA987654320Fn, -0xFEDCBA97n, -0x77777778n);
testMod(-0xFEDCBA987654320Fn, -0xFEDCBA98n, -0x7654320Fn);
testMod(-0xFEDCBA987654320Fn, -0xFEDCBA987654320Fn, 0x0n);
testMod(-0xFEDCBA987654320Fn, -0xFEDCBA9876543210n, -0xFEDCBA987654320Fn);
testMod(-0xFEDCBA9876543210n, 0xFEDCBA9876543210n, 0x0n);
testMod(-0xFEDCBA9876543210n, 0xFEDCBA987654320Fn, -0x1n);
testMod(-0xFEDCBA9876543210n, 0xFEDCBA98n, -0x76543210n);
testMod(-0xFEDCBA9876543210n, 0xFEDCBA97n, -0x77777779n);
testMod(-0xFEDCBA9876543210n, 0x1234n, -0x960n);
testMod(-0xFEDCBA9876543210n, 0x3n, 0x0n);
testMod(-0xFEDCBA9876543210n, 0x2n, 0x0n);
testMod(-0xFEDCBA9876543210n, 0x1n, 0x0n);
testMod(-0xFEDCBA9876543210n, -0x1n, 0x0n);
testMod(-0xFEDCBA9876543210n, -0x2n, 0x0n);
testMod(-0xFEDCBA9876543210n, -0x3n, 0x0n);
testMod(-0xFEDCBA9876543210n, -0x1234n, -0x960n);
testMod(-0xFEDCBA9876543210n, -0xFEDCBA97n, -0x77777779n);
testMod(-0xFEDCBA9876543210n, -0xFEDCBA98n, -0x76543210n);
testMod(-0xFEDCBA9876543210n, -0xFEDCBA987654320Fn, -0x1n);
testMod(-0xFEDCBA9876543210n, -0xFEDCBA9876543210n, 0x0n);
