/* * 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); }); }); });