/* Copyright 2002-2017 CS Systèmes d'Information
* Licensed to CS Systèmes d'Information (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* CS 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.orekit.data;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
import org.hipparchus.util.FastMath;
import org.junit.Assert;
import org.junit.Test;
public class PolynomialParserTest {
@Test
public void testEmptyData() {
double[] coefficients =
new PolynomialParser('x', PolynomialParser.Unit.NO_UNITS).parse("");
Assert.assertNull(coefficients);
}
@Test
public void testConstant() {
double[] coefficients =
new PolynomialParser('x', PolynomialParser.Unit.NO_UNITS).parse("3");
Assert.assertEquals(1, coefficients.length);
Assert.assertEquals(3, coefficients[0], 1.0e-14);
}
@Test
public void testHighDegreeMonomialSuperscripts() {
double[] coefficients =
new PolynomialParser('\u03c4', PolynomialParser.Unit.NO_UNITS).parse(" −1234.567″ × τ⁴⁵");
Assert.assertEquals(46, coefficients.length);
Assert.assertEquals(FastMath.toRadians(-1234.567 / 3600), coefficients[45], 1.0e-14);
for (int i = 0; i < coefficients.length - 1; ++i) {
Assert.assertEquals(0.0, coefficients[i], 1.0e-14);
}
}
@Test
public void testHighDegreeMonomialCaret() {
double[] coefficients =
new PolynomialParser('\u03c4', PolynomialParser.Unit.NO_UNITS).parse(" −1234.567″ × τ^45");
Assert.assertEquals(46, coefficients.length);
Assert.assertEquals(FastMath.toRadians(-1234.567 / 3600), coefficients[45], 1.0e-14);
for (int i = 0; i < coefficients.length - 1; ++i) {
Assert.assertEquals(0.0, coefficients[i], 1.0e-14);
}
}
@Test
public void testDefaultRadians() {
double[] coefficients =
new PolynomialParser('a', PolynomialParser.Unit.RADIANS).parse("1 − 1 × a");
Assert.assertEquals(2, coefficients.length);
Assert.assertEquals(+1.0, coefficients[0], 1.0e-14);
Assert.assertEquals(-1.0, coefficients[1], 1.0e-14);
}
@Test
public void testDefaultDegrees() {
double[] coefficients =
new PolynomialParser('a', PolynomialParser.Unit.DEGREES).parse("1 − 1 × a");
Assert.assertEquals(2, coefficients.length);
Assert.assertEquals(FastMath.toRadians(+1.0), coefficients[0], 1.0e-14);
Assert.assertEquals(FastMath.toRadians(-1.0), coefficients[1], 1.0e-14);
}
@Test
public void testDefaultArcSeconds() {
double[] coefficients =
new PolynomialParser('a', PolynomialParser.Unit.ARC_SECONDS).parse("1 − 1 × a");
Assert.assertEquals(2, coefficients.length);
Assert.assertEquals(FastMath.toRadians(+1.0 / 3600.0), coefficients[0], 1.0e-14);
Assert.assertEquals(FastMath.toRadians(-1.0 / 3600.0), coefficients[1], 1.0e-14);
}
@Test
public void testDefaultMilliArcSeconds() {
double[] coefficients =
new PolynomialParser('a', PolynomialParser.Unit.MILLI_ARC_SECONDS).parse("1 − 1 × a");
Assert.assertEquals(2, coefficients.length);
Assert.assertEquals(FastMath.toRadians(+1.0 / 3600000.0), coefficients[0], 1.0e-14);
Assert.assertEquals(FastMath.toRadians(-1.0 / 3600000.0), coefficients[1], 1.0e-14);
}
@Test
public void testDefaultMicroArcSeconds() {
double[] coefficients =
new PolynomialParser('a', PolynomialParser.Unit.MICRO_ARC_SECONDS).parse("1 − 1 × a");
Assert.assertEquals(2, coefficients.length);
Assert.assertEquals(FastMath.toRadians(+1.0 / 3600000000.0), coefficients[0], 1.0e-14);
Assert.assertEquals(FastMath.toRadians(-1.0 / 3600000000.0), coefficients[1], 1.0e-14);
}
@Test
public void testDefaultNoUnits() {
double[] coefficients =
new PolynomialParser('a', PolynomialParser.Unit.NO_UNITS).parse("1 − 1 × a");
Assert.assertEquals(2, coefficients.length);
Assert.assertEquals(+1.0, coefficients[0], 1.0e-14);
Assert.assertEquals(-1.0, coefficients[1], 1.0e-14);
}
@Test
public void testExplicitEmbeddedUnits() {
for (final PolynomialParser.Unit defaultUnit : PolynomialParser.Unit.values()) {
double[] coefficients = new PolynomialParser('a', defaultUnit).parse("1°.25 − 1″.2 × a");
Assert.assertEquals(2, coefficients.length);
Assert.assertEquals(FastMath.toRadians(+1.25), coefficients[0], 1.0e-14);
Assert.assertEquals(FastMath.toRadians(-1.2 / 3600.0), coefficients[1], 1.0e-14);
}
}
@Test
public void testExplicitAppendedUnits() {
for (final PolynomialParser.Unit defaultUnit : PolynomialParser.Unit.values()) {
double[] coefficients = new PolynomialParser('a', defaultUnit).parse("1° − 1″ × a");
Assert.assertEquals(2, coefficients.length);
Assert.assertEquals(FastMath.toRadians(+1.0), coefficients[0], 1.0e-14);
Assert.assertEquals(FastMath.toRadians(-1.0 / 3600.0), coefficients[1], 1.0e-14);
}
}
@Test
public void testIERSData1() {
PolynomialParser parser = new PolynomialParser('t', PolynomialParser.Unit.MICRO_ARC_SECONDS);
double[] coefficients = parser.parse("125.04455501° − 6962890.5431″t + 7.4722″t² + 0.007702″t³ − 0.00005939″t⁴");
Assert.assertEquals(5, coefficients.length);
Assert.assertEquals(FastMath.toRadians(125.04455501), coefficients[0], 1.0e-14);
Assert.assertEquals(FastMath.toRadians(-6962890.5431 / 3600), coefficients[1], 1.0e-14);
Assert.assertEquals(FastMath.toRadians(7.4722 / 3600), coefficients[2], 1.0e-14);
Assert.assertEquals(FastMath.toRadians(0.007702 / 3600), coefficients[3], 1.0e-14);
Assert.assertEquals(FastMath.toRadians(-0.00005939 / 3600.0), coefficients[4], 1.0e-14);
}
@Test
public void testIERSData2() {
PolynomialParser parser = new PolynomialParser('t', PolynomialParser.Unit.ARC_SECONDS);
double[] coefficients = parser.parse("0.02438175 × t + 0.00000538691 × t²");
Assert.assertEquals(3, coefficients.length);
Assert.assertEquals(FastMath.toRadians(0), coefficients[0], 1.0e-14);
Assert.assertEquals(FastMath.toRadians(0.02438175 / 3600), coefficients[1], 1.0e-14);
Assert.assertEquals(FastMath.toRadians(0.00000538691 / 3600.0), coefficients[2], 1.0e-14);
}
@Test
public void testIERSData3() {
PolynomialParser parser = new PolynomialParser('t', PolynomialParser.Unit.MICRO_ARC_SECONDS);
double[] coefficients = parser.parse("0''.014506 + 4612''.15739966t + 1''.39667721t^2 - 0''.00009344t^3 + 0''.00001882t^4");
Assert.assertEquals(5, coefficients.length);
Assert.assertEquals(FastMath.toRadians(0.014506 / 3600), coefficients[0], 1.0e-14);
Assert.assertEquals(FastMath.toRadians(4612.15739966 / 3600), coefficients[1], 1.0e-14);
Assert.assertEquals(FastMath.toRadians(1.39667721 / 3600), coefficients[2], 1.0e-14);
Assert.assertEquals(FastMath.toRadians(-0.00009344 / 3600), coefficients[3], 1.0e-14);
Assert.assertEquals(FastMath.toRadians(0.00001882 / 3600.0), coefficients[4], 1.0e-14);
}
@Test
public void testIERSData4() {
PolynomialParser parser = new PolynomialParser('t', PolynomialParser.Unit.MICRO_ARC_SECONDS);
double[] coefficients = parser.parse("-16616.99 + 2004191742.88 t - 427219.05 t^2 - 198620.54 t^3 - 46.05 t^4 + 5.98 t^5");
Assert.assertEquals(6, coefficients.length);
Assert.assertEquals(FastMath.toRadians(-16616.99 / 3600000000.0), coefficients[0], 1.0e-14);
Assert.assertEquals(FastMath.toRadians(2004191742.88 / 3600000000.0), coefficients[1], 1.0e-14);
Assert.assertEquals(FastMath.toRadians(-427219.05 / 3600000000.0), coefficients[2], 1.0e-14);
Assert.assertEquals(FastMath.toRadians(-198620.54 / 3600000000.0), coefficients[3], 1.0e-14);
Assert.assertEquals(FastMath.toRadians(-46.05 / 3600000000.0), coefficients[4], 1.0e-14);
Assert.assertEquals(FastMath.toRadians(5.98 / 3600000000.0), coefficients[5], 1.0e-14);
}
@Test
public void testEnum() throws NoSuchMethodException, SecurityException,
IllegalAccessException, IllegalArgumentException,
InvocationTargetException {
Class<?> e = null;
for (final Class<?> c : PolynomialParser.class.getDeclaredClasses()) {
if (c.getName().endsWith("Unit")) {
e = c;
}
}
Method m = e.getDeclaredMethod("valueOf", String.class);
m.setAccessible(true);
for (String n : Arrays.asList("RADIANS", "DEGREES", "ARC_SECONDS",
"MILLI_ARC_SECONDS", "MICRO_ARC_SECONDS", "NO_UNITS")) {
Assert.assertEquals(n, m.invoke(null, n).toString());
}
try {
m.invoke(null, "inexistent");
Assert.fail("an exception should have been thrown");
} catch (InvocationTargetException ite) {
Assert.assertTrue(ite.getCause() instanceof IllegalArgumentException);
}
}
}