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