var count = (function config(Decimal) { var start = +new Date(), log, error, obj, undefined, passed = 0, total = 0, state, T; if (typeof window === 'undefined') { log = console.log; error = console.error; } else { log = function (str) { document.body.innerHTML += str.replace('\n', '
') }; error = function (str) { document.body.innerHTML += '
' + str.replace('\n', '
') + '
' }; } if (!Decimal && typeof require === 'function') Decimal = require('../decimal'); 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 == 'Decimal Error') { passed++; //log('\n Expected and actual: ' + actual); } else { error('\n Test number: ' + total + ' failed'); error('\n Expected: ' + message + ' to raise a Decimal Error.'); error(' Actual: ' + (actual || 'no exception')); //process.exit(); } } log('\n Testing config...'); Decimal.config({ precision: 20, rounding: 4, toExpNeg: -7, toExpPos: 21, minE: -9e15, maxE: 9e15, errors: false, crypto: false, modulo: 1 }); assert( true, Decimal.precision === 20 && Decimal.rounding === 4 && Decimal.toExpNeg === -7 && Decimal.toExpPos === 21 && Decimal.minE === -9e15 && Decimal.maxE === 9e15 && Decimal.errors === false && Decimal.crypto === false && Decimal.modulo === 1 ); Decimal.config({ precision: 40, rounding : 4, toExpNeg: -1000, toExpPos: 1000, minE: -1e9, maxE: 1e9, errors: true, crypto: true, modulo: 4 }); assert(true, Decimal.config() === Decimal); assert(true, Decimal.config(undefined) === Decimal); assert(true, Decimal.config(null) === Decimal); // Throw if not an object object. assertException(function () {Decimal.config('')}, "config('')"); assertException(function () {Decimal.config('hi')}, "config('hi')"); assertException(function () {Decimal.config(4)}, "config(4)"); assert(true, Decimal.precision === 40); assert(true, Decimal.rounding === 4); assert(true, Decimal.toExpNeg === -1000); assert(true, Decimal.toExpPos === 1000); assert(true, Decimal.minE === -1e9); assert(true, Decimal.maxE === 1e9); assert(true, Decimal.errors === true); assert(true, Decimal.crypto === true || Decimal.crypto === false); assert(true, Decimal.modulo === 4); Decimal.config({ toExpNeg: -7, toExpPos: 21, minE: -324, maxE: 308 }); // precision T = function (expected, obj) { Decimal.config(obj); assert(String(expected), String(Decimal.precision)); } T(1, {precision: 1}); T(20, {precision: 20}); T(300000,{precision: 300000}); T(4e+8, {precision: 4e8}); T(123456789, {precision: '123456789'}); T(1e9, {precision: 1e9}); T(1e9, {precision: null}); T(1e9, {precision: undefined}); assertException(function () {Decimal.config({precision: -1})}, "precision: -1"); assertException(function () {Decimal.config({precision: 0.1})}, "precision: 0.1"); assertException(function () {Decimal.config({precision: 1.1})}, "precision: 1.1"); assertException(function () {Decimal.config({precision: -1.1})}, "precision: -1.1"); assertException(function () {Decimal.config({precision: 8.1})}, "precision: 8.1"); assertException(function () {Decimal.config({precision: 1e+9 + 1})}, "precision: 1e9 + 1"); assertException(function () {Decimal.config({precision: []})}, "precision: []"); assertException(function () {Decimal.config({precision: {}})}, "precision: {}"); assertException(function () {Decimal.config({precision: ''})}, "precision: ''"); assertException(function () {Decimal.config({precision: ' '})}, "precision: ' '"); assertException(function () {Decimal.config({precision: 'hi'})}, "precision: 'hi'"); assertException(function () {Decimal.config({precision: '1e+9'})}, "precision: '1e+9'"); assertException(function () {Decimal.config({precision: NaN})}, "precision: NaN"); assertException(function () {Decimal.config({precision: Infinity})}, "precision: Infinity"); Decimal.config({ errors: false }); T(1e9, {precision: -1}); T(1e9, {precision: 0.1}); T(1, {precision: 1.99}); T(1, {precision: -1.1}); T(8, {precision: 8.7654321}); T(8, {precision: 1e9 + 1}); T(8, {precision: []}); T(8, {precision: {}}); T(8, {precision: ''}); T(8, {precision: ' '}); T(8, {precision: 'hi'}); T(1e9, {precision: '1e+9'}); T(1e9, {precision: NaN}); T(1e9, {precision: Infinity}); T(1e9, {precision: new Date}); T(1e9, {precision: null}); T(1e9, {precision: undefined}); // rounding T = function (expected) { assert(expected, Decimal.rounding); } Decimal.config({ rounding: 8, errors: 0 }); Decimal.config({rounding: -1}); T(8); Decimal.config({rounding: 0.1}); T(0); Decimal.config({rounding: 1.99}); T(1); Decimal.config({rounding: -1.1}); T(1); Decimal.config({rounding: 8.01}); T(1); Decimal.config({rounding: 7.99}); T(7); Decimal.config({rounding: 1e9 + 1}); T(7); Decimal.config({rounding: []}); T(7); Decimal.config({rounding: {}}); T(7); Decimal.config({rounding: ''}); T(7); Decimal.config({rounding: ' '}); T(7); Decimal.config({rounding: 'hi'}); T(7); Decimal.config({rounding: '1e+0'}); T(1); Decimal.config({rounding: NaN}); T(1); Decimal.config({rounding: Infinity}); T(1); Decimal.config({rounding: new Date}); T(1); Decimal.config({rounding: null}); T(1); Decimal.config({rounding: undefined}); T(1); Decimal.config({ errors: true }); T = function (expected, rm) { Decimal.config(rm); assert(String(expected), String(Decimal.rounding)); } T(0, {rounding: 0}); T(1, {rounding: 1}); T(2, {rounding: 2}); T(3, {rounding: 3}); T(4, {rounding: 4}); T(5, {rounding: 5}); T(6, {rounding: 6}); T(7, {rounding: 7}); T(8, {rounding: 8}); T(8, {rounding: null}); T(8, {rounding: undefined}); assertException(function () {Decimal.config({rounding: -1})}, "rounding : -1"); assertException(function () {Decimal.config({rounding: 0.1})}, "rounding : 0.1"); assertException(function () {Decimal.config({rounding: 1.1})}, "rounding : 1.1"); assertException(function () {Decimal.config({rounding: -1.1})}, "rounding : -1.1"); assertException(function () {Decimal.config({rounding: 8.1})}, "rounding : 8.1"); assertException(function () {Decimal.config({rounding: 9})}, "rounding : 9"); assertException(function () {Decimal.config({rounding: 11})}, "rounding : 11"); assertException(function () {Decimal.config({rounding: []})}, "rounding : []"); assertException(function () {Decimal.config({rounding: {}})}, "rounding : {}"); assertException(function () {Decimal.config({rounding: ''})}, "rounding : ''"); assertException(function () {Decimal.config({rounding: ' '})}, "rounding : ' '"); assertException(function () {Decimal.config({rounding: 'hi'})}, "rounding : 'hi'"); assertException(function () {Decimal.config({rounding: NaN})}, "rounding : NaN"); assertException(function () {Decimal.config({rounding: Infinity})}, "rounding : Infinity"); // toExpNeg, toExpPos assert(true, Decimal.toExpNeg === -7); assert(true, Decimal.toExpPos === 21); assertException(function () {Decimal.config({toExpNeg: 0.1})}, "toExpNeg: 0.1"); assertException(function () {Decimal.config({toExpPos: -0.1})}, "toExpPos: -0.1"); assertException(function () {Decimal.config({toExpNeg: 1})}, "toExpNeg: 1"); assertException(function () {Decimal.config({toExpPos: -1})}, "toExpPos: -1"); assertException(function () {Decimal.config({toExpNeg: 1e9 + 1})}, "toExpNeg: 1e9 + 1"); assertException(function () {Decimal.config({toExpPos: -1e9 - 1})}, "toExpPos: -1e9 - 1"); assertException(function () {Decimal.config({toExpNeg: Infinity})}, "toExpNeg: Infinity"); assertException(function () {Decimal.config({toExpPos: -Infinity})}, "toExpPos: -Infinity"); assert(true, Decimal.toExpNeg === -7); assert(true, Decimal.toExpPos === 21); Decimal.config({toExpNeg: -1}); assert(-1, Decimal.toExpNeg); Decimal.config({toExpPos: 1}); assert(1, Decimal.toExpPos); Decimal.config({toExpNeg: 0}); assert(true, Decimal.toExpNeg === 0); assert(false, Decimal.toExpPos === 0); Decimal.config({toExpNeg: -1}); assert(true, Decimal.toExpNeg === -1 && Decimal.toExpPos !== -1); Decimal.config({ errors: true }); // minE, maxE assert(true, Decimal.minE === -324); assert(true, Decimal.maxE === 308); assertException(function () {Decimal.config({minE: -0.9})}, "minE: -0.9"); assertException(function () {Decimal.config({maxE: 0.9})}, "maxE: 0.9"); assertException(function () {Decimal.config({maxE: -1})}, "maxE: -1"); assertException(function () {Decimal.config({minE: 1})}, "minE: 1"); assertException(function () {Decimal.config({minE: -9e16})}, "minE: -9e16"); assertException(function () {Decimal.config({maxE: -1e9})}, "maxE: -1e9"); assertException(function () {Decimal.config({minE: 1e9})}, "minE: 1e9"); assertException(function () {Decimal.config({maxE: 9e16})}, "maxE: 9e16"); assertException(function () {Decimal.config({minE: Infinity})}, "minE: Infinity"); assertException(function () {Decimal.config({maxE: Infinity})}, "maxE: Infinity"); assertException(function () {Decimal.config({minE: "-Infinity"})}, "minE: '-Infinity'"); assertException(function () {Decimal.config({maxE: "-Infinity"})}, "maxE: '-Infinity'"); assert(true, Decimal.minE === -324); assert(true, Decimal.maxE === 308); Decimal.config({minE: -1}); assert(true, Decimal.minE === -1 && Decimal.maxE !== 1); Decimal.config({maxE: 1}); assert(true, Decimal.minE !== 1 && Decimal.maxE === 1); // errors Decimal.config({errors: 0}); assert(false, Decimal.errors); Decimal.config({errors: 1}); assert(true, Decimal.errors); Decimal.config({errors: false}); assert(false, Decimal.errors); Decimal.config({errors: true}); assert(true, Decimal.errors); Decimal.config({errors: null}); assert(true, Decimal.errors); Decimal.config({errors: undefined}); assert(true, Decimal.errors); assertException(function () {Decimal.config({errors: 'hiya'})}, "errors: 'hiya'"); assertException(function () {Decimal.config({errors: 'true'})}, "errors: 'true'"); assertException(function () {Decimal.config({errors: 'false'})}, "errors: 'false'"); assertException(function () {Decimal.config({errors: '0'})}, "errors: '0'"); assertException(function () {Decimal.config({errors: '1'})}, "errors: '1'"); assertException(function () {Decimal.config({errors: -1})}, "errors: -1"); assertException(function () {Decimal.config({errors: 0.1})}, "errors: 0.1"); assertException(function () {Decimal.config({errors: 1.1})}, "errors: 1.1"); assertException(function () {Decimal.config({errors: []})}, "errors: []"); assertException(function () {Decimal.config({errors: {}})}, "errors: {}"); assertException(function () {Decimal.config({errors: ''})}, "errors: ''"); assertException(function () {Decimal.config({errors: ' '})}, "errors: ' '"); assertException(function () {Decimal.config({errors: NaN})}, "errors: NaN"); assertException(function () {Decimal.config({errors: Infinity})}, "errors: Infinity"); assert(true, Decimal.errors); Decimal.config({ errors: false }); T = function (expected, err) { Decimal.config(err); assert(String(expected), String(Decimal.errors)); } T(false, {errors: null}); T(false, {errors: undefined}); T(false, {errors: NaN}); T(false, {errors: 'd'}); T(false, {errors: []}); T(false, {errors: {}}); T(false, {errors: new Date}); T(true, {errors: Boolean(1)}); T(true, {errors: Boolean(true)}); T(false, {errors: Boolean(0)}); T(false, {errors: Boolean(false)}); T(true, {errors: Boolean('false')}); // crypto T = function (expected, obj) { Decimal.config(obj); assert(String(expected), String(Decimal.crypto)); } Decimal.config({ crypto: true }); state = Decimal.crypto; assertException(function () {Decimal.config({crypto: 'hiya'})}, "crypto: 'hiya'"); assertException(function () {Decimal.config({crypto: 'true'})}, "crypto: 'true'"); assertException(function () {Decimal.config({crypto: 'false'})}, "crypto: 'false'"); assertException(function () {Decimal.config({crypto: '0'})}, "crypto: '0'"); assertException(function () {Decimal.config({crypto: '1'})}, "crypto: '1'"); assertException(function () {Decimal.config({crypto: -1})}, "crypto: -1"); assertException(function () {Decimal.config({crypto: 0.1})}, "crypto: 0.1"); assertException(function () {Decimal.config({crypto: 1.1})}, "crypto: 1.1"); assertException(function () {Decimal.config({crypto: []})}, "crypto: []"); assertException(function () {Decimal.config({crypto: {}})}, "crypto: {}"); assertException(function () {Decimal.config({crypto: ''})}, "crypto: ''"); assertException(function () {Decimal.config({crypto: ' '})}, "crypto: ' '"); assertException(function () {Decimal.config({crypto: NaN})}, "crypto: NaN"); assertException(function () {Decimal.config({crypto: Infinity})}, "crypto: Infinity"); Decimal.config({ errors: false }); T(state, {crypto: null}); T(state, {crypto: undefined}); T(state, {crypto: NaN}); T(state, {crypto: 'd'}); T(state, {crypto: []}); T(state, {crypto: {}}); T(state, {crypto: new Date}); T(state, {crypto: Boolean(1)}); T(state, {crypto: Boolean(true)}); T(false, {crypto: Boolean(0)}); T(false, {crypto: Boolean(false)}); T(state, {crypto: Boolean('false')}); T(false, {crypto: false}); T(state, {crypto: 1}); T(false, {crypto: 0}); T(state, {crypto: true}); // modulo Decimal.config({ errors: true }); T = function (expected, rm) { Decimal.config(rm); assert(String(expected), String(Decimal.modulo)); } T(0, {modulo: 0}); T(1, {modulo: 1}); T(2, {modulo: 2}); T(3, {modulo: 3}); T(4, {modulo: 4}); T(5, {modulo: 5}); T(6, {modulo: 6}); T(7, {modulo: 7}); T(8, {modulo: 8}); T(9, {modulo: 9}); T(9, {modulo: null}); T(9, {modulo: undefined}); assertException(function () {Decimal.config({modulo: -1})}, "modulo: -1"); assertException(function () {Decimal.config({modulo: 0.1})}, "modulo: 0.1"); assertException(function () {Decimal.config({modulo: 1.1})}, "modulo: 1.1"); assertException(function () {Decimal.config({modulo: -1.1})}, "modulo: -1.1"); assertException(function () {Decimal.config({modulo: 8.1})}, "modulo: 8.1"); assertException(function () {Decimal.config({modulo: 10})}, "modulo: 10"); assertException(function () {Decimal.config({modulo: -11})}, "modulo: -11"); assertException(function () {Decimal.config({modulo: []})}, "modulo: []"); assertException(function () {Decimal.config({modulo: {}})}, "modulo: {}"); assertException(function () {Decimal.config({modulo: ''})}, "modulo: ''"); assertException(function () {Decimal.config({modulo: ' '})}, "modulo: ' '"); assertException(function () {Decimal.config({modulo: 'hi'})}, "modulo: 'hi'"); assertException(function () {Decimal.config({modulo: NaN})}, "modulo: NaN"); assertException(function () {Decimal.config({modulo: Infinity})}, "modulo: Infinity"); assert(9, Decimal.modulo); // Test constructor parsing. Decimal.config({ precision: 40, rounding: 4, toExpNeg: -7, toExpPos: 21, minE: -9e15, maxE: 9e15, errors: true, crypto: false, modulo: 1 }); T = function (expected, n) { assert(String(expected), String(new Decimal(n).toString())); } T('123.456789', 123.456789); T('123.456789', '123.456789'); var N = 'NaN'; T(N, NaN); T(N, 'NaN'); T(N, ' NaN'); T(N, 'NaN '); T(N, ' NaN '); T(N, '+NaN'); T(N, ' +NaN'); T(N, '+NaN '); T(N, ' +NaN '); T(N, '-NaN'); T(N, ' -NaN'); T(N, '-NaN '); T(N, ' -NaN '); assertException(function () {new Decimal('+ NaN')}, "+ NaN"); assertException(function () {new Decimal('- NaN')}, "- NaN"); assertException(function () {new Decimal(' + NaN')}, " + NaN"); assertException(function () {new Decimal(' - NaN')}, " - NaN"); assertException(function () {new Decimal('. NaN')}, ". NaN"); assertException(function () {new Decimal('.-NaN')}, ".-NaN"); assertException(function () {new Decimal('.+NaN')}, ".+NaN"); assertException(function () {new Decimal('-.NaN')}, "-.NaN"); assertException(function () {new Decimal('+.NaN')}, "+.NaN"); var I = 'Infinity'; T(I, Infinity); T(I, 'Infinity'); T(I, ' Infinity'); T(I, 'Infinity '); T(I, ' Infinity '); T(I, '+Infinity'); T(I, ' +Infinity'); T(I, '+Infinity '); T(I, ' +Infinity '); T('-Infinity', '-Infinity'); T('-Infinity', ' -Infinity'); T('-Infinity', '-Infinity '); T('-Infinity', ' -Infinity '); assertException(function () {new Decimal('+ Infinity')}, "+ Infinity"); assertException(function () {new Decimal(' + Infinity')}, " + Infinity"); assertException(function () {new Decimal('- Infinity')}, "- Infinity"); assertException(function () {new Decimal(' - Infinity')}, " - Infinity"); assertException(function () {new Decimal('.Infinity')}, ".Infinity"); assertException(function () {new Decimal('. Infinity')}, ". Infinity"); assertException(function () {new Decimal('.-Infinity')}, ".-Infinity"); assertException(function () {new Decimal('.+Infinity')}, ".+Infinity"); assertException(function () {new Decimal('-.Infinity')}, "-.Infinity"); assertException(function () {new Decimal('+.Infinity')}, "+.Infinity"); var Z = '0'; T(Z, 0); T(Z, -0); T(Z, '.0'); T(Z, '0.'); T(Z, '0.00000000'); T(Z, '-0.'); T(Z, '+0.'); T(Z, '+0'); T(Z, '-0'); T(Z, ' +0'); T(Z, ' -0'); T(Z, ' +0 '); T(Z, ' -0 '); T(Z, '+.0'); T(Z, '-.0'); T(Z, ' +.0'); T(Z, ' -.0'); T(Z, ' +.0 '); T(Z, ' -.0 '); assertException(function () {new Decimal('+-0')}, "+-0"); assertException(function () {new Decimal('-+0')}, "-+0"); assertException(function () {new Decimal('--0')}, "--0"); assertException(function () {new Decimal('++0')}, "++0"); assertException(function () {new Decimal('.-0')}, ".-0"); assertException(function () {new Decimal('.+0')}, ".+0"); assertException(function () {new Decimal('0 .')}, "0 ."); assertException(function () {new Decimal('. 0')}, ". 0"); assertException(function () {new Decimal('..0')}, "..0"); assertException(function () {new Decimal('+.-0')}, "+.-0"); assertException(function () {new Decimal('-.+0')}, "-.+0"); assertException(function () {new Decimal('+. 0')}, "+. 0"); assertException(function () {new Decimal('-. 0')}, "-. 0"); T('2', '+2'); T('-2', '-2'); T('2', ' +2'); T('-2', ' -2'); T('2', ' +2 '); T('-2', ' -2 '); T('0.2', '.2'); T('2', '2.'); T('-2', '-2.'); T('2', '+2.'); T('0.2', '+.2'); T('-0.2', '-.2'); T('0.2', ' +.2'); T('-0.2', ' -.2'); T('0.2', ' +.2 '); T('-0.2', ' -.2 '); assertException(function () {new Decimal('+-2')}, "+-2"); assertException(function () {new Decimal('-+2')}, "-+2"); assertException(function () {new Decimal('--2')}, "--2"); assertException(function () {new Decimal('++2')}, "++2"); assertException(function () {new Decimal('.-2')}, ".-2"); assertException(function () {new Decimal('.+2')}, ".+2"); assertException(function () {new Decimal('2 .')}, "2 ."); assertException(function () {new Decimal('. 2')}, ". 2"); assertException(function () {new Decimal('..2')}, "..2"); assertException(function () {new Decimal('+.-2')}, "+.-2"); assertException(function () {new Decimal('-.+2')}, "-.+2"); assertException(function () {new Decimal('+. 2')}, "+. 2"); assertException(function () {new Decimal('-. 2')}, "-. 2"); assertException(function () {new Decimal('+2..')}, "+2.."); assertException(function () {new Decimal('-2..')}, "-2.."); assertException(function () {new Decimal('-.2.')}, "-.2."); assertException(function () {new Decimal('+.2.')}, "+.2."); assertException(function () {new Decimal('.-20.')}, ".-20."); assertException(function () {new Decimal('.+20.')}, ".+20."); assertException(function () {new Decimal('. 20.')}, ". 20."); assertException(function () {new Decimal(undefined)}, "undefined"); assertException(function () {new Decimal([])}, "[]"); assertException(function () {new Decimal('')}, "''"); assertException(function () {new Decimal(null)}, "null"); assertException(function () {new Decimal(' ')}, "' '"); assertException(function () {new Decimal('nan')}, "nan"); assertException(function () {new Decimal('23er')}, "23er"); assertException(function () {new Decimal('e4')}, "e4"); assertException(function () {new Decimal('0x434')}, "0x434"); assertException(function () {new Decimal('--45')}, "--45"); assertException(function () {new Decimal('+-2')}, "+-2"); assertException(function () {new Decimal('0 0')}, "0 0"); log('\n ' + passed + ' of ' + total + ' tests passed in ' + (+new Date() - start) + ' ms \n'); return [passed, total]; })(this.Decimal); if (typeof module !== 'undefined' && module.exports) module.exports = count;