{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}

module LargeNumberTest where

import Data.Word

import Init

share
    [mkPersist sqlSettings{mpsGeneric = True}, mkMigrate "numberMigrate"]
    [persistLowerCase|
  Number
    intx Int
    int32 Int32
    word32 Word32
    int64 Int64
    word64 Word64
    deriving Show Eq
|]

cleanDB
    :: (Runner backend m) => ReaderT backend m ()
cleanDB :: forall backend (m :: * -> *).
Runner backend m =>
ReaderT backend m ()
cleanDB = do
    [Filter (NumberGeneric backend)] -> ReaderT backend m ()
forall backend (m :: * -> *) record.
(PersistQueryWrite backend, MonadIO m,
 PersistRecordBackend record backend) =>
[Filter record] -> ReaderT backend m ()
forall (m :: * -> *) record.
(MonadIO m, PersistRecordBackend record backend) =>
[Filter record] -> ReaderT backend m ()
deleteWhere ([] :: [Filter (NumberGeneric backend)])

specsWith :: (Runner backend m) => RunDb backend m -> Spec
specsWith :: forall backend (m :: * -> *).
Runner backend m =>
RunDb backend m -> Spec
specsWith RunDb backend m
runDb = String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Large Numbers" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
    String -> IO () -> SpecWith (Arg (IO ()))
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"preserves their values in the database" (IO () -> SpecWith (Arg (IO ())))
-> IO () -> SpecWith (Arg (IO ()))
forall a b. (a -> b) -> a -> b
$ RunDb backend m
runDb RunDb backend m -> RunDb backend m
forall a b. (a -> b) -> a -> b
$ do
        let
            go :: record -> ReaderT backend m ()
go record
x = do
                Key record
xid <- record -> ReaderT backend m (Key record)
forall backend record (m :: * -> *).
(PersistStoreWrite backend, MonadIO m,
 PersistRecordBackend record backend, SafeToInsert record) =>
record -> ReaderT backend m (Key record)
forall record (m :: * -> *).
(MonadIO m, PersistRecordBackend record backend,
 SafeToInsert record) =>
record -> ReaderT backend m (Key record)
insert record
x
                Maybe record
x' <- Key record -> ReaderT backend m (Maybe record)
forall backend record (m :: * -> *).
(PersistStoreRead backend, MonadIO m,
 PersistRecordBackend record backend) =>
Key record -> ReaderT backend m (Maybe record)
forall record (m :: * -> *).
(MonadIO m, PersistRecordBackend record backend) =>
Key record -> ReaderT backend m (Maybe record)
get Key record
xid
                IO () -> ReaderT backend m ()
forall a. IO a -> ReaderT backend m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ReaderT backend m ()) -> IO () -> ReaderT backend m ()
forall a b. (a -> b) -> a -> b
$ Maybe record
x' Maybe record -> Maybe record -> IO ()
forall a. (HasCallStack, Eq a, Show a) => a -> a -> IO ()
@?= record -> Maybe record
forall a. a -> Maybe a
Just record
x

        NumberGeneric backend -> ReaderT backend m ()
forall {record} {backend} {m :: * -> *}.
(PersistEntityBackend record ~ BaseBackend backend, MonadIO m,
 PersistStoreWrite backend, PersistEntity record,
 SafeToInsert record, Show record, Eq record) =>
record -> ReaderT backend m ()
go (NumberGeneric backend -> ReaderT backend m ())
-> NumberGeneric backend -> ReaderT backend m ()
forall a b. (a -> b) -> a -> b
$ Int -> Int32 -> Word32 -> Int64 -> Word64 -> NumberGeneric backend
forall backend.
Int -> Int32 -> Word32 -> Int64 -> Word64 -> NumberGeneric backend
Number Int
forall a. Bounded a => a
maxBound Int32
0 Word32
0 Int64
0 Word64
0
        NumberGeneric backend -> ReaderT backend m ()
forall {record} {backend} {m :: * -> *}.
(PersistEntityBackend record ~ BaseBackend backend, MonadIO m,
 PersistStoreWrite backend, PersistEntity record,
 SafeToInsert record, Show record, Eq record) =>
record -> ReaderT backend m ()
go (NumberGeneric backend -> ReaderT backend m ())
-> NumberGeneric backend -> ReaderT backend m ()
forall a b. (a -> b) -> a -> b
$ Int -> Int32 -> Word32 -> Int64 -> Word64 -> NumberGeneric backend
forall backend.
Int -> Int32 -> Word32 -> Int64 -> Word64 -> NumberGeneric backend
Number Int
0 Int32
forall a. Bounded a => a
maxBound Word32
0 Int64
0 Word64
0
        NumberGeneric backend -> ReaderT backend m ()
forall {record} {backend} {m :: * -> *}.
(PersistEntityBackend record ~ BaseBackend backend, MonadIO m,
 PersistStoreWrite backend, PersistEntity record,
 SafeToInsert record, Show record, Eq record) =>
record -> ReaderT backend m ()
go (NumberGeneric backend -> ReaderT backend m ())
-> NumberGeneric backend -> ReaderT backend m ()
forall a b. (a -> b) -> a -> b
$ Int -> Int32 -> Word32 -> Int64 -> Word64 -> NumberGeneric backend
forall backend.
Int -> Int32 -> Word32 -> Int64 -> Word64 -> NumberGeneric backend
Number Int
0 Int32
0 Word32
forall a. Bounded a => a
maxBound Int64
0 Word64
0
        NumberGeneric backend -> ReaderT backend m ()
