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