/*
 * Hibernate Search, full-text search for your domain model
 *
 * License: GNU Lesser General Public License (LGPL), version 2.1 or later
 * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
 */
package org.hibernate.search.test.spatial;

import org.junit.Assert;
import org.junit.Test;

import org.hibernate.search.spatial.impl.Point;

/**
 * Unit tests for Hibernate Search Spatial point implementation
 *
 * @author Nicolas Helleringer
 */
public class PointTest {
	@Test
	public void normalizeTest() {
		Point point = Point.fromDegrees( 45, 517 );
		Assert.assertEquals( 45, point.getLatitude(), 0 );
		Assert.assertEquals( 157, point.getLongitude(), 0 );

		Point point2 = Point.fromDegrees( 0, -185 );
		Assert.assertEquals( 175, point2.getLongitude(), 0 );

		Point point3 = Point.fromDegrees( 110, 0 );
		Assert.assertEquals( 70, point3.getLatitude(), 0 );

		Point point4 = Point.fromDegrees( -110, 0 );
		Assert.assertEquals( -70, point4.getLatitude(), 0 );

		Point point5 = Point.fromDegrees( 185, 0 );
		Assert.assertEquals( -5, point5.getLatitude(), 0 );

		Point point6 = Point.fromDegrees( 90, 180 );
		Assert.assertEquals( 90, point6.getLatitude(), 0 );
		Assert.assertEquals( 180, point6.getLongitude(), 0 );

		Point point7 = Point.fromDegrees( -90, -180 );
		Assert.assertEquals( -90, point7.getLatitude(), 0 );
		Assert.assertEquals( 180, point7.getLongitude(), 0 );
	}

	@Test
	public void computeDestinationTest() {
		Point point = Point.fromDegrees( 45, 4 );

		Point destination = point.computeDestination( 100, 45 );

		Assert.assertEquals( 0.796432523, destination.getLatitudeRad(), 0.00001 );
		Assert.assertEquals( 0.08568597, destination.getLongitudeRad(), 0.00001 );
	}

	@Test
	public void distanceToPoint() {
		Point point = Point.fromDegrees( 45, 4 );
		Point point2 = Point.fromDegrees( 46, 14 );

		double distance = point.getDistanceTo( point2 );

		Assert.assertEquals( 786.7, distance, 0.1 );
	}
}
