package Ġn ago ya . ku u . mi ol ife . predict _ estimate _ volume _ days . domain . impl Ċ Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . mock Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . reset Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . wh enever Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġn ago ya . ku u . mi ol ife . predict _ estimate _ volume _ days . domain . Predict Estimate Volume Days Use case Ċ import Ġn ago ya . ku u . mi ol ife . predict _ estimate _ volume _ days . domain . Predict Estimate Volume Days Use case Error Ċ import Ġn ago ya . ku u . mi ol ife . predict _ estimate _ volume _ days . domain . Predict Estimate Volume Days Use case Response Ċ import Ġn ago ya . ku u . mi ol ife . predict _ estimate _ volume _ days . domain . repository . Contract Readonly Repository Ċ import Ġn ago ya . ku u . mi ol ife . predict _ estimate _ volume _ days . domain . repository . Datetime Repository Ċ import Ġn ago ya . ku u . mi ol ife . predict _ estimate _ volume _ days . domain . repository . Sim Volume Readonly Repository Ċ import Ġorg . junit . Assert Ċ import Ġorg . spe k framework . spe k 2 . Spe k Ċ import Ġorg . spe k framework . spe k 2 . style . specification . describe ĊĊ Ċ class ĠPredict Estimate Volume Days Use case Impl Test Ġ: ĠSpe k ({ ĊĊĠĠĠ Ġdescribe (" ãģĤ ãģ¨ ä½ķ æĹ¥ ãĤ ® ãĤ¬ ãģĮ æĮģ ãģ¤ ãģĭ è¨Ī ç®Ĺ ãģĻãĤĭ Use case ") Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġcontract Readonly Repository : ĠContract Readonly Repository Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġval Ġsim Volume Readonly Repository : ĠSim Volume Readonly Repository Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġval Ġdatetime Repository : ĠDate time Repository Ġ= Ġmock () ĊĊĠĠĠĠĠĠĠ Ġval Ġpredict Estimate Volume Use case : ĠPredict Estimate Volume Days Use case Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPredict Estimate Volume Days Use case Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontract Readonly Repository , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsim Volume Readonly Repository , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatetime Repository ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠbeforeEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontract Readonly Repository , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsim Volume Readonly Repository , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatetime Repository ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdescribe (" çĦ¡ åĬ¹ ãģª å¥ ĳ ç´Ħ ID ãĤĴ æ¸ ¡ ãģĻ ãģ¨ çĦ¡ åĬ¹ ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescribe (" ç©º æĸĩåŃĹ ãģ® å¥ ĳ ç´Ħ ID ãģ® åł´åĲĪ ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontract Id Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġpredict Estimate Volume Use case . execute ( contract Id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" ãĤ¨ãĥ© ãĥ¼ ãģ§ãģĤãĤĭ ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertTrue (( actual Ġis ĠPredict Estimate Volume Days Use case Response . error )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" å¥ ĳ ç´Ħ ID ãģĮ ç©º æĸĩåŃĹ ãģ§ãģĤãĤĭ ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( actual Ġas ĠPredict Estimate Volume Days Use case Response . error ). error Kind , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPredict Estimate Volume Days Use case Error . CONTRACT _ ID _ IS _ EMPTY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext (" åŃĺåľ¨ ãģĹãģªãģĦ å¥ ĳ ç´Ħ ID ãģ® åł´åĲĪ ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontract Id Ġ= Ġ" ho ge ho ge " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( contract Readonly Repository . has Contract Id ( contract Id )). thenReturn ( false ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġpredict Estimate Volume Use case . execute ( contract Id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" ãĤ¨ãĥ© ãĥ¼ ãģ§ãģĤãĤĭ ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Ġis ĠPredict Estimate Volume Days Use case Response . error ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" å¥ ĳ ç´Ħ ID ãģĮ åŃĺåľ¨ ãģĹãģªãģĦ ãĤ¨ãĥ© ãĥ¼ ãģĮ è¿Ķ ãģķãĤĮãĤĭ ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( actual Ġas ĠPredict Estimate Volume Days Use case Response . error ). error Kind , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPredict Estimate Volume Days Use case Error . CONTRACT _ ID _ NOT _ FOUND ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext (" å¥ ĳ ç´Ħ èĢħ æĥħåł± ãģ«ãģ¤ãģĦãģ¦ ãģ® èªŃãģ¿ è¾¼ ãģ¿ ãģ« å¤± æķ Ĺ ãģĹãģŁ æĻĤ ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontract Id Ġ= Ġ" ho ge ho ge " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( contract Readonly Repository . has Contract Id ( contract Id )). then Answer Ġ{ ĠException () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġpredict Estimate Volume Use case . execute ( contract Id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" ãĤ¨ãĥ© ãĥ¼ ãģ§ãģĤãĤĭ ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertTrue ( actual Ġis ĠPredict Estimate Volume Days Use case Response . error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" èªŃãģ¿ è¾¼ ãģ¿ ãģ« å¤± æķ Ĺ ãģ§ãģĤãĤĭ ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( actual Ġas ĠPredict Estimate Volume Days Use case Response . error ). error Kind , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPredict Estimate Volume Days Use case Error . CONTRACT _ ID _ LOADING _ FAILED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontext (" æľĪ æľ« ãģ¾ãģ§ ãĤ¯ ãĥ¼ãĥ Ŀ ãĥ³ ãģĮ æĮģ ãģ¤ åł´åĲĪ æĮģ ãģ¤ ãģ¨ãģĦãģĨ ãĤ¹ãĥĨ ãĥ¼ãĤ¿ ãĤ¹ ãĤĴ è¿Ķ ãģĻ ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdummy Contract Id Ġ= Ġ" ho ge " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( contract Readonly Repository . has Contract Id ( dummy Contract Id )). thenReturn ( true ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Ġargument ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremain : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremain Days : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuse : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargument ( 1 , Ġ 0 , Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargument ( 1 0 , Ġ 0 , Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargument ( 1 0 0 , Ġ 1 0 , Ġ 1 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargument ( 1 0 0 0 0 , Ġ 1 0 0 , Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( sim Volume Readonly Repository . load Contract Remain Sim Volume ( dummy Contract Id )). thenReturn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSim Volume Readonly Repository . Load Contract Remain Sim Volume Response . Success ( it . remain ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( sim Volume Readonly Repository . load Contract Sim Usage Average ( dummy Contract Id )). thenReturn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . use ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( datetime Repository . count Monthly Remain Days ()). thenReturn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . remain Days ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġpredict Estimate Volume Use case . execute ( dummy Contract Id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" æ® ĭ éĩı ãģĮ ${ it . remain } md , æľĪ æľ« ãģ¾ãģ§ ${ it . remain Days } æĹ¥ , æ¯ İ æĹ¥ å¹³åĿĩ ãģ§ ${ it . use } md ä½¿çĶ¨ ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPredict Estimate Volume Days Use case Response . success ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontext (" æľĪ æľ« ãģ¾ãģ§ ãĤ¯ ãĥ¼ãĥ Ŀ ãĥ³ ãģĮ æĮģ ãģŁ ãģªãģĦ åł´åĲĪ æĮģ ãģ¤ æĹ¥ æķ° ãĤĴ è¿Ķ ãģĻ ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Ġargument ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvolume : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdays : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaverage : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Days : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargument ( 1 0 , Ġ 2 , Ġ 1 0 , Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargument ( 1 0 0 , Ġ 1 0 , Ġ 5 0 , Ġ 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargument ( 1 5 0 0 0 , Ġ 2 0 , Ġ 1 0 0 0 , Ġ 1 5 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargument ( 1 5 5 0 0 , Ġ 2 0 , Ġ 1 0 0 0 , Ġ 1 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontract Id Ġ= Ġ" ho ge " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( sim Volume Readonly Repository . load Contract Remain Sim Volume ( contract Id Ġ= Ġcontract Id )). thenReturn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSim Volume Readonly Repository . Load Contract Remain Sim Volume Response . Success ( it . volume ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( sim Volume Readonly Repository . load Contract Sim Usage Average ( contract Id )). thenReturn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . average ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( datetime Repository . count Monthly Remain Days ()). thenReturn ( it . days ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġpredict Estimate Volume Use case . execute ( contract Id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" æ® ĭ éĩı ãģĮ ${ it . volume } md , æľĪ æľ« ãģ¾ãģ§ ${ it . days } æĹ¥ , æ¯ İ æĹ¥ å¹³åĿĩ ãģ§ ${ it . average } md åĪ©çĶ¨ => ${ it . expected Days } æĹ¥ æĮģ ãģ¤ ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Ġis ĠPredict Estimate Volume Days Use case Response . Need ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( actual Ġas ĠPredict Estimate Volume Days Use case Response . Need ). remain Days , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . expected Days ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ })