/* Test program for mktime(). Crude in that it assumes TZ=EST, but it is purposely avoided being set to stop from messing up PC environments. (Time was not spent to see if this was a real problem or not.) */ #include #include #include void pr_tm(struct tm *set, struct tm *work); int //test_mktime(void) main(void) { const char *name=__func__; const char *exp; char buf[80]; /* Include time zone in printout */ const char *fmt="%a %b %e %H:%M:%S %Z %Y"; const char pass[]="\t(PASS)", fail[]="\t(FAIL)"; int err=0, p=0, f=0; struct tm tm_set, tm_work, *tm_p; time_t t; /* Set up values in tm_set */ tm_set.tm_mon = 3-1; /* 3 for March */ tm_set.tm_mday = 1; /* 1 won't be DST */ tm_set.tm_hour = 12; tm_set.tm_min = 34; tm_set.tm_sec = 0; tm_set.tm_year = 2008-1900; tm_set.tm_wday = -2; /* mktime() ignores */ tm_set.tm_yday = -3; /* mktime() ignores */ /* Copy base set to working, run first test */ tm_set.tm_isdst = -1; /* -1=have mktime() decide DST|ST */ exp = "Sat Mar 1 12:34:00 EST 2008"; tm_work = tm_set; t = mktime(&tm_work); if(t == (time_t)-1) { puts("mktime() failed on given data\007"); err++; } else { tm_p = localtime(&t); strftime(buf, sizeof(buf), fmt, tm_p); printf("For set => mktime(), "); puts("tm_isdst <0=mktime() figure out if is DST:"); pr_tm(&tm_set, &tm_work); printf("strftime(localtime()) gives: "); fputs(buf, stdout); if(strcmp(buf, exp)) { f++; puts(fail); } else { p++; puts(pass); } } /* Copy base set to working, run next test */ tm_set.tm_isdst = 0; /* 0=specify not DST */ // exp is same, as working date is not DST tm_work = tm_set; t = mktime(&tm_work); if(t == (time_t)-1) { puts("mktime() failed on given data\007"); err++; } else { tm_p = localtime(&t); strftime(buf, sizeof(buf), fmt, tm_p); printf("For set => mktime(), "); puts("tm_isdst 0=specify not DST:"); pr_tm(&tm_set, &tm_work); printf("strftime(localtime()) gives: "); fputs(buf, stdout); if(strcmp(buf, exp)) { f++; puts(fail); } else { p++; puts(pass); } } /* Copy base set to working, run next test */ tm_set.tm_isdst = 2; /* 1=specify is DST */ // Expect adjustment, since working date is not DST exp = "Sat Mar 1 11:34:00 EST 2008"; tm_work = tm_set; t = mktime(&tm_work); if(t == (time_t)-1) { puts("mktime() failed on given data\007"); err++; } else { tm_p = localtime(&t); strftime(buf, sizeof(buf), fmt, tm_p); printf("For set => mktime(), "); puts("tm_isdst 2=specify is DST:"); pr_tm(&tm_set, &tm_work); printf("strftime(localtime()) gives: "); fputs(buf, stdout); if(strcmp(buf, exp)) { f++; puts(fail); } else { p++; puts(pass); } } /*** HOW COME THIS WORKS OK ON CYGWIN, WHICH APPEARS TO USE 1.14.0? ***/ /******************************************************************************/ /* Repeat same basic calls, except use date that is DST */ tm_set.tm_mon = 5-1; /* 5 for May */ exp = "Thu May 1 12:34:00 EDT 2008"; /* Copy base set to working, run first test */ tm_set.tm_isdst = -1; /* -1=have mktime() decide DST|ST */ tm_work = tm_set; t = mktime(&tm_work); if(t == (time_t)-1) { puts("mktime() failed on given data\007"); err++; } else { tm_p = localtime(&t); strftime(buf, sizeof(buf), fmt, tm_p); printf("For set => mktime(), "); puts("tm_isdst <0=mktime() figure out if is DST:"); pr_tm(&tm_set, &tm_work); printf("strftime(localtime()) gives: "); fputs(buf, stdout); if(strcmp(buf, exp)) { f++; puts(fail); } else { p++; puts(pass); } } /* Copy base set to working, run next test */ tm_set.tm_isdst = 0; /* 0=specify not DST */ // Expect adjustment, since working date is DST exp = "Thu May 1 13:34:00 EDT 2008"; tm_work = tm_set; t = mktime(&tm_work); if(t == (time_t)-1) { puts("mktime() failed on given data\007"); err++; } else { tm_p = localtime(&t); strftime(buf, sizeof(buf), fmt, tm_p); printf("For set => mktime(), "); puts("tm_isdst 0=specify not DST:"); pr_tm(&tm_set, &tm_work); printf("strftime(localtime()) gives: "); fputs(buf, stdout); if(strcmp(buf, exp)) { f++; puts(fail); } else { p++; puts(pass); } } /* Copy base set to working, run next test */ tm_set.tm_isdst = 4; /* 1=specify is DST */ // exp is unaltered, as working date is DST exp = "Thu May 1 12:34:00 EDT 2008"; tm_work = tm_set; t = mktime(&tm_work); if(t == (time_t)-1) { puts("mktime() failed on given data\007"); err++; } else { tm_p = localtime(&t); strftime(buf, sizeof(buf), fmt, tm_p); printf("For set => mktime(), "); puts("tm_isdst 4=specify is DST:"); pr_tm(&tm_set, &tm_work); printf("strftime(localtime()) gives: "); fputs(buf, stdout); if(strcmp(buf, exp)) { f++; puts(fail); } else { p++; puts(pass); } } printf("\nPassed %d cases, failed %d cases.\n", p, f); printf("mktime() indicated failure %d times\n", err); return(f || err); } #define PR(mem) printf(#mem": \t%d => %d\n", set->mem, work->mem) #define PRx(mem) printf("("#mem": \t%d => %d)\n", set->mem, work->mem) void pr_tm(struct tm *set, struct tm *work) { PR(tm_mon); PR(tm_mday); PR(tm_hour); PR(tm_min); PR(tm_sec); PR(tm_year); PR(tm_isdst); PRx(tm_wday); PRx(tm_yday); }