mirror of
https://github.com/tfausak/witch.git
synced 2024-11-26 09:43:03 +03:00
1982 lines
82 KiB
Haskell
1982 lines
82 KiB
Haskell
{-# OPTIONS_GHC -Wno-error=overflowed-literals #-}
|
|
|
|
{-# LANGUAGE MultiParamTypeClasses #-}
|
|
{-# LANGUAGE NegativeLiterals #-}
|
|
{-# LANGUAGE TemplateHaskell #-}
|
|
{-# LANGUAGE TypeApplications #-}
|
|
|
|
import qualified Control.Exception as Exception
|
|
import qualified Data.ByteString as ByteString
|
|
import qualified Data.ByteString.Lazy as LazyByteString
|
|
import qualified Data.ByteString.Short as ShortByteString
|
|
import qualified Data.Complex as Complex
|
|
import qualified Data.Either as Either
|
|
import qualified Data.Fixed as Fixed
|
|
import qualified Data.Int as Int
|
|
import qualified Data.IntMap as IntMap
|
|
import qualified Data.IntSet as IntSet
|
|
import qualified Data.List.NonEmpty as NonEmpty
|
|
import qualified Data.Map as Map
|
|
import qualified Data.Ratio as Ratio
|
|
import qualified Data.Sequence as Seq
|
|
import qualified Data.Set as Set
|
|
import qualified Data.Text as Text
|
|
import qualified Data.Text.Lazy as LazyText
|
|
import qualified Data.Time as Time
|
|
import qualified Data.Time.Clock.POSIX as Time
|
|
import qualified Data.Time.Clock.System as Time
|
|
import qualified Data.Time.Clock.TAI as Time
|
|
import qualified Data.Word as Word
|
|
import qualified Numeric.Natural as Natural
|
|
import Test.HUnit (Test(TestCase), assertBool, runTestTTAndExit, (~:), (~?=))
|
|
import qualified Witch
|
|
|
|
main :: IO ()
|
|
main =
|
|
runTestTTAndExit
|
|
$ "Witch"
|
|
~: [ "From"
|
|
~: ["from" ~: [Witch.from (1 :: Int.Int8) ~?= (1 :: Int.Int16)]]
|
|
, "TryFrom"
|
|
~: [ "tryFrom"
|
|
~: let f = hush . Witch.tryFrom @Int.Int16 @Int.Int8
|
|
in [f 1 ~?= Just 1, f 128 ~?= Nothing]
|
|
]
|
|
, "Utility"
|
|
~: [ "as" ~: [Witch.as @Int.Int8 1 ~?= 1]
|
|
, "from" ~: [Witch.from @Int.Int8 1 ~?= (1 :: Int.Int16)]
|
|
, "into" ~: [Witch.into @Int.Int16 (1 :: Int.Int8) ~?= 1]
|
|
, "over" ~: [Witch.over @Int.Int8 (+ 1) (Age 1) ~?= Age 2]
|
|
, "via"
|
|
~: [Witch.via @Int.Int16 (1 :: Int.Int8) ~?= (1 :: Int.Int32)]
|
|
, "tryFrom"
|
|
~: [hush (Witch.tryFrom @Int.Int16 1) ~?= Just (1 :: Int.Int8)]
|
|
, "tryInto"
|
|
~: [hush (Witch.tryInto @Int.Int8 (1 :: Int.Int16)) ~?= Just 1]
|
|
, "tryVia"
|
|
~: let f = Witch.tryVia @Int.Int16 @Int.Int32 @Int.Int8
|
|
in
|
|
[ hush (f 1) ~?= Just 1
|
|
, hush (f 128) ~?= Nothing
|
|
, hush (f 32768) ~?= Nothing
|
|
]
|
|
, "unsafeFrom"
|
|
~: let f = Witch.unsafeFrom @Int.Int16 @Int.Int8
|
|
in
|
|
[ f 1 ~?= 1
|
|
, TestCase $ do
|
|
result <-
|
|
Exception.try @Exception.SomeException
|
|
. Exception.evaluate
|
|
$ f 128
|
|
assertBool (show result) $ Either.isLeft result
|
|
]
|
|
, "unsafeInto"
|
|
~: [Witch.unsafeInto @Int.Int8 (1 :: Int.Int16) ~?= 1]
|
|
]
|
|
, "Lift"
|
|
~: [ "liftedFrom"
|
|
~: [($$(Witch.liftedFrom (1 :: Int.Int16)) :: Int.Int8) ~?= 1]
|
|
, "liftedInto"
|
|
~: [$$(Witch.liftedInto @Int.Int8 (1 :: Int.Int16)) ~?= 1]
|
|
]
|
|
, "TryFromException"
|
|
~: [ "show"
|
|
~: [ show (Witch.TryFromException @Int @Int 0 Nothing)
|
|
~?= "TryFromException @Int @Int 0 Nothing"
|
|
, show
|
|
(Witch.TryFromException @(Seq.Seq Int) @(Seq.Seq Int)
|
|
(Seq.fromList [])
|
|
(Just (Exception.toException Exception.Overflow))
|
|
)
|
|
~?= "TryFromException @(Seq Int) @(Seq Int) (fromList []) (Just arithmetic overflow)"
|
|
]
|
|
]
|
|
, "Instances"
|
|
~: [ "From a a" ~: let f = Witch.from @Int @Int in [f 0 ~?= 0]
|
|
|
|
-- Int8
|
|
, "From Int8 Int16"
|
|
~: let f = Witch.from @Int.Int8 @Int.Int16
|
|
in [f 0 ~?= 0, f 127 ~?= 127, f (-128) ~?= (-128)]
|
|
, "From Int8 Int32"
|
|
~: let f = Witch.from @Int.Int8 @Int.Int32
|
|
in [f 0 ~?= 0, f 127 ~?= 127, f (-128) ~?= (-128)]
|
|
, "From Int8 Int64"
|
|
~: let f = Witch.from @Int.Int8 @Int.Int64
|
|
in [f 0 ~?= 0, f 127 ~?= 127, f (-128) ~?= (-128)]
|
|
, "From Int8 Int"
|
|
~: let f = Witch.from @Int.Int8 @Int
|
|
in [f 0 ~?= 0, f 127 ~?= 127, f (-128) ~?= (-128)]
|
|
, "From Int8 Integer"
|
|
~: let f = Witch.from @Int.Int8 @Integer
|
|
in [f 0 ~?= 0, f 127 ~?= 127, f (-128) ~?= (-128)]
|
|
, "TryFrom Int8 Word8"
|
|
~: let f = hush . Witch.tryFrom @Int.Int8 @Word.Word8
|
|
in [f 0 ~?= Just 0, f 127 ~?= Just 127, f (-1) ~?= Nothing]
|
|
, "TryFrom Int8 Word16"
|
|
~: let f = hush . Witch.tryFrom @Int.Int8 @Word.Word16
|
|
in [f 0 ~?= Just 0, f 127 ~?= Just 127, f (-1) ~?= Nothing]
|
|
, "TryFrom Int8 Word32"
|
|
~: let f = hush . Witch.tryFrom @Int.Int8 @Word.Word32
|
|
in [f 0 ~?= Just 0, f 127 ~?= Just 127, f (-1) ~?= Nothing]
|
|
, "TryFrom Int8 Word64"
|
|
~: let f = hush . Witch.tryFrom @Int.Int8 @Word.Word64
|
|
in [f 0 ~?= Just 0, f 127 ~?= Just 127, f (-1) ~?= Nothing]
|
|
, "TryFrom Int8 Word"
|
|
~: let f = hush . Witch.tryFrom @Int.Int8 @Word
|
|
in [f 0 ~?= Just 0, f 127 ~?= Just 127, f (-1) ~?= Nothing]
|
|
, "TryFrom Int8 Natural"
|
|
~: let f = hush . Witch.tryFrom @Int.Int8 @Natural.Natural
|
|
in [f 0 ~?= Just 0, f 127 ~?= Just 127, f (-1) ~?= Nothing]
|
|
, "From Int8 Float"
|
|
~: let f = Witch.from @Int.Int8 @Float
|
|
in [f 0 ~?= 0, f 127 ~?= 127, f (-128) ~?= (-128)]
|
|
, "From Int8 Double"
|
|
~: let f = Witch.from @Int.Int8 @Double
|
|
in [f 0 ~?= 0, f 127 ~?= 127, f (-128) ~?= (-128)]
|
|
|
|
-- Int16
|
|
, "TryFrom Int16 Int8"
|
|
~: let f = hush . Witch.tryFrom @Int.Int16 @Int.Int8
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 127 ~?= Just 127
|
|
, f 128 ~?= Nothing
|
|
, f (-128) ~?= Just (-128)
|
|
, f (-129) ~?= Nothing
|
|
]
|
|
, "From Int16 Int32"
|
|
~: let f = Witch.from @Int.Int16 @Int.Int32
|
|
in [f 0 ~?= 0, f 32767 ~?= 32767, f (-32768) ~?= (-32768)]
|
|
, "From Int16 Int64"
|
|
~: let f = Witch.from @Int.Int16 @Int.Int64
|
|
in [f 0 ~?= 0, f 32767 ~?= 32767, f (-32768) ~?= (-32768)]
|
|
, "From Int16 Int"
|
|
~: let f = Witch.from @Int.Int16 @Int
|
|
in [f 0 ~?= 0, f 32767 ~?= 32767, f (-32768) ~?= (-32768)]
|
|
, "From Int16 Integer"
|
|
~: let f = Witch.from @Int.Int16 @Integer
|
|
in [f 0 ~?= 0, f 32767 ~?= 32767, f (-32768) ~?= (-32768)]
|
|
, "TryFrom Int16 Word8"
|
|
~: let f = hush . Witch.tryFrom @Int.Int16 @Word.Word8
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 255 ~?= Just 255
|
|
, f 256 ~?= Nothing
|
|
, f (-1) ~?= Nothing
|
|
]
|
|
, "TryFrom Int16 Word16"
|
|
~: let f = hush . Witch.tryFrom @Int.Int16 @Word.Word16
|
|
in [f 0 ~?= Just 0, f 127 ~?= Just 127, f (-1) ~?= Nothing]
|
|
, "TryFrom Int16 Word32"
|
|
~: let f = hush . Witch.tryFrom @Int.Int16 @Word.Word32
|
|
in
|
|
[f 0 ~?= Just 0, f 32767 ~?= Just 32767, f (-1) ~?= Nothing]
|
|
, "TryFrom Int16 Word64"
|
|
~: let f = hush . Witch.tryFrom @Int.Int16 @Word.Word64
|
|
in
|
|
[f 0 ~?= Just 0, f 32767 ~?= Just 32767, f (-1) ~?= Nothing]
|
|
, "TryFrom Int16 Word"
|
|
~: let f = hush . Witch.tryFrom @Int.Int16 @Word
|
|
in
|
|
[f 0 ~?= Just 0, f 32767 ~?= Just 32767, f (-1) ~?= Nothing]
|
|
, "TryFrom Int16 Natural"
|
|
~: let f = hush . Witch.tryFrom @Int.Int16 @Natural.Natural
|
|
in
|
|
[f 0 ~?= Just 0, f 32767 ~?= Just 32767, f (-1) ~?= Nothing]
|
|
, "From Int16 Float"
|
|
~: let f = Witch.from @Int.Int16 @Float
|
|
in [f 0 ~?= 0, f 32767 ~?= 32767, f (-32768) ~?= (-32768)]
|
|
, "From Int16 Double"
|
|
~: let f = Witch.from @Int.Int16 @Double
|
|
in [f 0 ~?= 0, f 32767 ~?= 32767, f (-32768) ~?= (-32768)]
|
|
|
|
-- Int32
|
|
, "TryFrom Int32 Int8"
|
|
~: let f = hush . Witch.tryFrom @Int.Int32 @Int.Int8
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 127 ~?= Just 127
|
|
, f 128 ~?= Nothing
|
|
, f (-128) ~?= Just (-128)
|
|
, f (-129) ~?= Nothing
|
|
]
|
|
, "TryFrom Int32 Int16"
|
|
~: let f = hush . Witch.tryFrom @Int.Int32 @Int.Int16
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 32767 ~?= Just 32767
|
|
, f 32768 ~?= Nothing
|
|
, f (-32768) ~?= Just (-32768)
|
|
, f (-32769) ~?= Nothing
|
|
]
|
|
, "From Int32 Int64"
|
|
~: let f = Witch.from @Int.Int32 @Int.Int64
|
|
in
|
|
[ f 0 ~?= 0
|
|
, f 2147483647 ~?= 2147483647
|
|
, f (-2147483648) ~?= (-2147483648)
|
|
]
|
|
, "TryFrom Int32 Int"
|
|
~: let f = hush . Witch.tryFrom @Int.Int32 @Int
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 2147483647 ~?= Just 2147483647
|
|
, f (-2147483648) ~?= Just (-2147483648)
|
|
]
|
|
, "From Int32 Integer"
|
|
~: let f = Witch.from @Int.Int32 @Integer
|
|
in
|
|
[ f 0 ~?= 0
|
|
, f 2147483647 ~?= 2147483647
|
|
, f (-2147483648) ~?= (-2147483648)
|
|
]
|
|
, "TryFrom Int32 Word8"
|
|
~: let f = hush . Witch.tryFrom @Int.Int32 @Word.Word8
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 255 ~?= Just 255
|
|
, f 256 ~?= Nothing
|
|
, f (-1) ~?= Nothing
|
|
]
|
|
, "TryFrom Int32 Word16"
|
|
~: let f = hush . Witch.tryFrom @Int.Int32 @Word.Word16
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 65535 ~?= Just 65535
|
|
, f 65536 ~?= Nothing
|
|
, f (-1) ~?= Nothing
|
|
]
|
|
, "TryFrom Int32 Word32"
|
|
~: let f = hush . Witch.tryFrom @Int.Int32 @Word.Word32
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 2147483647 ~?= Just 2147483647
|
|
, f (-1) ~?= Nothing
|
|
]
|
|
, "TryFrom Int32 Word64"
|
|
~: let f = hush . Witch.tryFrom @Int.Int32 @Word.Word64
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 2147483647 ~?= Just 2147483647
|
|
, f (-1) ~?= Nothing
|
|
]
|
|
, "TryFrom Int32 Word"
|
|
~: let f = hush . Witch.tryFrom @Int.Int32 @Word
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 2147483647 ~?= Just 2147483647
|
|
, f (-1) ~?= Nothing
|
|
]
|
|
, "TryFrom Int32 Natural"
|
|
~: let f = hush . Witch.tryFrom @Int.Int32 @Natural.Natural
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 2147483647 ~?= Just 2147483647
|
|
, f (-1) ~?= Nothing
|
|
]
|
|
, "TryFrom Int32 Float"
|
|
~: let f = hush . Witch.tryFrom @Int.Int32 @Float
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 16777215 ~?= Just 16777215
|
|
, f 16777216 ~?= Nothing
|
|
, f (-16777215) ~?= Just (-16777215)
|
|
, f (-16777216) ~?= Nothing
|
|
]
|
|
, "From Int32 Double"
|
|
~: let f = Witch.from @Int.Int32 @Double
|
|
in
|
|
[ f 0 ~?= 0
|
|
, f 2147483647 ~?= 2147483647
|
|
, f (-2147483648) ~?= (-2147483648)
|
|
]
|
|
|
|
-- Int64
|
|
, "TryFrom Int64 Int8"
|
|
~: let f = hush . Witch.tryFrom @Int.Int64 @Int.Int8
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 127 ~?= Just 127
|
|
, f 128 ~?= Nothing
|
|
, f (-128) ~?= Just (-128)
|
|
, f (-129) ~?= Nothing
|
|
]
|
|
, "TryFrom Int64 Int16"
|
|
~: let f = hush . Witch.tryFrom @Int.Int64 @Int.Int16
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 32767 ~?= Just 32767
|
|
, f 32768 ~?= Nothing
|
|
, f (-32768) ~?= Just (-32768)
|
|
, f (-32769) ~?= Nothing
|
|
]
|
|
, "TryFrom Int64 Int32"
|
|
~: let f = hush . Witch.tryFrom @Int.Int64 @Int.Int32
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 2147483647 ~?= Just 2147483647
|
|
, f 2147483648 ~?= Nothing
|
|
, f (-2147483648) ~?= Just (-2147483648)
|
|
, f (-2147483649) ~?= Nothing
|
|
]
|
|
, "TryFrom Int64 Int"
|
|
~: let f = hush . Witch.tryFrom @Int.Int64 @Int
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, let x = maxBound :: Int
|
|
in
|
|
if toInteger x >= 9223372036854775807
|
|
then f 9223372036854775807
|
|
~?= Just 9223372036854775807
|
|
else f (fromIntegral x) ~?= Just x
|
|
, let x = minBound :: Int
|
|
in
|
|
if toInteger x <= (-9223372036854775808)
|
|
then f (-9223372036854775808)
|
|
~?= Just (-9223372036854775808)
|
|
else f (fromIntegral x) ~?= Just x
|
|
]
|
|
, "From Int64 Integer"
|
|
~: let f = Witch.from @Int.Int64 @Integer
|
|
in
|
|
[ f 0 ~?= 0
|
|
, f 9223372036854775807 ~?= 9223372036854775807
|
|
, f (-9223372036854775808) ~?= (-9223372036854775808)
|
|
]
|
|
, "TryFrom Int64 Word8"
|
|
~: let f = hush . Witch.tryFrom @Int.Int64 @Word.Word8
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 255 ~?= Just 255
|
|
, f 256 ~?= Nothing
|
|
, f (-1) ~?= Nothing
|
|
]
|
|
, "TryFrom Int64 Word16"
|
|
~: let f = hush . Witch.tryFrom @Int.Int64 @Word.Word16
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 65535 ~?= Just 65535
|
|
, f 65536 ~?= Nothing
|
|
, f (-1) ~?= Nothing
|
|
]
|
|
, "TryFrom Int64 Word32"
|
|
~: let f = hush . Witch.tryFrom @Int.Int64 @Word.Word32
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 2147483647 ~?= Just 2147483647
|
|
, f (-1) ~?= Nothing
|
|
]
|
|
, "TryFrom Int64 Word64"
|
|
~: let f = hush . Witch.tryFrom @Int.Int64 @Word.Word64
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 9223372036854775807 ~?= Just 9223372036854775807
|
|
, f (-1) ~?= Nothing
|
|
]
|
|
, "TryFrom Int64 Word"
|
|
~: let f = hush . Witch.tryFrom @Int.Int64 @Word
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, let x = maxBound :: Word
|
|
in
|
|
if toInteger x >= 9223372036854775807
|
|
then f 9223372036854775807
|
|
~?= Just 9223372036854775807
|
|
else f (fromIntegral x) ~?= Just x
|
|
, f (-1) ~?= Nothing
|
|
]
|
|
, "TryFrom Int64 Natural"
|
|
~: let f = hush . Witch.tryFrom @Int.Int64 @Natural.Natural
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 9223372036854775807 ~?= Just 9223372036854775807
|
|
, f (-1) ~?= Nothing
|
|
]
|
|
, "TryFrom Int64 Float"
|
|
~: let f = hush . Witch.tryFrom @Int.Int64 @Float
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 16777215 ~?= Just 16777215
|
|
, f 16777216 ~?= Nothing
|
|
, f (-16777215) ~?= Just (-16777215)
|
|
, f (-16777216) ~?= Nothing
|
|
]
|
|
, "TryFrom Int64 Double"
|
|
~: let f = hush . Witch.tryFrom @Int.Int64 @Double
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 9007199254740991 ~?= Just 9007199254740991
|
|
, f 9007199254740992 ~?= Nothing
|
|
, f (-9007199254740991) ~?= Just (-9007199254740991)
|
|
, f (-9007199254740992) ~?= Nothing
|
|
]
|
|
|
|
-- Int
|
|
, "TryFrom Int Int8"
|
|
~: let f = hush . Witch.tryFrom @Int @Int.Int8
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 127 ~?= Just 127
|
|
, f 128 ~?= Nothing
|
|
, f (-128) ~?= Just (-128)
|
|
, f (-129) ~?= Nothing
|
|
]
|
|
, "TryFrom Int Int16"
|
|
~: let f = hush . Witch.tryFrom @Int @Int.Int16
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 32767 ~?= Just 32767
|
|
, f 32768 ~?= Nothing
|
|
, f (-32768) ~?= Just (-32768)
|
|
, f (-32769) ~?= Nothing
|
|
]
|
|
, "TryFrom Int Int32"
|
|
~: let f = hush . Witch.tryFrom @Int @Int.Int32
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 2147483647 ~?= Just 2147483647
|
|
, let x = maxBound :: Int
|
|
in
|
|
if toInteger x >= 2147483648
|
|
then f 2147483648 ~?= Nothing
|
|
else f x ~?= Just (fromIntegral x)
|
|
, f (-2147483648) ~?= Just (-2147483648)
|
|
, let x = minBound :: Int
|
|
in
|
|
if toInteger x <= (-2147483649)
|
|
then f (-2147483649) ~?= Nothing
|
|
else f x ~?= Just (fromIntegral x)
|
|
]
|
|
, "From Int Int64"
|
|
~: let f = Witch.from @Int @Int.Int64
|
|
in
|
|
[ f 0 ~?= 0
|
|
, f maxBound ~?= fromIntegral (maxBound :: Int)
|
|
, f minBound ~?= fromIntegral (minBound :: Int)
|
|
]
|
|
, "From Int Integer"
|
|
~: let f = Witch.from @Int @Integer
|
|
in
|
|
[ f 0 ~?= 0
|
|
, f maxBound ~?= fromIntegral (maxBound :: Int)
|
|
, f minBound ~?= fromIntegral (minBound :: Int)
|
|
]
|
|
, "TryFrom Int Word8"
|
|
~: let f = hush . Witch.tryFrom @Int @Word.Word8
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 255 ~?= Just 255
|
|
, f 256 ~?= Nothing
|
|
, f (-1) ~?= Nothing
|
|
]
|
|
, "TryFrom Int Word16"
|
|
~: let f = hush . Witch.tryFrom @Int @Word.Word16
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 65535 ~?= Just 65535
|
|
, f 65536 ~?= Nothing
|
|
, f (-1) ~?= Nothing
|
|
]
|
|
, "TryFrom Int Word32"
|
|
~: let f = hush . Witch.tryFrom @Int @Word.Word32
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, let x = maxBound :: Int
|
|
in
|
|
if toInteger x >= 4294967295
|
|
then f 4294967295 ~?= Just 4294967295
|
|
else f x ~?= Just (fromIntegral x)
|
|
, let x = maxBound :: Int
|
|
in
|
|
if toInteger x >= 4294967296
|
|
then f 4294967296 ~?= Nothing
|
|
else f x ~?= Just (fromIntegral x)
|
|
, f (-1) ~?= Nothing
|
|
]
|
|
, "TryFrom Int Word64"
|
|
~: let f = hush . Witch.tryFrom @Int @Word.Word64
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f maxBound ~?= Just (fromIntegral (maxBound :: Int))
|
|
, f (-1) ~?= Nothing
|
|
]
|
|
, "TryFrom Int Word"
|
|
~: let f = hush . Witch.tryFrom @Int @Word
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f maxBound ~?= Just (fromIntegral (maxBound :: Int))
|
|
, f (-1) ~?= Nothing
|
|
]
|
|
, "TryFrom Int Natural"
|
|
~: let f = hush . Witch.tryFrom @Int @Natural.Natural
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f maxBound ~?= Just (fromIntegral (maxBound :: Int))
|
|
, f (-1) ~?= Nothing
|
|
]
|
|
, "TryFrom Int Float"
|
|
~: let f = hush . Witch.tryFrom @Int @Float
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 16777215 ~?= Just 16777215
|
|
, f 16777216 ~?= Nothing
|
|
, f (-16777215) ~?= Just (-16777215)
|
|
, f (-16777216) ~?= Nothing
|
|
]
|
|
, "TryFrom Int Double"
|
|
~: let f = hush . Witch.tryFrom @Int @Double
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, let x = maxBound :: Int
|
|
in
|
|
if toInteger x >= 9007199254740991
|
|
then f 9007199254740991 ~?= Just 9007199254740991
|
|
else f x ~?= Just (fromIntegral x)
|
|
, let x = maxBound :: Int
|
|
in
|
|
if toInteger x >= 9007199254740992
|
|
then f 9007199254740992 ~?= Nothing
|
|
else f x ~?= Just (fromIntegral x)
|
|
, let x = minBound :: Int
|
|
in
|
|
if toInteger x <= (-9007199254740991)
|
|
then f (-9007199254740991)
|
|
~?= Just (-9007199254740991)
|
|
else f x ~?= Just (fromIntegral x)
|
|
, let x = minBound :: Int
|
|
in
|
|
if toInteger x <= (-9007199254740992)
|
|
then f (-9007199254740992) ~?= Nothing
|
|
else f x ~?= Just (fromIntegral x)
|
|
]
|
|
|
|
-- Integer
|
|
, "TryFrom Integer Int8"
|
|
~: let f = hush . Witch.tryFrom @Integer @Int.Int8
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 127 ~?= Just 127
|
|
, f 128 ~?= Nothing
|
|
, f (-128) ~?= Just (-128)
|
|
, f (-129) ~?= Nothing
|
|
]
|
|
, "TryFrom Integer Int16"
|
|
~: let f = hush . Witch.tryFrom @Integer @Int.Int16
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 32767 ~?= Just 32767
|
|
, f 32768 ~?= Nothing
|
|
, f (-32768) ~?= Just (-32768)
|
|
, f (-32769) ~?= Nothing
|
|
]
|
|
, "TryFrom Integer Int32"
|
|
~: let f = hush . Witch.tryFrom @Integer @Int.Int32
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 2147483647 ~?= Just 2147483647
|
|
, f 2147483648 ~?= Nothing
|
|
, f (-2147483648) ~?= Just (-2147483648)
|
|
, f (-2147483649) ~?= Nothing
|
|
]
|
|
, "TryFrom Integer Int64"
|
|
~: let f = hush . Witch.tryFrom @Integer @Int.Int64
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 9223372036854775807 ~?= Just 9223372036854775807
|
|
, f 9223372036854775808 ~?= Nothing
|
|
, f (-9223372036854775808) ~?= Just (-9223372036854775808)
|
|
, f (-9223372036854775809) ~?= Nothing
|
|
]
|
|
, "TryFrom Integer Int"
|
|
~: let f = hush . Witch.tryFrom @Integer @Int
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, let x = maxBound :: Int in f (fromIntegral x) ~?= Just x
|
|
, let x = toInteger (maxBound :: Int) + 1
|
|
in f x ~?= Nothing
|
|
, let x = minBound :: Int in f (fromIntegral x) ~?= Just x
|
|
, let x = toInteger (minBound :: Int) - 1
|
|
in f x ~?= Nothing
|
|
]
|
|
, "TryFrom Integer Word8"
|
|
~: let f = hush . Witch.tryFrom @Integer @Word.Word8
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 255 ~?= Just 255
|
|
, f 256 ~?= Nothing
|
|
, f (-1) ~?= Nothing
|
|
]
|
|
, "TryFrom Integer Word16"
|
|
~: let f = hush . Witch.tryFrom @Integer @Word.Word16
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 65535 ~?= Just 65535
|
|
, f 65536 ~?= Nothing
|
|
, f (-1) ~?= Nothing
|
|
]
|
|
, "TryFrom Integer Word32"
|
|
~: let f = hush . Witch.tryFrom @Integer @Word.Word32
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 4294967295 ~?= Just 4294967295
|
|
, f 4294967296 ~?= Nothing
|
|
, f (-1) ~?= Nothing
|
|
]
|
|
, "TryFrom Integer Word64"
|
|
~: let f = hush . Witch.tryFrom @Integer @Word.Word64
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 18446744073709551615 ~?= Just 18446744073709551615
|
|
, f 18446744073709551616 ~?= Nothing
|
|
, f (-1) ~?= Nothing
|
|
]
|
|
, "TryFrom Integer Word"
|
|
~: let f = hush . Witch.tryFrom @Integer @Word
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, let x = maxBound :: Word in f (fromIntegral x) ~?= Just x
|
|
, let x = toInteger (maxBound :: Word) + 1
|
|
in f x ~?= Nothing
|
|
, f (-1) ~?= Nothing
|
|
]
|
|
, "TryFrom Integer Natural"
|
|
~: let f = hush . Witch.tryFrom @Integer @Natural.Natural
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 18446744073709551616 ~?= Just 18446744073709551616
|
|
, f (-1) ~?= Nothing
|
|
]
|
|
, "TryFrom Integer Float"
|
|
~: let f = hush . Witch.tryFrom @Integer @Float
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 16777215 ~?= Just 16777215
|
|
, f 16777216 ~?= Nothing
|
|
, f (-16777215) ~?= Just (-16777215)
|
|
, f (-16777216) ~?= Nothing
|
|
]
|
|
, "TryFrom Integer Double"
|
|
~: let f = hush . Witch.tryFrom @Integer @Double
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 9007199254740991 ~?= Just 9007199254740991
|
|
, f 9007199254740992 ~?= Nothing
|
|
, f (-9007199254740991) ~?= Just (-9007199254740991)
|
|
, f (-9007199254740992) ~?= Nothing
|
|
]
|
|
|
|
-- Word8
|
|
, "From Word8 Word16"
|
|
~: let f = Witch.from @Word.Word8 @Word.Word16
|
|
in [f 0 ~?= 0, f 255 ~?= 255]
|
|
, "From Word8 Word32"
|
|
~: let f = Witch.from @Word.Word8 @Word.Word32
|
|
in [f 0 ~?= 0, f 255 ~?= 255]
|
|
, "From Word8 Word64"
|
|
~: let f = Witch.from @Word.Word8 @Word.Word64
|
|
in [f 0 ~?= 0, f 255 ~?= 255]
|
|
, "From Word8 Word"
|
|
~: let f = Witch.from @Word.Word8 @Word
|
|
in [f 0 ~?= 0, f 255 ~?= 255]
|
|
, "From Word8 Natural"
|
|
~: let f = Witch.from @Word.Word8 @Natural.Natural
|
|
in [f 0 ~?= 0, f 255 ~?= 255]
|
|
, "TryFrom Word8 Int8"
|
|
~: let f = hush . Witch.tryFrom @Word.Word8 @Int.Int8
|
|
in [f 0 ~?= Just 0, f 127 ~?= Just 127, f 128 ~?= Nothing]
|
|
, "From Word8 Int16"
|
|
~: let f = Witch.from @Word.Word8 @Int.Int16
|
|
in [f 0 ~?= 0, f 255 ~?= 255]
|
|
, "From Word8 Int32"
|
|
~: let f = Witch.from @Word.Word8 @Int.Int32
|
|
in [f 0 ~?= 0, f 255 ~?= 255]
|
|
, "From Word8 Int64"
|
|
~: let f = Witch.from @Word.Word8 @Int.Int64
|
|
in [f 0 ~?= 0, f 255 ~?= 255]
|
|
, "From Word8 Int"
|
|
~: let f = Witch.from @Word.Word8 @Int
|
|
in [f 0 ~?= 0, f 255 ~?= 255]
|
|
, "From Word8 Integer"
|
|
~: let f = Witch.from @Word.Word8 @Integer
|
|
in [f 0 ~?= 0, f 255 ~?= 255]
|
|
, "From Word8 Float"
|
|
~: let f = Witch.from @Word.Word8 @Float
|
|
in [f 0 ~?= 0, f 255 ~?= 255]
|
|
, "From Word8 Double"
|
|
~: let f = Witch.from @Word.Word8 @Double
|
|
in [f 0 ~?= 0, f 255 ~?= 255]
|
|
|
|
-- Word16
|
|
, "TryFrom Word16 Word8"
|
|
~: let f = hush . Witch.tryFrom @Word.Word16 @Word.Word8
|
|
in [f 0 ~?= Just 0, f 255 ~?= Just 255, f 256 ~?= Nothing]
|
|
, "From Word16 Word32"
|
|
~: let f = Witch.from @Word.Word16 @Word.Word32
|
|
in [f 0 ~?= 0, f 65535 ~?= 65535]
|
|
, "From Word16 Word64"
|
|
~: let f = Witch.from @Word.Word16 @Word.Word64
|
|
in [f 0 ~?= 0, f 65535 ~?= 65535]
|
|
, "From Word16 Word"
|
|
~: let f = Witch.from @Word.Word16 @Word
|
|
in [f 0 ~?= 0, f 65535 ~?= 65535]
|
|
, "From Word16 Natural"
|
|
~: let f = Witch.from @Word.Word16 @Natural.Natural
|
|
in [f 0 ~?= 0, f 65535 ~?= 65535]
|
|
, "TryFrom Word16 Int8"
|
|
~: let f = hush . Witch.tryFrom @Word.Word16 @Int.Int8
|
|
in [f 0 ~?= Just 0, f 127 ~?= Just 127, f 128 ~?= Nothing]
|
|
, "TryFrom Word16 Int16"
|
|
~: let f = hush . Witch.tryFrom @Word.Word16 @Int.Int16
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 32767 ~?= Just 32767
|
|
, f 32768 ~?= Nothing
|
|
]
|
|
, "From Word16 Int32"
|
|
~: let f = Witch.from @Word.Word16 @Int.Int32
|
|
in [f 0 ~?= 0, f 65535 ~?= 65535]
|
|
, "From Word16 Int64"
|
|
~: let f = Witch.from @Word.Word16 @Int.Int64
|
|
in [f 0 ~?= 0, f 65535 ~?= 65535]
|
|
, "From Word16 Int"
|
|
~: let f = Witch.from @Word.Word16 @Int
|
|
in [f 0 ~?= 0, f 65535 ~?= 65535]
|
|
, "From Word16 Integer"
|
|
~: let f = Witch.from @Word.Word16 @Integer
|
|
in [f 0 ~?= 0, f 65535 ~?= 65535]
|
|
, "From Word16 Float"
|
|
~: let f = Witch.from @Word.Word16 @Float
|
|
in [f 0 ~?= 0, f 65535 ~?= 65535]
|
|
, "From Word16 Double"
|
|
~: let f = Witch.from @Word.Word16 @Double
|
|
in [f 0 ~?= 0, f 65535 ~?= 65535]
|
|
|
|
-- Word32
|
|
, "TryFrom Word32 Word8"
|
|
~: let f = hush . Witch.tryFrom @Word.Word32 @Word.Word8
|
|
in [f 0 ~?= Just 0, f 255 ~?= Just 255, f 256 ~?= Nothing]
|
|
, "TryFrom Word32 Word16"
|
|
~: let f = hush . Witch.tryFrom @Word.Word32 @Word.Word16
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 65535 ~?= Just 65535
|
|
, f 65536 ~?= Nothing
|
|
]
|
|
, "From Word32 Word64"
|
|
~: let f = Witch.from @Word.Word32 @Word.Word64
|
|
in [f 0 ~?= 0, f 4294967295 ~?= 4294967295]
|
|
, "TryFrom Word32 Word"
|
|
~: let f = hush . Witch.tryFrom @Word.Word32 @Word
|
|
in [f 0 ~?= Just 0, f 4294967295 ~?= Just 4294967295]
|
|
, "From Word32 Natural"
|
|
~: let f = Witch.from @Word.Word32 @Natural.Natural
|
|
in [f 0 ~?= 0, f 4294967295 ~?= 4294967295]
|
|
, "TryFrom Word32 Int8"
|
|
~: let f = hush . Witch.tryFrom @Word.Word32 @Int.Int8
|
|
in [f 0 ~?= Just 0, f 127 ~?= Just 127, f 128 ~?= Nothing]
|
|
, "TryFrom Word32 Int16"
|
|
~: let f = hush . Witch.tryFrom @Word.Word32 @Int.Int16
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 32767 ~?= Just 32767
|
|
, f 32768 ~?= Nothing
|
|
]
|
|
, "TryFrom Word32 Int32"
|
|
~: let f = hush . Witch.tryFrom @Word.Word32 @Int.Int32
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 2147483647 ~?= Just 2147483647
|
|
, f 2147483648 ~?= Nothing
|
|
]
|
|
, "From Word32 Int64"
|
|
~: let f = Witch.from @Word.Word32 @Int.Int64
|
|
in [f 0 ~?= 0, f 4294967295 ~?= 4294967295]
|
|
, "TryFrom Word32 Int"
|
|
~: let f = hush . Witch.tryFrom @Word.Word32 @Int
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, let x = maxBound :: Int
|
|
in
|
|
if toInteger x >= 4294967295
|
|
then f 4294967295 ~?= Just 4294967295
|
|
else f (fromIntegral x) ~?= Just x
|
|
]
|
|
, "From Word32 Integer"
|
|
~: let f = Witch.from @Word.Word32 @Integer
|
|
in [f 0 ~?= 0, f 4294967295 ~?= 4294967295]
|
|
, "TryFrom Word32 Float"
|
|
~: let f = hush . Witch.tryFrom @Word.Word32 @Float
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 16777215 ~?= Just 16777215
|
|
, f 16777216 ~?= Nothing
|
|
]
|
|
, "From Word32 Double"
|
|
~: let f = Witch.from @Word.Word32 @Double
|
|
in [f 0 ~?= 0, f 4294967295 ~?= 4294967295]
|
|
|
|
-- Word64
|
|
, "TryFrom Word64 Word8"
|
|
~: let f = hush . Witch.tryFrom @Word.Word64 @Word.Word8
|
|
in [f 0 ~?= Just 0, f 255 ~?= Just 255, f 256 ~?= Nothing]
|
|
, "TryFrom Word64 Word16"
|
|
~: let f = hush . Witch.tryFrom @Word.Word64 @Word.Word16
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 65535 ~?= Just 65535
|
|
, f 65536 ~?= Nothing
|
|
]
|
|
, "TryFrom Word64 Word32"
|
|
~: let f = hush . Witch.tryFrom @Word.Word64 @Word.Word32
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 4294967295 ~?= Just 4294967295
|
|
, f 4294967296 ~?= Nothing
|
|
]
|
|
, "TryFrom Word64 Word"
|
|
~: let f = hush . Witch.tryFrom @Word.Word64 @Word
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, let x = maxBound :: Word
|
|
in
|
|
if toInteger x >= 18446744073709551615
|
|
then f 18446744073709551615
|
|
~?= Just 18446744073709551615
|
|
else f (fromIntegral x) ~?= Just x
|
|
]
|
|
, "From Word64 Natural"
|
|
~: let f = Witch.from @Word.Word64 @Natural.Natural
|
|
in
|
|
[f 0 ~?= 0, f 18446744073709551615 ~?= 18446744073709551615]
|
|
, "TryFrom Word64 Int8"
|
|
~: let f = hush . Witch.tryFrom @Word.Word64 @Int.Int8
|
|
in [f 0 ~?= Just 0, f 127 ~?= Just 127, f 128 ~?= Nothing]
|
|
, "TryFrom Word64 Int16"
|
|
~: let f = hush . Witch.tryFrom @Word.Word64 @Int.Int16
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 32767 ~?= Just 32767
|
|
, f 32768 ~?= Nothing
|
|
]
|
|
, "TryFrom Word64 Int32"
|
|
~: let f = hush . Witch.tryFrom @Word.Word64 @Int.Int32
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 2147483647 ~?= Just 2147483647
|
|
, f 2147483648 ~?= Nothing
|
|
]
|
|
, "TryFrom Word64 Int64"
|
|
~: let f = hush . Witch.tryFrom @Word.Word64 @Int.Int64
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 9223372036854775807 ~?= Just 9223372036854775807
|
|
, f 9223372036854775808 ~?= Nothing
|
|
]
|
|
, "TryFrom Word64 Int"
|
|
~: let f = hush . Witch.tryFrom @Word.Word64 @Int
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, let x = maxBound :: Int
|
|
in
|
|
hush (Witch.tryFrom @Word.Word64 @Int (fromIntegral x))
|
|
~?= Just x
|
|
, let x = fromIntegral (maxBound :: Int) + 1 :: Word.Word64
|
|
in hush (Witch.tryFrom @Word.Word64 @Int x) ~?= Nothing
|
|
]
|
|
, "From Word64 Integer"
|
|
~: let f = Witch.from @Word.Word64 @Integer
|
|
in
|
|
[f 0 ~?= 0, f 18446744073709551615 ~?= 18446744073709551615]
|
|
, "TryFrom Word64 Float"
|
|
~: let f = hush . Witch.tryFrom @Word.Word64 @Float
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 16777215 ~?= Just 16777215
|
|
, f 16777216 ~?= Nothing
|
|
]
|
|
, "TryFrom Word64 Double"
|
|
~: let f = hush . Witch.tryFrom @Word.Word64 @Double
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 9007199254740991 ~?= Just 9007199254740991
|
|
, f 9007199254740992 ~?= Nothing
|
|
]
|
|
|
|
-- Word
|
|
, "TryFrom Word Word8"
|
|
~: let f = hush . Witch.tryFrom @Word @Word.Word8
|
|
in [f 0 ~?= Just 0, f 255 ~?= Just 255, f 256 ~?= Nothing]
|
|
, "TryFrom Word Word16"
|
|
~: let f = hush . Witch.tryFrom @Word @Word.Word16
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 65535 ~?= Just 65535
|
|
, f 65536 ~?= Nothing
|
|
]
|
|
, "TryFrom Word Word32"
|
|
~: let f = hush . Witch.tryFrom @Word @Word.Word32
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 4294967295 ~?= Just 4294967295
|
|
, let x = maxBound :: Word
|
|
in
|
|
if toInteger x >= 4294967296
|
|
then f 4294967296 ~?= Nothing
|
|
else f x ~?= Just (fromIntegral x)
|
|
]
|
|
, "From Word Word64"
|
|
~: let f = Witch.from @Word @Word.Word64
|
|
in [f 0 ~?= 0, f maxBound ~?= fromIntegral (maxBound :: Word)]
|
|
, "From Word Natural"
|
|
~: let f = Witch.from @Word @Natural.Natural
|
|
in [f 0 ~?= 0, f maxBound ~?= fromIntegral (maxBound :: Word)]
|
|
, "TryFrom Word Int8"
|
|
~: let f = hush . Witch.tryFrom @Word @Int.Int8
|
|
in [f 0 ~?= Just 0, f 127 ~?= Just 127, f 128 ~?= Nothing]
|
|
, "TryFrom Word Int16"
|
|
~: let f = hush . Witch.tryFrom @Word @Int.Int16
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 32767 ~?= Just 32767
|
|
, f 32768 ~?= Nothing
|
|
]
|
|
, "TryFrom Word Int32"
|
|
~: let f = hush . Witch.tryFrom @Word @Int.Int32
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 2147483647 ~?= Just 2147483647
|
|
, f 2147483648 ~?= Nothing
|
|
]
|
|
, "TryFrom Word Int64"
|
|
~: let f = hush . Witch.tryFrom @Word @Int.Int64
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, let x = maxBound :: Word
|
|
in
|
|
if toInteger x >= 9223372036854775807
|
|
then f 9223372036854775807
|
|
~?= Just 9223372036854775807
|
|
else f x ~?= Just (fromIntegral x)
|
|
, let x = maxBound :: Word
|
|
in
|
|
if toInteger x >= 9223372036854775808
|
|
then f 9223372036854775808 ~?= Nothing
|
|
else f x ~?= Just (fromIntegral x)
|
|
]
|
|
, "TryFrom Word Int"
|
|
~: let f = hush . Witch.tryFrom @Word @Int
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, let x = maxBound :: Int
|
|
in
|
|
hush (Witch.tryFrom @Word @Int (fromIntegral x))
|
|
~?= Just x
|
|
, let x = fromIntegral (maxBound :: Int) + 1 :: Word
|
|
in hush (Witch.tryFrom @Word @Int x) ~?= Nothing
|
|
]
|
|
, "From Word Integer"
|
|
~: let f = Witch.from @Word @Integer
|
|
in [f 0 ~?= 0, f maxBound ~?= fromIntegral (maxBound :: Word)]
|
|
, "TryFrom Word Float"
|
|
~: let f = hush . Witch.tryFrom @Word @Float
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 16777215 ~?= Just 16777215
|
|
, f 16777216 ~?= Nothing
|
|
]
|
|
, "TryFrom Word Double"
|
|
~: let f = hush . Witch.tryFrom @Word @Double
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, let x = maxBound :: Word
|
|
in
|
|
if toInteger x >= 9007199254740991
|
|
then f 9007199254740991 ~?= Just 9007199254740991
|
|
else f x ~?= Just (fromIntegral x)
|
|
, let x = maxBound :: Word
|
|
in
|
|
if toInteger x >= 9007199254740992
|
|
then f 9007199254740992 ~?= Nothing
|
|
else f x ~?= Just (fromIntegral x)
|
|
]
|
|
|
|
-- Natural
|
|
, "TryFrom Natural Word8"
|
|
~: let f = hush . Witch.tryFrom @Natural.Natural @Word.Word8
|
|
in [f 0 ~?= Just 0, f 255 ~?= Just 255, f 256 ~?= Nothing]
|
|
, "TryFrom Natural Word16"
|
|
~: let f = hush . Witch.tryFrom @Natural.Natural @Word.Word16
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 65535 ~?= Just 65535
|
|
, f 65536 ~?= Nothing
|
|
]
|
|
, "TryFrom Natural Word32"
|
|
~: let f = hush . Witch.tryFrom @Natural.Natural @Word.Word32
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 4294967295 ~?= Just 4294967295
|
|
, f 4294967296 ~?= Nothing
|
|
]
|
|
, "TryFrom Natural Word64"
|
|
~: let f = hush . Witch.tryFrom @Natural.Natural @Word.Word64
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 18446744073709551615 ~?= Just 18446744073709551615
|
|
, f 18446744073709551616 ~?= Nothing
|
|
]
|
|
, "TryFrom Natural Word"
|
|
~: let f = hush . Witch.tryFrom @Natural.Natural @Word
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, let x = maxBound :: Word
|
|
in
|
|
hush
|
|
(Witch.tryFrom @Natural.Natural @Word
|
|
(fromIntegral x)
|
|
)
|
|
~?= Just x
|
|
, let
|
|
x =
|
|
fromIntegral (maxBound :: Word) + 1 :: Natural.Natural
|
|
in
|
|
hush (Witch.tryFrom @Natural.Natural @Word x)
|
|
~?= Nothing
|
|
]
|
|
, "TryFrom Natural Int8"
|
|
~: let f = hush . Witch.tryFrom @Natural.Natural @Int.Int8
|
|
in [f 0 ~?= Just 0, f 127 ~?= Just 127, f 128 ~?= Nothing]
|
|
, "TryFrom Natural Int16"
|
|
~: let f = hush . Witch.tryFrom @Natural.Natural @Int.Int16
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 32767 ~?= Just 32767
|
|
, f 32768 ~?= Nothing
|
|
]
|
|
, "TryFrom Natural Int32"
|
|
~: let f = hush . Witch.tryFrom @Natural.Natural @Int.Int32
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 2147483647 ~?= Just 2147483647
|
|
, f 2147483648 ~?= Nothing
|
|
]
|
|
, "TryFrom Natural Int64"
|
|
~: let f = hush . Witch.tryFrom @Natural.Natural @Int.Int64
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 9223372036854775807 ~?= Just 9223372036854775807
|
|
, f 9223372036854775808 ~?= Nothing
|
|
]
|
|
, "TryFrom Natural Int"
|
|
~: let f = hush . Witch.tryFrom @Natural.Natural @Int
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, let x = maxBound :: Int
|
|
in
|
|
hush
|
|
(Witch.tryFrom @Natural.Natural @Int
|
|
(fromIntegral x)
|
|
)
|
|
~?= Just x
|
|
, let
|
|
x =
|
|
fromIntegral (maxBound :: Int) + 1 :: Natural.Natural
|
|
in
|
|
hush (Witch.tryFrom @Natural.Natural @Int x) ~?= Nothing
|
|
]
|
|
, "From Natural Integer"
|
|
~: let f = Witch.from @Natural.Natural @Integer
|
|
in [f 0 ~?= 0, f 9223372036854775808 ~?= 9223372036854775808]
|
|
, "TryFrom Natural Float"
|
|
~: let f = hush . Witch.tryFrom @Natural.Natural @Float
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 16777215 ~?= Just 16777215
|
|
, f 16777216 ~?= Nothing
|
|
]
|
|
, "TryFrom Natural Double"
|
|
~: let f = hush . Witch.tryFrom @Natural.Natural @Double
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 9007199254740991 ~?= Just 9007199254740991
|
|
, f 9007199254740992 ~?= Nothing
|
|
]
|
|
|
|
-- Float
|
|
, "TryFrom Float Int8"
|
|
~: let f = hush . Witch.tryFrom @Float @Int.Int8
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 127 ~?= Just 127
|
|
, f 128 ~?= Nothing
|
|
, f (-128) ~?= Just (-128)
|
|
, f (-129) ~?= Nothing
|
|
, f (0 / 0) ~?= Nothing
|
|
, f (1 / 0) ~?= Nothing
|
|
, f (-1 / 0) ~?= Nothing
|
|
]
|
|
, "TryFrom Float Int16"
|
|
~: let f = hush . Witch.tryFrom @Float @Int.Int16
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 32767 ~?= Just 32767
|
|
, f 32768 ~?= Nothing
|
|
, f (-32768) ~?= Just (-32768)
|
|
, f (-32769) ~?= Nothing
|
|
, f (0 / 0) ~?= Nothing
|
|
, f (1 / 0) ~?= Nothing
|
|
, f (-1 / 0) ~?= Nothing
|
|
]
|
|
, "TryFrom Float Int32"
|
|
~: let f = hush . Witch.tryFrom @Float @Int.Int32
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 16777215 ~?= Just 16777215
|
|
, f 16777216 ~?= Nothing
|
|
, f (-16777215) ~?= Just (-16777215)
|
|
, f (-16777216) ~?= Nothing
|
|
, f (0 / 0) ~?= Nothing
|
|
, f (1 / 0) ~?= Nothing
|
|
, f (-1 / 0) ~?= Nothing
|
|
]
|
|
, "TryFrom Float Int64"
|
|
~: let f = hush . Witch.tryFrom @Float @Int.Int64
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 16777215 ~?= Just 16777215
|
|
, f 16777216 ~?= Nothing
|
|
, f (-16777215) ~?= Just (-16777215)
|
|
, f (-16777216) ~?= Nothing
|
|
, f (0 / 0) ~?= Nothing
|
|
, f (1 / 0) ~?= Nothing
|
|
, f (-1 / 0) ~?= Nothing
|
|
]
|
|
, "TryFrom Float Int"
|
|
~: let f = hush . Witch.tryFrom @Float @Int
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 16777215 ~?= Just 16777215
|
|
, f 16777216 ~?= Nothing
|
|
, f (-16777215) ~?= Just (-16777215)
|
|
, f (-16777216) ~?= Nothing
|
|
, f (0 / 0) ~?= Nothing
|
|
, f (1 / 0) ~?= Nothing
|
|
, f (-1 / 0) ~?= Nothing
|
|
]
|
|
, "TryFrom Float Integer"
|
|
~: let f = hush . Witch.tryFrom @Float @Integer
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 16777215 ~?= Just 16777215
|
|
, f 16777216 ~?= Nothing
|
|
, f (-16777215) ~?= Just (-16777215)
|
|
, f (-16777216) ~?= Nothing
|
|
, f (0 / 0) ~?= Nothing
|
|
, f (1 / 0) ~?= Nothing
|
|
, f (-1 / 0) ~?= Nothing
|
|
]
|
|
, "TryFrom Float Word8"
|
|
~: let f = hush . Witch.tryFrom @Float @Word.Word8
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 255 ~?= Just 255
|
|
, f 256 ~?= Nothing
|
|
, f (0 / 0) ~?= Nothing
|
|
, f (1 / 0) ~?= Nothing
|
|
, f (-1 / 0) ~?= Nothing
|
|
]
|
|
, "TryFrom Float Word16"
|
|
~: let f = hush . Witch.tryFrom @Float @Word.Word16
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 65535 ~?= Just 65535
|
|
, f 65536 ~?= Nothing
|
|
, f (0 / 0) ~?= Nothing
|
|
, f (1 / 0) ~?= Nothing
|
|
, f (-1 / 0) ~?= Nothing
|
|
]
|
|
, "TryFrom Float Word32"
|
|
~: let f = hush . Witch.tryFrom @Float @Word.Word32
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 16777215 ~?= Just 16777215
|
|
, f 16777216 ~?= Nothing
|
|
, f (0 / 0) ~?= Nothing
|
|
, f (1 / 0) ~?= Nothing
|
|
, f (-1 / 0) ~?= Nothing
|
|
]
|
|
, "TryFrom Float Word64"
|
|
~: let f = hush . Witch.tryFrom @Float @Word.Word64
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 16777215 ~?= Just 16777215
|
|
, f 16777216 ~?= Nothing
|
|
, f (0 / 0) ~?= Nothing
|
|
, f (1 / 0) ~?= Nothing
|
|
, f (-1 / 0) ~?= Nothing
|
|
]
|
|
, "TryFrom Float Word"
|
|
~: let f = hush . Witch.tryFrom @Float @Word
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 16777215 ~?= Just 16777215
|
|
, f 16777216 ~?= Nothing
|
|
, f (0 / 0) ~?= Nothing
|
|
, f (1 / 0) ~?= Nothing
|
|
, f (-1 / 0) ~?= Nothing
|
|
]
|
|
, "TryFrom Float Natural"
|
|
~: let f = hush . Witch.tryFrom @Float @Natural.Natural
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 16777215 ~?= Just 16777215
|
|
, f 16777216 ~?= Nothing
|
|
, f (0 / 0) ~?= Nothing
|
|
, f (1 / 0) ~?= Nothing
|
|
, f (-1 / 0) ~?= Nothing
|
|
]
|
|
, "TryFrom Float Rational"
|
|
~: let f = hush . Witch.tryFrom @Float @Rational
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f (-0) ~?= Just 0
|
|
, f 0.5 ~?= Just 0.5
|
|
, f (-0.5) ~?= Just (-0.5)
|
|
, f 16777215 ~?= Just 16777215
|
|
, f (-16777215) ~?= Just (-16777215)
|
|
, f 16777216 ~?= Just 16777216
|
|
, f (-16777216) ~?= Just (-16777216)
|
|
, f (0 / 0) ~?= Nothing
|
|
, f (1 / 0) ~?= Nothing
|
|
, f (-1 / 0) ~?= Nothing
|
|
, f 0.1 ~?= Just 0.1
|
|
, f (-0.1) ~?= Just (-0.1)
|
|
]
|
|
, "From Float Double"
|
|
~: let f = Witch.from @Float @Double
|
|
in
|
|
[ f 0 ~?= 0
|
|
, f 0.5 ~?= 0.5
|
|
, f (-0.5) ~?= (-0.5)
|
|
, TestCase
|
|
$ let x = f (0 / 0) in assertBool (show x) $ isNaN x
|
|
, f (1 / 0) ~?= (1 / 0)
|
|
, f (-1 / 0) ~?= (-1 / 0)
|
|
]
|
|
|
|
-- Double
|
|
, "TryFrom Double Int8"
|
|
~: let f = hush . Witch.tryFrom @Double @Int.Int8
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 127 ~?= Just 127
|
|
, f 128 ~?= Nothing
|
|
, f (-128) ~?= Just (-128)
|
|
, f (-129) ~?= Nothing
|
|
, f (0 / 0) ~?= Nothing
|
|
, f (1 / 0) ~?= Nothing
|
|
, f (-1 / 0) ~?= Nothing
|
|
]
|
|
, "TryFrom Double Int16"
|
|
~: let f = hush . Witch.tryFrom @Double @Int.Int16
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 32767 ~?= Just 32767
|
|
, f 32768 ~?= Nothing
|
|
, f (-32768) ~?= Just (-32768)
|
|
, f (-32769) ~?= Nothing
|
|
, f (0 / 0) ~?= Nothing
|
|
, f (1 / 0) ~?= Nothing
|
|
, f (-1 / 0) ~?= Nothing
|
|
]
|
|
, "TryFrom Double Int32"
|
|
~: let f = hush . Witch.tryFrom @Double @Int.Int32
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 2147483647 ~?= Just 2147483647
|
|
, f 2147483648 ~?= Nothing
|
|
, f (-2147483648) ~?= Just (-2147483648)
|
|
, f (-2147483649) ~?= Nothing
|
|
, f (0 / 0) ~?= Nothing
|
|
, f (1 / 0) ~?= Nothing
|
|
, f (-1 / 0) ~?= Nothing
|
|
]
|
|
, "TryFrom Double Int64"
|
|
~: let f = hush . Witch.tryFrom @Double @Int.Int64
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 9007199254740991 ~?= Just 9007199254740991
|
|
, f 9007199254740992 ~?= Nothing
|
|
, f (-9007199254740991) ~?= Just (-9007199254740991)
|
|
, f (-9007199254740992) ~?= Nothing
|
|
, f (0 / 0) ~?= Nothing
|
|
, f (1 / 0) ~?= Nothing
|
|
, f (-1 / 0) ~?= Nothing
|
|
]
|
|
, "TryFrom Double Int"
|
|
~: let f = hush . Witch.tryFrom @Double @Int
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, let x = maxBound :: Int
|
|
in
|
|
if toInteger x >= 9007199254740991
|
|
then f 9007199254740991 ~?= Just 9007199254740991
|
|
else f (fromIntegral x) ~?= Just x
|
|
, f 9007199254740992 ~?= Nothing
|
|
, let x = minBound :: Int
|
|
in
|
|
if toInteger x <= (-9007199254740991)
|
|
then f (-9007199254740991)
|
|
~?= Just (-9007199254740991)
|
|
else f (fromIntegral x) ~?= Just x
|
|
, f (-9007199254740992) ~?= Nothing
|
|
, f (0 / 0) ~?= Nothing
|
|
, f (1 / 0) ~?= Nothing
|
|
, f (-1 / 0) ~?= Nothing
|
|
]
|
|
, "TryFrom Double Integer"
|
|
~: let f = hush . Witch.tryFrom @Double @Integer
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 9007199254740991 ~?= Just 9007199254740991
|
|
, f 9007199254740992 ~?= Nothing
|
|
, f (-9007199254740991) ~?= Just (-9007199254740991)
|
|
, f (-9007199254740992) ~?= Nothing
|
|
, f (0 / 0) ~?= Nothing
|
|
, f (1 / 0) ~?= Nothing
|
|
, f (-1 / 0) ~?= Nothing
|
|
]
|
|
, "TryFrom Double Word8"
|
|
~: let f = hush . Witch.tryFrom @Double @Word.Word8
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 255 ~?= Just 255
|
|
, f 256 ~?= Nothing
|
|
, f (0 / 0) ~?= Nothing
|
|
, f (1 / 0) ~?= Nothing
|
|
, f (-1 / 0) ~?= Nothing
|
|
]
|
|
, "TryFrom Double Word16"
|
|
~: let f = hush . Witch.tryFrom @Double @Word.Word16
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 65535 ~?= Just 65535
|
|
, f 65536 ~?= Nothing
|
|
, f (0 / 0) ~?= Nothing
|
|
, f (1 / 0) ~?= Nothing
|
|
, f (-1 / 0) ~?= Nothing
|
|
]
|
|
, "TryFrom Double Word32"
|
|
~: let f = hush . Witch.tryFrom @Double @Word.Word32
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 4294967295 ~?= Just 4294967295
|
|
, f 4294967296 ~?= Nothing
|
|
, f (0 / 0) ~?= Nothing
|
|
, f (1 / 0) ~?= Nothing
|
|
, f (-1 / 0) ~?= Nothing
|
|
]
|
|
, "TryFrom Double Word64"
|
|
~: let f = hush . Witch.tryFrom @Double @Word.Word64
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 9007199254740991 ~?= Just 9007199254740991
|
|
, f 9007199254740992 ~?= Nothing
|
|
, f (0 / 0) ~?= Nothing
|
|
, f (1 / 0) ~?= Nothing
|
|
, f (-1 / 0) ~?= Nothing
|
|
]
|
|
, "TryFrom Double Word"
|
|
~: let f = hush . Witch.tryFrom @Double @Word
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, let x = maxBound :: Word
|
|
in
|
|
if toInteger x >= 9007199254740991
|
|
then f 9007199254740991 ~?= Just 9007199254740991
|
|
else f (fromIntegral x) ~?= Just x
|
|
, f 9007199254740992 ~?= Nothing
|
|
, f (0 / 0) ~?= Nothing
|
|
, f (1 / 0) ~?= Nothing
|
|
, f (-1 / 0) ~?= Nothing
|
|
]
|
|
, "TryFrom Double Natural"
|
|
~: let f = hush . Witch.tryFrom @Double @Natural.Natural
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f 9007199254740991 ~?= Just 9007199254740991
|
|
, f 9007199254740992 ~?= Nothing
|
|
, f (0 / 0) ~?= Nothing
|
|
, f (1 / 0) ~?= Nothing
|
|
, f (-1 / 0) ~?= Nothing
|
|
]
|
|
, "TryFrom Double Rational"
|
|
~: let f = hush . Witch.tryFrom @Double @Rational
|
|
in
|
|
[ f 0 ~?= Just 0
|
|
, f (-0) ~?= Just 0
|
|
, f 0.5 ~?= Just 0.5
|
|
, f (-0.5) ~?= Just (-0.5)
|
|
, f 9007199254740991 ~?= Just 9007199254740991
|
|
, f (-9007199254740991) ~?= Just (-9007199254740991)
|
|
, f 9007199254740992 ~?= Just 9007199254740992
|
|
, f (-9007199254740992) ~?= Just (-9007199254740992)
|
|
, f (0 / 0) ~?= Nothing
|
|
, f (1 / 0) ~?= Nothing
|
|
, f (-1 / 0) ~?= Nothing
|
|
, f 0.1 ~?= Just 0.1
|
|
, f (-0.1) ~?= Just (-0.1)
|
|
]
|
|
, "From Double Float"
|
|
~: let f = Witch.from @Double @Float
|
|
in
|
|
[ f 0 ~?= 0
|
|
, f 0.5 ~?= 0.5
|
|
, f (-0.5) ~?= (-0.5)
|
|
, TestCase
|
|
$ let x = f (0 / 0) in assertBool (show x) $ isNaN x
|
|
, f (1 / 0) ~?= (1 / 0)
|
|
, f (-1 / 0) ~?= (-1 / 0)
|
|
]
|
|
|
|
-- Ratio
|
|
, "From a (Ratio a)"
|
|
~: let f = Witch.from @Int @(Ratio.Ratio Int)
|
|
in [Witch.from @Integer @Rational 0 ~?= 0, f 0 ~?= 0]
|
|
, "TryFrom (Ratio a) a"
|
|
~: let f = hush . Witch.tryFrom @(Ratio.Ratio Int) @Int
|
|
in
|
|
[ hush (Witch.tryFrom @Rational @Integer 0) ~?= Just 0
|
|
, hush (Witch.tryFrom @Rational @Integer 0.5) ~?= Nothing
|
|
, f 0 ~?= Just 0
|
|
, f 0.5 ~?= Nothing
|
|
]
|
|
, "From Rational Float"
|
|
~: let f = Witch.from @Rational @Float
|
|
in
|
|
[ f 0 ~?= 0
|
|
, f 0.5 ~?= 0.5
|
|
, f (-0.5) ~?= (-0.5)
|
|
, f 0.1 ~?= 0.1
|
|
, f (-0.1) ~?= (-0.1)
|
|
]
|
|
, "From Rational Double"
|
|
~: let f = Witch.from @Rational @Double
|
|
in
|
|
[ f 0 ~?= 0
|
|
, f 0.5 ~?= 0.5
|
|
, f (-0.5) ~?= (-0.5)
|
|
, f 0.1 ~?= 0.1
|
|
, f (-0.1) ~?= (-0.1)
|
|
]
|
|
, "TryFrom Rational (Fixed a)"
|
|
~: let f = hush . Witch.tryFrom @Rational @Fixed.Deci
|
|
in
|
|
[ hush (Witch.tryFrom @Rational @Fixed.Uni 1) ~?= Just 1
|
|
, hush (Witch.tryFrom @Rational @Fixed.Uni 1.2) ~?= Nothing
|
|
, f 0.1 ~?= Just 0.1
|
|
, f 1.2 ~?= Just 1.2
|
|
, f 12.3 ~?= Just 12.3
|
|
, f 0.12 ~?= Nothing
|
|
]
|
|
|
|
-- Fixed
|
|
, "From Integer (Fixed a)"
|
|
~: let f = Witch.from @Integer @Fixed.Deci
|
|
in
|
|
[ Witch.from @Integer @Fixed.Uni 1 ~?= 1
|
|
, f 1 ~?= 0.1
|
|
, f 10 ~?= 1
|
|
, f 120 ~?= 12
|
|
]
|
|
, "From (Fixed a) Integer"
|
|
~: let f = Witch.from @Fixed.Deci @Integer
|
|
in
|
|
[ Witch.from @Fixed.Uni @Integer 1 ~?= 1
|
|
, f 0.1 ~?= 1
|
|
, f 1 ~?= 10
|
|
, f 12 ~?= 120
|
|
]
|
|
, "From (Fixed a) Rational"
|
|
~: let f = Witch.from @Fixed.Deci @Rational
|
|
in
|
|
[ Witch.from @Fixed.Uni @Rational 1 ~?= 1
|
|
, f 0.1 ~?= 0.1
|
|
, f 1 ~?= 1
|
|
, f 12 ~?= 12
|
|
]
|
|
|
|
-- Complex
|
|
, "From a (Complex a)"
|
|
~: let f = Witch.from @Float @(Complex.Complex Float)
|
|
in
|
|
[ Witch.from @Double @(Complex.Complex Double) 1 ~?= 1
|
|
, f 1 ~?= 1
|
|
]
|
|
, "TryFrom (Complex a) a"
|
|
~: let f = hush . Witch.tryFrom @(Complex.Complex Float) @Float
|
|
in
|
|
[ hush (Witch.tryFrom @(Complex.Complex Double) @Double 1)
|
|
~?= Just 1
|
|
, hush
|
|
(Witch.tryFrom @(Complex.Complex Double) @Double
|
|
(0 Complex.:+ 1)
|
|
)
|
|
~?= Nothing
|
|
, f 1 ~?= Just 1
|
|
, f (0 Complex.:+ 1) ~?= Nothing
|
|
]
|
|
|
|
-- NonEmpty
|
|
, "TryFrom [a] (NonEmpty a)"
|
|
~: let f = hush . Witch.tryFrom @[Int] @(NonEmpty.NonEmpty Int)
|
|
in
|
|
[ f [] ~?= Nothing
|
|
, f [1] ~?= Just (1 NonEmpty.:| [])
|
|
, f [1, 2] ~?= Just (1 NonEmpty.:| [2])
|
|
]
|
|
, "From (NonEmpty a) [a]"
|
|
~: let f = Witch.from @(NonEmpty.NonEmpty Int) @[Int]
|
|
in
|
|
[ f (1 NonEmpty.:| []) ~?= [1]
|
|
, f (1 NonEmpty.:| [2]) ~?= [1, 2]
|
|
]
|
|
|
|
-- Set
|
|
, "From [a] (Set a)"
|
|
~: let f = Witch.from @[Char] @(Set.Set Char)
|
|
in
|
|
[ f [] ~?= Set.fromList []
|
|
, f ['a'] ~?= Set.fromList ['a']
|
|
, f ['a', 'b'] ~?= Set.fromList ['a', 'b']
|
|
, f ['a', 'a'] ~?= Set.fromList ['a']
|
|
]
|
|
, "From (Set a) [a]"
|
|
~: let f = Witch.from @(Set.Set Char) @[Char]
|
|
in
|
|
[ f (Set.fromList []) ~?= []
|
|
, f (Set.fromList ['a']) ~?= ['a']
|
|
, f (Set.fromList ['a', 'b']) ~?= ['a', 'b']
|
|
]
|
|
|
|
-- IntSet
|
|
, "From [Int] IntSet"
|
|
~: let f = Witch.from @[Int] @IntSet.IntSet
|
|
in
|
|
[ f [] ~?= IntSet.fromList []
|
|
, f [1] ~?= IntSet.fromList [1]
|
|
, f [1, 2] ~?= IntSet.fromList [1, 2]
|
|
]
|
|
, "From IntSet [Int]"
|
|
~: let f = Witch.from @IntSet.IntSet @[Int]
|
|
in
|
|
[ f (IntSet.fromList []) ~?= []
|
|
, f (IntSet.fromList [1]) ~?= [1]
|
|
, f (IntSet.fromList [1, 2]) ~?= [1, 2]
|
|
]
|
|
|
|
-- Map
|
|
, "From [(k, v)] (Map k v)"
|
|
~: let f = Witch.from @[(Char, Int)] @(Map.Map Char Int)
|
|
in
|
|
[ f [] ~?= Map.empty
|
|
, f [('a', 1)] ~?= Map.fromList [('a', 1)]
|
|
, f [('a', 1), ('b', 2)]
|
|
~?= Map.fromList [('a', 1), ('b', 2)]
|
|
, f [('a', 1), ('a', 2)] ~?= Map.fromList [('a', 2)]
|
|
]
|
|
, "From (Map k v) [(k, v)]"
|
|
~: let f = Witch.from @(Map.Map Char Int) @[(Char, Int)]
|
|
in
|
|
[ f Map.empty ~?= []
|
|
, f (Map.fromList [('a', 1)]) ~?= [('a', 1)]
|
|
, f (Map.fromList [('a', 1), ('b', 2)])
|
|
~?= [('a', 1), ('b', 2)]
|
|
]
|
|
|
|
-- IntMap
|
|
, "From [(Int, v)] (IntMap v)"
|
|
~: let f = Witch.from @[(Int, Char)] @(IntMap.IntMap Char)
|
|
in
|
|
[ f [] ~?= IntMap.fromList []
|
|
, f [(1, 'a')] ~?= IntMap.fromList [(1, 'a')]
|
|
, f [(1, 'a'), (2, 'b')]
|
|
~?= IntMap.fromList [(1, 'a'), (2, 'b')]
|
|
, f [(1, 'a'), (1, 'b')] ~?= IntMap.fromList [(1, 'b')]
|
|
]
|
|
, "From (IntMap v) [(Int, v)]"
|
|
~: let f = Witch.from @(IntMap.IntMap Char) @[(Int, Char)]
|
|
in
|
|
[ f (IntMap.fromList []) ~?= []
|
|
, f (IntMap.fromList [(1, 'a')]) ~?= [(1, 'a')]
|
|
, f (IntMap.fromList [(1, 'a'), (2, 'b')])
|
|
~?= [(1, 'a'), (2, 'b')]
|
|
]
|
|
|
|
-- Seq
|
|
, "From [a] (Seq a)"
|
|
~: let f = Witch.from @[Int] @(Seq.Seq Int)
|
|
in
|
|
[ f [] ~?= Seq.fromList []
|
|
, f [1] ~?= Seq.fromList [1]
|
|
, f [1, 2] ~?= Seq.fromList [1, 2]
|
|
]
|
|
, "From (Seq a) [a]"
|
|
~: let f = Witch.from @(Seq.Seq Int) @[Int]
|
|
in
|
|
[ f (Seq.fromList []) ~?= []
|
|
, f (Seq.fromList [1]) ~?= [1]
|
|
, f (Seq.fromList [1, 2]) ~?= [1, 2]
|
|
]
|
|
|
|
-- ByteString
|
|
, "From [Word8] ByteString"
|
|
~: let f = Witch.from @[Word.Word8] @ByteString.ByteString
|
|
in
|
|
[ f [] ~?= ByteString.pack []
|
|
, f [0x00] ~?= ByteString.pack [0x00]
|
|
, f [0x0f, 0xf0] ~?= ByteString.pack [0x0f, 0xf0]
|
|
]
|
|
, "From ByteString [Word8]"
|
|
~: let f = Witch.from @ByteString.ByteString @[Word.Word8]
|
|
in
|
|
[ f (ByteString.pack []) ~?= []
|
|
, f (ByteString.pack [0x00]) ~?= [0x00]
|
|
, f (ByteString.pack [0x0f, 0xf0]) ~?= [0x0f, 0xf0]
|
|
]
|
|
, "From ByteString LazyByteString"
|
|
~: let
|
|
f =
|
|
Witch.from @ByteString.ByteString
|
|
@LazyByteString.ByteString
|
|
in
|
|
[ f (ByteString.pack []) ~?= LazyByteString.pack []
|
|
, f (ByteString.pack [0x00]) ~?= LazyByteString.pack [0x00]
|
|
, f (ByteString.pack [0x0f, 0xf0])
|
|
~?= LazyByteString.pack [0x0f, 0xf0]
|
|
]
|
|
, "From ByteString ShortByteString"
|
|
~: let
|
|
f =
|
|
Witch.from @ByteString.ByteString
|
|
@ShortByteString.ShortByteString
|
|
in
|
|
[ f (ByteString.pack []) ~?= ShortByteString.pack []
|
|
, f (ByteString.pack [0x00]) ~?= ShortByteString.pack [0x00]
|
|
, f (ByteString.pack [0x0f, 0xf0])
|
|
~?= ShortByteString.pack [0x0f, 0xf0]
|
|
]
|
|
, "TryFrom ByteString Text"
|
|
~: let
|
|
f = hush . Witch.tryFrom @ByteString.ByteString @Text.Text
|
|
in
|
|
[ f (ByteString.pack []) ~?= Just (Text.pack "")
|
|
, f (ByteString.pack [0x61]) ~?= Just (Text.pack "a")
|
|
, f (ByteString.pack [0xff]) ~?= Nothing
|
|
]
|
|
, "TryFrom ByteString LazyText"
|
|
~: let
|
|
f =
|
|
hush . Witch.tryFrom @ByteString.ByteString @LazyText.Text
|
|
in
|
|
[ f (ByteString.pack []) ~?= Just (LazyText.pack "")
|
|
, f (ByteString.pack [0x61]) ~?= Just (LazyText.pack "a")
|
|
, f (ByteString.pack [0xff]) ~?= Nothing
|
|
]
|
|
, "TryFrom ByteString String"
|
|
~: let f = hush . Witch.tryFrom @ByteString.ByteString @String
|
|
in
|
|
[ f (ByteString.pack []) ~?= Just ""
|
|
, f (ByteString.pack [0x61]) ~?= Just "a"
|
|
, f (ByteString.pack [0xff]) ~?= Nothing
|
|
]
|
|
|
|
-- LazyByteString
|
|
, "From [Word8] LazyByteString"
|
|
~: let f = Witch.from @[Word.Word8] @LazyByteString.ByteString
|
|
in
|
|
[ f [] ~?= LazyByteString.pack []
|
|
, f [0x00] ~?= LazyByteString.pack [0x00]
|
|
, f [0x0f, 0xf0] ~?= LazyByteString.pack [0x0f, 0xf0]
|
|
]
|
|
, "From LazyByteString [Word8]"
|
|
~: let f = Witch.from @LazyByteString.ByteString @[Word.Word8]
|
|
in
|
|
[ f (LazyByteString.pack []) ~?= []
|
|
, f (LazyByteString.pack [0x00]) ~?= [0x00]
|
|
, f (LazyByteString.pack [0x0f, 0xf0]) ~?= [0x0f, 0xf0]
|
|
]
|
|
, "From LazyByteString ByteString"
|
|
~: let
|
|
f =
|
|
Witch.from @LazyByteString.ByteString
|
|
@ByteString.ByteString
|
|
in
|
|
[ f (LazyByteString.pack []) ~?= ByteString.pack []
|
|
, f (LazyByteString.pack [0x00]) ~?= ByteString.pack [0x00]
|
|
, f (LazyByteString.pack [0x0f, 0xf0])
|
|
~?= ByteString.pack [0x0f, 0xf0]
|
|
]
|
|
, "TryFrom LazyByteString LazyText"
|
|
~: let
|
|
f =
|
|
hush
|
|
. Witch.tryFrom @LazyByteString.ByteString
|
|
@LazyText.Text
|
|
in
|
|
[ f (LazyByteString.pack []) ~?= Just (LazyText.pack "")
|
|
, f (LazyByteString.pack [0x61])
|
|
~?= Just (LazyText.pack "a")
|
|
, f (LazyByteString.pack [0xff]) ~?= Nothing
|
|
]
|
|
, "TryFrom LazyByteString Text"
|
|
~: let
|
|
f =
|
|
hush . Witch.tryFrom @LazyByteString.ByteString @Text.Text
|
|
in
|
|
[ f (LazyByteString.pack []) ~?= Just (Text.pack "")
|
|
, f (LazyByteString.pack [0x61]) ~?= Just (Text.pack "a")
|
|
, f (LazyByteString.pack [0xff]) ~?= Nothing
|
|
]
|
|
, "TryFrom LazyByteString String"
|
|
~: let
|
|
f = hush . Witch.tryFrom @LazyByteString.ByteString @String
|
|
in
|
|
[ f (LazyByteString.pack []) ~?= Just ""
|
|
, f (LazyByteString.pack [0x61]) ~?= Just "a"
|
|
, f (LazyByteString.pack [0xff]) ~?= Nothing
|
|
]
|
|
|
|
-- ShortByteString
|
|
, "From [Word8] ShortByteString"
|
|
~: let
|
|
f =
|
|
Witch.from @[Word.Word8] @ShortByteString.ShortByteString
|
|
in
|
|
[ f [] ~?= ShortByteString.pack []
|
|
, f [0x00] ~?= ShortByteString.pack [0x00]
|
|
, f [0x0f, 0xf0] ~?= ShortByteString.pack [0x0f, 0xf0]
|
|
]
|
|
, "From ShortByteString [Word8]"
|
|
~: let
|
|
f =
|
|
Witch.from @ShortByteString.ShortByteString @[Word.Word8]
|
|
in
|
|
[ f (ShortByteString.pack []) ~?= []
|
|
, f (ShortByteString.pack [0x00]) ~?= [0x00]
|
|
, f (ShortByteString.pack [0x0f, 0xf0]) ~?= [0x0f, 0xf0]
|
|
]
|
|
, "From ShortByteString ByteString"
|
|
~: let
|
|
f =
|
|
Witch.from @ShortByteString.ShortByteString
|
|
@ByteString.ByteString
|
|
in
|
|
[ f (ShortByteString.pack []) ~?= ByteString.pack []
|
|
, f (ShortByteString.pack [0x00]) ~?= ByteString.pack [0x00]
|
|
, f (ShortByteString.pack [0x0f, 0xf0])
|
|
~?= ByteString.pack [0x0f, 0xf0]
|
|
]
|
|
|
|
-- Text
|
|
, "From Text LazyText"
|
|
~: let f = Witch.from @Text.Text @LazyText.Text
|
|
in
|
|
[ f (Text.pack "") ~?= LazyText.pack ""
|
|
, f (Text.pack "a") ~?= LazyText.pack "a"
|
|
, f (Text.pack "ab") ~?= LazyText.pack "ab"
|
|
]
|
|
, "From Text ByteString"
|
|
~: let f = Witch.from @Text.Text @ByteString.ByteString
|
|
in
|
|
[ f (Text.pack "") ~?= ByteString.pack []
|
|
, f (Text.pack "a") ~?= ByteString.pack [0x61]
|
|
]
|
|
, "From Text LazyByteString"
|
|
~: let f = Witch.from @Text.Text @LazyByteString.ByteString
|
|
in
|
|
[ f (Text.pack "") ~?= LazyByteString.pack []
|
|
, f (Text.pack "a") ~?= LazyByteString.pack [0x61]
|
|
]
|
|
|
|
-- LazyText
|
|
, "From LazyText Text"
|
|
~: let f = Witch.from @LazyText.Text @Text.Text
|
|
in
|
|
[ f (LazyText.pack "") ~?= Text.pack ""
|
|
, f (LazyText.pack "a") ~?= Text.pack "a"
|
|
, f (LazyText.pack "ab") ~?= Text.pack "ab"
|
|
]
|
|
, "From LazyText LazyByteString"
|
|
~: let f = Witch.from @LazyText.Text @LazyByteString.ByteString
|
|
in
|
|
[ f (LazyText.pack "") ~?= LazyByteString.pack []
|
|
, f (LazyText.pack "a") ~?= LazyByteString.pack [0x61]
|
|
]
|
|
, "From LazyText ByteString"
|
|
~: let f = Witch.from @LazyText.Text @ByteString.ByteString
|
|
in
|
|
[ f (LazyText.pack "") ~?= ByteString.pack []
|
|
, f (LazyText.pack "a") ~?= ByteString.pack [0x61]
|
|
]
|
|
|
|
-- String
|
|
, "From String Text"
|
|
~: let f = Witch.from @String @Text.Text
|
|
in
|
|
[ f "" ~?= Text.pack ""
|
|
, f "a" ~?= Text.pack "a"
|
|
, f "ab" ~?= Text.pack "ab"
|
|
]
|
|
, "From Text String"
|
|
~: let f = Witch.from @Text.Text @String
|
|
in
|
|
[ f (Text.pack "") ~?= ""
|
|
, f (Text.pack "a") ~?= "a"
|
|
, f (Text.pack "ab") ~?= "ab"
|
|
]
|
|
, "From String LazyText"
|
|
~: let f = Witch.from @String @LazyText.Text
|
|
in
|
|
[ f "" ~?= LazyText.pack ""
|
|
, f "a" ~?= LazyText.pack "a"
|
|
, f "ab" ~?= LazyText.pack "ab"
|
|
]
|
|
, "From LazyText String"
|
|
~: let f = Witch.from @LazyText.Text @String
|
|
in
|
|
[ f (LazyText.pack "") ~?= ""
|
|
, f (LazyText.pack "a") ~?= "a"
|
|
, f (LazyText.pack "ab") ~?= "ab"
|
|
]
|
|
, "From String ByteString"
|
|
~: let f = Witch.from @String @ByteString.ByteString
|
|
in
|
|
[ f "" ~?= ByteString.pack []
|
|
, f "a" ~?= ByteString.pack [0x61]
|
|
]
|
|
, "From String LazyByteString"
|
|
~: let f = Witch.from @String @LazyByteString.ByteString
|
|
in
|
|
[ f "" ~?= LazyByteString.pack []
|
|
, f "a" ~?= LazyByteString.pack [0x61]
|
|
]
|
|
|
|
-- Day
|
|
, "From Integer Day"
|
|
~: let f = Witch.from @Integer @Time.Day
|
|
in [f 0 ~?= Time.ModifiedJulianDay 0]
|
|
, "From Day Integer"
|
|
~: let f = Witch.from @Time.Day @Integer
|
|
in [f (Time.ModifiedJulianDay 0) ~?= 0]
|
|
|
|
-- DayOfWeek
|
|
, "From Day DayOfWeek"
|
|
~: let f = Witch.from @Time.Day @Time.DayOfWeek
|
|
in [f (Time.ModifiedJulianDay 0) ~?= Time.Wednesday]
|
|
|
|
-- UniversalTime
|
|
, "From Rational UniversalTime"
|
|
~: let f = Witch.from @Rational @Time.UniversalTime
|
|
in [f 0 ~?= Time.ModJulianDate 0]
|
|
, "From UniversalTime Rational"
|
|
~: let f = Witch.from @Time.UniversalTime @Rational
|
|
in [f (Time.ModJulianDate 0) ~?= 0]
|
|
|
|
-- DiffTime
|
|
, "From Pico DiffTime"
|
|
~: let f = Witch.from @Fixed.Pico @Time.DiffTime in [f 0 ~?= 0]
|
|
, "From DiffTime Pico"
|
|
~: let f = Witch.from @Time.DiffTime @Fixed.Pico in [f 0 ~?= 0]
|
|
|
|
-- NominalDiffTime
|
|
, "From Pico NominalDiffTime"
|
|
~: let f = Witch.from @Fixed.Pico @Time.NominalDiffTime
|
|
in [f 0 ~?= 0]
|
|
, "From NominalDiffTime Pico"
|
|
~: let f = Witch.from @Time.NominalDiffTime @Fixed.Pico
|
|
in [f 0 ~?= 0]
|
|
|
|
-- POSIXTime
|
|
, "From SystemTime POSIXTime"
|
|
~: let f = Witch.from @Time.SystemTime @Time.POSIXTime
|
|
in [f (Time.MkSystemTime 0 0) ~?= 0]
|
|
, "From UTCTime POSIXTime"
|
|
~: let f = Witch.from @Time.UTCTime @Time.POSIXTime
|
|
in [f unixEpoch ~?= 0]
|
|
, "From POSIXTime UTCTime"
|
|
~: let f = Witch.from @Time.POSIXTime @Time.UTCTime
|
|
in [f 0 ~?= unixEpoch]
|
|
|
|
-- SystemTime
|
|
, "From UTCTime SystemTime"
|
|
~: let f = Witch.from @Time.UTCTime @Time.SystemTime
|
|
in [f unixEpoch ~?= Time.MkSystemTime 0 0]
|
|
, "From SystemTime AbsoluteTime"
|
|
~: let f = Witch.from @Time.SystemTime @Time.AbsoluteTime
|
|
in [f (Time.MkSystemTime (-3506716800) 0) ~?= Time.taiEpoch]
|
|
, "From SystemTime UTCTime"
|
|
~: let f = Witch.from @Time.SystemTime @Time.UTCTime
|
|
in [f (Time.MkSystemTime 0 0) ~?= unixEpoch]
|
|
|
|
-- TimeOfDay
|
|
, "From DiffTime TimeOfDay"
|
|
~: let f = Witch.from @Time.DiffTime @Time.TimeOfDay
|
|
in [f 0 ~?= Time.TimeOfDay 0 0 0]
|
|
, "From Rational TimeOfDay"
|
|
~: let f = Witch.from @Rational @Time.TimeOfDay
|
|
in [f 0 ~?= Time.TimeOfDay 0 0 0]
|
|
, "From TimeOfDay DiffTime"
|
|
~: let f = Witch.from @Time.TimeOfDay @Time.DiffTime
|
|
in [f (Time.TimeOfDay 0 0 0) ~?= 0]
|
|
, "From TimeOfDay Rational"
|
|
~: let f = Witch.from @Time.TimeOfDay @Rational
|
|
in [f (Time.TimeOfDay 0 0 0) ~?= 0]
|
|
|
|
-- CalendarDiffTime
|
|
, "From CalendarDiffDays CalendarDiffTime"
|
|
~: let
|
|
f =
|
|
Witch.from @Time.CalendarDiffDays @Time.CalendarDiffTime
|
|
in
|
|
[ f (Time.CalendarDiffDays 0 0)
|
|
~?= Time.CalendarDiffTime 0 0
|
|
]
|
|
, "From NominalDiffTime CalendarDiffTime"
|
|
~: let
|
|
f = Witch.from @Time.NominalDiffTime @Time.CalendarDiffTime
|
|
in [f 0 ~?= Time.CalendarDiffTime 0 0]
|
|
|
|
-- ZonedTime
|
|
, "From ZonedTime UTCTime"
|
|
~: let f = Witch.from @Time.ZonedTime @Time.UTCTime
|
|
in
|
|
[ f
|
|
(Time.ZonedTime
|
|
(Time.LocalTime
|
|
(Time.ModifiedJulianDay 0)
|
|
(Time.TimeOfDay 0 0 0)
|
|
)
|
|
Time.utc
|
|
)
|
|
~?= Time.UTCTime (Time.ModifiedJulianDay 0) 0
|
|
]
|
|
]
|
|
]
|
|
|
|
unixEpoch :: Time.UTCTime
|
|
unixEpoch = Time.UTCTime (Time.ModifiedJulianDay 40587) 0
|
|
|
|
hush :: Either x a -> Maybe a
|
|
hush = either (const Nothing) Just
|
|
|
|
newtype Age
|
|
= Age Int.Int8
|
|
deriving (Eq, Show)
|
|
|
|
instance Witch.From Age Int.Int8
|
|
|
|
instance Witch.From Int.Int8 Age
|