lib/tests/date-utils-test.rkt
#lang racket

(require rackunit/text-ui racket/date)

(require rackunit "../date-utils.rkt")

(define test-date-utils
  (test-suite 
   "test-date-utils"

   (test-case 
    "test-add-day"

    (define result-date1 (add-day (seconds->date (find-seconds 0 0 10 29 2 2012)) 1))
    (check-equal? (date-day result-date1) 1)
    (check-equal? (date-month result-date1) 3)
    (check-equal? (date-year result-date1) 2012)
      
    (define result-date2 (add-day (seconds->date (find-seconds 0 0 10 1 3 2012)) -1))
    (check-equal? (date-day result-date2) 29)
    (check-equal? (date-month result-date2) 2)
    (check-equal? (date-year result-date2) 2012)

    (define result-date3 (add-day (seconds->date (find-seconds 0 0 10 1 1 2012)) -1))
    (check-equal? (date-day result-date3) 31)
    (check-equal? (date-month result-date3) 12)
    (check-equal? (date-year result-date3) 2011)

    (define result-date4 (add-day (seconds->date (find-seconds 0 0 10 31 12 2011)) 1))
    (check-equal? (date-day result-date4) 1)
    (check-equal? (date-month result-date4) 1)
    (check-equal? (date-year result-date4) 2012)

    (define result-date5 (add-day (seconds->date (find-seconds 0 0 10 27 2 2012)) 3))
    (check-equal? (date-day result-date5) 1)
    (check-equal? (date-month result-date5) 3)
    (check-equal? (date-year result-date5) 2012)
      
    (define result-date6 (add-day (seconds->date (find-seconds 0 0 10 2 3 2012)) -2))
    (check-equal? (date-day result-date6) 29)
    (check-equal? (date-month result-date6) 2)
    (check-equal? (date-year result-date6) 2012))

   (test-case
    "test-add1-month & sub1-month"

    (define result-date1 (add1-month (seconds->date (find-seconds 0 0 10 1 2 2012))))
    (check-equal? (date-day result-date1) 1)
    (check-equal? (date-month result-date1) 3)
    (check-equal? (date-year result-date1) 2012)

    (define result-date2 (sub1-month (seconds->date (find-seconds 0 0 10 1 2 2012))))
    (check-equal? (date-day result-date2) 1)
    (check-equal? (date-month result-date2) 1)
    (check-equal? (date-year result-date2) 2012)

    (define result-date3 (sub1-month (seconds->date (find-seconds 0 0 10 1 1 2012))))
    (check-equal? (date-day result-date3) 1)
    (check-equal? (date-month result-date3) 12)
    (check-equal? (date-year result-date3) 2011)

    (define result-date4 (sub1-month (seconds->date (find-seconds 0 0 10 1 1 2012))))
    (check-equal? (date-day result-date4) 1)
    (check-equal? (date-month result-date4) 12)
    (check-equal? (date-year result-date4) 2011)

    (define result-date5 (sub1-month (seconds->date (find-seconds 0 0 10 31 3 2012))))
    (check-equal? (date-day result-date5) 29)
    (check-equal? (date-month result-date5) 2)
    (check-equal? (date-year result-date5) 2012)

    (define result-date6 (sub1-month (seconds->date (find-seconds 0 0 10 31 3 2012)) #:align 'up))
    (check-equal? (date-day result-date6) 1)
    (check-equal? (date-month result-date6) 3)
    (check-equal? (date-year result-date6) 2012))


   (test-case
    "test-add-year"

    (define result-date1 (add-year (seconds->date (find-seconds 0 0 10 1 2 2012)) 1))
    (check-equal? (date-day result-date1) 1)
    (check-equal? (date-month result-date1) 2)
    (check-equal? (date-year result-date1) 2013)

    (define result-date2 (add-year (seconds->date (find-seconds 0 0 10 29 2 2012)) 1))
    (check-equal? (date-day result-date2) 28)
    (check-equal? (date-month result-date2) 2)
    (check-equal? (date-year result-date2) 2013)

    (define result-date3 (add-year (seconds->date (find-seconds 0 0 10 29 2 2012)) 1 #:align 'up))
    (check-equal? (date-day result-date3) 1)
    (check-equal? (date-month result-date3) 3)
    (check-equal? (date-year result-date3) 2013)

    (define result-date4 (add-year (seconds->date (find-seconds 0 0 10 29 2 2012)) 10 #:align 'up))
    (check-equal? (date-day result-date4) 1)
    (check-equal? (date-month result-date4) 3)
    (check-equal? (date-year result-date4) 2022))

   ))

(run-tests test-date-utils)