From 5f098c89c378c221a9b16dbfe0549ab8b7650f27 Mon Sep 17 00:00:00 2001
From: jD91mZM2 <me@krake.one>
Date: Fri, 13 Jul 2018 10:16:42 +0200
Subject: [PATCH] Add more tests for mktime and localtime

---
 src/time/src/lib.rs | 10 ++++------
 tests/mktime.c      | 34 ++++++++++++++++++++++++++++++----
 2 files changed, 34 insertions(+), 10 deletions(-)

diff --git a/src/time/src/lib.rs b/src/time/src/lib.rs
index 878df02c..a7a4118e 100644
--- a/src/time/src/lib.rs
+++ b/src/time/src/lib.rs
@@ -291,6 +291,8 @@ pub unsafe extern "C" fn mktime(t: *mut tm) -> time_t {
     let mut month = (*t).tm_mon;
     let mut day = (*t).tm_mday as i64 - 1;
 
+    let leap = if leap_year(year) { 1 } else { 0 };
+
     if year < 1970 {
         day = MONTH_DAYS[if leap_year(year) { 1 } else { 0 }][(*t).tm_mon as usize] as i64 - day;
 
@@ -299,8 +301,6 @@ pub unsafe extern "C" fn mktime(t: *mut tm) -> time_t {
             day += if leap_year(year) { 366 } else { 365 };
         }
 
-        let leap = if leap_year(year) { 1 } else { 0 };
-
         while month < 11 {
             month += 1;
             day += MONTH_DAYS[leap][month as usize] as i64;
@@ -312,15 +312,13 @@ pub unsafe extern "C" fn mktime(t: *mut tm) -> time_t {
                 + (*t).tm_sec as i64))
     } else {
         while year > 1970 {
-            day += if leap_year(year) { 366 } else { 365 };
             year -= 1;
+            day += if leap_year(year) { 366 } else { 365 };
         }
 
-        let leap = if leap_year(year) { 1 } else { 0 };
-
         while month > 0 {
-            day += MONTH_DAYS[leap][month as usize] as i64;
             month -= 1;
+            day += MONTH_DAYS[leap][month as usize] as i64;
         }
 
         (day * (60 * 60 * 24)
diff --git a/tests/mktime.c b/tests/mktime.c
index 17eb30b1..9b9d9406 100644
--- a/tests/mktime.c
+++ b/tests/mktime.c
@@ -1,6 +1,23 @@
+#include <assert.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <time.h>
 
+int check(time_t input) {
+    struct tm* t = localtime(&input);
+
+    printf("%ld = %ld\n", input, mktime(t));
+
+    if (input != mktime(t)) {
+        printf(
+            "Year %d, Day of year: %d, Month %d, Day of month: %d, Day of week: %d, %d:%d:%d\n",
+            t->tm_year, t->tm_yday, t->tm_mon, t->tm_mday, t->tm_wday, t->tm_hour, t->tm_min, t->tm_sec
+        );
+        puts("Failed!");
+        return -1;
+    }
+    return 0;
+}
 int main() {
     struct tm t = {};
 
@@ -12,11 +29,20 @@ int main() {
     int day = 60 * 60 * 24;
     time_t inputs[] = { -(day * 33), -day, -500, 0, 1531454950 };
     for (int i = 0; i < 5; i += 1) {
-        struct tm* t2 = localtime(&inputs[i]);
+        if (check(inputs[i])) {
+            return -1;
+        }
+    }
+
+    srand(time(NULL));
 
-        printf("%ld = %ld\n", inputs[i], mktime(t2));
-        if (inputs[i] != mktime(t2)) {
-            puts("Failed!");
+    for (int i = 0; i < 10; i += 1) {
+        time_t input = (time_t) rand();
+        struct tm* time = localtime(&input);
+        time_t output = mktime(time);
+        if (input != output) {
+            // asctime has newline
+            printf("Comparison %ld == %ld failed. Time: %s", input, output, asctime(time));
         }
     }
 }
-- 
GitLab