From ce3d5c59f90151f0db5cca17568816c6f6866efe Mon Sep 17 00:00:00 2001
From: Jan Frederik Engels <engels+git@dkrz.de>
Date: Wed, 9 May 2018 14:14:03 +0200
Subject: [PATCH] Added more testing for timedelta functionality

* Some tests do fail (reflecting problems with events for restarts in
  ICON, affecting the atm_amip experiment).
---
 test/mtime_timedelta_test.c | 63 ++++++++++++++++++++++++++++++++-----
 test/mtime_timedelta_test.h |  1 +
 2 files changed, 56 insertions(+), 8 deletions(-)

diff --git a/test/mtime_timedelta_test.c b/test/mtime_timedelta_test.c
index c7cb12be..5532c6a6 100644
--- a/test/mtime_timedelta_test.c
+++ b/test/mtime_timedelta_test.c
@@ -692,14 +692,32 @@ END_TEST
 
 START_TEST(test_getTimeDeltaFromDateTime)
 {
-	// These test are taken from ac66aeaef2dde828aa31b63f88076070a8282b49
+	// These tests are taken from ac66aeaef2dde828aa31b63f88076070a8282b49
 	assertGetTimeDeltaFromDateTime("1979-03-01T00:00:00.000", "1979-01-01T01:00:00.000", "P01M27DT23H");
 	assertGetTimeDeltaFromDateTime("1979-07-01T00:00:00.000", "1979-01-01T01:00:00.000", "P05M29DT23H");
 	assertGetTimeDeltaFromDateTime("1979-12-01T00:00:00.000", "1979-01-01T01:00:00.000", "P10M29DT23H");
 	assertGetTimeDeltaFromDateTime("1980-01-01T00:00:00.000", "1979-01-01T01:00:00.000", "P11M30DT23H");
+
+	// These tests are taken from 5bcba6591c38fbb9f7a3a5f63c86963d8a066595
+	assertGetTimeDeltaFromDateTime("2017-07-31T00:00:00.000", "2017-07-01T00:00:00.000", "P30D");
+	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.
+	assertGetTimeDeltaFromDateTime("1981-01-01T00:00:00.000", "1980-01-01T00:10:00.000", "P11M30DT23H50M");
+}
+END_TEST
+
+START_TEST(test_timeDeltaToJulianDeltaToTimeDelta)
+{
+	assertTimeDeltaToJulianDeltaToTimeDelta("1979-01-01T01:00:00.000", "P01M27DT23H");
+
+
+	assertTimeDeltaToJulianDeltaToTimeDelta("1980-01-01T00:10:00.000", "P11M30DT23H50M");
+	assertTimeDeltaToJulianDeltaToTimeDelta("1981-01-01T00:00:00.000", "P11M30DT23H50M");
 }
 END_TEST
 
+
 static void setup_ProlepticGregorian(void)
 {
 	initCalendar(PROLEPTIC_GREGORIAN);
@@ -734,6 +752,7 @@ void add_mtime_timedelta_test_to_suite(Suite* suite)
 	tcase_add_test(tcase_ProlepticGregorian, test_timeDeltaToJulianDelta_ProlepticGregorian_3);
 	tcase_add_test(tcase_ProlepticGregorian, test_timeDeltaToJulianDelta_highDeltas);
 	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);
@@ -869,12 +888,6 @@ void assertTimeDeltaToJulianDeltaWithoutExpectations(const char* timedelta_strin
 	deallocateJulianDelta(juliandelta);
 }
 
-// FIXME: Fill with content
-void assertJulianDeltaToTimeDelta ()
-{
-	
-}
-
 
 // It seems we need this tested too.
 void assertGetTimeDeltaFromDateTime (const char* dt1_string, const char* dt2_string, const char* expected_td_string)
@@ -892,10 +905,44 @@ void assertGetTimeDeltaFromDateTime (const char* dt1_string, const char* dt2_str
 	struct _timedelta* expected_td = newTimeDelta(expected_td_string);
 	ck_assert(expected_td != NULL);
 
-	ck_assert(compareTimeDelta(&td, expected_td) == equal_to);
+	char str[MAX_TIMEDELTA_STR_LEN];
+	timedeltaToString(&td, str);
+	ck_assert_msg(compareTimeDelta(&td, expected_td) == equal_to, "expected %s != %s returned", expected_td_string, str);
 
 	deallocateDateTime(dt1);
 	deallocateDateTime(dt2);
 	deallocateTimeDelta(expected_td);
 }
 
+void assertTimeDeltaToJulianDeltaToTimeDelta (const char* base_dt_string, const char* td_string)
+{
+	void* err;
+
+	struct _datetime* base_dt = newDateTime(base_dt_string);
+	ck_assert(base_dt != NULL);
+
+	struct _timedelta* td = newTimeDelta(td_string);
+	ck_assert(td != NULL);
+
+	struct _juliandelta jd;
+	err = timeDeltaToJulianDelta(td, base_dt, &jd);
+	ck_assert(err != NULL);
+
+	struct _timedelta res_td;
+	err = julianDeltaToTimeDelta(&jd, base_dt, &res_td);
+	ck_assert(err != NULL);
+
+	char str[MAX_TIMEDELTA_STR_LEN];
+	timedeltaToString(&res_td, str);
+	ck_assert_msg(compareTimeDelta(td, &res_td) == equal_to, "base datetime %s\n original %s != %s returned",
+			base_dt_string, td_string, str);
+
+	//FIXME: Deallocate.
+}
+
+// FIXME: Fill with content
+void assertJulianDeltaToTimeDelta ()
+{
+	
+}
+
diff --git a/test/mtime_timedelta_test.h b/test/mtime_timedelta_test.h
index 03b11bbc..999e9da3 100644
--- a/test/mtime_timedelta_test.h
+++ b/test/mtime_timedelta_test.h
@@ -14,4 +14,5 @@ void assertTimeDeltaToJulianDelta(const char* timedelta_string, const char* base
 void assertTimeDeltaToJulianDeltaWithoutExpectations(const char* timedelta_string, const char* base_datetime_string, char expected_jd_sign);
 
 void assertGetTimeDeltaFromDateTime (const char* dt1_string, const char* dt2_string, const char* expected_td_string);
+void assertTimeDeltaToJulianDeltaToTimeDelta (const char* base_dt_string, const char* td_string);
 #endif
-- 
GitLab