diff --git a/examples/simulate_iau.f90 b/examples/simulate_iau.f90 index 3867c408c4ce2d9a9abb58e9a9179a33b776667f..afa60a9cee76686af5bd0b34af5613c0bfc4ecde 100644 --- a/examples/simulate_iau.f90 +++ b/examples/simulate_iau.f90 @@ -4,45 +4,41 @@ program simulate_iau use mtime_hl implicit none - + type(t_datetime) :: start_date, stop_date, current_date, previous_date - type(t_timedelta) :: time_step, iau_time_shift + type(t_timedelta) :: time_step, iau_time_shift - logical :: iterate_iau = .true. + logical, parameter :: iterate_iau = .TRUE. integer :: iau_iter - real :: dt_shift, dtime + real :: dt_shift, dtime integer :: jstep, jstep0, jstep_shift write (0,*) "Start execution, set calendar ..." call setCalendar(proleptic_gregorian) - + write (0,*) "Assign values ..." - + start_date = t_datetime("2016-01-01T00:00:00") - stop_date = t_datetime("2016-01-02T00:00:00") + stop_date = t_datetime("2016-01-02T00:00:00") time_step = t_timedelta("PT15M") dtime = 900.0 - + iau_time_shift = t_timedelta("-PT1H30M") dt_shift = -5400.0 write (0,*) "Prepare time loop ..." - + current_date = start_date current_date = current_date + iau_time_shift write (0,*) ' start date ', start_date%to_string() write (0,*) ' shifted start date ', current_date%to_string() - - if (iterate_iau) then - iau_iter = 1 - else - iau_iter = 0 - endif + + iau_iter = MERGE(1, 0, iterate_iau) if (iterate_iau) then jstep_shift = nint(dt_shift/dtime) @@ -51,28 +47,28 @@ program simulate_iau endif previous_date = current_date - + jstep0 = 0 jstep = (jstep0 + 1) + jstep_shift write (0,*) "Start time loop ..." - + time_loop: do current_date = current_date + time_step write (0,*) " Time loop ", current_date%to_string(), jstep - + if ( (current_date%day() /= previous_date%day()) .and. .not. (jstep == 0 .and. iau_iter == 1) ) then previous_date = current_date endif - + write (0,*) ' --- integrate nh input: ', current_date%to_string(), jstep-jstep_shift, iau_iter if (current_date >= stop_date) then exit time_loop end if - + if (jstep == 0 .and. iau_iter == 1) then iau_iter = 2 jstep = (jstep0 + 1) + jstep_shift diff --git a/include/mtime_datetime.h b/include/mtime_datetime.h index be10d886c210bb58f8470e38b42c077b2a4918b1..37dff6e0c47e7d89ecd3afbf0a19ddad2a21fbcb 100644 --- a/include/mtime_datetime.h +++ b/include/mtime_datetime.h @@ -71,8 +71,13 @@ int getNoOfDaysInYearDateTime(struct _datetime* dt); /*! \cond PRIVATE */ -bool -testYearIsLeapYear(int64_t year); +static inline bool +testYearIsLeapYear(int64_t year) +{ + bool isLeapYear = !(year % 400) || ((year % 100) && !(year % 4)); + return isLeapYear; +} + struct _datetime * convertDateToDateTime(struct _date* d, struct _datetime* dt_return); diff --git a/src/mtime_datetime.c b/src/mtime_datetime.c index cc71bc0921ecf5b8a4a44a31a0db9765bc4d2d3a..1fc55971386efe9153ec22054b689dedbc0af750 100644 --- a/src/mtime_datetime.c +++ b/src/mtime_datetime.c @@ -336,26 +336,6 @@ else } -/*! \cond PRIVATE */ -/* Internal function. Test is year a leap year? */ - -bool -testYearIsLeapYear(int64_t year) -{ - bool flag = false; - - if (!(year % 400)) - flag = true; - else if (!(year % 100)) - flag = false; - else if (!(year % 4)) - flag = true; - else - flag = false; - - return flag; -} - /* * NOTE: Internal and not doxyfied. * diff --git a/src/mtime_timedelta.c b/src/mtime_timedelta.c index 0f4c70a828a7601330be5adc2ccbd120ed6bc552..e82c9532a4bdd2ce01a975f72c7f317421aeb1f6 100644 --- a/src/mtime_timedelta.c +++ b/src/mtime_timedelta.c @@ -873,65 +873,63 @@ julianDeltaToTimeDelta(struct _juliandelta* jd, struct _datetime* base_dt, struc msdinm = monthSpecificDeltaInMonths365; ndiny = NO_OF_DAYS_IN_A_YEAR_FOR_CAL_TYPE365; break; - + case YEAR_OF_360_DAYS: - + msdinm = monthSpecificDeltaInMonths360; ndiny = NO_OF_DAYS_IN_A_YEAR_FOR_CAL_TYPE360; break; case PROLEPTIC_GREGORIAN: /* Handle all Gregorian related code here. */ - + /* Gregorian will have 366 days and 365 days depending on Leap year. */ - + if ( jd->sign == '-' ) { /* Negative TimeDelta. A negative juliandelta is represented in the following way: -P01DT00.500S = jd2->sign = '-', jd2->day = -30, jd2->ms = -500. */ - + td_return->sign = '-'; - fprintf(stderr, "NEGATIVE CASE ....\n"); - /* No of days in the final year */ int64_t delta_final_year; int64_t days = (-1)*jd->day; - /* Set counter to base year and then jump forward to get to the final year. + /* Set counter to base year and then iterate backward to get to the final year. For each loop forward, increment year by 1. */ int64_t j = base_dt->date.year; /* Initialize to 0. */ td_return->year = 0; - + /* Fast-Fwd >= 400 */ if (days >= NO_OF_DAYS_IN_400_YEARS) { int64_t numberOf400YearPeriods = days / NO_OF_DAYS_IN_400_YEARS; td_return->year = td_return->year + numberOf400YearPeriods * 400; - j = j + numberOf400YearPeriods * 400; + j = j - numberOf400YearPeriods * 400; days = days - numberOf400YearPeriods * NO_OF_DAYS_IN_400_YEARS; } do { - + /* Loop over and get to the final year by substracting 366/365 days depending - on leap/non-leap year. For each substraction, increment year by 1. + on leap/non-leap year. For each substraction, increment year by 1. */ - + /* The crucial point is month of february. */ delta_final_year = days; if ( ( (testYearIsLeapYear(j)) && (base_dt->date.month >= 3) ) || - ( (testYearIsLeapYear(j+1)) && (base_dt->date.month < 3) ) + ( (testYearIsLeapYear(j-1)) && (base_dt->date.month < 3) ) ) { - /* If next year is leap year and base month is >= 3 - OR - this year is a leap year and month is < 3 - => delta of 1 year corresponds to 366 day julian delta. + /* If year is leap year and base month is >= 3 + OR + next year is a leap year and month is < 3 + => delta of 1 year corresponds to 366 day julian delta. */ days = days - NO_OF_DAYS_IN_A_LEAP_YEAR; } @@ -941,7 +939,7 @@ julianDeltaToTimeDelta(struct _juliandelta* jd, struct _datetime* base_dt, struc days = days - NO_OF_DAYS_IN_A_YEAR_FOR_CAL_TYPE365; } td_return->year++; - j++; + j--; } while (days >= 0); /* The loop ran one time too much. */ @@ -949,20 +947,20 @@ julianDeltaToTimeDelta(struct _juliandelta* jd, struct _datetime* base_dt, struc if (days < 0) { td_return->year--; - j--; + j++; } - + /* In final year, the crucial point is the month of february. */ if ( ((testYearIsLeapYear(j)) && (base_dt->date.month >= 3)) || - ((testYearIsLeapYear(j+1)) && (base_dt->date.month < 3)) + ((testYearIsLeapYear(j-1)) && (base_dt->date.month < 3)) ) { - /* If final year's next year is a leap year and base month is >= 3 - OR - final year is a leap year and month is < 3 + /* If final year is a leap year and base month is >= 3 + OR + year preceding final year is a leap year and month is < 3 => An addition of leap-year specific delta for each month. */ msdinm = monthSpecificDeltaInMonthsLeapyear; @@ -974,17 +972,20 @@ julianDeltaToTimeDelta(struct _juliandelta* jd, struct _datetime* base_dt, struc msdinm = monthSpecificDeltaInMonths365; ndiny = NO_OF_DAYS_IN_A_YEAR_FOR_CAL_TYPE365; } - + for (i = 1; i <= NO_OF_MONTHS_IN_A_YEAR; i++) { if (delta_final_year < msdinm[base_dt->date.month - 1][i]) { + /* Month */ td_return->month = i - 1; + /* Day. */ td_return->day = (int) delta_final_year - msdinm[base_dt->date.month - 1][i - 1]; break; } } - + + /* Time. */ td_return->hour = ((-1)*(int) jd->ms) / NO_OF_MS_IN_A_HOUR; td_return->minute = ((-1)*(int) jd->ms - td_return->hour * NO_OF_MS_IN_A_HOUR) / NO_OF_MS_IN_A_MINUTE; td_return->second = ((-1)*(int) jd->ms - td_return->hour * NO_OF_MS_IN_A_HOUR - td_return->minute * NO_OF_MS_IN_A_MINUTE) / NO_OF_MS_IN_A_SECOND; @@ -994,8 +995,6 @@ julianDeltaToTimeDelta(struct _juliandelta* jd, struct _datetime* base_dt, struc { td_return->sign = '+'; - fprintf(stderr, "POSITIVE CASE ....\n"); - /* No days in the final year. */ int64_t delta_final_year; int64_t days = jd->day; @@ -1005,69 +1004,63 @@ julianDeltaToTimeDelta(struct _juliandelta* jd, struct _datetime* base_dt, struc int64_t j = base_dt->date.year; /* Initialize. */ td_return->year = 0; - + /* Fast-Fwd >= 400 */ if (days >= NO_OF_DAYS_IN_400_YEARS) { - int64_t numberOf400YearPeriods = days / NO_OF_DAYS_IN_400_YEARS; + int64_t numberOf400YearPeriods = days / NO_OF_DAYS_IN_400_YEARS; td_return->year = td_return->year + numberOf400YearPeriods * 400; j = j - numberOf400YearPeriods * 400; days = days - numberOf400YearPeriods * NO_OF_DAYS_IN_400_YEARS; } - - fprintf(stderr, "y: %ld ym1: %ld\n", j, j-1); - + do { /* Loop over and get the year by substracting 366/365 days depending - on leap/non-leap year. For each substraction, increment year by 1. + on leap/non-leap year. For each substraction, increment year by 1. */ - + /* The crucial point is month of february. */ delta_final_year = days; if ( - ((testYearIsLeapYear(j)) && (base_dt->date.month <= 3)) + ((testYearIsLeapYear(j+1)) && (base_dt->date.month >= 3)) || - ((testYearIsLeapYear(j-1)) && (base_dt->date.month > 3)) + ((testYearIsLeapYear(j)) && (base_dt->date.month < 3)) ) { - fprintf(stderr, " .... special 1 (leap)\n"); - /* If previous year is leap year and base month is < 3 - OR - this year is a leap year and month is >= 3 - => delta of 1 year corresponds to 366 day julian delta. + /* If next year is leap year and base month is < 3 + OR + this year is a leap year and month is < 3 + => delta of 1 year corresponds to 366 day julian delta. */ days = days - NO_OF_DAYS_IN_A_LEAP_YEAR; } else { - fprintf(stderr, " .... normal 1\n"); /* Otherwise. */ days = days - NO_OF_DAYS_IN_A_YEAR_FOR_CAL_TYPE365; } - + td_return->year++; - j--; + j++; } while (days >= 0); /* The loop ran one time too much. */ - if (days < 0) { td_return->year--; - j++; + j--; } - - /* In final year, the crucial point is the month of february. */ + /* In final year, the crucial point is the month of february. */ if ( - ((testYearIsLeapYear(j)) && (base_dt->date.month <= 3)) + ((testYearIsLeapYear(j+1)) && (base_dt->date.month >= 3)) || - ((testYearIsLeapYear(j-1)) && (base_dt->date.month > 3)) + ((testYearIsLeapYear(j)) && (base_dt->date.month < 3)) ) { - /* If final year is a leap year and base month is >= 3 - OR + /* If final year is a leap year and base month is >= 3 + OR final year's previous year is a leap year and month is < 3 => An addition of leap-year specific delta for each month. */ @@ -1092,7 +1085,8 @@ julianDeltaToTimeDelta(struct _juliandelta* jd, struct _datetime* base_dt, struc break; } } - + + /* Time */ td_return->hour = (int) jd->ms / NO_OF_MS_IN_A_HOUR; td_return->minute = ((int) jd->ms - td_return->hour * NO_OF_MS_IN_A_HOUR) / NO_OF_MS_IN_A_MINUTE; td_return->second = ((int) jd->ms - td_return->hour * NO_OF_MS_IN_A_HOUR - td_return->minute * NO_OF_MS_IN_A_MINUTE) / NO_OF_MS_IN_A_SECOND; @@ -1442,10 +1436,6 @@ getTimeDeltaFromDateTime(struct _datetime* dt1, struct _datetime* dt2, struct _t /* Substract the 2 dates on julian axis. */ jd = substractJulianDay(jd1, jd2, jd); - fprintf(stderr, "jd1 %6ld %10ld\n", (long) jd1->day, (long) jd1->ms); - fprintf(stderr, "jd2 %6ld %10ld\n", (long) jd2->day, (long) jd2->ms); - fprintf(stderr, "jd %6ld %10ld\n", (long) jd->day, (long) jd->ms); - /* Convert Julian-delta to TimeDelta. */ td_return = julianDeltaToTimeDelta(jd, dt2, td_return); diff --git a/test/mtime_timedelta_test.c b/test/mtime_timedelta_test.c index 3ad7d838e21e7b7fd5f5af11e2c18620a14ce849..dd5aebec3b9c6b33aaf346b2f5b112ccc6366397 100644 --- a/test/mtime_timedelta_test.c +++ b/test/mtime_timedelta_test.c @@ -524,7 +524,9 @@ START_TEST(test_mtime_add_months_atEnd) int i; struct _timedelta *td, *offset; struct _datetime *start, *ref; +#ifdef DEBUG char curs[MAX_DATETIME_STR_LEN]; +#endif start = newDateTime("2001-01-01T00:00:00"); ref = newDateTime("1999-12-31T23:50:00"); @@ -534,7 +536,7 @@ START_TEST(test_mtime_add_months_atEnd) ref = start; struct _datetime* cur = constructAndCopyDateTime(ref); -#ifdef EBUG +#ifdef DEBUG printf("\n#==================================================================\n"); printf("Results from test: test_mtime_add_months_atEnd\n"); printf("Start date is: %s\n",datetimeToString(cur, curs)); @@ -692,24 +694,17 @@ END_TEST START_TEST(test_getTimeDeltaFromDateTime) { - // These tests are taken from ac66aeaef2dde828aa31b63f88076070a8282b49 - fprintf(stderr, "TEST A:\n"); + // These tests are taken from ac66aeaef2dde828aa31b63f88076070a8282b49 assertGetTimeDeltaFromDateTime("1979-03-01T00:00:00.000", "1979-01-01T01:00:00.000", "P01M27DT23H"); - fprintf(stderr, "TEST B:\n"); assertGetTimeDeltaFromDateTime("1979-07-01T00:00:00.000", "1979-01-01T01:00:00.000", "P05M29DT23H"); - fprintf(stderr, "TEST C:\n"); assertGetTimeDeltaFromDateTime("1979-12-01T00:00:00.000", "1979-01-01T01:00:00.000", "P10M29DT23H"); - fprintf(stderr, "TEST D:\n"); assertGetTimeDeltaFromDateTime("1980-01-01T00:00:00.000", "1979-01-01T01:00:00.000", "P11M30DT23H"); // These tests are taken from 5bcba6591c38fbb9f7a3a5f63c86963d8a066595 - fprintf(stderr, "TEST E:\n"); assertGetTimeDeltaFromDateTime("2017-07-31T00:00:00.000", "2017-07-01T00:00:00.000", "P30D"); - fprintf(stderr, "TEST F:\n"); assertGetTimeDeltaFromDateTime("2017-08-01T00:00:00.000", "2017-07-01T00:00:00.000", "P1M"); // FIXME: This needs to be fulfilled for amip restart to work fine. - fprintf(stderr, "TEST G:\n"); assertGetTimeDeltaFromDateTime("1981-01-01T00:00:00.000", "1980-01-01T00:10:00.000", "P11M30DT23H50M"); } END_TEST @@ -717,7 +712,7 @@ END_TEST START_TEST(test_timeDeltaToJulianDeltaToTimeDelta) { assertTimeDeltaToJulianDeltaToTimeDelta("1979-01-01T01:00:00.000", "P01M27DT23H"); - assertTimeDeltaToJulianDeltaToTimeDelta("1979-02-01T01:00:00.000", "P01M27DT23H"); + assertTimeDeltaToJulianDeltaToTimeDelta("1979-02-01T01:00:00.000", "P01M27DT23H"); assertTimeDeltaToJulianDeltaToTimeDelta("1979-03-01T00:00:00.000", "P01M27DT23H"); assertTimeDeltaToJulianDeltaToTimeDelta("1979-04-01T01:00:00.000", "P01M27DT23H"); assertTimeDeltaToJulianDeltaToTimeDelta("1979-05-01T01:00:00.000", "P01M27DT23H"); @@ -731,21 +726,21 @@ START_TEST(test_timeDeltaToJulianDeltaToTimeDelta) assertTimeDeltaToJulianDeltaToTimeDelta("1980-01-01T01:00:00.000", "P01M27DT23H"); assertTimeDeltaToJulianDeltaToTimeDelta("1980-02-01T01:00:00.000", "P01M27DT23H"); assertTimeDeltaToJulianDeltaToTimeDelta("1980-03-01T01:00:00.000", "P01M27DT23H"); - assertTimeDeltaToJulianDeltaToTimeDelta("1980-04-01T01:00:00.000", "P01M27DT23H"); + assertTimeDeltaToJulianDeltaToTimeDelta("1980-04-01T01:00:00.000", "P01M27DT23H"); assertTimeDeltaToJulianDeltaToTimeDelta("1979-01-01T01:00:00.000", "P05M29DT23H"); assertTimeDeltaToJulianDeltaToTimeDelta("1979-07-01T00:00:00.000", "P05M29DT23H"); assertTimeDeltaToJulianDeltaToTimeDelta("1979-01-01T01:00:00.000", "P10M29DT23H"); assertTimeDeltaToJulianDeltaToTimeDelta("1979-12-01T00:00:00.000", "P10M29DT23H"); - /* assertTimeDeltaToJulianDeltaToTimeDelta("1979-01-01T01:00:00.000", "P11M30DT23H"); */ - /* assertTimeDeltaToJulianDeltaToTimeDelta("1980-01-01T00:00:00.000", "P11M30DT23H"); */ + assertTimeDeltaToJulianDeltaToTimeDelta("1979-01-01T01:00:00.000", "P11M30DT23H"); + assertTimeDeltaToJulianDeltaToTimeDelta("1980-01-01T00:00:00.000", "P11M30DT23H"); - /* assertTimeDeltaToJulianDeltaToTimeDelta("2017-07-01T00:00:00.000", "P30D"); */ - /* assertTimeDeltaToJulianDeltaToTimeDelta("2017-07-31T00:00:00.000", "P30D"); */ - /* assertTimeDeltaToJulianDeltaToTimeDelta("2017-07-01T00:00:00.000", "P1M"); */ - /* assertTimeDeltaToJulianDeltaToTimeDelta("2017-08-01T00:00:00.000", "P1M"); */ + assertTimeDeltaToJulianDeltaToTimeDelta("2017-07-01T00:00:00.000", "P30D"); + assertTimeDeltaToJulianDeltaToTimeDelta("2017-07-31T00:00:00.000", "P30D"); + assertTimeDeltaToJulianDeltaToTimeDelta("2017-07-01T00:00:00.000", "P1M"); + assertTimeDeltaToJulianDeltaToTimeDelta("2017-08-01T00:00:00.000", "P1M"); - /* assertTimeDeltaToJulianDeltaToTimeDelta("1980-01-01T00:10:00.000", "P11M30DT23H50M"); */ - /* assertTimeDeltaToJulianDeltaToTimeDelta("1981-01-01T00:00:00.000", "P11M30DT23H50M"); */ + assertTimeDeltaToJulianDeltaToTimeDelta("1980-01-01T00:10:00.000", "P11M30DT23H50M"); + assertTimeDeltaToJulianDeltaToTimeDelta("1981-01-01T00:00:00.000", "P11M30DT23H50M"); } END_TEST @@ -786,25 +781,25 @@ void add_mtime_timedelta_test_to_suite(Suite* suite) tcase_add_test(tcase_ProlepticGregorian, test_getTimeDeltaFromDateTime); tcase_add_test(tcase_ProlepticGregorian, test_timeDeltaToJulianDeltaToTimeDelta); - /* TCase *tcase_YearOf365Days = tcase_create("mtime_time_test_YearOf365Days"); */ - /* suite_add_tcase(suite, tcase_YearOf365Days); */ - /* tcase_add_checked_fixture(tcase_YearOf365Days, setup_YearOf365Days, teardown); */ - /* tcase_add_test(tcase_YearOf365Days, test_timeDeltaToJulianDelta_YearOf365Days); */ - - /* TCase *tcase_YearOf360Days = tcase_create("mtime_time_test_YearOf360Days"); */ - /* suite_add_tcase(suite, tcase_YearOf360Days); */ - /* tcase_add_checked_fixture(tcase_YearOf360Days, setup_YearOf360Days, teardown); */ - /* tcase_add_test(tcase_YearOf360Days, test_timeDeltaToJulianDelta_YearOf360Days); */ - - /* TCase *tcase_timedeltaCompute = tcase_create("mtime_timedelta_computations"); */ - /* tcase_add_checked_fixture(tcase_timedeltaCompute, setup_ProlepticGregorian, teardown); */ - /* suite_add_tcase(suite,tcase_timedeltaCompute); */ - /* tcase_add_test(tcase_timedeltaCompute,test_timeDeltaAddLeadingZero); */ - /* tcase_add_test(tcase_timedeltaCompute,test_mtime_add_months); */ - /* tcase_add_test(tcase_timedeltaCompute,test_mtime_add_months_atEnd); */ - /* tcase_add_test(tcase_timedeltaCompute,test_add_negative_delta); */ - /* tcase_add_test(tcase_timedeltaCompute,test_event_at_end_of_month); */ - /* tcase_add_test(tcase_timedeltaCompute,test_timeDeltaMilliseconds); */ + TCase *tcase_YearOf365Days = tcase_create("mtime_time_test_YearOf365Days"); + suite_add_tcase(suite, tcase_YearOf365Days); + tcase_add_checked_fixture(tcase_YearOf365Days, setup_YearOf365Days, teardown); + tcase_add_test(tcase_YearOf365Days, test_timeDeltaToJulianDelta_YearOf365Days); + + TCase *tcase_YearOf360Days = tcase_create("mtime_time_test_YearOf360Days"); + suite_add_tcase(suite, tcase_YearOf360Days); + tcase_add_checked_fixture(tcase_YearOf360Days, setup_YearOf360Days, teardown); + tcase_add_test(tcase_YearOf360Days, test_timeDeltaToJulianDelta_YearOf360Days); + + TCase *tcase_timedeltaCompute = tcase_create("mtime_timedelta_computations"); + tcase_add_checked_fixture(tcase_timedeltaCompute, setup_ProlepticGregorian, teardown); + suite_add_tcase(suite,tcase_timedeltaCompute); + tcase_add_test(tcase_timedeltaCompute,test_timeDeltaAddLeadingZero); + tcase_add_test(tcase_timedeltaCompute,test_mtime_add_months); + tcase_add_test(tcase_timedeltaCompute,test_mtime_add_months_atEnd); + tcase_add_test(tcase_timedeltaCompute,test_add_negative_delta); + tcase_add_test(tcase_timedeltaCompute,test_event_at_end_of_month); + tcase_add_test(tcase_timedeltaCompute,test_timeDeltaMilliseconds); } /*** SPECIAL ASSERT FUNCTIONS ***/ @@ -950,13 +945,9 @@ void assertTimeDeltaToJulianDeltaToTimeDelta (const char* base_dt_string, const { void* err; - fprintf(stderr, "TDT test A: %s\n", base_dt_string); - struct _datetime* base_dt = newDateTime(base_dt_string); ck_assert(base_dt != NULL); - fprintf(stderr, "TDT test B: %s\n", td_string); - struct _timedelta* td = newTimeDelta(td_string); ck_assert(td != NULL); @@ -964,19 +955,13 @@ void assertTimeDeltaToJulianDeltaToTimeDelta (const char* base_dt_string, const err = timeDeltaToJulianDelta(td, base_dt, &jd); ck_assert(err != NULL); - fprintf(stderr, "TDT test C: %ld %ld\n", jd.day, jd.ms); - struct _timedelta res_td; err = julianDeltaToTimeDelta(&jd, base_dt, &res_td); ck_assert(err != NULL); - fprintf(stderr, "TDT test D: %d %d %d\n", res_td.month, res_td.day, res_td.hour); - char str[MAX_TIMEDELTA_STR_LEN]; timedeltaToString(&res_td, str); - fprintf(stderr, "TDT test E: %s\n", str); - ck_assert_msg(compareTimeDelta(td, &res_td) == equal_to, "base datetime %s original %s != %s returned", base_dt_string, td_string, str);