if (typeof T === 'undefined') require('../setup');

T('toNearest', function () {

  function isMinusZero(n) {
    return n.isZero() && n.isNegative();
  }

  Decimal.config({
    precision: 20,
    rounding: 4,
    toExpNeg: -9e15,
    toExpPos: 9e15,
    minE: -9e15,
    maxE: 9e15
  });

  var t = function (actual) {
    T.assert(actual);
  }

  t(!isMinusZero(new Decimal(0).toNearest(0)));
  t( isMinusZero(new Decimal(-1).toNearest(0)));
  t( isMinusZero(new Decimal(-0).toNearest(0)));
  t(!isMinusZero(new Decimal(1).toNearest(0)));
  t(!isMinusZero(new Decimal(1).toNearest(-0)));
  t(!isMinusZero(new Decimal(1).toNearest(-3)));
  t( isMinusZero(new Decimal(-1).toNearest(-3)));

  t = function (expected, n, v, rm) {
    T.assertEqual(expected, new Decimal(n).toNearest(v, rm).valueOf());
  }

  t('Infinity', Infinity);
  t('-Infinity', -Infinity);
  t('NaN', NaN);
  t('NaN', NaN, NaN);
  t('NaN', NaN, Infinity);
  t('NaN', NaN, -Infinity);
  t('NaN', NaN, 0);
  t('NaN', NaN, -0);

  t('Infinity', '9.999e+9000000000000000', '1e+9000000000000001');
  t('Infinity', '9.999e+9000000000000000', '-1e+9000000000000001');
  t('-Infinity', '-9.999e+9000000000000000', '1e+9000000000000001');
  t('-Infinity', '-9.999e+9000000000000000', '-1e+9000000000000001');
  t('9.999e+9000000000000000', '9.999e+9000000000000000');
  t('-9.999e+9000000000000000', '-9.999e+9000000000000000');

  t('NaN', 123.456, NaN);
  t('Infinity', 123.456, Infinity);
  t('Infinity', 123.456, -Infinity);
  t('0', 123.456, 0);
  t('0', 123.456, '-0');

  t('NaN', -123.456, NaN);
  t('-Infinity', -123.456, Infinity);
  t('-Infinity', -123.456, -Infinity);
  t('-0', -123.456, '-0');

  t('0', 0, 0);
  t('Infinity', 0, Infinity);
  t('Infinity', 0, -Infinity);
  t('-Infinity', -0, Infinity);
  t('-Infinity', -0, -Infinity);

  t('0', 1, -3);
  t('-0', -1, -3);
  t('3', 1.5, -3, 0);
  t('-0', -1.5, -3, 1);
  t('-3', -1.5, -3, 2);

  t('123', 123.456);
  t('123', 123.456, 1);
  t('123.5', 123.456, 0.1);
  t('123.46', 123.456, 0.01);
  t('123.456', 123.456, 0.001);

  t('123', 123.456, -1);
  t('123.5', 123.456, -0.1);
  t('123.46', 123.456, -0.01);
  t('123.456', 123.456, -0.001);

  t('124', 123.456, '-2');
  t('123.4', 123.456, '-0.2');
  t('123.46', 123.456, '-0.02');
  t('123.456', 123.456, '-0.002');

  t('83105511540', '83105511539.5', 1, 4);
  t('83105511539', '83105511539.499999999999999999999999999999', 1, 4);
  t('83105511539', '83105511539.5', '1', 5);
  t('83105511540', '83105511539.5000000000000000000001', 1, 5);

  Decimal.precision = 3;

  t('83105511540', '83105511539.5', new Decimal(1), 4);
  t('83105511539', '83105511539.499999999999999999999999999999', 1, 4);
  t('83105511539', '83105511539.5', new Decimal('1'), 5);
  t('83105511540', '83105511539.5000000000000000000001', 1, 5);

  Decimal.precision = 20;

  t('83105511540', '83105511539.5', -1, 4);
  t('83105511539', '83105511539.499999999999999999999999999999', -1, 4);
  t('83105511539', '83105511539.5', '-1', 5);
  t('83105511540', '83105511539.5000000000000000000001', -1, 5);

  t('-83105511540', '-83105511539.5', new Decimal(-1), 4);
  t('-83105511539', '-83105511539.499999999999999999999999999999', 1, 4);
  t('-83105511539', '-83105511539.5', new Decimal('-1'), 5);
  t('-83105511540', '-83105511539.5000000000000000000001', -1, 5);

  t('83105511540', '83105511539.5', 1, 0);
  t('83105511539', '83105511539.5', 1, 1);
  t('83105511540', '83105511539.5', 1, 2);
  t('83105511539', '83105511539.5', 1, 3);
  t('83105511540', '83105511539.5', 1, 4);
  t('83105511539', '83105511539.5', 1, 5);
  t('83105511540', '83105511539.5', 1, 6);
  t('83105511540', '83105511539.5', 1, 7);
  t('83105511539', '83105511539.5', 1, 8);
  t('83105511539', '83105511539.499999999999999999999999999999', void 0, 0);
  t('83105511539', '83105511539.499999999999999999999999999999', 1, 1);
  t('83105511539', '83105511539.499999999999999999999999999999', void 0, 2);
  t('83105511539', '83105511539.499999999999999999999999999999', 1, 3);
  t('83105511539', '83105511539.499999999999999999999999999999', void 0, 4);
  t('83105511539', '83105511539.499999999999999999999999999999', 1, 5);
  t('83105511539', '83105511539.499999999999999999999999999999', void 0, 6);
  t('83105511539', '83105511539.499999999999999999999999999999', 1, 7);
  t('83105511539', '83105511539.499999999999999999999999999999', void 0, 8);
  t('83105511540', '83105511539.5000000000000000000001', void 0, 0);
  t('83105511539', '83105511539.5000000000000000000001', 1, 1);
  t('83105511540', '83105511539.5000000000000000000001', void 0, 2);
  t('83105511539', '83105511539.5000000000000000000001', 1, 3);
  t('83105511540', '83105511539.5000000000000000000001', void 0, 4);
  t('83105511540', '83105511539.5000000000000000000001', 1, 5);
  t('83105511540', '83105511539.5000000000000000000001', void 0, 6);
  t('83105511540', '83105511539.5000000000000000000001', 1, 7);
  t('83105511540', '83105511539.5000000000000000000001', void 0, 8);

  Decimal.rounding = 0;
  t('83105511540', '83105511539.5');

  Decimal.rounding = 1;
  t('83105511539', '83105511539.5');

  t('3847570', '3847561.00000749', 10, 0);
  t('42840000000000000', '42835000000000001', '1e+13', 0);
  t('42830000000000000', '42835000000000001', '1e+13', 1);
  t('42840000000000000', '42835000000000000.0002', '1e+13', 0);
  t('42830000000000000', '42835000000000000.0002', '1e+13', 1);

  t('500', '449.999', 100, 0);
  t('400', '449.999', 100, 1);
  t('500', '449.999', 100, 2);
  t('400', '449.999', 100, 3);
  t('400', '449.999', 100, 4);
  t('400', '449.999', 100, 5);
  t('400', '449.999', 100, 6);
  t('400', '449.999', 100, 7);
  t('400', '449.999', 100, 8);

  t('-500', '-449.999', 100, 0);
  t('-400', '-449.999', 100, 1);
  t('-400', '-449.999', 100, 2);
  t('-500', '-449.999', 100, 3);
  t('-400', '-449.999', 100, 4);
  t('-400', '-449.999', 100, 5);
  t('-400', '-449.999', 100, 6);
  t('-400', '-449.999', 100, 7);
  t('-400', '-449.999', 100, 8);

  t('500', '450', 100, 0);
  t('400', '450', 100, 1);
  t('500', '450', 100, 2);
  t('400', '450', 100, 3);
  t('500', '450', 100, 4);
  t('400', '450', 100, 5);
  t('400', '450', 100, 6);
  t('500', '450', 100, 7);
  t('400', '450', 100, 8);

  t('-500', '-450', 100, 0);
  t('-400', '-450', 100, 1);
  t('-400', '-450', 100, 2);
  t('-500', '-450', 100, 3);
  t('-500', '-450', 100, 4);
  t('-400', '-450', 100, 5);
  t('-400', '-450', 100, 6);
  t('-400', '-450', 100, 7);
  t('-500', '-450', 100, 8);

  Decimal.rounding = 0;
  t('500', '450.001', 100);
  Decimal.rounding = 1;
  t('400', '450.001', 100);
  Decimal.rounding = 2;
  t('500', '450.001', 100);
  Decimal.rounding = 3;
  t('400', '450.001', 100);
  Decimal.rounding = 4;
  t('500', '450.001', 100);
  Decimal.rounding = 5;
  t('500', '450.001', 100);
  Decimal.rounding = 6;
  t('500', '450.001', 100);
  Decimal.rounding = 7;
  t('500', '450.001', 100);
  Decimal.rounding = 8;
  t('500', '450.001', 100);

  Decimal.rounding = 0;
  t('-500', '-450.001', 100);
  Decimal.rounding = 1;
  t('-400', '-450.001', 100);
  Decimal.rounding = 2;
  t('-400', '-450.001', 100);
  Decimal.rounding = 3;
  t('-500', '-450.001', 100);
  Decimal.rounding = 4;
  t('-500', '-450.001', 100);
  Decimal.rounding = 5;
  t('-500', '-450.001', 100);
  Decimal.rounding = 6;
  t('-500', '-450.001', 100);
  Decimal.rounding = 7;
  t('-500', '-450.001', 100);
  Decimal.rounding = 8;
  t('-500', '-450.001', 100);
});