forall {record} {backend} {m :: * -> *}.
(PersistEntityBackend record ~ BaseBackend backend, MonadIO m,
 PersistStoreWrite backend, PersistEntity record,
 SafeToInsert record, Show record, Eq record) =>
record -> ReaderT backend m ()
go (NumberGeneric backend -> ReaderT backend m ())
-> NumberGeneric backend -> ReaderT backend m ()
forall a b. (a -> b) -> a -> b
$ Int -> Int32 -> Word32 -> Int64 -> Word64 -> NumberGeneric backend
forall backend.
Int -> Int32 -> Word32 -> Int64 -> Word64 -> NumberGeneric backend
Number Int
0 Int32
0 Word32
0 Int64
forall a. Bounded a => a
maxBound Word64
0
        NumberGeneric backend -> ReaderT backend m ()
forall {record} {backend} {m :: * -> *}.
(PersistEntityBackend record ~ BaseBackend backend, MonadIO m,
 PersistStoreWrite backend, PersistEntity record,
 SafeToInsert record, Show record, Eq record) =>
record -> ReaderT backend m ()
go (NumberGeneric backend -> ReaderT backend m ())
-> NumberGeneric backend -> ReaderT backend m ()
forall a b. (a -> b) -> a -> b
$ Int -> Int32 -> Word32 -> Int64 -> Word64 -> NumberGeneric backend
forall backend.
Int -> Int32 -> Word32 -> Int64 -> Word64 -> NumberGeneric backend
Number Int
0 Int32
0 Word32
0 Int64
0 Word64
forall a. Bounded a => a
maxBound

        NumberGeneric backend -> ReaderT backend m ()
forall {record} {backend} {m :: * -> *}.
(PersistEntityBackend record ~ BaseBackend backend, MonadIO m,
 PersistStoreWrite backend, PersistEntity record,
 SafeToInsert record, Show record, Eq record) =>
record -> ReaderT backend m ()
go (NumberGeneric backend -> ReaderT backend m ())
-> NumberGeneric backend -> ReaderT backend m ()
forall a b. (a -> b) -> a -> b
$ Int -> Int32 -> Word32 -> Int64 -> Word64 -> NumberGeneric backend
forall backend.
Int -> Int32 -> Word32 -> Int64 -> Word64 -> NumberGeneric backend
Number Int
forall a. Bounded a => a
minBound Int32
0 Word32
0 Int64
0 Word64
0
        NumberGeneric backend -> ReaderT backend m ()
forall {record} {backend} {m :: * -> *}.
(PersistEntityBackend record ~ BaseBackend backend, MonadIO m,
 PersistStoreWrite backend, PersistEntity record,
 SafeToInsert record, Show record, Eq record) =>
record -> ReaderT backend m ()
go (NumberGeneric backend -> ReaderT backend m ())
-> NumberGeneric backend -> ReaderT backend m ()
forall a b. (a -> b) -> a -> b
$ Int -> Int32 -> Word32 -> Int64 -> Word64 -> NumberGeneric backend
forall backend.
Int -> Int32 -> Word32 -> Int64 -> Word64 -> NumberGeneric backend
Number Int
0 Int32
forall a. Bounded a => a
minBound Word32
0 Int64
0 Word64
0
        NumberGeneric backend -> ReaderT backend m ()
forall {record} {backend} {m :: * -> *}.
(PersistEntityBackend record ~ BaseBackend backend, MonadIO m,
 PersistStoreWrite backend, PersistEntity record,
 SafeToInsert record, Show record, Eq record) =>
record -> ReaderT backend m ()
go (NumberGeneric backend -> ReaderT backend m ())
-> NumberGeneric backend -> ReaderT backend m ()
forall a b. (a -> b) -> a -> b
$ Int -> Int32 -> Word32 -> Int64 -> Word64 -> NumberGeneric backend
forall backend.
Int -> Int32 -> Word32 -> Int64 -> Word64 -> NumberGeneric backend
Number Int
0 Int32
0 Word32
forall a. Bounded a => a
minBound Int64
0 Word64
0
        NumberGeneric backend -> ReaderT backend m ()
forall {record} {backend} {m :: * -> *}.
(PersistEntityBackend record ~ BaseBackend backend, MonadIO m,
 PersistStoreWrite backend, PersistEntity record,
 SafeToInsert record, Show record, Eq record) =>
record -> ReaderT backend m ()
go (NumberGeneric backend -> ReaderT backend m ())
-> NumberGeneric backend -> ReaderT backend m ()
forall a b. (a -> b) -> a -> b
$ Int -> Int32 -> Word32 -> Int64 -> Word64 -> NumberGeneric backend
forall backend.
Int -> Int32 -> Word32 -> Int64 -> Word64 -> NumberGeneric backend
Number Int
0 Int32
0 Word32
0 Int64
forall a. Bounded a => a
minBound Word64
0
        NumberGeneric backend -> ReaderT backend m ()
forall {record} {backend} {m :: * -> *}.
(PersistEntityBackend record ~ BaseBackend backend, MonadIO m,
 PersistStoreWrite backend, PersistEntity record,
 SafeToInsert record, Show record, Eq record) =>
record -> ReaderT backend m ()
go (NumberGeneric backend -> ReaderT backend m ())
-> NumberGeneric backend -> ReaderT backend m ()
forall a b. (a -> b) -> a -> b
$ Int -> Int32 -> Word32 -> Int64 -> Word64 -> NumberGeneric backend
forall backend.
Int -> Int32 -> Word32 -> Int64 -> Word64 -> NumberGeneric backend
Number Int
0 Int32
0 Word32
0 Int64
0 Word64
forall a. Bounded a => a
minBound