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

T('decimalPlaces and precision', function () {

  function t(n, dp, sd, zs) {
    T.assertEqual(dp, new Decimal(n).dp());
    T.assertEqual(dp, new Decimal(n).decimalPlaces());
    T.assertEqual(sd, new Decimal(n).sd(zs));
    T.assertEqual(sd, new Decimal(n).precision(zs));
  }

  function tx(fn, msg) {
    T.assertException(fn, msg);
  }

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

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

  t(100, 0, 1);
  t(100, 0, 1, 0);
  t(100, 0, 1, false);
  t(100, 0, 3, 1);
  t(100, 0, 3, true);

  t('0.0012345689', 10, 8);
  t('0.0012345689', 10, 8, 0);
  t('0.0012345689', 10, 8, false);
  t('0.0012345689', 10, 8, 1);
  t('0.0012345689', 10, 8, true);

  t('987654321000000.0012345689000001', 16, 31, 0);
  t('987654321000000.0012345689000001', 16, 31, 1);

  t('1e+123', 0, 1);
  t('1e+123', 0, 124, 1);
  t('1e-123', 123, 1);
  t('1e-123', 123, 1, 1);

  t('9.9999e+9000000000000000', 0, 5, false);
  t('9.9999e+9000000000000000', 0, 9000000000000001, true);
  t('-9.9999e+9000000000000000', 0, 5, false);
  t('-9.9999e+9000000000000000', 0, 9000000000000001, true);

  t('1e-9000000000000000', 9e15, 1, false);
  t('1e-9000000000000000', 9e15, 1, true);
  t('-1e-9000000000000000', 9e15, 1, false);
  t('-1e-9000000000000000', 9e15, 1, true);

  t('55325252050000000000000000000000.000000004534500000001', 21, 53);

  tx(function () {new Decimal(1).precision(null)}, "new Decimal(1).precision(null)");
  tx(function () {new Decimal(1).sd(null)}, "new Decimal(1).sd(null)");
  tx(function () {new Decimal(1).sd(2)}, "new Decimal(1).sd(2)");
  tx(function () {new Decimal(1).sd('3')}, "new Decimal(1).sd('3')");
  tx(function () {new Decimal(1).sd({})}, "new Decimal(1).sd({})");
});