1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT:
350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Copyright (c) 1996-2010, International Business Machines Corporation and
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved.
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Test CalendarAstronomer for C++ */
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "string.h"
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/locid.h"
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "astro.h"
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "astrotst.h"
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "gregoimp.h" // for Math
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/simpletz.h"
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const double DAY_MS = 24.*60.*60.*1000.;
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define CASE(id,test) case id: name = #test; if (exec) { logln(#test "---"); logln((UnicodeString)""); test(); } break
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruAstroTest::AstroTest(): astro(NULL), gc(NULL) {
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid AstroTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (exec) logln("TestSuite AstroTest");
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (index) {
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      // CASE(0,FooTest);
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      CASE(0,TestSolarLongitude);
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      CASE(1,TestLunarPosition);
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      CASE(2,TestCoordinates);
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      CASE(3,TestCoverage);
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      CASE(4,TestSunriseTimes);
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      CASE(5,TestBasics);
39b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru      CASE(6,TestMoonAge);
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    default: name = ""; break;
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#undef CASE
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#define ASSERT_OK(x)   if(U_FAILURE(x)) { dataerrln("%s:%d: %s\n", __FILE__, __LINE__, u_errorName(x)); return; }
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid AstroTest::initAstro(UErrorCode &status) {
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(U_FAILURE(status)) return;
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if((astro != NULL) || (gc != NULL)) {
536d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    dataerrln("Err: initAstro() called twice!");
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    closeAstro(status);
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status)) {
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      status = U_INTERNAL_PROGRAM_ERROR;
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(U_FAILURE(status)) return;
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  astro = new CalendarAstronomer();
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  gc = Calendar::createInstance(TimeZone::getGMT()->clone(), status);
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid AstroTest::closeAstro(UErrorCode &/*status*/) {
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(astro != NULL) {
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete astro;
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    astro = NULL;
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(gc != NULL) {
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete gc;
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gc = NULL;
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid AstroTest::TestSolarLongitude(void) {
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  initAstro(status);
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ASSERT_OK(status);
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  struct {
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t d[5]; double f ;
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } tests[] = {
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { { 1980, 7, 27, 0, 00 },  124.114347 },
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { { 1988, 7, 27, 00, 00 },  124.187732 }
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  logln("");
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for (uint32_t i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gc->clear();
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gc->set(tests[i].d[0], tests[i].d[1]-1, tests[i].d[2], tests[i].d[3], tests[i].d[4]);
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    astro->setDate(gc->getTime(status));
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double longitude = astro->getSunLongitude();
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //longitude = 0;
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CalendarAstronomer::Equatorial result;
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    astro->getSunPosition(result);
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"Sun position is " + result.toString() + (UnicodeString)";  " /* + result.toHmsString()*/ + " Sun longitude is " + longitude );
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  closeAstro(status);
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ASSERT_OK(status);
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid AstroTest::TestLunarPosition(void) {
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  initAstro(status);
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ASSERT_OK(status);
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const double tests[][7] = {
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { 1979, 2, 26, 16, 00,  0, 0 }
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  logln("");
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for (int32_t i = 0; i < (int32_t)(sizeof(tests)/sizeof(tests[0])); i++) {
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gc->clear();
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gc->set((int32_t)tests[i][0], (int32_t)tests[i][1]-1, (int32_t)tests[i][2], (int32_t)tests[i][3], (int32_t)tests[i][4]);
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    astro->setDate(gc->getTime(status));
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const CalendarAstronomer::Equatorial& result = astro->getMoonPosition();
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"Moon position is " + result.toString() + (UnicodeString)";  " /* + result->toHmsString()*/);
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  closeAstro(status);
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ASSERT_OK(status);
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid AstroTest::TestCoordinates(void) {
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  initAstro(status);
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ASSERT_OK(status);
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  CalendarAstronomer::Equatorial result;
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  astro->eclipticToEquatorial(result, 139.686111 * CalendarAstronomer::PI / 180.0, 4.875278* CalendarAstronomer::PI / 180.0);
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  logln((UnicodeString)"result is " + result.toString() + (UnicodeString)";  " /* + result.toHmsString()*/ );
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  closeAstro(status);
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ASSERT_OK(status);
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid AstroTest::TestCoverage(void) {
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  initAstro(status);
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ASSERT_OK(status);
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  GregorianCalendar *cal = new GregorianCalendar(1958, UCAL_AUGUST, 15,status);
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UDate then = cal->getTime(status);
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  CalendarAstronomer *myastro = new CalendarAstronomer(then);
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ASSERT_OK(status);
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  //Latitude:  34 degrees 05' North
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  //Longitude:  118 degrees 22' West
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  double laLat = 34 + 5./60, laLong = 360 - (118 + 22./60);
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  CalendarAstronomer *myastro2 = new CalendarAstronomer(laLong, laLat);
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  double eclLat = laLat * CalendarAstronomer::PI / 360;
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  double eclLong = laLong * CalendarAstronomer::PI / 360;
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  CalendarAstronomer::Ecliptic ecl(eclLat, eclLong);
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  CalendarAstronomer::Equatorial eq;
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  CalendarAstronomer::Horizon hor;
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  logln("ecliptic: " + ecl.toString());
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  CalendarAstronomer *myastro3 = new CalendarAstronomer();
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  myastro3->setJulianDay((4713 + 2000) * 365.25);
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  CalendarAstronomer *astronomers[] = {
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    myastro, myastro2, myastro3, myastro2 // check cache
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for (uint32_t i = 0; i < sizeof(astronomers)/sizeof(astronomers[0]); ++i) {
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CalendarAstronomer *anAstro = astronomers[i];
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //logln("astro: " + astro);
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"   date: " + anAstro->getTime());
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"   cent: " + anAstro->getJulianCentury());
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"   gw sidereal: " + anAstro->getGreenwichSidereal());
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"   loc sidereal: " + anAstro->getLocalSidereal());
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"   equ ecl: " + (anAstro->eclipticToEquatorial(eq,ecl)).toString());
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"   equ long: " + (anAstro->eclipticToEquatorial(eq, eclLong)).toString());
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"   horiz: " + (anAstro->eclipticToHorizon(hor, eclLong)).toString());
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"   sunrise: " + (anAstro->getSunRiseSet(TRUE)));
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"   sunset: " + (anAstro->getSunRiseSet(FALSE)));
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"   moon phase: " + anAstro->getMoonPhase());
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"   moonrise: " + (anAstro->getMoonRiseSet(TRUE)));
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"   moonset: " + (anAstro->getMoonRiseSet(FALSE)));
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"   prev summer solstice: " + (anAstro->getSunTime(CalendarAstronomer::SUMMER_SOLSTICE(), FALSE)));
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"   next summer solstice: " + (anAstro->getSunTime(CalendarAstronomer::SUMMER_SOLSTICE(), TRUE)));
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"   prev full moon: " + (anAstro->getMoonTime(CalendarAstronomer::FULL_MOON(), FALSE)));
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"   next full moon: " + (anAstro->getMoonTime(CalendarAstronomer::FULL_MOON(), TRUE)));
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  delete myastro2;
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  delete myastro3;
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  delete myastro;
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  delete cal;
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  closeAstro(status);
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ASSERT_OK(status);
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid AstroTest::TestSunriseTimes(void) {
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  initAstro(status);
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ASSERT_OK(status);
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  //  logln("Sunrise/Sunset times for San Jose, California, USA");
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  //  CalendarAstronomer *astro2 = new CalendarAstronomer(-121.55, 37.20);
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  //  TimeZone *tz = TimeZone::createTimeZone("America/Los_Angeles");
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // We'll use a table generated by the UNSO website as our reference
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // From: http://aa.usno.navy.mil/
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  //-Location: W079 25, N43 40
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  //-Rise and Set for the Sun for 2001
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  //-Zone:  4h West of Greenwich
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int32_t USNO[] = {
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    6,59, 19,45,
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    6,57, 19,46,
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    6,56, 19,47,
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    6,54, 19,48,
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    6,52, 19,49,
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    6,50, 19,51,
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    6,48, 19,52,
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    6,47, 19,53,
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    6,45, 19,54,
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    6,43, 19,55,
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    6,42, 19,57,
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    6,40, 19,58,
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    6,38, 19,59,
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    6,36, 20, 0,
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    6,35, 20, 1,
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    6,33, 20, 3,
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    6,31, 20, 4,
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    6,30, 20, 5,
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    6,28, 20, 6,
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    6,27, 20, 7,
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    6,25, 20, 8,
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    6,23, 20,10,
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    6,22, 20,11,
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    6,20, 20,12,
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    6,19, 20,13,
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    6,17, 20,14,
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    6,16, 20,16,
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    6,14, 20,17,
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    6,13, 20,18,
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    6,11, 20,19,
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  };
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  logln("Sunrise/Sunset times for Toronto, Canada");
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // long = 79 25", lat = 43 40"
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  CalendarAstronomer *astro3 = new CalendarAstronomer(-(79+25/60), 43+40/60);
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // As of ICU4J 2.8 the ICU4J time zones implement pass-through
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // to the underlying JDK.  Because of variation in the
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // underlying JDKs, we have to use a fixed-offset
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // SimpleTimeZone to get consistent behavior between JDKs.
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // The offset we want is [-18000000, 3600000] (raw, dst).
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // [aliu 10/15/03]
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // TimeZone tz = TimeZone.getTimeZone("America/Montreal");
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  TimeZone *tz = new SimpleTimeZone(-18000000 + 3600000, "Montreal(FIXED)");
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  GregorianCalendar *cal = new GregorianCalendar(tz->clone(), Locale::getUS(), status);
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  GregorianCalendar *cal2 = new GregorianCalendar(tz->clone(), Locale::getUS(), status);
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  cal->clear();
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  cal->set(UCAL_YEAR, 2001);
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  cal->set(UCAL_MONTH, UCAL_APRIL);
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  cal->set(UCAL_DAY_OF_MONTH, 1);
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  cal->set(UCAL_HOUR_OF_DAY, 12); // must be near local noon for getSunRiseSet to work
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  DateFormat *df_t  = DateFormat::createTimeInstance(DateFormat::MEDIUM,Locale::getUS());
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  DateFormat *df_d  = DateFormat::createDateInstance(DateFormat::MEDIUM,Locale::getUS());
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  DateFormat *df_dt = DateFormat::createDateTimeInstance(DateFormat::MEDIUM, DateFormat::MEDIUM, Locale::getUS());
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(!df_t || !df_d || !df_dt) {
2826d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    dataerrln("couldn't create dateformats.");
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return;
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  df_t->adoptTimeZone(tz->clone());
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  df_d->adoptTimeZone(tz->clone());
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  df_dt->adoptTimeZone(tz->clone());
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for (int32_t i=0; i < 30; i++) {
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("setDate\n");
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    astro3->setDate(cal->getTime(status));
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("getRiseSet(TRUE)\n");
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate sunrise = astro3->getSunRiseSet(TRUE);
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("getRiseSet(FALSE)\n");
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate sunset  = astro3->getSunRiseSet(FALSE);
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("end of getRiseSet\n");
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal2->setTime(cal->getTime(status), status);
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal2->set(UCAL_SECOND,      0);
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal2->set(UCAL_MILLISECOND, 0);
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal2->set(UCAL_HOUR_OF_DAY, USNO[4*i+0]);
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal2->set(UCAL_MINUTE,      USNO[4*i+1]);
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate exprise = cal2->getTime(status);
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal2->set(UCAL_HOUR_OF_DAY, USNO[4*i+2]);
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal2->set(UCAL_MINUTE,      USNO[4*i+3]);
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate expset = cal2->getTime(status);
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Compute delta of what we got to the USNO data, in seconds
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t deltarise = (int32_t)uprv_fabs((sunrise - exprise) / 1000);
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t deltaset = (int32_t)uprv_fabs((sunset - expset) / 1000);
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Allow a deviation of 0..MAX_DEV seconds
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // It would be nice to get down to 60 seconds, but at this
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // point that appears to be impossible without a redo of the
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // algorithm using something more advanced than Duffett-Smith.
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t MAX_DEV = 180;
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString s1, s2, s3, s4, s5;
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (deltarise > MAX_DEV || deltaset > MAX_DEV) {
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if (deltarise > MAX_DEV) {
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: (rise) " + df_d->format(cal->getTime(status),s1) +
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              ", Sunrise: " + df_dt->format(sunrise, s2) +
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              " (USNO " + df_t->format(exprise,s3) +
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              " d=" + deltarise + "s)");
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      } else {
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(df_d->format(cal->getTime(status),s1) +
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              ", Sunrise: " + df_dt->format(sunrise,s2) +
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              " (USNO " + df_t->format(exprise,s3) + ")");
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      s1.remove(); s2.remove(); s3.remove(); s4.remove(); s5.remove();
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if (deltaset > MAX_DEV) {
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: (set)  " + df_d->format(cal->getTime(status),s1) +
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              ", Sunset:  " + df_dt->format(sunset,s2) +
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              " (USNO " + df_t->format(expset,s3) +
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              " d=" + deltaset + "s)");
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      } else {
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(df_d->format(cal->getTime(status),s1) +
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              ", Sunset: " + df_dt->format(sunset,s2) +
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              " (USNO " + df_t->format(expset,s3) + ")");
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      logln(df_d->format(cal->getTime(status),s1) +
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ", Sunrise: " + df_dt->format(sunrise,s2) +
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            " (USNO " + df_t->format(exprise,s3) + ")" +
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ", Sunset: " + df_dt->format(sunset,s4) +
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            " (USNO " + df_t->format(expset,s5) + ")");
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->add(UCAL_DATE, 1, status);
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  //        CalendarAstronomer a = new CalendarAstronomer(-(71+5/60), 42+37/60);
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  //        cal.clear();
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  //        cal.set(cal.YEAR, 1986);
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  //        cal.set(cal.MONTH, cal.MARCH);
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  //        cal.set(cal.DATE, 10);
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  //        cal.set(cal.YEAR, 1988);
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  //        cal.set(cal.MONTH, cal.JULY);
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  //        cal.set(cal.DATE, 27);
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  //        a.setDate(cal.getTime());
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  //        long r = a.getSunRiseSet2(true);
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  delete astro3;
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  delete tz;
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  delete cal;
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  delete cal2;
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  delete df_t;
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  delete df_d;
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  delete df_dt;
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  closeAstro(status);
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ASSERT_OK(status);
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid AstroTest::TestBasics(void) {
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  initAstro(status);
3766d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru  if (U_FAILURE(status)) {
3776d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    dataerrln("Got error: %s", u_errorName(status));
3786d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    return;
3796d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru  }
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // Check that our JD computation is the same as the book's (p. 88)
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  GregorianCalendar *cal3 = new GregorianCalendar(TimeZone::getGMT()->clone(), Locale::getUS(), status);
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  DateFormat *d3 = DateFormat::createDateTimeInstance(DateFormat::MEDIUM,DateFormat::MEDIUM,Locale::getUS());
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  d3->setTimeZone(*TimeZone::getGMT());
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  cal3->clear();
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  cal3->set(UCAL_YEAR, 1980);
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  cal3->set(UCAL_MONTH, UCAL_JULY);
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  cal3->set(UCAL_DATE, 2);
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  logln("cal3[a]=%.1lf, d=%d\n", cal3->getTime(status), cal3->get(UCAL_JULIAN_DAY,status));
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString s;
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(UnicodeString("cal3[a] = ") + d3->format(cal3->getTime(status),s));
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  cal3->clear();
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  cal3->set(UCAL_YEAR, 1980);
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  cal3->set(UCAL_MONTH, UCAL_JULY);
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  cal3->set(UCAL_DATE, 27);
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  logln("cal3=%.1lf, d=%d\n", cal3->getTime(status), cal3->get(UCAL_JULIAN_DAY,status));
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ASSERT_OK(status);
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString s;
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(UnicodeString("cal3 = ") + d3->format(cal3->getTime(status),s));
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  astro->setTime(cal3->getTime(status));
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  double jd = astro->getJulianDay() - 2447891.5;
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  double exp = -3444.;
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if (jd == exp) {
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString s;
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(d3->format(cal3->getTime(status),s) + " => " + jd);
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } else {
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString s;
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errln("FAIL: " + d3->format(cal3->getTime(status), s) + " => " + jd +
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          ", expected " + exp);
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  //        cal3.clear();
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  //        cal3.set(cal3.YEAR, 1990);
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  //        cal3.set(cal3.MONTH, Calendar.JANUARY);
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  //        cal3.set(cal3.DATE, 1);
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  //        cal3.add(cal3.DATE, -1);
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  //        astro.setDate(cal3.getTime());
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  //        astro.foo();
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  delete cal3;
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  delete d3;
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ASSERT_OK(status);
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  closeAstro(status);
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  ASSERT_OK(status);
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
433b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid AstroTest::TestMoonAge(void){
434b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	UErrorCode status = U_ZERO_ERROR;
435b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	initAstro(status);
436b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	ASSERT_OK(status);
437b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
438b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	// more testcases are around the date 05/20/2012
439b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	//ticket#3785  UDate ud0 = 1337557623000.0;
440b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	static const double testcase[][10] = {{2012, 5, 20 , 16 , 48, 59},
441b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	                {2012, 5, 20 , 16 , 47, 34},
442b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	                {2012, 5, 21, 00, 00, 00},
443b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	                {2012, 5, 20, 14, 55, 59},
444b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	                {2012, 5, 21, 7, 40, 40},
445b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	                {2023, 9, 25, 10,00, 00},
446b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	                {2008, 7, 7, 15, 00, 33},
447b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	                {1832, 9, 24, 2, 33, 41 },
448b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	                {2016, 1, 31, 23, 59, 59},
449b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	                {2099, 5, 20, 14, 55, 59}
450b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	        };
451b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	// Moon phase angle - Got from http://www.moonsystem.to/checkupe.htm
452b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	static const double angle[] = {356.8493418421329, 356.8386760059673, 0.09625415252237701, 355.9986960782416, 3.5714026601303317, 124.26906744384183, 59.80247650195558,
453b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru									357.54163205513123, 268.41779281511094, 4.82340276581624};
454b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	static const double precision = CalendarAstronomer::PI/32;
455b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	for (int32_t i = 0; i < (int32_t)(sizeof(testcase)/sizeof(testcase[0])); i++) {
456b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru		gc->clear();
457b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru		logln((UnicodeString)"CASE["+i+"]: Year "+(int32_t)testcase[i][0]+" Month "+(int32_t)testcase[i][1]+" Day "+
458b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru		                                    (int32_t)testcase[i][2]+" Hour "+(int32_t)testcase[i][3]+" Minutes "+(int32_t)testcase[i][4]+
459b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru		                                    " Seconds "+(int32_t)testcase[i][5]);
460b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru		gc->set((int32_t)testcase[i][0], (int32_t)testcase[i][1]-1, (int32_t)testcase[i][2], (int32_t)testcase[i][3], (int32_t)testcase[i][4], (int32_t)testcase[i][5]);
461b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru		astro->setDate(gc->getTime(status));
462b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru		double expectedAge = (angle[i]*CalendarAstronomer::PI)/180;
463b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru		double got = astro->getMoonAge();
464b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru		//logln(testString);
465b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru		if(!(got>expectedAge-precision && got<expectedAge+precision)){
466b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru			errln((UnicodeString)"FAIL: expected " + expectedAge +
467b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru					" got " + got);
468b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru		}else{
469b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru			logln((UnicodeString)"PASS: expected " + expectedAge +
470b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru					" got " + got);
471b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru		}
472b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	}
473b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	closeAstro(status);
474b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	ASSERT_OK(status);
475b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
476b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// TODO: try finding next new moon after  07/28/1984 16:00 GMT
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
485