浏览代码

* Arrange year interpretation in order of likeliness
* Add unit tests

asund 7 年之前
父节点
当前提交
80af9b4838
共有 2 个文件被更改,包括 42 次插入5 次删除
  1. 6 4
      minmea.c
  2. 36 1
      tests.c

+ 6 - 4
minmea.c

@@ -619,10 +619,12 @@ int minmea_gettime(struct timespec *ts, const struct minmea_date *date, const st
 
     struct tm tm;
     memset(&tm, 0, sizeof(tm));
-    tm.tm_year = date->year % 100;  // ZDA parser stores 4 digit year, filter centuries here so raw information is preserved in struct minmea_sentence_zda if user needs it.
-    if (tm.tm_year < 80)    // GPS epoch begins 1980, assume a year range of 1980 to 2079 for the library.
-    {
-        tm.tm_year = 2000 + tm.tm_year - 1900;
+    if (date->year < 80) {
+        tm.tm_year = 2000 + date->year - 1900;  // 2000-2079
+    } else if (date->year >= 1900) {
+        tm.tm_year = date->year - 1900; // 4 digit year, use directly
+    } else {
+        tm.tm_year = date->year;    // 1980-1999
     }
     tm.tm_mon = date->month - 1;
     tm.tm_mday = date->day;

+ 36 - 1
tests.c

@@ -953,10 +953,45 @@ START_TEST(test_minmea_gettime)
 
     d.year = -1;
     ck_assert(minmea_gettime(&ts, &d, &t) != 0);
-    d.year = 2014;
+    d.year = 14;
 
     t.hours = -1;
     ck_assert(minmea_gettime(&ts, &d, &t) != 0);
+    t.hours = 13;
+
+    /* two digit year conversions */
+    d.year = 80;
+    ck_assert(minmea_gettime(&ts, &d, &t) == 0);
+    ck_assert_int_eq(ts.tv_sec, 319381209);		/* 1980 */
+    d.year = 37;
+    ck_assert(minmea_gettime(&ts, &d, &t) == 0);
+    ck_assert_int_eq(ts.tv_sec, 2118229209);	/* 2037 */
+    /* skip >= 2038 tests on 32-bit time_t platforms */
+	if (sizeof(time_t) == sizeof(int64_t)) {
+    	d.year = 79;
+    	ck_assert(minmea_gettime(&ts, &d, &t) == 0);
+    	ck_assert_int_eq(ts.tv_sec, 3443605209);	/* 2079 */
+    }
+
+    /* four digit year conversions */
+    d.year = 1979;
+    ck_assert(minmea_gettime(&ts, &d, &t) == 0);
+    ck_assert_int_eq(ts.tv_sec, 287845209);
+    d.year = 1980;
+    ck_assert(minmea_gettime(&ts, &d, &t) == 0);
+    ck_assert_int_eq(ts.tv_sec, 319381209);
+    d.year = 2037;
+    ck_assert(minmea_gettime(&ts, &d, &t) == 0);
+    ck_assert_int_eq(ts.tv_sec, 2118229209);
+    /* skip >= 2038 tests on 32-bit time_t platforms */
+	if (sizeof(time_t) == sizeof(int64_t)) {
+    	d.year = 2079;
+    	ck_assert(minmea_gettime(&ts, &d, &t) == 0);
+    	ck_assert_int_eq(ts.tv_sec, 3443605209);
+    	d.year = 2080;
+    	ck_assert(minmea_gettime(&ts, &d, &t) == 0);
+    	ck_assert_int_eq(ts.tv_sec, 3475141209);
+	}
 }
 END_TEST