6 changed files with 203 additions and 82 deletions
@ -0,0 +1,118 @@ |
|||||||
|
{-# LANGUAGE OverloadedStrings, TypeSynonymInstances, FlexibleInstances #-} |
||||||
|
{-# LANGUAGE MultiWayIf #-} |
||||||
|
|
||||||
|
module ArbitraryInstances ( |
||||||
|
) where |
||||||
|
|
||||||
|
|
||||||
|
import Test.Tasty |
||||||
|
import Test.Tasty.SmallCheck as SC |
||||||
|
import Test.Tasty.QuickCheck as QC |
||||||
|
import Test.QuickCheck.Instances hiding (Text) |
||||||
|
|
||||||
|
import ATrade.Types |
||||||
|
import ATrade.Broker.Protocol |
||||||
|
|
||||||
|
import Data.Decimal |
||||||
|
import Data.Scientific |
||||||
|
import Data.Time.Clock |
||||||
|
import Data.Time.Calendar |
||||||
|
|
||||||
|
notTooBig x = abs x < 1000000000000 |
||||||
|
|
||||||
|
instance Arbitrary Tick where |
||||||
|
arbitrary = Tick <$> |
||||||
|
arbitrary <*> |
||||||
|
arbitrary <*> |
||||||
|
arbitraryTimestamp <*> |
||||||
|
(roundTo 9 <$> (arbitrary `suchThat` notTooBig)) <*> |
||||||
|
arbitrary |
||||||
|
where |
||||||
|
arbitraryTimestamp = do |
||||||
|
y <- choose (1970, 2050) |
||||||
|
m <- choose (1, 12) |
||||||
|
d <- choose (1, 31) |
||||||
|
|
||||||
|
sec <- secondsToDiffTime <$> choose (0, 86399) |
||||||
|
|
||||||
|
return $ UTCTime (fromGregorian y m d) sec |
||||||
|
|
||||||
|
instance Arbitrary DataType where |
||||||
|
arbitrary = toEnum <$> choose (1, 10) |
||||||
|
|
||||||
|
instance Arbitrary Decimal where |
||||||
|
arbitrary = realFracToDecimal 10 <$> (arbitrary :: Gen Scientific) |
||||||
|
|
||||||
|
instance Arbitrary SignalId where |
||||||
|
arbitrary = SignalId <$> arbitrary <*> arbitrary <*> arbitrary |
||||||
|
|
||||||
|
instance Arbitrary OrderPrice where |
||||||
|
arbitrary = do |
||||||
|
v <- choose (1, 4) :: Gen Int |
||||||
|
if | v == 1 -> return Market |
||||||
|
| v == 2 -> Limit <$> arbitrary `suchThat` notTooBig |
||||||
|
| v == 3 -> Stop <$> arbitrary `suchThat` notTooBig <*> arbitrary `suchThat` notTooBig |
||||||
|
| v == 4 -> StopMarket <$> arbitrary `suchThat` notTooBig |
||||||
|
| otherwise -> fail "Invalid case" |
||||||
|
|
||||||
|
instance Arbitrary Operation where |
||||||
|
arbitrary = elements [Buy, Sell] |
||||||
|
|
||||||
|
instance Arbitrary OrderState where |
||||||
|
arbitrary = elements [Unsubmitted, |
||||||
|
Submitted, |
||||||
|
PartiallyExecuted, |
||||||
|
Executed, |
||||||
|
Cancelled, |
||||||
|
Rejected, |
||||||
|
OrderError ] |
||||||
|
|
||||||
|
instance Arbitrary Order where |
||||||
|
arbitrary = Order <$> |
||||||
|
arbitrary <*> |
||||||
|
arbitrary <*> |
||||||
|
arbitrary <*> |
||||||
|
arbitrary <*> |
||||||
|
arbitrary <*> |
||||||
|
arbitrary <*> |
||||||
|
arbitrary <*> |
||||||
|
arbitrary <*> |
||||||
|
arbitrary |
||||||
|
|
||||||
|
instance Arbitrary Trade where |
||||||
|
arbitrary = Trade <$> |
||||||
|
arbitrary <*> |
||||||
|
arbitrary <*> |
||||||
|
arbitrary <*> |
||||||
|
arbitrary <*> |
||||||
|
arbitrary <*> |
||||||
|
arbitrary <*> |
||||||
|
arbitrary <*> |
||||||
|
arbitrary <*> |
||||||
|
arbitrary <*> |
||||||
|
arbitrary |
||||||
|
|
||||||
|
instance Arbitrary Notification where |
||||||
|
arbitrary = do |
||||||
|
t <- choose (1, 2) :: Gen Int |
||||||
|
if t == 1 |
||||||
|
then do |
||||||
|
oid <- arbitrary |
||||||
|
state <- arbitrary |
||||||
|
return $ OrderNotification oid state |
||||||
|
else TradeNotification <$> arbitrary |
||||||
|
|
||||||
|
instance Arbitrary BrokerServerRequest where |
||||||
|
arbitrary = do |
||||||
|
t <- choose (1, 3) :: Gen Int |
||||||
|
if | t == 1 -> RequestSubmitOrder <$> arbitrary <*> arbitrary |
||||||
|
| t == 2 -> RequestCancelOrder <$> arbitrary <*> arbitrary |
||||||
|
| t == 3 -> RequestNotifications <$> arbitrary |
||||||
|
|
||||||
|
instance Arbitrary BrokerServerResponse where |
||||||
|
arbitrary = do |
||||||
|
t <- choose (1, 3) :: Gen Int |
||||||
|
if | t == 1 -> ResponseOrderSubmitted <$> arbitrary |
||||||
|
| t == 2 -> ResponseOrderCancelled <$> arbitrary |
||||||
|
| t == 3 -> ResponseNotifications <$> arbitrary |
||||||
|
|
||||||
Loading…
Reference in new issue