Browse Source

Merge pull request #2088 from c3js/feature/refactor-data.convert

[Refactor] Write unit tests of convert(Rows|Columns)ToData
pull/2096/merge
Masayuki Tanaka 8 years ago committed by GitHub
parent
commit
39caf931fa
  1. 4
      karma.conf.js
  2. 26
      package-lock.json
  3. 7
      package.json
  4. 15
      rollup.config.js
  5. 97
      spec/data.convert.js
  6. 4
      spec/shape.line-spec.js
  7. 3
      spec/svg-helper.js
  8. 51
      src/data.convert.js

4
karma.conf.js

@ -6,10 +6,10 @@ module.exports = function(config) {
files: [ files: [
'c3.css', 'c3.css',
'spec/*-helper.js', 'spec/*-helper.js',
'spec/*-spec.js' 'spec/*.js'
], ],
preprocessors: { preprocessors: {
'spec/c3-helper.js': ['browserify'] 'spec/*.js': ['browserify']
}, },
browserify: { browserify: {
debug: true, debug: true,

26
package-lock.json generated

@ -1,6 +1,6 @@
{ {
"name": "c3", "name": "c3",
"version": "0.4.13", "version": "0.4.14",
"lockfileVersion": 1, "lockfileVersion": 1,
"dependencies": { "dependencies": {
"abbrev": { "abbrev": {
@ -297,6 +297,12 @@
"integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
"dev": true "dev": true
}, },
"babel-plugin-external-helpers": {
"version": "6.22.0",
"resolved": "https://registry.npmjs.org/babel-plugin-external-helpers/-/babel-plugin-external-helpers-6.22.0.tgz",
"integrity": "sha1-IoX0iwK9Xe3oUXXK+MYuhq3M76E=",
"dev": true
},
"babel-plugin-istanbul": { "babel-plugin-istanbul": {
"version": "4.1.4", "version": "4.1.4",
"resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.4.tgz", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.4.tgz",
@ -1292,6 +1298,12 @@
"integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
"dev": true "dev": true
}, },
"estree-walker": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.2.1.tgz",
"integrity": "sha1-va/oCVOD2EFNXcLs9MkXO225QS4=",
"dev": true
},
"esutils": { "esutils": {
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
@ -3680,6 +3692,18 @@
"integrity": "sha1-4NBUl4d6OYwQTYFtJzOnGKepTio=", "integrity": "sha1-4NBUl4d6OYwQTYFtJzOnGKepTio=",
"dev": true "dev": true
}, },
"rollup-plugin-babel": {
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-2.7.1.tgz",
"integrity": "sha1-FlKBl7D5OKFTb0RoPHqT1XMYL1c=",
"dev": true
},
"rollup-pluginutils": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz",
"integrity": "sha1-HhVud4+UtyVb+hs9AXi+j1xVJAg=",
"dev": true
},
"safe-buffer": { "safe-buffer": {
"version": "5.0.1", "version": "5.0.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz",

7
package.json

@ -8,7 +8,7 @@
"lint": "jshint --reporter=node_modules/jshint-stylish src/ spec/", "lint": "jshint --reporter=node_modules/jshint-stylish src/ spec/",
"build": "npm run build:js && npm run build:css", "build": "npm run build:js && npm run build:css",
"build:js": "npm run build:js:rollup && npm run build:js:uglify", "build:js": "npm run build:js:rollup && npm run build:js:uglify",
"build:js:rollup": "rollup -f umd --name c3 --globals d3:d3 src/index.js > c3.js", "build:js:rollup": "rollup -c > c3.js",
"build:js:uglify": "uglifyjs c3.js --compress --mangle -o c3.min.js", "build:js:uglify": "uglifyjs c3.js --compress --mangle -o c3.min.js",
"build:css": "npm run build:css:sass && npm run build:css:min", "build:css": "npm run build:css:sass && npm run build:css:min",
"build:css:sass": "node-sass src/scss/main.scss > c3.css", "build:css:sass": "node-sass src/scss/main.scss > c3.css",
@ -41,6 +41,7 @@
"d3": "~3.5.0" "d3": "~3.5.0"
}, },
"devDependencies": { "devDependencies": {
"babel-plugin-external-helpers": "^6.22.0",
"babel-plugin-istanbul": "^4.1.4", "babel-plugin-istanbul": "^4.1.4",
"babel-preset-es2015": "^6.24.1", "babel-preset-es2015": "^6.24.1",
"babelify": "^7.3.0", "babelify": "^7.3.0",
@ -60,12 +61,14 @@
"node-static": "^0.7.9", "node-static": "^0.7.9",
"nodemon": "^1.11.0", "nodemon": "^1.11.0",
"rollup": "^0.41.6", "rollup": "^0.41.6",
"rollup-plugin-babel": "^2.7.1",
"uglify-js": "^3.0.15", "uglify-js": "^3.0.15",
"watchify": "^3.9.0" "watchify": "^3.9.0"
}, },
"nyc": { "nyc": {
"exclude": [ "exclude": [
"src/polyfill.js" "src/polyfill.js",
"spec/"
] ]
} }
} }

15
rollup.config.js

@ -0,0 +1,15 @@
import babel from 'rollup-plugin-babel';
export default {
entry: 'src/index.js',
format: 'umd',
moduleName: 'c3',
plugins: [babel({
presets: [['es2015', {
modules: false
}]],
plugins: [
'external-helpers'
]
})]
};

97
spec/data.convert.js

@ -0,0 +1,97 @@
import c3 from '../src';
const $$ = c3.chart.internal.fn;
describe('$$.convertColumnsToData', () => {
it('converts column data to normalized data', () => {
const data = $$.convertColumnsToData([
["cat1", "a", "b", "c", "d"],
["data1", 30, 200, 100, 400],
["cat2", "b", "a", "c", "d", "e", "f"],
["data2", 400, 60, 200, 800, 10, 10]
]);
expect(data).toEqual([{
cat1: 'a',
data1: 30,
cat2: 'b',
data2: 400
}, {
cat1: 'b',
data1: 200,
cat2: 'a',
data2: 60
}, {
cat1: 'c',
data1: 100,
cat2: 'c',
data2: 200
}, {
cat1: 'd',
data1: 400,
cat2: 'd',
data2: 800
}, {
cat2: 'e',
data2: 10
}, {
cat2: 'f',
data2: 10
}]);
});
it('throws when the column data contains undefined', () => {
expect(() => $$.convertColumnsToData([
["cat1", "a", "b", "c", "d"],
["data1", undefined]
])).toThrowError(Error, /Source data is missing a component/);
});
});
describe('$$.convertRowsToData', () => {
it('converts the row data to normalized data', () => {
const data = $$.convertRowsToData([
['data1', 'data2', 'data3'],
[90, 120, 300],
[40, 160, 240],
[50, 200, 290],
[120, 160, 230],
[80, 130, 300],
[90, 220, 320]
]);
expect(data).toEqual([{
data1: 90,
data2: 120,
data3: 300
}, {
data1: 40,
data2: 160,
data3: 240
}, {
data1: 50,
data2: 200,
data3: 290
}, {
data1: 120,
data2: 160,
data3: 230
}, {
data1: 80,
data2: 130,
data3: 300
}, {
data1: 90,
data2: 220,
data3: 320
}]);
});
it('throws when the row data contains undefined', () => {
expect(() => $$.convertRowsToData([
['data1', 'data2', 'data3'],
[40, 160, 240],
[90, 120, undefined]
])).toThrowError(Error, /Source data is missing a component/);
});
});

4
spec/shape.line-spec.js

@ -1,3 +1,5 @@
import { parseSvgPath } from './svg-helper';
describe('c3 chart shape line', function () { describe('c3 chart shape line', function () {
'use strict'; 'use strict';
@ -7,8 +9,6 @@ describe('c3 chart shape line', function () {
chart = window.initChart(chart, args, done); chart = window.initChart(chart, args, done);
}); });
var parseSvgPath = window.parseSvgPath;
describe('shape-rendering for line chart', function () { describe('shape-rendering for line chart', function () {
beforeAll(function () { beforeAll(function () {

3
spec/svg-helper.js

@ -3,8 +3,7 @@
* @param {String} d SvgPath d attribute.] * @param {String} d SvgPath d attribute.]
* @return {Array} an array of drawing commands. * @return {Array} an array of drawing commands.
*/ */
export function parseSvgPath(d) { //jshint ignore:line
function parseSvgPath(d) { //jshint ignore:line
'use strict'; 'use strict';
var commands = []; var commands = [];

51
src/data.convert.js

@ -89,36 +89,53 @@ c3_chart_internal_fn.findValueInJson = function (object, path) {
} }
return object; return object;
}; };
c3_chart_internal_fn.convertRowsToData = function (rows) {
var keys = rows[0], new_row = {}, new_rows = [], i, j; /**
for (i = 1; i < rows.length; i++) { * Converts the rows to normalized data.
new_row = {}; * @param {any[][]} rows The row data
for (j = 0; j < rows[i].length; j++) { * @return {Object[]}
*/
c3_chart_internal_fn.convertRowsToData = (rows) => {
const newRows = [];
const keys = rows[0];
for (let i = 1; i < rows.length; i++) {
const newRow = {};
for (let j = 0; j < rows[i].length; j++) {
if (isUndefined(rows[i][j])) { if (isUndefined(rows[i][j])) {
throw new Error("Source data is missing a component at (" + i + "," + j + ")!"); throw new Error("Source data is missing a component at (" + i + "," + j + ")!");
} }
new_row[keys[j]] = rows[i][j]; newRow[keys[j]] = rows[i][j];
} }
new_rows.push(new_row); newRows.push(newRow);
} }
return new_rows; return newRows;
}; };
c3_chart_internal_fn.convertColumnsToData = function (columns) {
var new_rows = [], i, j, key; /**
for (i = 0; i < columns.length; i++) { * Converts the columns to normalized data.
key = columns[i][0]; * @param {any[][]} columns The column data
for (j = 1; j < columns[i].length; j++) { * @return {Object[]}
if (isUndefined(new_rows[j - 1])) { */
new_rows[j - 1] = {}; c3_chart_internal_fn.convertColumnsToData = (columns) => {
const newRows = [];
for (let i = 0; i < columns.length; i++) {
const key = columns[i][0];
for (let j = 1; j < columns[i].length; j++) {
if (isUndefined(newRows[j - 1])) {
newRows[j - 1] = {};
} }
if (isUndefined(columns[i][j])) { if (isUndefined(columns[i][j])) {
throw new Error("Source data is missing a component at (" + i + "," + j + ")!"); throw new Error("Source data is missing a component at (" + i + "," + j + ")!");
} }
new_rows[j - 1][key] = columns[i][j]; newRows[j - 1][key] = columns[i][j];
} }
} }
return new_rows;
return newRows;
}; };
c3_chart_internal_fn.convertDataToTargets = function (data, appendXs) { c3_chart_internal_fn.convertDataToTargets = function (data, appendXs) {
var $$ = this, config = $$.config, var $$ = this, config = $$.config,
ids = $$.d3.keys(data[0]).filter($$.isNotX, $$), ids = $$.d3.keys(data[0]).filter($$.isNotX, $$),

Loading…
Cancel
Save