]> git.ipfire.org Git - thirdparty/Chart.js.git/commitdiff
Add helpers.math._factorize (#6360)
authorBen McCann <322311+benmccann@users.noreply.github.com>
Tue, 2 Jul 2019 22:22:47 +0000 (15:22 -0700)
committerEvert Timberg <evert.timberg@gmail.com>
Tue, 2 Jul 2019 22:22:47 +0000 (18:22 -0400)
* Add helpers.math._factorize
* Remove duplicate test statement

src/helpers/helpers.math.js [new file with mode: 0644]
src/helpers/index.js
src/scales/scale.time.js
test/specs/helpers.math.tests.js [new file with mode: 0644]

diff --git a/src/helpers/helpers.math.js b/src/helpers/helpers.math.js
new file mode 100644 (file)
index 0000000..9ed8114
--- /dev/null
@@ -0,0 +1,34 @@
+'use strict';
+
+/**
+ * @alias Chart.helpers.math
+ * @namespace
+ */
+var exports = {
+       /**
+        * Returns an array of factors sorted from 1 to sqrt(value)
+        * @private
+        */
+       _factorize: function(value) {
+               var result = [];
+               var sqrt = Math.sqrt(value);
+               var i;
+
+               for (i = 1; i < sqrt; i++) {
+                       if (value % i === 0) {
+                               result.push(i);
+                               result.push(value / i);
+                       }
+               }
+               if (sqrt === (sqrt | 0)) { // if value is a square number
+                       result.push(sqrt);
+               }
+
+               result.sort(function(a, b) {
+                       return a - b;
+               }).pop();
+               return result;
+       }
+};
+
+module.exports = exports;
index 60c199cad55db2159ca56cacdbefe4869c96de7e..ef51007609007ad75a24e463f85ac4ca09d77940 100644 (file)
@@ -4,3 +4,4 @@ module.exports = require('./helpers.core');
 module.exports.easing = require('./helpers.easing');
 module.exports.canvas = require('./helpers.canvas');
 module.exports.options = require('./helpers.options');
+module.exports.math = require('./helpers.math');
index 0f6348bc433c6ce35e4abeb11a2d0daf8e1f1a70..88ccdf7a271291f5fdb93b801f978dcd31510c2e 100644 (file)
@@ -6,6 +6,7 @@ var helpers = require('../helpers/index');
 var Scale = require('../core/core.scale');
 
 var valueOrDefault = helpers.valueOrDefault;
+var factorize = helpers.math._factorize;
 
 // Integer constants are from the ES6 spec.
 var MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991;
@@ -15,42 +16,42 @@ var INTERVALS = {
        millisecond: {
                common: true,
                size: 1,
-               steps: [1, 2, 5, 10, 20, 50, 100, 250, 500]
+               steps: factorize(1000)
        },
        second: {
                common: true,
                size: 1000,
-               steps: [1, 2, 5, 10, 15, 30]
+               steps: factorize(60)
        },
        minute: {
                common: true,
                size: 60000,
-               steps: [1, 2, 5, 10, 15, 30]
+               steps: factorize(60)
        },
        hour: {
                common: true,
                size: 3600000,
-               steps: [1, 2, 3, 6, 12]
+               steps: factorize(24)
        },
        day: {
                common: true,
                size: 86400000,
-               steps: [1, 2, 5]
+               steps: factorize(10)
        },
        week: {
                common: false,
                size: 604800000,
-               steps: [1, 2, 3, 4]
+               steps: factorize(4)
        },
        month: {
                common: true,
                size: 2.628e9,
-               steps: [1, 2, 3]
+               steps: factorize(12)
        },
        quarter: {
                common: false,
                size: 7.884e9,
-               steps: [1, 2, 3, 4]
+               steps: factorize(4)
        },
        year: {
                common: true,
diff --git a/test/specs/helpers.math.tests.js b/test/specs/helpers.math.tests.js
new file mode 100644 (file)
index 0000000..c26435f
--- /dev/null
@@ -0,0 +1,16 @@
+'use strict';
+
+describe('Chart.helpers.math', function() {
+       var factorize = Chart.helpers.math._factorize;
+
+       it('should factorize', function() {
+               expect(factorize(1000)).toEqual([1, 2, 4, 5, 8, 10, 20, 25, 40, 50, 100, 125, 200, 250, 500]);
+               expect(factorize(60)).toEqual([1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30]);
+               expect(factorize(30)).toEqual([1, 2, 3, 5, 6, 10, 15]);
+               expect(factorize(24)).toEqual([1, 2, 3, 4, 6, 8, 12]);
+               expect(factorize(12)).toEqual([1, 2, 3, 4, 6]);
+               expect(factorize(4)).toEqual([1, 2]);
+               expect(factorize(-1)).toEqual([]);
+               expect(factorize(2.76)).toEqual([]);
+       });
+});