| /* | |
| * 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 { createChart, getECModel } from '../../core/utHelper'; | |
| import { EChartsType } from '@/src/echarts'; | |
| import CartesianAxisModel from '@/src/coord/cartesian/AxisModel'; | |
| import IntervalScale from '@/src/scale/Interval'; | |
| import { intervalScaleNiceTicks } from '@/src/scale/helper'; | |
| import { getPrecisionSafe } from '@/src/util/number'; | |
| describe('scale_interval', function () { | |
| let chart: EChartsType; | |
| beforeEach(function () { | |
| chart = createChart(); | |
| }); | |
| afterEach(function () { | |
| chart.dispose(); | |
| }); | |
| describe('extreme', function () { | |
| it('ticks_min_max', function () { | |
| const min = 0; | |
| const max = 54.090909; | |
| const splitNumber = 5; | |
| chart.setOption({ | |
| xAxis: {}, | |
| yAxis: { | |
| type: 'value', | |
| min: min, | |
| max: max, | |
| interval: max / splitNumber, | |
| splitNumber: splitNumber | |
| }, | |
| series: [{type: 'line', data: []}] | |
| }); | |
| const yAxis = getECModel(chart).getComponent('yAxis', 0) as CartesianAxisModel; | |
| const scale = yAxis.axis.scale; | |
| const ticks = scale.getTicks(); | |
| expect(ticks[0].value).toEqual(min); | |
| expect(ticks[ticks.length - 1].value).toEqual(max); | |
| }); | |
| it('ticks_small_value', function () { | |
| chart.setOption({ | |
| tooltip: {}, | |
| xAxis: [ | |
| { | |
| type: 'category', | |
| data: ['Mon'], | |
| axisTick: { | |
| alignWithLabel: true | |
| } | |
| } | |
| ], | |
| yAxis: [ | |
| { | |
| type: 'value' | |
| } | |
| ], | |
| series: [ | |
| { | |
| name: '', | |
| type: 'bar', | |
| data: [0.0000034] | |
| } | |
| ] | |
| }); | |
| const yAxis = getECModel(chart).getComponent('yAxis', 0) as CartesianAxisModel; | |
| const scale = yAxis.axis.scale as IntervalScale; | |
| const ticks = scale.getTicks(); | |
| const labels = yAxis.axis.getViewLabels().map(function (item) { | |
| return item.formattedLabel; | |
| }); | |
| const labelPrecisioned = scale.getLabel({ value: 0.0000005 }, { precision: 10 }); | |
| expect(ticks.map(tick => tick.value)).toEqual( | |
| [0, 0.0000005, 0.000001, 0.0000015, 0.000002, 0.0000025, 0.000003, 0.0000035] | |
| ); | |
| expect(labels).toEqual( | |
| // Should not be '5e-7' | |
| ['0', '0.0000005', '0.000001', '0.0000015', '0.000002', '0.0000025', '0.000003', '0.0000035'] | |
| ); | |
| expect(labelPrecisioned).toEqual('0.0000005000'); | |
| }); | |
| }); | |
| describe('ticks', function () { | |
| function randomNumber(quantity: number): number { | |
| return (Math.random() - 0.5) * Math.pow(10, (Math.random() - 0.5) * quantity); | |
| } | |
| function doSingleTest(extent: [number, number], splitNumber: number): void { | |
| const result = intervalScaleNiceTicks(extent, splitNumber); | |
| const intervalPrecision = result.intervalPrecision; | |
| const resultInterval = result.interval; | |
| const niceTickExtent = result.niceTickExtent; | |
| expect(resultInterval).toBeFinite(); | |
| expect(intervalPrecision).toBeFinite(); | |
| expect(niceTickExtent[0]).toBeFinite(); | |
| expect(niceTickExtent[1]).toBeFinite(); | |
| expect(niceTickExtent[0]).toBeGreaterThanOrEqual(extent[0]); | |
| expect(niceTickExtent[1]).not.toBeGreaterThan(extent[1]); | |
| expect(niceTickExtent[1]).toBeGreaterThanOrEqual(niceTickExtent[1]); | |
| const interval = new IntervalScale(); | |
| interval.setExtent(extent[0], extent[1]); | |
| interval.calcNiceExtent({ | |
| fixMin: true, | |
| fixMax: true, | |
| splitNumber | |
| }); | |
| const ticks = interval.getTicks(); | |
| expect(ticks.length > 0); | |
| expect(ticks[0].value).toEqual(extent[0]); | |
| expect(ticks[ticks.length - 1].value).toEqual(extent[1]); | |
| for (let i = 1; i < ticks.length; i++) { | |
| expect(ticks[i - 1].value).not.toBeGreaterThanOrEqual(ticks[i].value); | |
| if (ticks[i].value !== extent[0] && ticks[i].value !== extent[1]) { | |
| const tickPrecision = getPrecisionSafe(ticks[i].value); | |
| expect(tickPrecision).not.toBeGreaterThan(intervalPrecision); | |
| } | |
| } | |
| } | |
| function doRandomTest(count: number, splitNumber: number, quantity: number): void { | |
| for (let i = 0; i < count; i++) { | |
| const extent: number[] = []; | |
| extent[0] = randomNumber(quantity); | |
| extent[1] = extent[0] + randomNumber(quantity); | |
| if (extent[1] === extent[0]) { | |
| extent[1] = extent[0] + 1; | |
| } | |
| if (extent[0] > extent[1]) { | |
| extent.reverse(); | |
| } | |
| doSingleTest(extent as [number, number], splitNumber); | |
| } | |
| } | |
| it('cases', function () { | |
| doSingleTest([3.7210923755786733e-8, 176.4352516752083], 1); | |
| doSingleTest([1550932.3941785, 1550932.3941786], 5); | |
| doSingleTest([-3711126.9907707, -3711126.990770699], 5); | |
| }); | |
| it('randomCover', function () { | |
| doRandomTest(500, 5, 20); | |
| doRandomTest(200, 1, 20); | |
| }); | |
| }); | |
| }); |