Hastructure-0.45.0: test/DealTest/DealTest.hs
module DealTest.DealTest(baseCase,baseTests,emptyCase)
where
import Test.Tasty
import Test.Tasty.HUnit
import Deal
import qualified Accounts as A
import qualified Stmt as S
import qualified Asset as Ast
import qualified Pool as P
import qualified AssetClass.Mortgage as ACM
import qualified AssetClass.AssetBase as AB
import qualified Expense as F
import qualified Deal.DealBase as D
import qualified Deal as DR
import qualified Liability as L
import qualified Waterfall as W
import qualified Cashflow as CF
import qualified Assumptions as AP
import qualified Call as C
import InterestRate
import qualified CreditEnhancement as CE
import qualified Triggers as Trg
import Lib
import Types
import qualified Data.Map as Map
import qualified Data.Time as T
import qualified Data.Set as S
import Numeric.Lens (base)
import qualified Types as P
dummySt = (0,Lib.toDate "19000101",Nothing)
emptyCase = D.TestDeal {
D.name = "empty case"
,D.status = Amortizing
,D.rateSwap = Nothing
,D.currencySwap = Nothing
,D.dates = CurrentDates (toDate "20220101",toDate "20220101") Nothing (toDate "20300101")
(toDate "20220201" , MonthFirst) (toDate "20220225" , MonthFirst)
,D.accounts = Map.empty
,D.fees = Map.empty
,D.bonds = Map.empty
,D.pool = D.MultiPool $ Map.fromList [(PoolConsol, (P.Pool {P.assets=[]}))]
,D.waterfall = Map.empty
,D.collects = []
}
baseCase = D.TestDeal {
D.name = "base case"
,D.status = Amortizing
,D.rateSwap = Nothing
,D.currencySwap = Nothing
,D.dates = CurrentDates (toDate "20220101",toDate "20220101") Nothing (toDate "20300101")
(toDate "20220201" , MonthFirst) (toDate "20220225" , MonthFirst)
,D.accounts = (Map.fromList
[("General", (A.Account { A.accName="General" ,A.accBalance=1000.0 ,A.accType=Nothing, A.accInterest=Nothing ,A.accStmt=Nothing }))])
,D.fees = Map.empty
,D.bonds = (Map.fromList [("A"
,L.Bond{
L.bndName="A"
,L.bndType=L.Sequential
,L.bndOriginInfo= L.OriginalInfo{
L.originBalance=3000
,L.originDate= (T.fromGregorian 2022 1 1)
,L.originRate= 0.08
,L.maturityDate = Nothing}
,L.bndInterestInfo= L.Fix 0.08 DC_ACT_365F
,L.bndBalance=3000
,L.bndRate=0.08
,L.bndDuePrin=0.0
,L.bndStepUp = Nothing
,L.bndDueInt=0.0
,L.bndDueIntDate=Nothing
,L.bndLastIntPay = Just (T.fromGregorian 2022 1 1)
,L.bndLastPrinPay = Just (T.fromGregorian 2022 1 1)
,L.bndStmt=Nothing
,L.bndDueIntOverInt = 0})
]
)
,D.pool = D.MultiPool $
(Map.fromList [(PoolConsol, (P.Pool {P.assets=[AB.Mortgage
AB.MortgageOriginalInfo{
AB.originBalance=4000
,AB.originRate=Fix DC_ACT_365F 0.085
,AB.originTerm=60
,AB.period=Monthly
,AB.startDate=T.fromGregorian 2022 1 1
,AB.prinType= AB.Level
,AB.prepaymentPenalty = Nothing}
4000
0.085
60
Nothing
AB.Current]
,P.futureCf=Nothing
,P.asOfDate = T.fromGregorian 2022 1 1
,P.issuanceStat = Just $ Map.fromList [(IssuanceBalance, 4000)]
,P.extendPeriods = Nothing}))])
,D.waterfall = Map.fromList [(W.DistributionDay Amortizing, [
(W.PayInt Nothing "General" ["A"] Nothing)
,(W.PayPrin Nothing "General" ["A"] Nothing)
])]
,D.collects = [W.Collect Nothing W.CollectedInterest "General"
,W.Collect Nothing W.CollectedPrincipal "General"]
,D.liqProvider = Nothing
,D.rateCap = Nothing
,D.triggers = Nothing
,D.ledgers = Nothing
,D.stats = (Map.empty,Map.empty,Map.empty,Map.empty)
}
baseTests =
let
nonRunAssump = (AP.NonPerfAssumption Nothing Nothing Nothing Nothing Nothing (Just [AP.InspectPt MonthEnd (FutureCurrentPoolBalance Nothing)]) Nothing Nothing Nothing Nothing Nothing Nothing)
(dealAfterRun,poolCf,rcs,_,_) = case DR.runDeal baseCase S.empty Nothing nonRunAssump of
Left e -> error $ "Deal run failed"++ show e
Right x -> x
inspects = [ rc | rc@(InspectBal {}) <- rcs ]
in
testGroup "Base Deal Test"
[ testCase "empty pool flow" $
assertEqual "empty pool flow"
0
-- (P.futureCf (D.pool baseCase))
0
-- https://docs.google.com/spreadsheets/d/1gmz8LOB01qqfPldquyDn43PJJ1MI016tS-JS5KW3SvM/edit?gid=1325808922#gid=1325808922
,testCase "pool current balance (run time)" $
assertEqual "pool current balance (run time)"
(InspectBal (toDate "20220101") (FutureCurrentPoolBalance Nothing) 4000)
(inspects!!0)
,testCase "pool current balance (run time 1)" $
assertEqual "pool current balance (run time 1)"
(InspectBal (toDate "20220131") (FutureCurrentPoolBalance Nothing) 4000)
(inspects!!1)
,testCase "pool current balance (run time 2)" $
assertEqual "pool current balance (run time 2)"
(InspectBal (toDate "20220228") (FutureCurrentPoolBalance Nothing) 3946.27)
(inspects!!2)
,testCase "pool current balance (run time 60)" $
assertEqual "pool current balance (run time 60)"
(InspectBal (toDate "20270131") (FutureCurrentPoolBalance Nothing) 0.0)
(inspects!!61)
]