simple-round
Version:
A module for rounding decimals in JavaScript
627 lines (516 loc) • 17.9 kB
JavaScript
import {round, fixedRound, fixedSimpleRound, simpleRound, DIRECTIONS} from '../src/round';
describe('Round HALF_UP for positive numbers', () => {
test('can round pi HALF_UP to 2 decimal places', () => {
let number = 3.14159;
let direction = DIRECTIONS.HALF_UP;
let precision = 2;
expect(round({number, direction, precision})).toEqual(3.14);
});
test('can round pi HALF_UP to 3 decimal places', () => {
let number = 3.14159;
let direction = DIRECTIONS.HALF_UP;
let precision = 3;
expect(round({number, direction, precision})).toEqual(3.142);
});
});
describe('Round HALF_UP for negative numbers', () => {
test('can round -pi HALF_UP to 2 decimal places', () => {
let number = -3.14159;
let direction = DIRECTIONS.HALF_UP;
let precision = 2;
expect(round({number, direction, precision})).toEqual(-3.14);
});
test('can round -pi HALF_UP to 3 decimal places', () => {
let number = -3.14159;
let direction = DIRECTIONS.HALF_UP;
let precision = 3;
expect(round({number, direction, precision})).toEqual(-3.142);
});
});
describe('Round HALF_UP handles edge cases', () => {
test('supplied precision is longer than number', () => {
let number = 3.14159;
let direction = DIRECTIONS.HALF_UP;
let precision = 10;
expect(round({number, direction, precision})).toEqual(3.14159);
});
test('number is undefined', () => {
let number;
let direction = DIRECTIONS.HALF_UP;
let precision = 10;
expect(round({number, direction, precision})).toEqual(0);
});
test('direction is out of range', () => {
let number = 3.14159;
let direction = 666;
let precision = 3;
expect(() => round({number, direction, precision})).toThrow();
});
test('can correctly round a four', () => {
let number = 3.14159;
let direction = DIRECTIONS.HALF_UP;
let precision = 1;
expect(round({number, direction, precision})).toEqual(3.1);
});
test('can correctly round a four when negative', () => {
let number = -3.14159;
let direction = DIRECTIONS.HALF_UP;
let precision = 1;
expect(round({number, direction, precision})).toEqual(-3.1);
});
test('can correctly round a six', () => {
let number = 1.23456;
let direction = DIRECTIONS.HALF_UP;
let precision = 4;
expect(round({number, direction, precision})).toEqual(1.2346);
});
test('can correctly round a six when negative', () => {
let number = -1.23456;
let direction = DIRECTIONS.HALF_UP;
let precision = 4;
expect(round({number, direction, precision})).toEqual(-1.2346);
});
});
describe('Round HALF_DOWN for positive numbers', () => {
test('can round pi HALF_DOWN to 2 decimal places', () => {
let number = 3.14159;
let direction = DIRECTIONS.HALF_DOWN;
let precision = 2;
expect(round({number, direction, precision})).toEqual(3.14);
});
test('can round pi HALF_DOWN to 3 decimal places', () => {
let number = 3.14159;
let direction = DIRECTIONS.HALF_DOWN;
let precision = 3;
expect(round({number, direction, precision})).toEqual(3.141);
});
});
describe('Round HALF_DOWN for negative numbers', () => {
test('can round -pi HALF_DOWN to 2 decimal places', () => {
let number = -3.14159;
let direction = DIRECTIONS.HALF_DOWN;
let precision = 2;
expect(round({number, direction, precision})).toEqual(-3.14);
});
test('can round -pi HALF_DOWN to 3 decimal places', () => {
let number = -3.14159;
let direction = DIRECTIONS.HALF_DOWN;
let precision = 3;
expect(round({number, direction, precision})).toEqual(-3.141);
});
});
describe('Round HALF_DOWN handles edge cases', () => {
test('supplied precision is longer than number', () => {
let number = 3.14159;
let direction = DIRECTIONS.HALF_DOWN;
let precision = 10;
expect(round({number, direction, precision})).toEqual(3.14159);
});
test('number is undefined', () => {
let number;
let direction = DIRECTIONS.HALF_DOWN;
let precision = 10;
expect(round({number, direction, precision})).toEqual(0);
});
test('can correctly round a six', () => {
let number = 1.23456;
let direction = DIRECTIONS.HALF_DOWN;
let precision = 4;
expect(round({number, direction, precision})).toEqual(1.2346);
});
test('can correctly round a six when negative', () => {
let number = -1.23456;
let direction = DIRECTIONS.HALF_DOWN;
let precision = 4;
expect(round({number, direction, precision})).toEqual(-1.2346);
});
test('can correctly round a 5', () => {
let number = 0.285;
let direction = DIRECTIONS.HALF_DOWN;
let precision = 2;
expect(round({number, direction, precision})).toEqual(0.28);
});
test('can correctly round a 5 when number is negative', () => {
let number = -0.285;
let direction = DIRECTIONS.HALF_DOWN;
let precision = 2;
expect(round({number, direction, precision})).toEqual(-0.28);
});
test('can correctly round a number that rolls', () => {
let number = 0.999;
let direction = DIRECTIONS.HALF_DOWN;
let precision = 2;
expect(round({number, direction, precision})).toEqual(1.00);
});
test('can correctly round a number that doesnt roll', () => {
let number = 0.995;
let direction = DIRECTIONS.HALF_DOWN;
let precision = 2;
expect(round({number, direction, precision})).toEqual(0.99);
});
test('can correctly round a number that just rolls', () => {
let number = 0.996;
let direction = DIRECTIONS.HALF_DOWN;
let precision = 2;
expect(round({number, direction, precision})).toEqual(1.00);
});
});
describe('Round DOWN for positive numbers', () => {
test('can round pi DOWN to 2 decimal places', () => {
let number = 3.14159;
let direction = DIRECTIONS.DOWN;
let precision = 2;
expect(round({number, direction, precision})).toEqual(3.14);
});
test('can round pi DOWN to 3 decimal places', () => {
let number = 3.14159;
let direction = DIRECTIONS.DOWN;
let precision = 3;
expect(round({number, direction, precision})).toEqual(3.141);
});
});
describe('Round DOWN for negative numbers', () => {
test('can round -pi DOWN to 2 decimal places', () => {
let number = -3.14159;
let direction = DIRECTIONS.DOWN;
let precision = 2;
expect(round({number, direction, precision})).toEqual(-3.14);
});
test('can round -pi DOWN to 3 decimal places', () => {
let number = -3.14159;
let direction = DIRECTIONS.DOWN;
let precision = 3;
expect(round({number, direction, precision})).toEqual(-3.141);
});
});
describe('round DOWN handles boundaries', () => {
test('rounds 5', () => {
let number = 0.285;
let direction = DIRECTIONS.DOWN;
let precision = 2;
expect(round({number, direction, precision})).toEqual(0.28);
});
test('rounds 5 when negative', () => {
let number = -0.285;
let direction = DIRECTIONS.DOWN;
let precision = 2;
expect(round({number, direction, precision})).toEqual(-0.28);
});
test('rounds 9', () => {
let number = 0.299;
let direction = DIRECTIONS.DOWN;
let precision = 2;
expect(round({number, direction, precision})).toEqual(0.29);
});
test('rounds 9 when negative', () => {
let number = -0.299;
let direction = DIRECTIONS.DOWN;
let precision = 2;
expect(round({number, direction, precision})).toEqual(-0.29);
});
test('doesnt round when precision is the same as the length of the number', () => {
let number = 0.999;
let direction = DIRECTIONS.DOWN;
let precision = 3;
expect(round({number, direction, precision})).toEqual(0.999);
});
test('doesnt round when precision is the same as the length of the negative number', () => {
let number = -0.999;
let direction = DIRECTIONS.DOWN;
let precision = 3;
expect(round({number, direction, precision})).toEqual(-0.999);
});
test('rounds a long number', () => {
let number = 0.99999999;
let direction = DIRECTIONS.DOWN;
let precision = 2;
expect(round({number, direction, precision})).toEqual(0.99);
});
test('rounds a long negative number', () => {
let number = -0.99999999;
let direction = DIRECTIONS.DOWN;
let precision = 2;
expect(round({number, direction, precision})).toEqual(-0.99);
});
});
describe('Round DOWN handles edge cases', () => {
test('supplied precision is longer than number', () => {
let number = 3.14159;
let direction = DIRECTIONS.DOWN;
let precision = 10;
expect(round({number, direction, precision})).toEqual(3.14159);
});
test('number is undefined', () => {
let number;
let direction = DIRECTIONS.DOWN;
let precision = 10;
expect(round({number, direction, precision})).toEqual(0);
});
});
describe('Round UP for positive numbers', () => {
test('can round pi UP to 2 decimal places', () => {
let number = 3.14159;
let direction = DIRECTIONS.UP;
let precision = 2;
expect(round({number, direction, precision})).toEqual(3.15);
});
test('can round pi UP to 3 decimal places', () => {
let number = 3.14159;
let direction = DIRECTIONS.UP;
let precision = 3;
expect(round({number, direction, precision})).toEqual(3.142);
});
});
describe('Round UP for negative numbers', () => {
test('can round -pi UP to 2 decimal places', () => {
let number = -3.14159;
let direction = DIRECTIONS.UP;
let precision = 2;
expect(round({number, direction, precision})).toEqual(-3.15);
});
test('can round -pi UP to 3 decimal places', () => {
let number = -3.14159;
let direction = DIRECTIONS.UP;
let precision = 3;
expect(round({number, direction, precision})).toEqual(-3.142);
});
});
describe('round UP handles boundaries', () => {
test('rounds 5', () => {
let number = 0.285;
let direction = DIRECTIONS.UP;
let precision = 2;
expect(round({number, direction, precision})).toEqual(0.29);
});
test('rounds 5 when negative', () => {
let number = -0.285;
let direction = DIRECTIONS.UP;
let precision = 2;
expect(round({number, direction, precision})).toEqual(-0.29);
});
test('rounds 9', () => {
let number = 0.299;
let direction = DIRECTIONS.UP;
let precision = 2;
expect(round({number, direction, precision})).toEqual(0.30);
});
test('rounds 9 when negative', () => {
let number = -0.299;
let direction = DIRECTIONS.UP;
let precision = 2;
expect(round({number, direction, precision})).toEqual(-0.30);
});
test('doesnt round when precision is the same as the length of the number', () => {
let number = 0.999;
let direction = DIRECTIONS.UP;
let precision = 3;
expect(round({number, direction, precision})).toEqual(0.999);
});
test('doesnt round when precision is the same as the length of the negative number', () => {
let number = -0.999;
let direction = DIRECTIONS.UP;
let precision = 3;
expect(round({number, direction, precision})).toEqual(-0.999);
});
test('rounds a long number', () => {
let number = 0.99999999;
let direction = DIRECTIONS.UP;
let precision = 2;
expect(round({number, direction, precision})).toEqual(1.00);
});
test('rounds a long negative number', () => {
let number = -0.99999999;
let direction = DIRECTIONS.UP;
let precision = 2;
expect(round({number, direction, precision})).toEqual(-1.00);
});
});
describe('Round UP handles edge cases', () => {
test('supplied precision is longer than number', () => {
let number = 3.14159;
let direction = DIRECTIONS.UP;
let precision = 10;
expect(round({number, direction, precision})).toEqual(3.14159);
});
test('number is undefined', () => {
let number;
let direction = DIRECTIONS.UP;
let precision = 10;
expect(round({number, direction, precision})).toEqual(0);
});
});
describe('simpleRound gives the same results as HALF_UP', () => {
test('simpleRound can round pi HALF_UP to 2 decimal places', () => {
let number = 3.14159;
expect(simpleRound(number)).toEqual(3.14);
});
test('simpleRound can round -pi HALF_UP to 2 decimal places', () => {
let number = -3.14159;
expect(simpleRound(number)).toEqual(-3.14);
});
test('number is undefined', () => {
let number;
expect(simpleRound(number)).toEqual(0);
});
});
describe('simpleRound works for decimal fractions less than one', () => {
test('a small number', () => {
let number = 0.285;
expect(simpleRound(number)).toEqual(0.29);
});
test('a smaller number', () => {
let number = 0.284;
expect(simpleRound(number)).toEqual(0.28);
});
test('a number that causes rollover', () => {
let number = 0.099;
expect(simpleRound(number)).toEqual(.10);
});
test('a number that causes rollover', () => {
let number = 0.999;
expect(simpleRound(number)).toEqual(1.00);
});
test('a number that causes rollover', () => {
let number = 0.99;
expect(simpleRound(number)).toEqual(0.99);
});
test('a small negative number that causes rollover', () => {
let number = -0.999;
expect(simpleRound(number)).toEqual(-1);
});
test('handles non-terminating decimals that round down', () => {
let number = 0.333333;
expect(simpleRound(number)).toEqual(0.33);
});
test('handles non-terminating decimals that round up', () => {
let number = 0.6666666;
expect(simpleRound(number)).toEqual(0.67);
});
test('handles non-terminating decimals that round up', () => {
let number = 0.09666;
expect(simpleRound(number)).toEqual(0.10);
});
});
describe('Check for invalid input', () => {
test('throws when number is not a number', () => {
let number = 'Hamburger';
expect(() => simpleRound(number)).toThrow();
});
test('throws when direction is out of range', () => {
let number = 3.14159;
let direction = 666;
expect(() => round({number, direction})).toThrow();
});
test('throws when precision is negative', () => {
let number = 3.14159;
let precision = -1;
expect(() => round({number, precision})).toThrow();
});
test('throws when precision is not an integer', () => {
let number = 3.14159;
let precision = 1.5;
expect(() => round({number, precision})).toThrow();
});
});
describe('fixedSimpleRound', () => {
test('fixedSimpleRound returns 2 decimal places', () => {
let number = 3.14159;
expect(fixedSimpleRound(number)).toEqual("3.14");
});
test('fixedSimpleRound works for leading zeroes', () => {
let number = 1.091;
expect(fixedSimpleRound(number)).toEqual("1.09");
});
test('fixedSimpleRound works for leading zeroes', () => {
let number = 1.099;
expect(fixedSimpleRound(number)).toEqual("1.10");
});
test('fixedSimpleRound works for leading zeroes', () => {
let number = -1.099;
expect(fixedSimpleRound(number)).toEqual("-1.10");
});
test('fixedSimpleRound works for leading zeroes', () => {
let number = 0.099;
expect(fixedSimpleRound(number)).toEqual("0.10");
});
test('fixedSimpleRound works for leading zeroes', () => {
let number = -0.099;
expect(fixedSimpleRound(number)).toEqual("-0.10");
});
});
describe('fixedRound', ()=> {
test('fixedRound returns 2 decimal places', () => {
let number = 3.14159;
let precision = 2;
expect(fixedRound({number, precision})).toEqual("3.14");
});
test('fixedRound works for leading zeroes', () => {
let number = 1.091;
expect(fixedRound({number})).toEqual("1.09");
});
test('fixedRound works for leading zeroes 1', () => {
let number = 1.099;
expect(fixedRound({number})).toEqual("1.10");
});
test('fixedRound works for leading zeroes 2', () => {
let number = -1.099;
expect(fixedRound({number})).toEqual("-1.10");
});
test('fixedRound works for leading zeroes 3', () => {
let number = 0.099;
expect(fixedRound({number})).toEqual("0.10");
});
test('fixedRound works for leading zeroes 4', () => {
let number = -0.099;
expect(fixedRound({number})).toEqual("-0.10");
});
test('fixedRound works for 3 decimal places', () => {
let number = -0.0999;
let precision = 3;
expect(fixedRound({number, precision})).toEqual("-0.100");
});
test('fixedRound works for 3 decimal places rounding down', () => {
let number = -0.0999;
let precision = 3;
let direction = DIRECTIONS.DOWN;
expect(fixedRound({number, precision, direction})).toEqual("-0.099");
});
test('fixedRound works for 3 decimal places rounding up', () => {
let number = -0.0999;
let precision = 3;
let direction = DIRECTIONS.UP;
expect(fixedRound({number, precision, direction})).toEqual("-0.100");
});
});
describe('Zero-precision cases', ()=> {
test('123.5 to 0 precision HALF_DOWN', ()=> {
let number = 123.5;
let precision = 0;
let direction = DIRECTIONS.HALF_DOWN;
expect(round({number, precision, direction})).toEqual(123);
});
test('123.4 to 0 precision HALF_UP', ()=> {
let number = 123.4;
let precision = 0;
let direction = DIRECTIONS.HALF_UP;
expect(round({number, precision, direction})).toEqual(123);
});
test('123.6 to 0 precision HALF_UP', ()=> {
let number = 123.6;
let precision = 0;
let direction = DIRECTIONS.HALF_UP;
expect(round({number, precision, direction})).toEqual(124);
});
test('123.5 to 0 precision HALF_UP', ()=> {
let number = 123.5;
let precision = 0;
let direction = DIRECTIONS.HALF_UP;
expect(round({number, precision, direction})).toEqual(124);
});
test('-123.5 to 0 precision HALF_UP', ()=> {
let number = -123.5;
let precision = 0;
let direction = DIRECTIONS.HALF_UP;
expect(round({number, precision, direction})).toEqual(-124);
})
});