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