From b8da2a9508c655be838b8517150e5612f142870d Mon Sep 17 00:00:00 2001
From: Jan Frederik Engels <engels+git@dkrz.de>
Date: Tue, 8 May 2018 17:55:03 +0200
Subject: [PATCH] Expand testing of mtime_timedelta routines

As a first step, generate tests from the example code in
ac66aeaef2dde828aa31b63f88076070a8282b49 .
---
 test/mtime_timedelta_test.c | 43 +++++++++++++++++++++++++++++++++++++
 test/mtime_timedelta_test.h |  1 +
 2 files changed, 44 insertions(+)

diff --git a/test/mtime_timedelta_test.c b/test/mtime_timedelta_test.c
index 96124821..c7cb12be 100644
--- a/test/mtime_timedelta_test.c
+++ b/test/mtime_timedelta_test.c
@@ -689,6 +689,17 @@ START_TEST(test_event_at_end_of_month)
     } while (compareDatetime(model_time, stop_date) <= 0);
 }
 END_TEST
+
+START_TEST(test_getTimeDeltaFromDateTime)
+{
+	// These test 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");
+}
+END_TEST
+
 static void setup_ProlepticGregorian(void)
 {
 	initCalendar(PROLEPTIC_GREGORIAN);
@@ -722,6 +733,7 @@ void add_mtime_timedelta_test_to_suite(Suite* suite)
 	tcase_add_test(tcase_ProlepticGregorian, test_timeDeltaToJulianDelta_ProlepticGregorian_2);
 	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 *tcase_YearOf365Days = tcase_create("mtime_time_test_YearOf365Days");
 	suite_add_tcase(suite, tcase_YearOf365Days);
@@ -856,3 +868,34 @@ void assertTimeDeltaToJulianDeltaWithoutExpectations(const char* timedelta_strin
 	deallocateDateTime(datetime);
 	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)
+{
+	struct _datetime* dt1 = newDateTime(dt1_string);
+	ck_assert(dt1 != NULL);
+
+	struct _datetime* dt2 = newDateTime(dt2_string);
+	ck_assert(dt2 != NULL);
+
+	struct _timedelta td;
+        void* err = getTimeDeltaFromDateTime(dt1, dt2, &td);
+	ck_assert(err != NULL);
+
+	struct _timedelta* expected_td = newTimeDelta(expected_td_string);
+	ck_assert(expected_td != NULL);
+
+	ck_assert(compareTimeDelta(&td, expected_td) == equal_to);
+
+	deallocateDateTime(dt1);
+	deallocateDateTime(dt2);
+	deallocateTimeDelta(expected_td);
+}
+
diff --git a/test/mtime_timedelta_test.h b/test/mtime_timedelta_test.h
index 0e63fca2..03b11bbc 100644
--- a/test/mtime_timedelta_test.h
+++ b/test/mtime_timedelta_test.h
@@ -13,4 +13,5 @@ void assertInvalidTimeDelta(const char* input_string);
 void assertTimeDeltaToJulianDelta(const char* timedelta_string, const char* base_datetime_string, char expected_jd_sign, int64_t expected_jd_day, int64_t expected_jd_ms);
 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);
 #endif
-- 
GitLab