blob: 095cf8e72afe55dbfa34c56897278813a9ee32ba [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import SeriesDimensionDefine from '@/src/data/SeriesDimensionDefine';
import createDimensions from '@/src/data/helper/createDimensions';
import { createSource } from '@/src/data/Source';
import { SOURCE_FORMAT_ARRAY_ROWS, SOURCE_LAYOUT_BY_COLUMN } from '@/src/util/types';
type ParametersOfCreateDimensions = Parameters<typeof createDimensions>;
describe('createDimensions', function () {
function doCreateDimensions(
source: ParametersOfCreateDimensions[0],
opt: ParametersOfCreateDimensions[1]
): SeriesDimensionDefine[] {
const result = createDimensions(source, opt);
for (let i = 0; i < result.dimensions.length; i++) {
const item = result.dimensions[i];
if (item && item.hasOwnProperty('dimsDef') && (item as any).dimsDef == null) {
delete (item as any).dimsDef;
}
}
return result.dimensions;
}
it('namesMoreThanDimCount', function () {
const sysDims = [
{
'name': 'x',
'type': 'ordinal' as const,
'otherDims': {
'tooltip': false as const,
'itemName': 0
},
'dimsDef': [
'base'
]
},
{
'name': 'y',
'type': 'float' as const,
'dimsDef': [
'open',
'close',
'lowest',
'highest'
]
}
];
const source = createSource(
[
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
],
{
sourceLayout: SOURCE_LAYOUT_BY_COLUMN,
sourceHeader: 0,
dimensions: void 0
},
SOURCE_FORMAT_ARRAY_ROWS
);
const opt = {
'coordDimensions': sysDims,
'dimensionsDefine': [
{
'name': 'date',
'displayName': 'date'
},
{
'name': 'open',
'displayName': 'open'
},
{
'name': 'high',
'displayName': 'high'
},
{
'name': 'low',
'displayName': 'low'
},
{
'name': 'close',
'displayName': 'close'
},
{
'name': 'volume',
'displayName': 'volume'
},
{
'name': 'haOpen',
'displayName': 'haOpen'
},
{
'name': 'haHigh',
'displayName': 'haHigh'
},
{
'name': 'haLow',
'displayName': 'haLow'
},
{
'name': 'haClose',
'displayName': 'haClose'
},
{
'name': 'sma9',
'displayName': 'sma9'
}
],
'encodeDefine': {
'x': 'date',
'y': [
'haOpen',
'haClose',
'haLow',
'haHigh'
],
'tooltip': [
'open',
'high',
'low',
'close'
]
},
'dimensionsCount': 5
};
const result: SeriesDimensionDefine[] = [
{
'otherDims': {
'tooltip': false,
'itemName': 0
},
'displayName': 'date',
'name': 'date',
'coordDim': 'x',
'coordDimIndex': 0,
'type': 'ordinal',
'storeDimIndex': 0
},
{
'otherDims': {
'tooltip': 0
},
'displayName': 'open',
'name': 'open',
'coordDim': 'value',
'coordDimIndex': 0,
'isExtraCoord': true,
'storeDimIndex': 1
},
{
'otherDims': {
'tooltip': 1
},
'displayName': 'high',
'name': 'high',
'coordDim': 'value0',
'coordDimIndex': 0,
'isExtraCoord': true,
'storeDimIndex': 2
},
{
'otherDims': {
'tooltip': 2
},
'displayName': 'low',
'name': 'low',
'coordDim': 'value1',
'coordDimIndex': 0,
'isExtraCoord': true,
'storeDimIndex': 3
},
{
'otherDims': {
'tooltip': 3
},
'displayName': 'close',
'name': 'close',
'coordDim': 'value2',
'coordDimIndex': 0,
'isExtraCoord': true,
'storeDimIndex': 4
},
{
'otherDims': {},
'displayName': 'volume',
'name': 'volume',
'coordDim': 'value3',
'coordDimIndex': 0,
'isExtraCoord': true,
'storeDimIndex': 5
},
{
'otherDims': {},
'displayName': 'haOpen',
'name': 'haOpen',
'coordDim': 'y',
'coordDimIndex': 0,
'type': 'float',
'storeDimIndex': 6
},
{
'otherDims': {},
'displayName': 'haHigh',
'name': 'haHigh',
'coordDim': 'y',
'coordDimIndex': 3,
'type': 'float',
'storeDimIndex': 7
},
{
'otherDims': {},
'displayName': 'haLow',
'name': 'haLow',
'coordDim': 'y',
'coordDimIndex': 2,
'type': 'float',
'storeDimIndex': 8
},
{
'otherDims': {},
'displayName': 'haClose',
'name': 'haClose',
'coordDim': 'y',
'coordDimIndex': 1,
'type': 'float',
'storeDimIndex': 9
},
{
'otherDims': {},
'displayName': 'sma9',
'name': 'sma9',
'coordDim': 'value4',
'coordDimIndex': 0,
'isExtraCoord': true,
'storeDimIndex': 10
}
];
expect(doCreateDimensions(source, opt)).toEqual(result.map(a => new SeriesDimensionDefine(a)));
});
it('differentData', function () {
function doTest(
source: ParametersOfCreateDimensions[0],
opt: ParametersOfCreateDimensions[1],
result: SeriesDimensionDefine[]
) {
expect(doCreateDimensions(source, opt)).toEqual(result.map(a => new SeriesDimensionDefine(a)));
}
// test dimcount
doTest([], { coordDimensions: ['x', 'y']}, [
{
'otherDims': {},
'coordDim': 'x',
'coordDimIndex': 0,
'name': 'x',
'storeDimIndex': 0
},
{
'otherDims': {},
'coordDim': 'y',
'coordDimIndex': 0,
'name': 'y',
'storeDimIndex': 1
}
]);
doTest([12], { coordDimensions: ['x', 'y']}, [
{
'otherDims': {},
'coordDim': 'x',
'coordDimIndex': 0,
'name': 'x',
'storeDimIndex': 0
},
{
'otherDims': {},
'coordDim': 'y',
'coordDimIndex': 0,
'name': 'y',
'storeDimIndex': 1
}
]);
doTest([12, 4], { coordDimensions: ['x', 'y']}, [
{
'otherDims': {},
'coordDim': 'x',
'coordDimIndex': 0,
'name': 'x',
'storeDimIndex': 0
},
{
'otherDims': {},
'coordDim': 'y',
'coordDimIndex': 0,
'name': 'y',
'storeDimIndex': 1
}
]);
doTest([[32, 55]], { coordDimensions: ['x']}, [
{
'otherDims': {},
'coordDim': 'x',
'coordDimIndex': 0,
'name': 'x',
'storeDimIndex': 0
}
]);
doTest([[32, 55]], { coordDimensions: ['x', 'y', 'z']}, [
{
'otherDims': {},
'coordDim': 'x',
'coordDimIndex': 0,
'name': 'x',
'storeDimIndex': 0
},
{
'otherDims': {},
'coordDim': 'y',
'coordDimIndex': 0,
'name': 'y',
'storeDimIndex': 1
},
{
'otherDims': {},
'coordDim': 'z',
'coordDimIndex': 0,
'name': 'z',
'storeDimIndex': 2
}
]);
doTest([[32, 55], [99, 11]], { coordDimensions: ['x']}, [
{
'otherDims': {},
'coordDim': 'x',
'coordDimIndex': 0,
'name': 'x',
'storeDimIndex': 0
}
]);
doTest([[32, 55], [99, 11]], {
dimensionsCount: 4,
coordDimensions: ['x', 'y']
}, [
{
'otherDims': {},
'coordDim': 'x',
'coordDimIndex': 0,
'name': 'x',
'storeDimIndex': 0
},
{
'otherDims': {},
'coordDim': 'y',
'coordDimIndex': 0,
'name': 'y',
'storeDimIndex': 1
},
{
'otherDims': {},
'coordDim': 'value',
'coordDimIndex': 0,
'isExtraCoord': true,
'name': 'value',
'storeDimIndex': 2
},
{
'otherDims': {},
'coordDim': 'value0',
'coordDimIndex': 0,
'isExtraCoord': true,
'name': 'value0',
'storeDimIndex': 3
}
]);
});
it('differentSysDims', function () {
function doTest(
source: ParametersOfCreateDimensions[0],
opt: ParametersOfCreateDimensions[1],
result: SeriesDimensionDefine[]
) {
expect(doCreateDimensions(source, opt)).toEqual(result.map(a => new SeriesDimensionDefine(a)));
}
const data = [
['iw', 332, 4434, 323, 59],
['vrr', 44, 11, 144, 55]
];
doTest(
data, { coordDimensions: ['x', 'y'] },
[
{
'otherDims': {},
'coordDim': 'x',
'coordDimIndex': 0,
'name': 'x',
'type': 'ordinal',
'storeDimIndex': 0
},
{
'otherDims': {},
'coordDim': 'y',
'coordDimIndex': 0,
'name': 'y',
'storeDimIndex': 1
}
]
);
doTest(
data, { coordDimensions: ['value'] },
[
{
'otherDims': {},
'coordDim': 'value',
'coordDimIndex': 0,
'name': 'value',
'type': 'ordinal',
'storeDimIndex': 0
}
]
);
doTest(
data,
{ coordDimensions: [{name: 'time', type: 'time' as const}, 'value'] },
[
{
'otherDims': {},
'name': 'time',
'type': 'time',
'coordDimIndex': 0,
'ordinalMeta': undefined,
'coordDim': 'time',
'storeDimIndex': 0
},
{
'otherDims': {},
'coordDim': 'value',
'coordDimIndex': 0,
'name': 'value',
'storeDimIndex': 1
}
]
);
doTest(
data, {
coordDimensions: [{
name: 'y',
otherDims: {
tooltip: false
},
dimsDef: ['base']
}, {
name: 'x',
dimsDef: ['open', 'close']
}]
},
[
{
'otherDims': {
'tooltip': false
},
'name': 'base',
'defaultTooltip': undefined,
'coordDimIndex': 0,
'coordDim': 'y',
'type': 'ordinal',
'displayName': 'base',
'ordinalMeta': undefined,
'storeDimIndex': 0
},
{
'otherDims': {},
'name': 'open',
'ordinalMeta': undefined,
'defaultTooltip': undefined,
'coordDimIndex': 0,
'coordDim': 'x',
'displayName': 'open',
'storeDimIndex': 1
}
]
);
doTest(
data, {
dimensionsDefine: ['基础', '打开', '关闭'],
coordDimensions: [{
name: 'y',
otherDims: {
tooltip: false
},
dimsDef: ['base']
}, {
name: 'x',
dimsDef: ['open', 'close']
}],
encodeDefine: {
tooltip: [1, 2, 0]
}
},
[
{
'otherDims': {
'tooltip': 2
},
'name': '基础',
'displayName': '基础',
'ordinalMeta': undefined,
'coordDimIndex': 0,
'coordDim': 'y',
'type': 'ordinal',
'storeDimIndex': 0
},
{
'otherDims': {
'tooltip': 0
},
'name': '打开',
'displayName': '打开',
'coordDimIndex': 0,
'ordinalMeta': undefined,
'coordDim': 'x',
'storeDimIndex': 1
},
{
'otherDims': {
'tooltip': 1
},
'name': '关闭',
'displayName': '关闭',
'ordinalMeta': undefined,
'coordDimIndex': 1,
'coordDim': 'x',
'storeDimIndex': 2
}
]
);
doTest(
data, {
coordDimensions: [{
name: 'y',
otherDims: {
tooltip: false
},
dimsDef: ['base']
}, {
name: 'x',
dimsDef: ['open', 'close']
}],
dimensionsDefine: ['基础', null, '关闭'],
encodeDefine: {
x: [0, 4]
}
},
[
{
'otherDims': {},
'displayName': '基础',
'name': '基础',
'coordDimIndex': 0,
'coordDim': 'x',
'ordinalMeta': undefined,
'type': 'ordinal',
'storeDimIndex': 0
},
{
'otherDims': {
'tooltip': false
},
'name': 'base',
'displayName': 'base',
'ordinalMeta': undefined,
'defaultTooltip': undefined,
'coordDimIndex': 0,
'coordDim': 'y',
'storeDimIndex': 1
},
{
'otherDims': {},
'name': '关闭',
'displayName': '关闭',
'coordDimIndex': 0,
'isExtraCoord': true,
'coordDim': 'value',
'storeDimIndex': 2
}
]
);
});
it('dimsDef', function () {
function doTest(
source: ParametersOfCreateDimensions[0],
opt: ParametersOfCreateDimensions[1],
result: SeriesDimensionDefine[]
) {
expect(doCreateDimensions(source, opt)).toEqual(result.map(a => new SeriesDimensionDefine(a)));
}
const data = [['iw', 332, 4434, 323, 59], ['vrr', 44, 11, 144, 55]];
doTest(
data,
{
dimensionsDefine: ['挨克思', null, '歪溜'],
coordDimensions: ['x', 'y', 'value']
},
[
{
'otherDims': {},
'displayName': '挨克思',
'name': '挨克思',
'type': 'ordinal',
'coordDim': 'x',
'coordDimIndex': 0,
'storeDimIndex': 0
},
{
'otherDims': {},
'coordDim': 'y',
'coordDimIndex': 0,
'name': 'y',
'storeDimIndex': 1
},
{
'otherDims': {},
'displayName': '歪溜',
'name': '歪溜',
'coordDim': 'value',
'coordDimIndex': 0,
'storeDimIndex': 2
}
]
);
doTest(
data,
{
dimensionsDefine: ['挨克思', null, {type: 'ordinal' as const}],
coordDimensions: ['x', 'y', 'value']
}, // no name but only type
[
{
'otherDims': {},
'displayName': '挨克思',
'name': '挨克思',
'type': 'ordinal',
'coordDim': 'x',
'coordDimIndex': 0,
'storeDimIndex': 0
},
{
'otherDims': {},
'coordDim': 'y',
'coordDimIndex': 0,
'name': 'y',
'storeDimIndex': 1
},
{
'otherDims': {},
'name': 'value',
'coordDim': 'value',
'type': 'ordinal',
'coordDimIndex': 0,
'storeDimIndex': 2
}
]
);
doTest(
data,
{
dimensionsDefine: [{name: '泰亩', type: 'ordinal'}, {name: '歪溜', type: 'float'}],
coordDimensions: [{name: 'time', type: 'time' as const}, 'value']
},
[
{
'otherDims': {},
'displayName': '泰亩',
'name': '泰亩',
'type': 'ordinal',
'ordinalMeta': undefined,
'coordDimIndex': 0,
'coordDim': 'time',
'storeDimIndex': 0
},
{
'otherDims': {},
'displayName': '歪溜',
'name': '歪溜',
'type': 'float',
'coordDim': 'value',
'coordDimIndex': 0,
'storeDimIndex': 1
}
]
);
// Duplicate name
doTest(
data,
{
dimensionsDefine: [{name: '泰亩', type: 'ordinal'}, {name: '泰亩', type: 'float'}],
coordDimensions: [{name: 'time', type: 'time' as const}, 'value']
},
[
{
'otherDims': {},
'displayName': '泰亩',
'name': '泰亩',
'type': 'ordinal',
'ordinalMeta': undefined,
'coordDimIndex': 0,
'coordDim': 'time',
'storeDimIndex': 0
},
{
'otherDims': {},
'displayName': '泰亩',
'name': '泰亩0',
'type': 'float',
'coordDim': 'value',
'coordDimIndex': 0,
'storeDimIndex': 1
}
]
);
});
it('encodeDef', function () {
function doTest(
source: ParametersOfCreateDimensions[0],
opt: ParametersOfCreateDimensions[1],
result: SeriesDimensionDefine[]
) {
expect(doCreateDimensions(source, opt)).toEqual(result.map(a => new SeriesDimensionDefine(a)));
}
const data = [['iw', 332, 4434, 323, 'd8', 59], ['vrr', 44, 11, 144, '-', 55]];
doTest(
data,
{
encodeDefine: {
x: 2,
y: [1, 4],
tooltip: 2,
label: [3, 5]
}
},
[
{
'otherDims': {},
'coordDim': 'value',
'coordDimIndex': 0,
'name': 'value',
'isExtraCoord': true,
'type': 'ordinal',
'storeDimIndex': 0
}
]
);
doTest(
data,
{
dimensionsDefine: ['挨克思', null, '歪溜'],
encodeDefine: {
x: 2,
y: [1, 4],
tooltip: 2,
label: [3, 5]
}
},
[
{
'otherDims': {},
'displayName': '挨克思',
'name': '挨克思',
'type': 'ordinal',
'coordDim': 'value',
'coordDimIndex': 0,
'isExtraCoord': true,
'storeDimIndex': 0
},
{
'otherDims': {},
'coordDim': 'y',
'coordDimIndex': 0,
'name': 'y',
'storeDimIndex': 1
},
{
'otherDims': {
'tooltip': 0
},
'displayName': '歪溜',
'name': '歪溜',
'coordDim': 'x',
'coordDimIndex': 0,
'storeDimIndex': 2
}
]
);
doTest(
data,
{
dimensionsDefine: ['挨克思', null, '歪溜'],
coordDimensions: ['x', {name: 'y', type: 'time' as const}, 'z'],
encodeDefine: {
x: 2,
y: [1, 4],
tooltip: 2,
label: [3, 5]
}
},
[
{
'otherDims': {},
'displayName': '挨克思',
'name': '挨克思',
'type': 'ordinal',
'coordDim': 'z',
'coordDimIndex': 0,
'storeDimIndex': 0
},
{
'otherDims': {},
'coordDim': 'y',
'coordDimIndex': 0,
'name': 'y',
'type': 'time',
'ordinalMeta': undefined,
'storeDimIndex': 1
},
{
'otherDims': {
'tooltip': 0
},
'displayName': '歪溜',
'name': '歪溜',
'coordDim': 'x',
'coordDimIndex': 0,
'storeDimIndex': 2
}
]
);
doTest(
data,
{
// dimsDef type 'ordinal' has higher priority then sysDims type 'time'.
dimensionsDefine: [{name: '泰亩', type: 'ordinal'}, {name: '歪溜', type: 'float'}],
coordDimensions: [{name: 'time', type: 'time' as const}, 'value'],
encodeDefine: {
tooltip: 2
}
},
[
{
'otherDims': {},
'displayName': '泰亩',
'name': '泰亩',
'type': 'ordinal',
'ordinalMeta': undefined,
'coordDimIndex': 0,
'coordDim': 'time',
'storeDimIndex': 0
},
{
'otherDims': {},
'displayName': '歪溜',
'name': '歪溜',
'type': 'float',
'coordDim': 'value',
'coordDimIndex': 0,
'storeDimIndex': 1
}
]
);
doTest(
data,
{
// dimsDef type 'ordinal' has higher priority then sysDims type 'time'.
dimensionsDefine: [{name: '泰亩', type: 'ordinal'}, {name: '歪溜', type: 'float'}],
coordDimensions: [{name: 'time', type: 'time' as const}, 'value'],
encodeDefine: {
tooltip: 2
}
},
[
{
'otherDims': {},
'displayName': '泰亩',
'name': '泰亩',
'type': 'ordinal',
'ordinalMeta': undefined,
'coordDimIndex': 0,
'coordDim': 'time',
'storeDimIndex': 0
},
{
'otherDims': {},
'displayName': '歪溜',
'name': '歪溜',
'type': 'float',
'coordDim': 'value',
'coordDimIndex': 0,
'storeDimIndex': 1
}
]
);
});
});