@rdkmaster/jigsaw-labs
Version:
Jigsaw, the next generation component set for RDK
390 lines (362 loc) • 17.4 kB
text/typescript
import {Dimension, Indicator, ModeledRectangularGraphData, ModeledRectangularTemplate} from "./modeled-graph-data";
import {EchartLegend, EchartOptions, EchartToolbox, EchartTooltip} from "./echart-types";
import {Grouped} from "../utils/data-collection-utils";
import {CommonUtils} from "../utils/common-utils";
class ModeledRectangularGraphDataSpec extends ModeledRectangularGraphData {
public getRealDimensions(dimField: string, dimensions: Dimension[], usingAllDimensions: boolean): Dimension[] {
return super.getRealDimensions(dimField, dimensions, usingAllDimensions);
}
public pruneAllData(xAxisIndex: number, serialIndex: number, dimensions: Dimension[]): Grouped {
return super.pruneAllData(xAxisIndex, serialIndex, dimensions);
}
public createMultiDimensionOptions(dimensions: Dimension[]): EchartOptions {
return super.createMultiDimensionOptions(dimensions);
}
public createMultiKPIOptions(dim: Dimension): EchartOptions {
return super.createMultiKPIOptions(dim);
}
public createChartOptions(): EchartOptions {
return super.createChartOptions();
}
}
class ModeledRectangularTemplateSpec extends ModeledRectangularTemplate {
getInstance(): EchartOptions {
return {
tooltip: {},
toolbox: {},
};
}
}
describe('Unit Test for ModeledRectangularGraphData', () => {
it('basic property access', () => {
const data = [[1, 2, 3]];
const header = ['a', 'b', 'c'];
const field = ['f1', 'f2', 'f3'];
const rd = new ModeledRectangularGraphDataSpec();
rd.data = data;
rd.header = header;
rd.field = field;
expect(rd.data).toEqual(data);
expect(rd.header).toEqual(header);
expect(rd.field).toEqual(field);
expect(rd.getIndex('f2')).toEqual(1);
expect(rd.getIndex('b')).toEqual(1);
expect(rd.getIndex('f3')).toEqual(2);
expect(rd.getIndex('c')).toEqual(2);
expect(rd.getIndex(null)).toEqual(-1);
expect(rd.getIndex('invalid')).toEqual(-1);
});
it('getRealDimensions - all', () => {
const rd = new ModeledRectangularGraphDataSpec();
let realDims = rd.getRealDimensions(rd.dimensionField, rd.dimensions, rd.usingAllDimensions);
expect(JSON.stringify(realDims)).toEqual(JSON.stringify([]));
rd.field = ['f1', 'f2', 'f3', 'f4'];
rd.data = [
['一', '南京', '20', '10'],
['一', '上海', '22', '12'],
['一', '深圳', '30', '23'],
];
rd.dimensionField = 'f2';
rd.dimensions = [new Dimension('南京')];
rd.dimensions[0].yAxisIndex = 1;
rd.dimensions[0].stack = 'stack';
rd.dimensions[0].shade = 'area';
rd.usingAllDimensions = false;
realDims = rd.getRealDimensions(rd.dimensionField, rd.dimensions, rd.usingAllDimensions);
expect(realDims.length).toEqual(1);
let dim = realDims[0];
expect(dim.name).toEqual('南京');
expect(dim.yAxisIndex).toEqual(1);
expect(dim.stack).toEqual('stack');
expect(dim.shade).toEqual('area');
rd.usingAllDimensions = true;
realDims = rd.getRealDimensions(rd.dimensionField, rd.dimensions, rd.usingAllDimensions);
expect(realDims.length).toEqual(3);
dim = realDims[0];
expect(dim.name).toEqual('南京');
expect(dim.yAxisIndex).toEqual(1);
expect(dim.stack).toEqual('stack');
expect(dim.shade).toEqual('area');
dim = realDims[1];
expect(dim.name).toEqual('上海');
expect(dim.yAxisIndex).toEqual(0);
expect(dim.stack).toEqual(undefined);
expect(dim.shade).toEqual('bar');
dim = realDims[2];
expect(dim.name).toEqual('深圳');
expect(dim.yAxisIndex).toEqual(0);
expect(dim.stack).toEqual(undefined);
expect(dim.shade).toEqual('bar');
});
it('pruneAllData - normal', () => {
const rd = new ModeledRectangularGraphDataSpec();
rd.field = ['f1', 'f2', 'f3', 'f4'];
rd.header = ['h1', 'h2', 'h3', 'h4'];
rd.data = [
// 这里需要让城市的顺序不一致,以检验数据处理能调整顺序
['a', '南京', '20', '10'],
['b', '上海', '122', '112'],
['a', '深圳', '30', '23'],
['a', '上海', '22', '12'],
['b', '南京', '120', '110'],
['b', '深圳', '130', '123'],
];
rd.dimensionField = 'f2';
rd.xAxis = {field: 'f1'};
rd.indicators = [new Indicator('f3'), new Indicator('f4')];
const dimensions = rd.getRealDimensions(rd.dimensionField, rd.dimensions, rd.usingAllDimensions);
const r = rd.pruneAllData(0, 1, dimensions);
expect(JSON.stringify(r._$groupItems)).toEqual(JSON.stringify(['a', 'b']));
let g = r.a;
expect(JSON.stringify(g)).toEqual(JSON.stringify(
[['a', '南京', '20', '10'],
['a', '上海', '22', '12'],
['a', '深圳', '30', '23']]));
g = r.b;
expect(JSON.stringify(g)).toEqual(JSON.stringify(
[['b', '南京', '120', '110'],
['b', '上海', '122', '112'],
['b', '深圳', '130', '123']]));
});
it('pruneAllData - add item', () => {
const rd = new ModeledRectangularGraphDataSpec();
rd.field = ['f1', 'f2', 'f3', 'f4'];
rd.header = ['h1', 'h2', 'h3', 'h4'];
rd.data = [
['a', '南京', '20', '10'],
['a', '上海', '22', '12'],
['a', '深圳', '30', '23'],
['b', '南京', '120', '110'],
['b', '深圳', '130', '123'],
];
rd.dimensionField = 'f2';
rd.xAxis = {field: 'f1'};
rd.indicators = [new Indicator('f3'), new Indicator('f4')];
rd.indicators[0].index = 2;
rd.indicators[0].defaultValue = 1122;
rd.indicators[1].index = 3;
const dimensions = rd.getRealDimensions(rd.dimensionField, rd.dimensions, rd.usingAllDimensions);
const r = rd.pruneAllData(0, 1, dimensions);
expect(JSON.stringify(r._$groupItems)).toEqual(JSON.stringify(['a', 'b']));
expect(JSON.stringify(r.b)).toEqual(JSON.stringify(
[['b', '南京', '120', '110'],
['b', '上海', 1122, 0],
['b', '深圳', '130', '123']]));
});
it('pruneAllData - aggregate item', () => {
const rd = new ModeledRectangularGraphDataSpec();
rd.field = ['f1', 'f2', 'f3', 'f4'];
rd.header = ['h1', 'h2', 'h3', 'h4'];
rd.data = [
['a', '南京', '20', '10'],
['a', '上海', '22', '12'],
['a', '深圳', '30', '23'],
['b', '南京', '120', '110'],
['b', '南京', '120', '110'],
['b', '深圳', '130', '123'],
];
rd.dimensionField = 'f2';
rd.xAxis = {field: 'f1'};
rd.indicators = [new Indicator('f3'), new Indicator('f4')];
rd.indicators[0].index = 2;
rd.indicators[0].defaultValue = 1122;
rd.indicators[1].index = 3;
const dimensions = rd.getRealDimensions(rd.dimensionField, rd.dimensions, rd.usingAllDimensions);
const r = rd.pruneAllData(0, 1, dimensions);
expect(JSON.stringify(r._$groupItems)).toEqual(JSON.stringify(['a', 'b']));
expect(JSON.stringify(r.b)).toEqual(JSON.stringify(
[['b', '南京', 240, 220],
['b', '上海', 1122, 0],
['b', '深圳', '130', '123']]));
});
it('createMultiDimensionOptions - normal', () => {
const rd = new ModeledRectangularGraphDataSpec();
rd.field = ['f1', 'f2', 'f3', 'f4'];
rd.header = ['h1', 'h2', 'h3', 'h4'];
rd.data = [
['a', '南京', '20', '10'],
['a', '上海', '22', '12'],
['a', '深圳', '30', '23'],
['b', '南京', '120', '110'],
['b', '南京', '120', '110'],
['b', '深圳', '130', '123'],
];
rd.dimensionField = 'f2';
rd.xAxis = {field: 'f1'};
rd.indicators = [new Indicator('f3')];
rd.indicators[0].index = 2;
rd.indicators[0].defaultValue = 1122;
const dimensions = rd.getRealDimensions(rd.dimensionField, rd.dimensions, rd.usingAllDimensions);
const options = rd.createMultiDimensionOptions(dimensions);
expect(JSON.stringify(options.legend.data)).toEqual(JSON.stringify(['南京', '上海', '深圳']));
expect(JSON.stringify(options.xAxis[0].data)).toEqual(JSON.stringify(['a', 'b']));
expect(options.series.length).toEqual(3);
expect(JSON.stringify(options.series[0].data)).toEqual(JSON.stringify(['20', 240]));
expect(JSON.stringify(options.series[1].data)).toEqual(JSON.stringify(['22', 1122]));
expect(JSON.stringify(options.series[2].data)).toEqual(JSON.stringify(['30', '130']));
});
it('createMultiDimensionOptions - abnormal', () => {
const rd = new ModeledRectangularGraphDataSpec();
let options;
options = rd.createMultiDimensionOptions([]);
expect(options).toEqual(undefined);
options = rd.createMultiDimensionOptions([{}]);
expect(options).toEqual(undefined);
rd.field = ['f'];
rd.xAxis = {field: 'f'};
options = rd.createMultiDimensionOptions([{}]);
expect(options).toEqual(undefined);
});
it('createMultiKPIOptions - normal', () => {
const rd = new ModeledRectangularGraphDataSpec();
rd.field = ['f1', 'f2', 'f3', 'f4'];
rd.header = ['h1', 'h2', '最高气温', '最低气温'];
rd.data = [
['a', '南京', '20', '10'],
['a', '上海', '22', '12'],
['a', '深圳', '30', '23'],
['b', '南京', '120', '110'],
['b', '南京', '120', '110'],
['b', '深圳', '130', '123'],
];
rd.dimensionField = 'f2';
rd.xAxis = {field: 'f1'};
rd.indicators = [new Indicator('f3'), new Indicator('最低气温')];
rd.indicators.forEach(kpi => kpi.index = rd.getIndex(kpi.field));
rd.indicators[0].index = 2;
rd.indicators[0].defaultValue = 1122;
let options = rd.createMultiKPIOptions(new Dimension('上海'));
expect(JSON.stringify(options.legend.data)).toEqual(JSON.stringify(['最高气温', '最低气温']));
expect(JSON.stringify(options.xAxis[0].data)).toEqual(JSON.stringify(['a', 'b']));
expect(options.series.length).toEqual(2);
expect(JSON.stringify(options.series[0].data)).toEqual(JSON.stringify(['22', 1122]));
expect(JSON.stringify(options.series[1].data)).toEqual(JSON.stringify(['12', 0]));
options = rd.createMultiKPIOptions(new Dimension('南京'));
expect(JSON.stringify(options.legend.data)).toEqual(JSON.stringify(['最高气温', '最低气温']));
expect(JSON.stringify(options.xAxis[0].data)).toEqual(JSON.stringify(['a', 'b']));
expect(options.series.length).toEqual(2);
expect(JSON.stringify(options.series[0].data)).toEqual(JSON.stringify(['20', 240]));
expect(JSON.stringify(options.series[1].data)).toEqual(JSON.stringify(['10', 220]));
});
it('createMultiKPIOptions - abnormal', () => {
const rd = new ModeledRectangularGraphDataSpec();
let options;
options = rd.createMultiKPIOptions(null);
expect(options).toEqual(undefined);
options = rd.createMultiKPIOptions(new Dimension('上海'));
expect(options).toEqual(undefined);
rd.field = ['f'];
rd.xAxis = {field: 'f'};
options = rd.createMultiKPIOptions(new Dimension('上海'));
expect(options).toEqual(undefined);
});
it('createChartOptions - normal', () => {
const rd = new ModeledRectangularGraphDataSpec();
rd.field = ['f1', 'f2', 'f3', 'f4'];
rd.header = ['h1', 'h2', '最高气温', '最低气温'];
rd.data = [
['a', '南京', '20', '10'],
['a', '上海', '22', '12'],
['a', '深圳', '30', '23'],
['b', '南京', '120', '110'],
['b', '南京', '120', '110'],
['b', '深圳', '130', '123'],
];
rd.dimensionField = 'f2';
rd.xAxis = {field: 'f1'};
rd.indicators = [new Indicator('f3')];
rd.indicators[0].index = 2;
rd.indicators[0].defaultValue = 1122;
let options = rd.createChartOptions();
expect(JSON.stringify(options.legend.data)).toEqual(JSON.stringify(['南京', '上海', '深圳']));
expect(JSON.stringify(options.xAxis[0].data)).toEqual(JSON.stringify(['a', 'b']));
expect(options.series.length).toEqual(3);
expect(JSON.stringify(options.series[0].data)).toEqual(JSON.stringify(['20', 240]));
expect(JSON.stringify(options.series[1].data)).toEqual(JSON.stringify(['22', 1122]));
expect(JSON.stringify(options.series[2].data)).toEqual(JSON.stringify(['30', '130']));
rd.usingAllDimensions = false;
rd.indicators.push(new Indicator('f4'));
rd.indicators[1].index = 3;
rd.dimensions = [new Dimension('南京')];
options = rd.createChartOptions();
expect(JSON.stringify(options.legend.data)).toEqual(JSON.stringify(['最高气温', '最低气温']));
expect(JSON.stringify(options.xAxis[0].data)).toEqual(JSON.stringify(['a', 'b']));
expect(options.series.length).toEqual(2);
expect(JSON.stringify(options.series[0].data)).toEqual(JSON.stringify(['20', 240]));
expect(JSON.stringify(options.series[1].data)).toEqual(JSON.stringify(['10', 220]));
const newOptions = rd.options;
expect(JSON.stringify(newOptions)).toEqual(JSON.stringify(options));
const newOptions1 = rd.options;
expect(newOptions === newOptions1).toEqual(true);
});
it('createChartOptions - abnormal', () => {
const rd = new ModeledRectangularGraphDataSpec();
let options;
options = rd.createChartOptions();
expect(options).toEqual(undefined);
rd.dimensionField = 'ff';
options = rd.createChartOptions();
expect(options).toEqual(undefined);
rd.xAxis = {};
options = rd.createChartOptions();
expect(options).toEqual(undefined);
rd.xAxis.field = 'xxx';
options = rd.createChartOptions();
expect(options).toEqual(undefined);
rd.indicators = [];
options = rd.createChartOptions();
expect(options).toEqual(undefined);
rd.indicators.push(new Indicator('xxx'));
options = rd.createChartOptions();
expect(options).toEqual(undefined);
rd.usingAllDimensions = false;
options = rd.createChartOptions();
expect(options).toEqual(undefined);
rd.dimensions = [];
options = rd.createChartOptions();
expect(options).toEqual(undefined);
});
it('createMultiDimensionOptions - invalid legend', function () {
const rd = new ModeledRectangularGraphDataSpec();
rd.template = new ModeledRectangularTemplateSpec();
rd.field = ['f1', 'f2', 'f3', 'f4'];
rd.header = ['h1', 'h2', '最高气温', '最低气温'];
rd.data = [
['a', '南京', '20', '10'],
['a', '上海', '22', '12'],
['a', '深圳', '30', '23'],
['b', '南京', '120', '110'],
['b', '南京', '120', '110'],
['b', '深圳', '130', '123'],
];
rd.dimensionField = 'f2';
rd.xAxis = {field: 'f1'};
rd.indicators = [new Indicator('f3')];
rd.indicators[0].index = 2;
rd.indicators[0].defaultValue = 1122;
let options = rd.createChartOptions();
expect(options.legend).toBeUndefined();
});
it('createMultiKPIOptions - invalid legend', function () {
const rd = new ModeledRectangularGraphDataSpec();
rd.template = new ModeledRectangularTemplateSpec();
rd.field = ['f1', 'f2', 'f3', 'f4'];
rd.header = ['h1', 'h2', '最高气温', '最低气温'];
rd.data = [
['a', '南京', '20', '10'],
['a', '上海', '22', '12'],
['a', '深圳', '30', '23'],
['b', '南京', '120', '110'],
['b', '南京', '120', '110'],
['b', '深圳', '130', '123'],
];
rd.dimensionField = 'f2';
rd.xAxis = {field: 'f1'};
rd.indicators = [new Indicator('f3'), new Indicator('最低气温')];
rd.indicators.forEach(kpi => kpi.index = rd.getIndex(kpi.field));
rd.indicators[0].index = 2;
rd.indicators[0].defaultValue = 1122;
let options = rd.createMultiKPIOptions(new Dimension('上海'));
expect(options.legend).toBeUndefined();
});
});