;;;; time.test --- test suite for Guile's time functions -*- scheme -*- ;;;; Jim Blandy --- June 1999, 2004 ;;;; ;;;; Copyright (C) 1999, 2004 Free Software Foundation, Inc. ;;;; ;;;; This program is free software; you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by ;;;; the Free Software Foundation; either version 2, or (at your option) ;;;; any later version. ;;;; ;;;; This program is distributed in the hope that it will be useful, ;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;;; GNU General Public License for more details. ;;;; ;;;; You should have received a copy of the GNU General Public License ;;;; along with this software; see the file COPYING. If not, write to ;;;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ;;;; Boston, MA 02110-1301 USA (define-module (test-suite test-time) #:use-module (test-suite lib) #:use-module (ice-9 threads)) ;;; ;;; gmtime ;;; (with-test-prefix "gmtime" (for-each (lambda (t) (pass-if (list "in another thread after error" t) (or (provided? 'threads) (throw 'unsupported)) ;; actually this test is perfectly good, but the "internal ;; define - missing body expression" in syntax.test somehow ;; ends up leaving SCM_DEFER_INTS, making the test here hang ;; (throw 'unresolved) (alarm 5) (false-if-exception (gmtime t)) (thread-join (begin-thread (catch 'out-of-range (lambda () (gmtime t)) (lambda args #f)))) (alarm 0) #t)) ;; time values that might provoke an error from libc ;; on 32-bit glibc all values (which fit) are fine ;; on 64-bit glibc apparently 2^63 can overflow a 32-bit tm_year (list (1- (ash 1 31)) (1- (ash 1 63)) -1 (- (ash 1 31)) (- (ash 1 63))))) ;;; ;;; internal-time-units-per-second ;;; (with-test-prefix "internal-time-units-per-second" ;; Check that sleep 1 gives about internal-time-units-per-second worth of ;; elapsed time from times:clock. This mainly ensures ;; internal-time-units-per-second correctly indicates CLK_TCK units. ;; (pass-if "versus times and sleep" (or (defined? 'times) (throw 'unsupported)) (let ((old (times))) (sleep 1) (let* ((new (times)) (elapsed (- (tms:clock new) (tms:clock old)))) (<= (* 0.5 internal-time-units-per-second) elapsed (* 2 internal-time-units-per-second)))))) ;;; ;;; strftime ;;; ;; Note we must force isdst to get the ZOW zone name out of %Z on HP-UX. ;; If localtime is in daylight savings then it will decide there's no ;; daylight savings zone name for the fake ZOW, and come back empty. ;; ;; This test is disabled because on NetBSD %Z doesn't look at the tm_zone ;; field in struct tm passed by guile. That behaviour is reasonable enough ;; since that field is not in C99 so a C99 program won't know it has to be ;; set. For the details on that see ;; ;; http://www.netbsd.org/cgi-bin/query-pr-single.pl?number=21722 ;; ;; Not sure what to do about this in guile, it'd be nice for %Z to look at ;; tm:zone everywhere. ;; ;; ;; (pass-if "strftime %Z doesn't return garbage" ;; (let ((t (localtime (current-time)))) ;; (set-tm:zone t "ZOW") ;; (set-tm:isdst t 0) ;; (string=? (strftime "%Z" t) ;; "ZOW"))) ;;; ;;; strptime ;;; (with-test-prefix "strptime" (pass-if "in another thread after error" (or (defined? 'strptime) (throw 'unsupported)) (or (provided? 'threads) (throw 'unsupported)) ;; actually this test is perfectly good, but the "internal define - ;; missing body expression" in syntax.test somehow ends up leaving ;; SCM_DEFER_INTS, making the test here hang ;; (throw 'unresolved) (alarm 5) (false-if-exception (strptime "%a" "nosuchday")) (thread-join (begin-thread (strptime "%d" "1"))) (alarm 0) #t))