187 lines
6.4 KiB
JavaScript
187 lines
6.4 KiB
JavaScript
|
var count = (function shift(BigNumber) {
|
||
|
var start = +new Date(),
|
||
|
log,
|
||
|
error,
|
||
|
undefined,
|
||
|
passed = 0,
|
||
|
total = 0;
|
||
|
|
||
|
if (typeof window === 'undefined') {
|
||
|
log = console.log;
|
||
|
error = console.error;
|
||
|
} else {
|
||
|
log = function (str) { document.body.innerHTML += str.replace('\n', '<br>') };
|
||
|
error = function (str) { document.body.innerHTML += '<div style="color: red">' +
|
||
|
str.replace('\n', '<br>') + '</div>' };
|
||
|
}
|
||
|
|
||
|
if (!BigNumber && typeof require === 'function') BigNumber = require('../bignumber.js');
|
||
|
|
||
|
function assert(expected, actual) {
|
||
|
total++;
|
||
|
if (expected !== actual) {
|
||
|
error('\n Test number: ' + total + ' failed');
|
||
|
error(' Expected: ' + expected);
|
||
|
error(' Actual: ' + actual);
|
||
|
//process.exit();
|
||
|
} else {
|
||
|
passed++;
|
||
|
//log('\n Expected and actual: ' + actual);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function assertException(func, message) {
|
||
|
var actual;
|
||
|
total++;
|
||
|
try {
|
||
|
func();
|
||
|
} catch (e) {
|
||
|
actual = e;
|
||
|
}
|
||
|
if (actual && actual.name == 'BigNumber Error') {
|
||
|
passed++;
|
||
|
//log('\n Expected and actual: ' + actual);
|
||
|
} else {
|
||
|
error('\n Test number: ' + total + ' failed');
|
||
|
error('\n Expected: ' + message + ' to raise a BigNumber Error.');
|
||
|
error(' Actual: ' + (actual || 'no exception'));
|
||
|
//process.exit();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function T(expected, n, k) {
|
||
|
assert(String(expected), String(new BigNumber(n).shift(k)));
|
||
|
}
|
||
|
|
||
|
function isMinusZero(n) {
|
||
|
return n.toString() === '0' && n.s == -1;
|
||
|
}
|
||
|
|
||
|
log('\n Testing shift...');
|
||
|
|
||
|
BigNumber.config({
|
||
|
DECIMAL_PLACES: 20,
|
||
|
ROUNDING_MODE: 4,
|
||
|
EXPONENTIAL_AT: [-7, 21],
|
||
|
RANGE: 1e9,
|
||
|
ERRORS: false,
|
||
|
POW_PRECISION: 0
|
||
|
});
|
||
|
|
||
|
T(0, 0, 0);
|
||
|
T(10, 1, 1);
|
||
|
T(0.1, 1, -1);
|
||
|
T(200, 2, 2);
|
||
|
T(2e+31, 2, 31);
|
||
|
T(0.02, 2, -2);
|
||
|
T(0.0002, 2, -4);
|
||
|
T(1e+100, 1, 100);
|
||
|
T(9999990, 9999.99, 3);
|
||
|
|
||
|
T(2, 2, NaN);
|
||
|
T(2435.43543, 2435.43543, NaN);
|
||
|
T(Infinity, Infinity, NaN);
|
||
|
T(-Infinity, -Infinity, NaN);
|
||
|
T(NaN, NaN, NaN);
|
||
|
|
||
|
T(NaN, NaN, 0);
|
||
|
T(NaN, NaN, -1);
|
||
|
T(NaN, NaN, 1);
|
||
|
T(NaN, NaN, 2.2);
|
||
|
T(NaN, NaN, -2.2);
|
||
|
T(NaN, NaN, Infinity);
|
||
|
T(NaN, NaN, -Infinity);
|
||
|
|
||
|
T(Infinity, Infinity, 0);
|
||
|
T(-Infinity, -Infinity, -1);
|
||
|
T(Infinity, Infinity, 1);
|
||
|
T(-Infinity, -Infinity, 2.2);
|
||
|
T(Infinity, Infinity, -2.2);
|
||
|
T(Infinity, Infinity, Infinity);
|
||
|
T(-Infinity, -Infinity, -Infinity);
|
||
|
T(-Infinity, -Infinity, Infinity);
|
||
|
T(Infinity, Infinity, -Infinity);
|
||
|
T(Infinity, 1, Infinity);
|
||
|
T(-Infinity, -1, Infinity);
|
||
|
T(Infinity, 0.1, Infinity);
|
||
|
T(-Infinity, -0.1, Infinity);
|
||
|
T(Infinity, 1.1, Infinity);
|
||
|
T(-Infinity, -1.1, Infinity);
|
||
|
T(Infinity, 2, Infinity);
|
||
|
T(-Infinity, -2, Infinity);
|
||
|
T(Infinity, 2e-45, Infinity);
|
||
|
T(-Infinity, -1e+300, Infinity);
|
||
|
T(Infinity, 0.999, Infinity);
|
||
|
|
||
|
T(0, 0, 1000);
|
||
|
T(0, 0, NaN);
|
||
|
T(-0, -0, NaN);
|
||
|
T(0, 0, Infinity);
|
||
|
T(0, 0, -Infinity);
|
||
|
T(0, 1, -Infinity);
|
||
|
T(0, 2e-45, -Infinity);
|
||
|
T(0, 0.1, -Infinity);
|
||
|
T(0, 2, -Infinity);
|
||
|
T(0, 0, 2);
|
||
|
T(0, 0, -2);
|
||
|
|
||
|
assert(false, isMinusZero(new BigNumber(0).shift(Infinity)));
|
||
|
assert(false, isMinusZero(new BigNumber(0).shift(-Infinity)));
|
||
|
assert(true, isMinusZero(new BigNumber(-0).shift(Infinity)));
|
||
|
assert(true, isMinusZero(new BigNumber(-0).shift(-Infinity)));
|
||
|
assert(true, isMinusZero(new BigNumber(-0.1).shift(-Infinity)));
|
||
|
assert(true, isMinusZero(new BigNumber(-1).shift(-Infinity)));
|
||
|
assert(true, isMinusZero(new BigNumber(-2).shift(-Infinity)));
|
||
|
assert(true, isMinusZero(new BigNumber(-1e+300).shift(-Infinity)));
|
||
|
assert(false, isMinusZero(new BigNumber(0).shift(0)));
|
||
|
assert(true, isMinusZero(new BigNumber(-0).shift(0)));
|
||
|
assert(false, isMinusZero(new BigNumber(0).shift(-0)));
|
||
|
assert(true, isMinusZero(new BigNumber(-0).shift(-0)));
|
||
|
assert(false, isMinusZero(new BigNumber(0).shift(1000)));
|
||
|
assert(false, isMinusZero(new BigNumber(0).shift(NaN)));
|
||
|
assert(true, isMinusZero(new BigNumber(-0).shift(NaN)));
|
||
|
assert(false, isMinusZero(new BigNumber(2e-45).shift(-Infinity)));
|
||
|
assert(true, isMinusZero(new BigNumber(-2e-45).shift(-Infinity)));
|
||
|
|
||
|
T(2, 2, 0);
|
||
|
T(2, 2, null);
|
||
|
T(2, 2, undefined);
|
||
|
T(2, 2, NaN);
|
||
|
T(2, 2, 'erger');
|
||
|
T(2, 2, {});
|
||
|
T(2, 2, []);
|
||
|
|
||
|
T('1e+1000000', 1, 1e6)
|
||
|
T(1, '1e-1000000', 1e6)
|
||
|
T('9.82736534568327e+21', '9827365.34568327', ' 1.5e+1 ');
|
||
|
T('0.0898086057643523405623480756380247658237465999999', '0.000000000898086057643523405623480756380247658237465999999', ' 87365e-4 ');
|
||
|
T('2.34543534545e-2394335', '2.34543534545e-2394323', ' -12 ');
|
||
|
T(Infinity, 0.000345345, 1e200);
|
||
|
T(0, 0.000345345, -1e200);
|
||
|
T(0.000345345, 0.000345345, -1e-2);
|
||
|
T(0.99, 0.99, 1e-9);
|
||
|
T('9.9e+999999999', 0.99, 1e+9);
|
||
|
|
||
|
BigNumber.config({ ERRORS: true });
|
||
|
|
||
|
assertException(function () {new BigNumber('12.345').shift(true)}, ".shift(true)");
|
||
|
assertException(function () {new BigNumber('12.345').shift(false)}, ".shift(false)");
|
||
|
assertException(function () {new BigNumber('12.345').shift([])}, ".shift([])");
|
||
|
assertException(function () {new BigNumber('12.345').shift({})}, ".shift({})");
|
||
|
assertException(function () {new BigNumber('12.345').shift('')}, ".shift('')");
|
||
|
assertException(function () {new BigNumber('12.345').shift(' ')}, ".shift(' ')");
|
||
|
assertException(function () {new BigNumber('12.345').shift('4e')}, ".shift('4e')");
|
||
|
assertException(function () {new BigNumber('12.345').shift('hello')}, ".shift('hello')");
|
||
|
assertException(function () {new BigNumber('12.345').shift('\t')}, ".shift('\t')");
|
||
|
assertException(function () {new BigNumber('12.345').shift(new Date)}, ".shift(new Date)");
|
||
|
assertException(function () {new BigNumber('12.345').shift(new RegExp)}, ".shift(new RegExp)");
|
||
|
assertException(function () {new BigNumber('12.345').shift(function (){})}, ".shift(function (){})");
|
||
|
|
||
|
T('3.45345e+196', 0.000345345, 200);
|
||
|
T('3.45345e-14', 0.000345345, ' -1e1');
|
||
|
|
||
|
log('\n ' + passed + ' of ' + total + ' tests passed in ' + (+new Date() - start) + ' ms \n');
|
||
|
return [passed, total];
|
||
|
})(this.BigNumber);
|
||
|
if (typeof module !== 'undefined' && module.exports) module.exports = count;
|