blob: d1ca9790d5594a2a6597a8162112fdf3305fdb9f [file] [log] [blame]
/*
* 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.
*/
package org.apache.sis.measure;
import java.util.Locale;
import org.apache.sis.test.TestCase;
import org.apache.sis.test.DependsOn;
import org.junit.Test;
import static java.lang.Double.NaN;
import static java.lang.Double.doubleToLongBits;
import static org.junit.Assert.*;
/**
* Tests the {@link Angle}, {@link Longitude} and {@link Latitude} classes.
*
* @author Martin Desruisseaux (MPO, IRD, Geomatys)
* @version 0.4
* @since 0.3
* @module
*/
@DependsOn(AngleFormatTest.class)
public final strictfp class AngleTest extends TestCase {
/**
* Tests the {@link Angle#toString()} method.
*/
@Test
public void testToString() {
assertEquals("45°", new Angle (45 ).toString());
assertEquals("45°30′", new Angle (45.5).toString());
assertEquals("45°30′N", new Latitude (45.5).toString());
assertEquals("45°30′E", new Longitude(45.5).toString());
assertEquals("45°30′56.25″E", new Longitude(45.515625).toString());
assertEquals("89°01′N", new Latitude (89.01666666666667).toString());
// Angle out of expected range.
assertEquals( "720.0°E", new Longitude( 720).toString());
assertEquals( "99.0°S", new Latitude ( -99).toString());
assertEquals("-361.0°", new Angle (-361).toString());
// Small angles; should switch to scientific notation.
assertEquals("3.6E-7″", new Angle ( 1E-10).toString());
assertEquals("3.6E-7″N", new Latitude ( 1E-10).toString());
assertEquals("3.6E-7″W", new Longitude(-1E-10).toString());
}
/**
* Tests the parsing performed by the constructor.
*/
@Test
public void testParse() {
assertEquals(new Angle (45.5), new Angle ("45°30′"));
assertEquals(new Angle (45.5), new Angle ("45°30′00″"));
assertEquals(new Latitude (45.5), new Latitude ("45°30′00″N"));
assertEquals(new Longitude(45.5), new Longitude("45°30′00″E"));
// Test the capability to differentiate 'E' of 'East' from exponential notation.
assertEquals(new Longitude(45.5), new Longitude("45.5°E"));
assertEquals(new Longitude(45.5), new Longitude("45.5E"));
assertEquals(new Longitude(455.), new Longitude("45.5E1"));
assertEquals(new Longitude(4.55), new Longitude("45.5E-1"));
}
/**
* Tests the {@link Angle#formatTo(Formatter, int, int, int)} method.
*/
@Test
public void testFormatTo() {
assertEquals("5°30′36″", String.format(Locale.CANADA, "%s", new Angle (5.51)));
assertEquals("5°30′36″N", String.format(Locale.CANADA, "%s", new Latitude(5.51)));
assertEquals(" 5°31′", String.format(Locale.CANADA, "%7.5s", new Angle (5.51)));
assertEquals(" 5.5°N", String.format(Locale.CANADA, "%7.5s", new Latitude(5.51)));
assertEquals(" 5,5°N", String.format(Locale.FRANCE, "%7.5s", new Latitude(5.51)));
assertEquals("5,5°N ", String.format(Locale.FRANCE, "%-7.5s", new Latitude(5.51)));
assertEquals("N", String.format(Locale.FRANCE, "%1.1s", new Latitude(5.51)));
assertEquals(" ", String.format(Locale.FRANCE, "%1.0s", new Latitude(5.51)));
}
/**
* Tests {@link Latitude#clamp(double)}.
*/
@Test
public void testClamp() {
assertEquals( 45, Latitude.clamp( 45), 0);
assertEquals(-45, Latitude.clamp(-45), 0);
assertEquals( 90, Latitude.clamp( 95), 0);
assertEquals(-90, Latitude.clamp(-95), 0);
assertEquals(NaN, Latitude.clamp(NaN), 0);
assertEquals( 90, Latitude.clamp(Double.POSITIVE_INFINITY), 0);
assertEquals(-90, Latitude.clamp(Double.NEGATIVE_INFINITY), 0);
assertEquals(doubleToLongBits(+0.0), doubleToLongBits(Latitude.clamp(+0.0)));
assertEquals(doubleToLongBits(-0.0), doubleToLongBits(Latitude.clamp(-0.0))); // Sign shall be preserved.
}
/**
* Tests {@link Longitude#normalize(double)}.
*/
@Test
public void testNormalize() {
assertEquals( 120, Longitude.normalize( 120), 0);
assertEquals(-120, Longitude.normalize(-120), 0);
assertEquals(-160, Longitude.normalize( 200), 0);
assertEquals( 160, Longitude.normalize(-200), 0);
assertEquals(-180, Longitude.normalize(-180), 0);
assertEquals(-180, Longitude.normalize( 180), 0); // Upper value shall be exclusive.
assertEquals(NaN, Longitude.normalize( NaN), 0);
assertEquals(NaN, Longitude.normalize(Double.POSITIVE_INFINITY), 0);
assertEquals(NaN, Longitude.normalize(Double.NEGATIVE_INFINITY), 0);
assertEquals(doubleToLongBits(+0.0), doubleToLongBits(Longitude.normalize(+0.0)));
assertEquals(doubleToLongBits(-0.0), doubleToLongBits(Longitude.normalize(-0.0))); // Sign shall be preserved.
}
}