// Copyright 2008 Google Inc.
//
// Licensed 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 com.google.android.stardroid.test.units;
import com.google.android.stardroid.provider.ephemeris.Planet;
import com.google.android.stardroid.units.HeliocentricCoordinates;
import com.google.android.stardroid.units.RaDec;
import java.util.GregorianCalendar;
import java.util.TimeZone;
import junit.framework.TestCase;
public class RaDecTest extends TestCase {
// Accuracy of 0.30 degree should be fine.
// TODO(jontayler): investigate why this now fails with a tol of 0.25 degrees
private static final float EPSILON = 0.30f;
// Convert from hours to degrees
private static final float HOURS_TO_DEGREES = 360.0f/24.0f;
// Verify that we are calculating the correct RA/Dec for the various solar system objects.
// All of the reference data comes from the US Naval Observatories web site:
// http://aa.usno.navy.mil/data/
public void testPositions() {
GregorianCalendar testCal = new GregorianCalendar();
testCal.setTimeZone(TimeZone.getTimeZone("GMT"));
RaDec pos = null;
HeliocentricCoordinates earthCoords = null;
// 2009 Jan 1, 12:00 UT1
// Sun 18h 48.8m -22d 58m
// Mercury 20h 10.6m -21d 36m
// Venus 22h 02.0m -13d 36m
// Mars 18h 17.1m -24d 05m
// Jupiter 20h 05.1m -20d 45m
// Saturn 11h 33.0m + 5d 09m
// Uranus 23h 21.7m - 4d 57m
// Neptune 21h 39.7m -14d 22m
// Pluto 18h 05.3m -17d 45m
testCal.set(2009, GregorianCalendar.JANUARY, 1, 12, 0, 0);
earthCoords = HeliocentricCoordinates.getInstance(Planet.Sun, testCal.getTime());
pos = RaDec.getInstance(Planet.Sun, testCal.getTime(), earthCoords);
assertEquals(18.813 * HOURS_TO_DEGREES, pos.ra, EPSILON);
assertEquals(-22.97, pos.dec, EPSILON);
pos = RaDec.getInstance(Planet.Mercury, testCal.getTime(), earthCoords);
assertEquals(20.177 * HOURS_TO_DEGREES, pos.ra, EPSILON);
assertEquals(-21.60, pos.dec, EPSILON);
pos = RaDec.getInstance(Planet.Venus, testCal.getTime(), earthCoords);
assertEquals(22.033 * HOURS_TO_DEGREES, pos.ra, EPSILON);
assertEquals(-13.60, pos.dec, EPSILON);
pos = RaDec.getInstance(Planet.Mars, testCal.getTime(), earthCoords);
assertEquals(18.285 * HOURS_TO_DEGREES, pos.ra, EPSILON);
assertEquals(-24.08, pos.dec, EPSILON);
pos = RaDec.getInstance(Planet.Jupiter, testCal.getTime(), earthCoords);
assertEquals(20.085 * HOURS_TO_DEGREES, pos.ra, EPSILON);
assertEquals(-20.75, pos.dec, EPSILON);
pos = RaDec.getInstance(Planet.Saturn, testCal.getTime(), earthCoords);
assertEquals(11.550 * HOURS_TO_DEGREES, pos.ra, EPSILON);
assertEquals(5.15, pos.dec, EPSILON);
pos = RaDec.getInstance(Planet.Uranus, testCal.getTime(), earthCoords);
assertEquals(23.362 * HOURS_TO_DEGREES, pos.ra, EPSILON);
assertEquals(-4.95, pos.dec, EPSILON);
pos = RaDec.getInstance(Planet.Neptune, testCal.getTime(), earthCoords);
assertEquals(21.662 * HOURS_TO_DEGREES, pos.ra, EPSILON);
assertEquals(-14.37, pos.dec, EPSILON);
pos = RaDec.getInstance(Planet.Pluto, testCal.getTime(), earthCoords);
assertEquals(18.088 * HOURS_TO_DEGREES, pos.ra, EPSILON);
assertEquals(-17.75, pos.dec, EPSILON);
// 2009 Sep 20, 12:00 UT1
// Sun 11h 51.4m + 0d 56m
// Mercury 11h 46.1m - 1d 45m
// Venus 10h 09.4m +12d 21m
// Mars 7h 08.6m +23d 03m
// Jupiter 21h 23.2m -16d 29m
// Saturn 11h 46.0m + 3d 40m
// Uranus 23h 41.1m - 2d 55m
// Neptune 21h 46.7m -13d 51m
// Pluto 18h 02.8m -18d 00m
testCal.set(2009, GregorianCalendar.SEPTEMBER, 20, 12, 0, 0);
earthCoords = HeliocentricCoordinates.getInstance(Planet.Sun, testCal.getTime());
pos = RaDec.getInstance(Planet.Sun, testCal.getTime(), earthCoords);
assertEquals(11.857 * HOURS_TO_DEGREES, pos.ra, EPSILON);
assertEquals(0.933, pos.dec, EPSILON);
pos = RaDec.getInstance(Planet.Mercury, testCal.getTime(), earthCoords);
assertEquals(11.768 * HOURS_TO_DEGREES, pos.ra, EPSILON);
assertEquals(-1.75, pos.dec, EPSILON);
pos = RaDec.getInstance(Planet.Venus, testCal.getTime(), earthCoords);
assertEquals(10.157 * HOURS_TO_DEGREES, pos.ra, EPSILON);
assertEquals(12.35, pos.dec, EPSILON);
pos = RaDec.getInstance(Planet.Mars, testCal.getTime(), earthCoords);
assertEquals(7.143 * HOURS_TO_DEGREES, pos.ra, EPSILON);
assertEquals(23.05, pos.dec, EPSILON);
pos = RaDec.getInstance(Planet.Jupiter, testCal.getTime(), earthCoords);
assertEquals(21.387 * HOURS_TO_DEGREES, pos.ra, EPSILON);
assertEquals(-16.48, pos.dec, EPSILON);
pos = RaDec.getInstance(Planet.Saturn, testCal.getTime(), earthCoords);
assertEquals(11.767 * HOURS_TO_DEGREES, pos.ra, EPSILON);
assertEquals(3.67, pos.dec, EPSILON);
pos = RaDec.getInstance(Planet.Uranus, testCal.getTime(), earthCoords);
assertEquals(23.685 * HOURS_TO_DEGREES, pos.ra, EPSILON);
assertEquals(-2.92, pos.dec, EPSILON);
pos = RaDec.getInstance(Planet.Neptune, testCal.getTime(), earthCoords);
assertEquals(21.778 * HOURS_TO_DEGREES, pos.ra, EPSILON);
assertEquals(-13.85, pos.dec, EPSILON);
pos = RaDec.getInstance(Planet.Pluto, testCal.getTime(), earthCoords);
assertEquals(18.047 * HOURS_TO_DEGREES, pos.ra, EPSILON);
assertEquals(-18.00, pos.dec, EPSILON);
// 2010 Dec 25, 12:00 UT1
// Sun 18 15.6 -23 23
// Mercury 17 24.2 -20 10
// Venus 15 04.1 -13 50
// Mars 18 58.5 -23 43
// Jupiter 23 46.4 - 2 53
// Saturn 13 03.9 - 4 14
// Uranus 23 49.6 - 1 56
// Neptune 21 55.8 -13 07
// Pluto 18 21.5 -18 50
testCal.set(2010, GregorianCalendar.DECEMBER, 25, 12, 0, 0);
earthCoords = HeliocentricCoordinates.getInstance(Planet.Sun, testCal.getTime());
pos = RaDec.getInstance(Planet.Sun, testCal.getTime(), earthCoords);
assertEquals(18.260 * HOURS_TO_DEGREES, pos.ra, EPSILON);
assertEquals(-23.38, pos.dec, EPSILON);
pos = RaDec.getInstance(Planet.Mercury, testCal.getTime(), earthCoords);
assertEquals(17.403 * HOURS_TO_DEGREES, pos.ra, EPSILON);
assertEquals(-20.17, pos.dec, EPSILON);
pos = RaDec.getInstance(Planet.Venus, testCal.getTime(), earthCoords);
assertEquals(15.068 * HOURS_TO_DEGREES, pos.ra, EPSILON);
assertEquals(-13.83, pos.dec, EPSILON);
pos = RaDec.getInstance(Planet.Mars, testCal.getTime(), earthCoords);
assertEquals(18.975 * HOURS_TO_DEGREES, pos.ra, EPSILON);
assertEquals(-23.72, pos.dec, EPSILON);
pos = RaDec.getInstance(Planet.Jupiter, testCal.getTime(), earthCoords);
assertEquals(23.773 * HOURS_TO_DEGREES, pos.ra, EPSILON);
assertEquals(-2.88, pos.dec, EPSILON);
pos = RaDec.getInstance(Planet.Saturn, testCal.getTime(), earthCoords);
assertEquals(13.065 * HOURS_TO_DEGREES, pos.ra, EPSILON);
assertEquals(-4.23, pos.dec, EPSILON);
pos = RaDec.getInstance(Planet.Uranus, testCal.getTime(), earthCoords);
assertEquals(23.827 * HOURS_TO_DEGREES, pos.ra, EPSILON);
assertEquals(-1.93, pos.dec, EPSILON);
pos = RaDec.getInstance(Planet.Neptune, testCal.getTime(), earthCoords);
assertEquals(21.930 * HOURS_TO_DEGREES, pos.ra, EPSILON);
assertEquals(-13.12, pos.dec, EPSILON);
pos = RaDec.getInstance(Planet.Pluto, testCal.getTime(), earthCoords);
assertEquals(18.358 * HOURS_TO_DEGREES, pos.ra, EPSILON);
}
}