Home Manual Reference Source Test Repository

src/util/math.js

import { assert }       from 'chai';

import MathUtil         from '../../../src/utils/MathUtil';

import * as testconfig  from '../testconfig';

if (testconfig.modules['utilMath'])
{
   suite('utils:', () =>
   {
      suite('StringUtil', () =>
      {
         suite('compactMatrix:', () =>
         {
            test('matrix is compacted', () =>
            {
               // Identity matrix.
               let matrix = MathUtil.create2DArray(4, 0);
               matrix[0][0] = 1;
               matrix[1][1] = 1;
               matrix[2][2] = 1;
               matrix[3][3] = 1;

               let testString = '[{"row":0,"cols":[0]},{"row":1,"cols":[1]},{"row":2,"cols":[2]},{"row":3,"cols":[3]}]';

               assert.strictEqual(JSON.stringify(MathUtil.compactMatrix(matrix)), testString);

               // Matrix with no column entries for row (3).
               matrix = MathUtil.create2DArray(4, 0);
               matrix[0][0] = 1;
               matrix[0][2] = 1;
               matrix[1][1] = 1;
               matrix[1][3] = 1;
               matrix[2][0] = 1;
               matrix[2][1] = 1;
               matrix[2][2] = 1;
               matrix[2][3] = 1;

               testString = '[{"row":0,"cols":[0,2]},{"row":1,"cols":[1,3]},{"row":2,"cols":[0,1,2,3]}]';

               assert.strictEqual(JSON.stringify(MathUtil.compactMatrix(matrix)), testString);

               // Large sparse matrix with few row / column entries.
               matrix = MathUtil.create2DArray(1024, 0);
               matrix[1][1] = 1;
               matrix[1][3] = 1;
               matrix[120][0] = 1;
               matrix[350][22] = 1;
               matrix[350][230] = 1;
               matrix[350][330] = 1;
               matrix[600][45] = 1;
               matrix[1023][320] = 1;

               testString = '[{"row":1,"cols":[1,3]},{"row":120,"cols":[0]},{"row":350,"cols":[22,230,330]},'
                + '{"row":600,"cols":[45]},{"row":1023,"cols":[320]}]';

               assert.strictEqual(JSON.stringify(MathUtil.compactMatrix(matrix)), testString);
            });
         });

         suite('getMedian:', () =>
         {
            test('median is returned', () =>
            {
               assert.strictEqual(MathUtil.getMedian([100, 20, 80, 60, 50]), 60);
               assert.strictEqual(MathUtil.getMedian([100, 20, 80, 60, 50, 120]), 70);
            });
         });

         suite('getPercent:', () =>
         {
            test('percent is returned', () =>
            {
               assert.strictEqual(MathUtil.getPercent(.2, 1), 20);
               assert.strictEqual(MathUtil.getPercent(100, 1000), 10);
            });
         });

         suite('toFixed:', () =>
         {
            test('correct float rounding', () =>
            {
               assert.strictEqual(MathUtil.toFixed(.1545839578), .155);

               assert.strictEqual(MathUtil.toFixed(.15), .15);
               assert.strictEqual(MathUtil.toFixed(.1), .1);

               assert.strictEqual(MathUtil.toFixed(20.1545839578), 20.155);
               assert.strictEqual(MathUtil.toFixed(20.1544392842), 20.154);
            });

            test('pass-through of non-float data', () =>
            {
               assert.strictEqual(MathUtil.toFixed(20), 20);
               assert.strictEqual(MathUtil.toFixed('test'), 'test');
               assert.strictEqual(MathUtil.toFixed(true), true);
            });

            test('correct JSON stringify results', () =>
            {
               const testString = '{"data":20.155,"data2":{"data3":20.154}}';

               const result = JSON.stringify({ data: 20.1545839578, data2: { data3: 20.1544392842 } }, (key, val) =>
               {
                  return MathUtil.toFixed(val);
               });

               assert.strictEqual(result, testString);
            });
         });
      });
   });
}