| /* |
| * 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 { EChartsType, registerMap } from '../../../../src/echarts'; |
| import { GeoJSON } from '../../../../src/coord/geo/geoTypes'; |
| import { createChart } from '../../core/utHelper'; |
| |
| |
| describe('api/converter', function () { |
| |
| const DELTA = 1E-3; |
| |
| function pointEquals(p1: number | number[], p2: number | number[]): boolean { |
| if (p1 instanceof Array && p2 instanceof Array) { |
| return Math.abs(p1[0] - p2[0]) < DELTA && Math.abs(p1[1] - p2[1]) < DELTA; |
| } |
| else if (typeof p1 === 'number' && typeof p2 === 'number') { |
| return Math.abs(p1 - p2) < DELTA; |
| } |
| else { |
| throw Error('Iillegal p1 or p2'); |
| } |
| } |
| |
| const testGeoJson1: GeoJSON = { |
| 'type': 'FeatureCollection', |
| 'features': [ |
| { |
| 'type': 'Feature', |
| 'geometry': { |
| 'type': 'Polygon', |
| 'coordinates': [ |
| [ |
| [ |
| 2000, |
| 3000 |
| ], |
| [ |
| 5000, |
| 3000 |
| ], |
| [ |
| 5000, |
| 8000 |
| ], |
| [ |
| 2000, |
| 8000 |
| ] |
| ] |
| ] |
| }, |
| 'properties': { |
| 'name': 'Afghanistan', |
| 'childNum': 1 |
| } |
| } |
| ] |
| }; |
| |
| const testGeoJson2: GeoJSON = { |
| 'type': 'FeatureCollection', |
| 'features': [ |
| { |
| 'type': 'Feature', |
| 'geometry': { |
| 'type': 'Polygon', |
| 'coordinates': [ |
| [ |
| [ |
| 200, |
| 300 |
| ], |
| [ |
| 500, |
| 300 |
| ], |
| [ |
| 500, |
| 800 |
| ], |
| [ |
| 200, |
| 800 |
| ] |
| ] |
| ] |
| }, |
| 'properties': { |
| 'name': 'Afghanistan', |
| 'childNum': 1 |
| } |
| } |
| ] |
| }; |
| registerMap('converter_test_geo_1', testGeoJson1); |
| registerMap('converter_test_geo_2', testGeoJson2); |
| |
| let chart: EChartsType; |
| beforeEach(function () { |
| chart = createChart(); |
| }); |
| |
| afterEach(function () { |
| chart.dispose(); |
| }); |
| |
| |
| it('geo', function () { |
| // TODO Needs namespace |
| chart.setOption({ |
| geo: [ |
| { |
| id: 'aa', |
| left: 10, |
| right: 20, |
| top: 30, |
| bottom: 40, |
| map: 'converter_test_geo_1' |
| }, |
| { |
| id: 'bb', |
| left: 10, |
| right: 20, |
| top: 30, |
| bottom: 40, |
| map: 'converter_test_geo_2' |
| } |
| ], |
| series: [ |
| {id: 'k1', type: 'scatter', coordinateSystem: 'geo', geoIndex: 1}, |
| {id: 'k2', type: 'scatter', coordinateSystem: 'geo'}, |
| { // Should not be affected by map. |
| id: 'm1', |
| type: 'map', |
| map: 'converter_test_geo_1', |
| left: 10, |
| right: 20, |
| top: 30, |
| bottom: 40 |
| } |
| ] |
| }); |
| |
| const width = chart.getWidth(); |
| const height = chart.getHeight(); |
| |
| expect(pointEquals(chart.convertToPixel('geo', [5000, 3000]), [width - 20, height - 40])).toEqual(true); |
| expect(pointEquals(chart.convertFromPixel('geo', [width - 20, height - 40]), [5000, 3000])).toEqual(true); |
| |
| expect(pointEquals(chart.convertToPixel({geoIndex: 1}, [500, 800]), [width - 20, 30])).toEqual(true); |
| expect(pointEquals(chart.convertFromPixel({geoIndex: 1}, [width - 20, 30]), [500, 800])).toEqual(true); |
| |
| expect(pointEquals(chart.convertToPixel({geoId: 'bb'}, [200, 300]), [10, height - 40])).toEqual(true); |
| expect(pointEquals(chart.convertFromPixel({geoId: 'bb'}, [10, height - 40]), [200, 300])).toEqual(true); |
| |
| expect(pointEquals(chart.convertToPixel({seriesIndex: 0}, [200, 800]), [10, 30])).toEqual(true); |
| expect(pointEquals(chart.convertFromPixel({seriesIndex: 0}, [10, 30]), [200, 800])).toEqual(true); |
| |
| expect(pointEquals(chart.convertToPixel({seriesId: 'k2'}, [2000, 8000]), [10, 30])).toEqual(true); |
| expect(pointEquals(chart.convertFromPixel({seriesId: 'k2'}, [10, 30]), [2000, 8000])).toEqual(true); |
| }); |
| |
| |
| it('map', function () { |
| chart.setOption({ |
| geo: [ // Should not be affected by geo |
| { |
| id: 'aa', |
| left: 10, |
| right: 20, |
| top: 30, |
| bottom: 40, |
| map: 'converter_test_geo_1' |
| } |
| ], |
| series: [ |
| { |
| id: 'k1', |
| type: 'map', |
| map: 'converter_test_geo_1', |
| left: 10, |
| right: 20, |
| top: 30, |
| bottom: 40 |
| }, |
| { |
| id: 'k2', |
| type: 'map', |
| map: 'converter_test_geo_2', |
| left: 10, |
| right: 20, |
| top: 30, |
| bottom: 40 |
| } |
| ] |
| }); |
| |
| expect(pointEquals(chart.convertToPixel({seriesIndex: 0}, [2000, 8000]), [10, 30])).toEqual(true); |
| expect(pointEquals(chart.convertFromPixel({seriesIndex: 0}, [10, 30]), [2000, 8000])).toEqual(true); |
| |
| expect(pointEquals(chart.convertToPixel({seriesId: 'k2'}, [200, 800]), [10, 30])).toEqual(true); |
| expect(pointEquals(chart.convertFromPixel({seriesId: 'k2'}, [10, 30]), [200, 800])).toEqual(true); |
| }); |
| |
| |
| it('cartesian', function () { |
| |
| chart.setOption({ |
| geo: [ // Should not affect grid converter. |
| { |
| map: 'converter_test_geo_1' |
| } |
| ], |
| grid: [ |
| { |
| id: 'g0', |
| left: 10, |
| right: '50%', |
| top: 30, |
| bottom: 40 |
| }, |
| { |
| id: 'g1', |
| left: '50%', |
| right: 20, |
| top: 30, |
| bottom: 40 |
| } |
| ], |
| xAxis: [ |
| { |
| id: 'x0', |
| type: 'value', |
| min: -500, |
| max: 3000, |
| gridId: 'g0' |
| }, |
| { |
| id: 'x1', |
| type: 'value', |
| min: -50, |
| max: 300, |
| gridId: 'g0' |
| }, |
| { |
| id: 'x2', |
| type: 'value', |
| min: -50, |
| max: 300, |
| gridId: 'g1' |
| } |
| ], |
| yAxis: [ |
| { |
| id: 'y0', |
| type: 'value', |
| min: 6000, |
| max: 9000, |
| gridId: 'g0' |
| }, |
| { |
| id: 'y1', |
| type: 'value', |
| inverse: true, // test inverse |
| min: 600, |
| max: 900, |
| gridId: 'g1' |
| } |
| ], |
| series: [ |
| { |
| id: 'k1', |
| type: 'scatter', |
| // left: 0, |
| // right: 0, |
| // top: 0, |
| // bottom: 0, |
| data: [[1000, 700]] |
| }, |
| { |
| id: 'k2', |
| type: 'scatter', |
| // left: 0, |
| // right: 0, |
| // top: 0, |
| // bottom: 0, |
| data: [[100, 800]] |
| }, |
| { |
| id: 'j1', |
| type: 'scatter', |
| // left: 0, |
| // right: 0, |
| // top: 0, |
| // bottom: 0, |
| data: [[100, 800]], |
| xAxisIndex: 1 |
| }, |
| { |
| id: 'i1', |
| type: 'scatter', |
| // left: 0, |
| // right: 0, |
| // top: 0, |
| // bottom: 0, |
| data: [], |
| xAxisId: 'x2', |
| yAxisId: 'y1' |
| } |
| ] |
| }); |
| |
| const width = chart.getWidth(); |
| const height = chart.getHeight(); |
| |
| expect( |
| pointEquals(chart.convertToPixel({seriesIndex: 1}, [-500, 6000]), [10, height - 40]) |
| ).toEqual(true); |
| expect( |
| pointEquals(chart.convertFromPixel({seriesIndex: 1}, [10, height - 40]), [-500, 6000]) |
| ).toEqual(true); |
| |
| expect( |
| pointEquals(chart.convertToPixel({seriesId: 'i1'}, [300, 900]), [width - 20, height - 40]) |
| ).toEqual(true); |
| expect( |
| pointEquals(chart.convertFromPixel({seriesId: 'i1'}, [width - 20, height - 40]), [300, 900]) |
| ).toEqual(true); |
| |
| expect( |
| pointEquals(chart.convertToPixel({xAxisIndex: 2, yAxisId: 'y1'}, [300, 900]), [width - 20, height - 40]) |
| ).toEqual(true); |
| expect( |
| pointEquals(chart.convertFromPixel({xAxisIndex: 2, yAxisId: 'y1'}, [width - 20, height - 40]), [300, 900]) |
| ).toEqual(true); |
| |
| expect( |
| pointEquals(chart.convertToPixel({gridId: 'g1'}, [300, 900]), [width - 20, height - 40]) |
| ).toEqual(true); |
| expect( |
| pointEquals(chart.convertFromPixel({gridId: 'g1'}, [width - 20, height - 40]), [300, 900]) |
| ).toEqual(true); |
| |
| expect(pointEquals(chart.convertToPixel({xAxisId: 'x0'}, 3000), width / 2)).toEqual(true); |
| expect(pointEquals(chart.convertFromPixel({xAxisId: 'x0'}, width / 2), 3000)).toEqual(true); |
| |
| expect(pointEquals(chart.convertToPixel({yAxisIndex: 1}, 600), 30)).toEqual(true); |
| expect(pointEquals(chart.convertFromPixel({yAxisIndex: 1}, 30), 600)).toEqual(true); |
| }); |
| |
| |
| it('graph', function () { |
| chart.setOption({ |
| geo: [ // Should not affect graph converter. |
| { |
| map: 'converter_test_geo_1' |
| } |
| ], |
| series: [ |
| { |
| id: 'k1', |
| type: 'graph', |
| left: 10, |
| right: 20, |
| top: 30, |
| bottom: 40, |
| data: [ |
| {x: 1000, y: 2000}, |
| {x: 1000, y: 5000}, |
| {x: 3000, y: 5000}, |
| {x: 3000, y: 2000} |
| ], |
| links: [] |
| }, |
| { |
| id: 'k2', |
| type: 'graph', |
| left: 10, |
| right: 20, |
| top: 30, |
| bottom: 40, |
| data: [ |
| {x: 100, y: 200}, |
| {x: 100, y: 500}, |
| {x: 300, y: 500}, |
| {x: 300, y: 200} |
| ], |
| links: [] |
| } |
| ] |
| }); |
| |
| const width = chart.getWidth(); |
| const height = chart.getHeight(); |
| |
| expect( |
| pointEquals( |
| chart.convertToPixel({seriesIndex: 0}, [2000, 3500]), [10 + (width - 30) / 2, 30 + (height - 70) / 2] |
| ) |
| ).toEqual(true); |
| expect( |
| pointEquals( |
| chart.convertFromPixel({seriesIndex: 0}, [10 + (width - 30) / 2, 30 + (height - 70) / 2]), [2000, 3500] |
| ) |
| ).toEqual(true); |
| |
| expect(pointEquals(chart.convertToPixel({seriesId: 'k2'}, [100, 500]), [10, height - 40])).toEqual(true); |
| expect(pointEquals(chart.convertFromPixel({seriesId: 'k2'}, [10, height - 40]), [100, 500])).toEqual(true); |
| }); |
| |
| |
| }); |