/* * Licensed to ElasticSearch and Shay Banon under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. ElasticSearch 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. */ package org.elasticsearch.test.unit.index.search.geo; import org.elasticsearch.index.search.geo.GeoUtils; import org.elasticsearch.index.search.geo.Point; import org.testng.annotations.Test; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.not; /** * */ @Test public class GeoUtilsTests { /** * Test special values like inf, NaN and -0.0. */ @Test public void testSpecials() { assertThat(GeoUtils.normalizeLon(Double.POSITIVE_INFINITY), equalTo(Double.NaN)); assertThat(GeoUtils.normalizeLat(Double.POSITIVE_INFINITY), equalTo(Double.NaN)); assertThat(GeoUtils.normalizeLon(Double.NEGATIVE_INFINITY), equalTo(Double.NaN)); assertThat(GeoUtils.normalizeLat(Double.NEGATIVE_INFINITY), equalTo(Double.NaN)); assertThat(GeoUtils.normalizeLon(Double.NaN), equalTo(Double.NaN)); assertThat(GeoUtils.normalizeLat(Double.NaN), equalTo(Double.NaN)); assertThat(0.0, not(equalTo(-0.0))); assertThat(GeoUtils.normalizeLon(-0.0), equalTo(0.0)); assertThat(GeoUtils.normalizeLat(-0.0), equalTo(0.0)); assertThat(GeoUtils.normalizeLon(0.0), equalTo(0.0)); assertThat(GeoUtils.normalizeLat(0.0), equalTo(0.0)); } /** * Test bounding values. */ @Test public void testBounds() { assertThat(GeoUtils.normalizeLon(-360.0), equalTo(0.0)); assertThat(GeoUtils.normalizeLat(-180.0), equalTo(0.0)); assertThat(GeoUtils.normalizeLon(360.0), equalTo(0.0)); assertThat(GeoUtils.normalizeLat(180.0), equalTo(0.0)); // and halves assertThat(GeoUtils.normalizeLon(-180.0), equalTo(180.0)); assertThat(GeoUtils.normalizeLat(-90.0), equalTo(-90.0)); assertThat(GeoUtils.normalizeLon(180.0), equalTo(180.0)); assertThat(GeoUtils.normalizeLat(90.0), equalTo(90.0)); } /** * Test normal values. */ @Test public void testNormal() { // Near bounds assertThat(GeoUtils.normalizeLon(-360.5), equalTo(-0.5)); assertThat(GeoUtils.normalizeLat(-180.5), equalTo(0.5)); assertThat(GeoUtils.normalizeLon(360.5), equalTo(0.5)); assertThat(GeoUtils.normalizeLat(180.5), equalTo(-0.5)); // and near halves assertThat(GeoUtils.normalizeLon(-180.5), equalTo(179.5)); assertThat(GeoUtils.normalizeLat(-90.5), equalTo(-89.5)); assertThat(GeoUtils.normalizeLon(180.5), equalTo(-179.5)); assertThat(GeoUtils.normalizeLat(90.5), equalTo(89.5)); // Now with points, to check for longitude shifting with latitude normalization // We've gone past the north pole and down the other side, the longitude will // be shifted by 180 assertNormalizedPoint(new Point(90.5, 10), new Point(89.5, -170)); // Every 10-units, multiple full turns for (int shift = -20; shift <= 20; ++shift) { assertThat(GeoUtils.normalizeLon(shift * 360.0 + 0.0), equalTo(0.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 10.0), equalTo(10.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 20.0), equalTo(20.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 30.0), equalTo(30.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 40.0), equalTo(40.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 50.0), equalTo(50.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 60.0), equalTo(60.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 70.0), equalTo(70.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 80.0), equalTo(80.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 90.0), equalTo(90.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 100.0), equalTo(100.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 110.0), equalTo(110.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 120.0), equalTo(120.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 130.0), equalTo(130.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 140.0), equalTo(140.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 150.0), equalTo(150.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 160.0), equalTo(160.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 170.0), equalTo(170.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 180.0), equalTo(180.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 190.0), equalTo(-170.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 200.0), equalTo(-160.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 210.0), equalTo(-150.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 220.0), equalTo(-140.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 230.0), equalTo(-130.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 240.0), equalTo(-120.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 250.0), equalTo(-110.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 260.0), equalTo(-100.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 270.0), equalTo(-90.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 280.0), equalTo(-80.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 290.0), equalTo(-70.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 300.0), equalTo(-60.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 310.0), equalTo(-50.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 320.0), equalTo(-40.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 330.0), equalTo(-30.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 340.0), equalTo(-20.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 350.0), equalTo(-10.0)); assertThat(GeoUtils.normalizeLon(shift * 360.0 + 360.0), equalTo(0.0)); } for (int shift = -20; shift <= 20; ++shift) { assertThat(GeoUtils.normalizeLat(shift * 360.0 + 0.0), equalTo(0.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 10.0), equalTo(10.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 20.0), equalTo(20.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 30.0), equalTo(30.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 40.0), equalTo(40.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 50.0), equalTo(50.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 60.0), equalTo(60.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 70.0), equalTo(70.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 80.0), equalTo(80.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 90.0), equalTo(90.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 100.0), equalTo(80.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 110.0), equalTo(70.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 120.0), equalTo(60.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 130.0), equalTo(50.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 140.0), equalTo(40.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 150.0), equalTo(30.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 160.0), equalTo(20.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 170.0), equalTo(10.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 180.0), equalTo(0.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 190.0), equalTo(-10.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 200.0), equalTo(-20.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 210.0), equalTo(-30.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 220.0), equalTo(-40.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 230.0), equalTo(-50.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 240.0), equalTo(-60.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 250.0), equalTo(-70.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 260.0), equalTo(-80.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 270.0), equalTo(-90.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 280.0), equalTo(-80.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 290.0), equalTo(-70.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 300.0), equalTo(-60.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 310.0), equalTo(-50.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 320.0), equalTo(-40.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 330.0), equalTo(-30.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 340.0), equalTo(-20.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 350.0), equalTo(-10.0)); assertThat(GeoUtils.normalizeLat(shift * 360.0 + 360.0), equalTo(0.0)); } } /** * Test huge values. */ @Test public void testHuge() { assertThat(GeoUtils.normalizeLon(-36000000000181.0), equalTo(GeoUtils.normalizeLon(-181.0))); assertThat(GeoUtils.normalizeLon(-36000000000180.0), equalTo(GeoUtils.normalizeLon(-180.0))); assertThat(GeoUtils.normalizeLon(-36000000000179.0), equalTo(GeoUtils.normalizeLon(-179.0))); assertThat(GeoUtils.normalizeLon(-36000000000178.0), equalTo(GeoUtils.normalizeLon(-178.0))); assertThat(GeoUtils.normalizeLon(-36000000000001.0), equalTo(GeoUtils.normalizeLon(-001.0))); assertThat(GeoUtils.normalizeLon(+36000000000000.0), equalTo(GeoUtils.normalizeLon(+000.0))); assertThat(GeoUtils.normalizeLon(+36000000000001.0), equalTo(GeoUtils.normalizeLon(+001.0))); assertThat(GeoUtils.normalizeLon(+36000000000002.0), equalTo(GeoUtils.normalizeLon(+002.0))); assertThat(GeoUtils.normalizeLon(+36000000000178.0), equalTo(GeoUtils.normalizeLon(+178.0))); assertThat(GeoUtils.normalizeLon(+36000000000179.0), equalTo(GeoUtils.normalizeLon(+179.0))); assertThat(GeoUtils.normalizeLon(+36000000000180.0), equalTo(GeoUtils.normalizeLon(+180.0))); assertThat(GeoUtils.normalizeLon(+36000000000181.0), equalTo(GeoUtils.normalizeLon(+181.0))); assertThat(GeoUtils.normalizeLat(-18000000000091.0), equalTo(GeoUtils.normalizeLat(-091.0))); assertThat(GeoUtils.normalizeLat(-18000000000090.0), equalTo(GeoUtils.normalizeLat(-090.0))); assertThat(GeoUtils.normalizeLat(-18000000000089.0), equalTo(GeoUtils.normalizeLat(-089.0))); assertThat(GeoUtils.normalizeLat(-18000000000088.0), equalTo(GeoUtils.normalizeLat(-088.0))); assertThat(GeoUtils.normalizeLat(-18000000000001.0), equalTo(GeoUtils.normalizeLat(-001.0))); assertThat(GeoUtils.normalizeLat(+18000000000000.0), equalTo(GeoUtils.normalizeLat(+000.0))); assertThat(GeoUtils.normalizeLat(+18000000000001.0), equalTo(GeoUtils.normalizeLat(+001.0))); assertThat(GeoUtils.normalizeLat(+18000000000002.0), equalTo(GeoUtils.normalizeLat(+002.0))); assertThat(GeoUtils.normalizeLat(+18000000000088.0), equalTo(GeoUtils.normalizeLat(+088.0))); assertThat(GeoUtils.normalizeLat(+18000000000089.0), equalTo(GeoUtils.normalizeLat(+089.0))); assertThat(GeoUtils.normalizeLat(+18000000000090.0), equalTo(GeoUtils.normalizeLat(+090.0))); assertThat(GeoUtils.normalizeLat(+18000000000091.0), equalTo(GeoUtils.normalizeLat(+091.0))); } private static void assertNormalizedPoint(Point input, Point expected) { GeoUtils.normalizePoint(input); assertThat(input, equalTo(expected)); } }