packages feed

options-time-1.0: tests/Tests.hs

{-# LANGUAGE TemplateHaskell #-}

module Main (main) where

import qualified Data.Time as T
import           Options
import           Options.Time
import           Test.Chell

test_Duration :: Test
test_Duration = assertions "duration" $ do
	let parse = optionTypeParse optionType_duration
	let format = optionTypeShow optionType_duration
	$expect $ equal
		(parse "10h9m8s7ms6us5ns4ps")
		(Right (sum
			[ 10*60*60
			, 9*60
			, 8
			, 7*0.001
			, 6*0.000001
			, 5*0.000000001
			, 4*0.000000000001
			]))
	$expect $ equal (parse "1h9s") (Right 3609)
	$expect $ equal (parse "1h9ms") (Right 3600.009)
	$expect $ equal (parse "0") (Right 0)
	$expect $ equal (parse "-1h9s") (Right (-3609))
	$expect $ equal (parse "1s2us3ns") (parse "1s2\181s3ns")
	$expect $ equal
		(parse "bogus")
		(Left "\"bogus\" could not be parsed as a duration.")
	$expect $ equal
		(parse "1ps2ps")
		(Left "\"1ps2ps\" could not be parsed as a duration.")
	$expect $ equal
		(format (sum
			[ 10*60*60
			, 9*60
			, 8
			, 7*0.001
			, 6*0.000001
			, 5*0.000000001
			, 4*0.000000000001
			]))
		"10h9m8s7ms6us5ns4ps"
	$expect $ equal (format 0) "0s"
	$expect $ equal (format 3609) "1h9s"
	$expect $ equal (format (-3609)) "-1h9s"

test_Date :: Test
test_Date = assertions "date" $ do
	let parse = optionTypeParse optionType_date
	let format = optionTypeShow optionType_date
	$expect $ equal
		(parse "2011-12-13")
		(Right (T.fromGregorian 2011 12 13))
	$expect $ equal
		(parse "20111213")
		(Right (T.fromGregorian 2011 12 13))
	$expect $ equal
		(parse "2011-347")
		(Right (T.fromGregorian 2011 12 13))
	$expect $ equal
		(parse "bogus")
		(Left "\"bogus\" could not be parsed as a date.")
	$expect $ equal
		(parse "2011-10-32")
		(Left "\"2011-10-32\" could not be parsed as a date.")
	$expect $ equal (format (T.fromGregorian 2011 12 13)) "2011-12-13"

test_Time :: Test
test_Time = assertions "time" $ do
	let parse = optionTypeParse optionType_time
	let format = optionTypeShow optionType_time
	$expect $ equal
		(parse "10:11")
		(Right (T.TimeOfDay 10 11 0))
	$expect $ equal
		(parse "20:21")
		(Right (T.TimeOfDay 20 21 0))
	$expect $ equal
		(parse "20:21:22")
		(Right (T.TimeOfDay 20 21 22))
	$expect $ equal
		(parse "20:21:22.232425")
		(Right (T.TimeOfDay 20 21 22.232425))
	$expect $ equal
		(parse "bogus")
		(Left "\"bogus\" could not be parsed as a time.")
	$expect $ equal
		(parse "25:21:00")
		(Left "\"25:21:00\" could not be parsed as a time.")
	$expect $ equal
		(parse "20:21:60")
		(Right (T.TimeOfDay 20 21 60))
	$expect $ equal
		(parse "20:21:61")
		(Left "\"20:21:61\" could not be parsed as a time.")
	$expect $ equal (format (T.TimeOfDay 20 21 0)) "20:21:00"
	$expect $ equal (format (T.TimeOfDay 20 21 22.232425)) "20:21:22.232425"

test_LocalTime :: Test
test_LocalTime = assertions "local time" $ do
	let parse = optionTypeParse optionType_localTime
	let format = optionTypeShow optionType_localTime
	let lt y mo d h mi s = T.LocalTime (T.fromGregorian y mo d) (T.TimeOfDay h mi s)
	let rlt y mo d h mi s = Right (lt y mo d h mi s)
	$expect $ equal (parse "2011-12-13 14:15") (rlt 2011 12 13 14 15 0)
	$expect $ equal (parse "2011-12-13 14:15:16") (rlt 2011 12 13 14 15 16)
	$expect $ equal (parse "2011-12-13 14:15:16.1718") (rlt 2011 12 13 14 15 16.1718)
	$expect $ equal (parse "2011-347 14:15") (rlt 2011 12 13 14 15 0)
	$expect $ equal (parse "20111213 14:15") (rlt 2011 12 13 14 15 0)
	$expect $ equal (parse "20111213T141516") (rlt 2011 12 13 14 15 16)
	$expect $ equal (parse "20111213T141516.1718") (rlt 2011 12 13 14 15 16.1718)
	$expect $ equal
		(parse "bogus")
		(Left "\"bogus\" could not be parsed as a local time.")
	$expect $ equal (format (lt 2011 12 13 14 15 0)) "2011-12-13 14:15:00"
	$expect $ equal (format (lt 2011 12 13 14 15 16)) "2011-12-13 14:15:16"
	$expect $ equal (format (lt 2011 12 13 14 15 16.1718)) "2011-12-13 14:15:16.1718"

test_UtcTime :: Test
test_UtcTime = assertions "utc time" $ do
	let parse = optionTypeParse optionType_utcTime
	let format = optionTypeShow optionType_utcTime
	let ut y mo d h mi s = T.UTCTime (T.fromGregorian y mo d) (h*60*60 + mi*60 + s)
	let rut y mo d h mi s = Right (ut y mo d h mi s)
	$expect $ equal (parse "2011-12-13 14:15") (rut 2011 12 13 14 15 0)
	$expect $ equal (parse "2011-12-13 14:15:16") (rut 2011 12 13 14 15 16)
	$expect $ equal (parse "2011-12-13 14:15:16.1718") (rut 2011 12 13 14 15 16.1718)
	$expect $ equal (parse "2011-347 14:15") (rut 2011 12 13 14 15 0)
	$expect $ equal (parse "20111213 14:15") (rut 2011 12 13 14 15 0)
	$expect $ equal (parse "20111213T141516") (rut 2011 12 13 14 15 16)
	$expect $ equal (parse "20111213T141516.1718") (rut 2011 12 13 14 15 16.1718)
	$expect $ equal (parse "2011-12-13 23:59:60") (rut 2011 12 13 23 59 60)
	$expect $ equal
		(parse "bogus")
		(Left "\"bogus\" could not be parsed as a UTC time.")
	$expect $ equal
		(parse "2011-12-13 23:59:61")
		(Left "\"2011-12-13 23:59:61\" could not be parsed as a UTC time.")
	$expect $ equal (format (ut 2011 12 13 14 15 0)) "2011-12-13 14:15:00"
	$expect $ equal (format (ut 2011 12 13 14 15 16)) "2011-12-13 14:15:16"
	$expect $ equal (format (ut 2011 12 13 14 15 16.1718)) "2011-12-13 14:15:16.1718"

test_ZonedTime :: Test
test_ZonedTime = assertions "zoned time" $ do
	let parse = optionTypeParse optionType_zonedTime
	let format = optionTypeShow optionType_zonedTime
	let zt y mo d h mi s tz = T.ZonedTime (T.LocalTime (T.fromGregorian y mo d) (T.TimeOfDay h mi s)) tz
	let rzt y mo d h mi s tz = Right (zt y mo d h mi s tz)
	let noZone = T.TimeZone 0 False ""
	let tzPlus60 = T.TimeZone 60 False ""
	let tzMinus60 = T.TimeZone (-60) False ""
	let tzABC = T.TimeZone 0 False "ABC"
	$expect $ equal (parse "2011-12-13 14:15") (rzt 2011 12 13 14 15 0 noZone)
	$expect $ equal (parse "2011-12-13 14:15Z") (rzt 2011 12 13 14 15 0 T.utc)
	$expect $ equal (parse "2011-12-13 14:15+0100") (rzt 2011 12 13 14 15 0 tzPlus60)
	$expect $ equal (parse "2011-12-13 14:15 +0100") (rzt 2011 12 13 14 15 0 tzPlus60)
	$expect $ equal (parse "2011-12-13 14:15-0100") (rzt 2011 12 13 14 15 0 tzMinus60)
	$expect $ equal (parse "2011-12-13 14:15 -0100") (rzt 2011 12 13 14 15 0 tzMinus60)
	$expect $ equal (parse "2011-12-13 14:15 ABC") (rzt 2011 12 13 14 15 0 tzABC)
	$expect $ equal (parse "2011-12-13 14:15") (rzt 2011 12 13 14 15 0 noZone)
	$expect $ equal (parse "2011-12-13 14:15:16") (rzt 2011 12 13 14 15 16 noZone)
	$expect $ equal (parse "2011-12-13 14:15:16.1718") (rzt 2011 12 13 14 15 16.1718 noZone)
	$expect $ equal (parse "2011-347 14:15") (rzt 2011 12 13 14 15 0 noZone)
	$expect $ equal (parse "20111213 14:15") (rzt 2011 12 13 14 15 0 noZone)
	$expect $ equal (parse "20111213T141516") (rzt 2011 12 13 14 15 16 noZone)
	$expect $ equal (parse "20111213T141516.1718") (rzt 2011 12 13 14 15 16.1718 noZone)
	$expect $ equal
		(parse "bogus")
		(Left "\"bogus\" could not be parsed as a zoned time.")
	$expect $ equal (format (zt 2011 12 13 14 15 0 noZone)) "2011-12-13 14:15:00 +0000"
	$expect $ equal (format (zt 2011 12 13 14 15 0 T.utc)) "2011-12-13 14:15:00 UTC"
	$expect $ equal (format (zt 2011 12 13 14 15 0 tzPlus60)) "2011-12-13 14:15:00 +0100"
	$expect $ equal (format (zt 2011 12 13 14 15 0 tzMinus60)) "2011-12-13 14:15:00 -0100"
	$expect $ equal (format (zt 2011 12 13 14 15 16 noZone)) "2011-12-13 14:15:16 +0000"
	$expect $ equal (format (zt 2011 12 13 14 15 16.1718 noZone)) "2011-12-13 14:15:16.1718 +0000"

instance Eq T.ZonedTime where
	x == y = key x == key y where
		key t = (T.zonedTimeToLocalTime t, T.zonedTimeZone t)

main :: IO ()
main = Test.Chell.defaultMain [suite "tests"
	[ test_Duration
	, test_Date
	, test_Time
	, test_LocalTime
	, test_UtcTime
	, test_ZonedTime
	]]