You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

144 lines
4.4 KiB

2 years ago
{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE QuasiQuotes #-}
import Criterion.Main
import qualified Data.ByteString as BS
import Data.Text.Encoding
import Data.Text.Encoding.Error
import Safe
import Text.RawString.QQ
import Text.XML.Light.Input (parseXMLDoc)
import Transaq
import Transaq.Parsing
validClient =
[r|
<client id="FOO">
<type>TYPE</type>
<currency>CURRENCY</currency>
<market>MARKET</market>
<union>UNION</union>
<forts_acc>FORTS_ACC</forts_acc>
</client>
|] :: BS.ByteString
validCandleKinds =
[r|
<candlekinds>
<kind>
<id>4</id>
<period>600</period>
<name>M10</name>
</kind>
<kind>
<id>5</id>
<period>900</period>
<name>M15</name>
</kind>
</candlekinds>
|] :: BS.ByteString
validCandles =
[r|
<candles secid="12" period="1" status="0" board="foo" seccode="bar">
<candle date="05.01.2024 12:30:00.123" open="41.3" high="42" low="40" close="41.6" volume="1234" oi="78" />
<candle date="05.01.2024 12:30:01.123" open="40.3" high="44" low="40" close="41.8" volume="1234" />
<candle date="05.01.2024 12:30:02.123" open="40.3" high="44" low="40" close="41.8" volume="1234" />
<candle date="05.01.2024 12:30:03.123" open="40.3" high="44" low="40" close="41.8" volume="1234" />
</candles>
|] :: BS.ByteString
validServerStatus =
[r|<server_status id="22" connected="true" recover="true" server_tz="TZ" sys_ver="42" build="51" /> |] :: BS.ByteString
validMarkets =
[r|
<markets>
<market id="1">FOO</market>
<market id="2">BAR</market>
</markets>
|] :: BS.ByteString
validSecurities =
[r|
<securities>
<security secid="1" active="true">
<seccode>SECCODE</seccode>
<instrclass>CLASS</instrclass>
<board>BOARD</board>
<market>15</market>
<currency>CURRENCY</currency>
<shortname>SHORTNAME</shortname>
<decimals>3</decimals>
<minstep>0.1</minstep>
<lotsize>10</lotsize>
<lotdivider>1</lotdivider>
<point_cost>6.28</point_cost>
<optmask usecredit="yes" bymarket="no" nosplit="yes" fok="no" ioc="no" />
<sectype>SECTYPE</sectype>
<sec_tz>SECTZ</sec_tz>
<quotestype>1</quotestype>
<MIC>FOO</MIC>
<currencyid>CURRENCYID</currencyid>
</security>
</securities>
|] :: BS.ByteString
validAllTrades =
[r|
<alltrades>
<trade secid="1">
<seccode>SEC1</seccode>
<tradeno>14</tradeno>
<time>05.01.2024 19:34:18.234</time>
<board>BOARD</board>
<price>12.34</price>
<quantity>10</quantity>
<buysell>B</buysell>
<openinterest>100</openinterest>
<period>N</period>
</trade>
<trade secid="2">
<seccode>SEC2</seccode>
<tradeno>15</tradeno>
<time>05.01.2024 19:34:19.234</time>
<board>BOARD</board>
<price>12.35</price>
<quantity>11</quantity>
<buysell>S</buysell>
<openinterest>200</openinterest>
<period>N</period>
</trade>
</alltrades>
|] :: BS.ByteString
parseDom :: BS.ByteString -> Maybe TransaqResponse
parseDom d = parseXMLDoc (decodeUtf8With lenientDecode d) >>= fromXml
parseSax :: BS.ByteString -> Maybe TransaqResponse
parseSax = headMay . parseTransaqResponses
main = defaultMain
[
bgroup "DOM"
[
bench "<client>" $ whnf parseDom validClient
, bench "<candlekinds>" $ whnf parseDom validCandleKinds
, bench "<candles>" $ whnf parseDom validCandles
, bench "<server_status>" $ whnf parseDom validServerStatus
, bench "<markets>" $ whnf parseDom validMarkets
, bench "<securities>" $ whnf parseDom validSecurities
, bench "<alltrades>" $ whnf parseDom validAllTrades
]
, bgroup "SAX"
[
bench "<client>" $ whnf parseSax validClient
, bench "<candlekinds>" $ whnf parseSax validCandleKinds
, bench "<candles>" $ whnf parseSax validCandles
, bench "<server_status>" $ whnf parseSax validServerStatus
, bench "<markets>" $ whnf parseSax validMarkets
, bench "<securities>" $ whnf parseSax validSecurities
, bench "<alltrades>" $ whnf parseSax validAllTrades
]
]