# Test generation of periodic transactions with --forecast.
# Note periodic transaction tests should include a regular transaction
# to pin the start date of forecasted transactions.

# 1. A balance report with forecasted transactions.
hledger bal -M -b 2016-11 -e 2017-02 -f - --forecast
<<<
2016/12/31
    expenses:housing  $600
    assets:cash

~ monthly from 2016/1
    income  $-1000
    expenses:food     $20
    expenses:leisure  $15
    expenses:grocery  $30
    assets:cash
>>>
Balance changes in 2016-11-01..2017-01-31:

                  || 2016-11  2016-12  2017-01 
==================++===========================
 assets:cash      ||       0    $-600     $935 
 expenses:food    ||       0        0      $20 
 expenses:grocery ||       0        0      $30 
 expenses:housing ||       0     $600        0 
 expenses:leisure ||       0        0      $15 
 income           ||       0        0   $-1000 
------------------++---------------------------
                  ||       0        0        0 
>>>2
>>>=0


# 2. print forecasted transactions, with status and description.
hledger print -b 2016-11 -e 2017-02 -f - --forecast
<<<
2016/12/31
    expenses:housing  $600
    assets:cash

~ monthly from 2016/1  * marked cleared, and with a description 
    income  $-1000
    expenses:food     $20
    expenses:leisure  $15
    expenses:grocery  $30
    assets:cash
>>>
2016-12-31
    expenses:housing            $600
    assets:cash

2017-01-01 * marked cleared, and with a description
    ; generated-transaction: ~ monthly from 2016/1
    income                    $-1000
    expenses:food                $20
    expenses:leisure             $15
    expenses:grocery             $30
    assets:cash

>>>2
>>>=0


# 3. A register with forecasted transactions, with a comment and tag.
hledger register -b 2016-11 -e 2017-02 -f - --forecast  tag:a
<<<
2016/12/31
    expenses:housing  $600
    assets:cash

~ monthly from 2016/1  ; or a comment, maybe with a:tag
    income  $-1000
    expenses:food     $20
    expenses:leisure  $15
    expenses:grocery  $30
    assets:cash
>>>
2017-01-01                      income                      $-1000        $-1000
                                expenses:food                  $20         $-980
                                expenses:leisure               $15         $-965
                                expenses:grocery               $30         $-935
                                assets:cash                   $935             0
>>>2
>>>=0

# 4. Check that --forecast generates transactions only after last transaction date in journal.
hledger register -b 2015-12 -e 2017-02 -f - assets:cash --forecast
<<<
2016/01/01
    expenses:fun  $10 ; more fireworks
    assets:cash

2016/12/02
    expenses:housing  $600
    assets:cash

~ yearly from 2016
    income  $-10000 ; bonus
    assets:cash
>>>
2016-01-01                      assets:cash                   $-10          $-10
2016-12-02                      assets:cash                  $-600         $-610
2017-01-01                      assets:cash                 $10000         $9390
>>>2
>>>=0

# 5. Y affects M/D partial dates in periodic transactions.
# The recur tag shows the original period expression and is not modified.
hledger -f - print --forecast desc:forecast
<<<
Y 2000

~ 2/1  forecast

; a real transaction to set the start of the forecast window
2000/1/1 real

>>>
2000-02-01 forecast
    ; generated-transaction: ~ 2/1

>>>2
>>>=0

# 6. Y also sets the month to 1, affecting D dates:
hledger -f - print --forecast desc:forecast
<<<
Y 2000

~ 15  forecast

; a real transaction to set the start of the forecast window
2000/1/1 real

>>>
2000-01-15 forecast
    ; generated-transaction: ~ 15

>>>2
>>>=0

# 7. Y also sets the day to 1, affecting relative dates:
hledger -f - print --forecast desc:forecast
<<<
Y 2000

~ next month  forecast

; a real transaction to set the start of the forecast window
2000/1/1 real

>>>
2000-02-01 forecast
    ; generated-transaction: ~ next month

>>>2
>>>=0


# 8. A balance report with forecast-begin enabling transaction before report end
hledger bal -M -b 2016-10 -e 2017-02 -f - --forecast=20160801-
<<<
2016/12/31
    expenses:housing  $600
    assets:cash

~ monthly from 2016/1  salary
    income  $-1000
    assets:cash
>>>
Balance changes in 2016-10-01..2017-01-31:

                  || 2016-10  2016-11  2016-12  2017-01 
==================++====================================
 assets:cash      ||   $1000    $1000     $400    $1000 
 expenses:housing ||       0        0     $600        0 
 income           ||  $-1000   $-1000   $-1000   $-1000 
------------------++------------------------------------
                  ||       0        0        0        0 
>>>2
>>>=0

# 9. Parse error in malformed forecast period expression
hledger bal -M -b 2016-10 -e 2017-02 -f - --forecast=20160801-foobar
<<<
2016/12/31
    expenses:housing  $600
    assets:cash

~ monthly from 2016/1  salary
    income  $-1000
    assets:cash
>>>
>>>2
hledger: could not parse forecast period : 1:10:
  |
1 | 20160801-foobar
  |          ^
unexpected 'f'
expecting end of input
 (use -h to see usage)
>>>=1

# 10. Amount display style is applied to forecasted transactions.
hledger -f - reg --forecast date:202001
<<<
commodity 1,000.00 USD

2020-01-01
  (a)      1,000.00 USD

~ every 28th day
  (a)       1000.00 USD

>>>
2020-01-01                      (a)                   1,000.00 USD  1,000.00 USD
2020-01-28                      (a)                   1,000.00 USD  2,000.00 USD
>>>2
>>>=0

# 11. Forecast transactions are generated up to the day before the requested end date
hledger -f - reg -b 2021-01-01 -e 2021-01-05 --forecast
<<<
2021-01-01
  (a)      1000

~ daily
  (a)       1

>>>
2021-01-01                      (a)                           1000          1000
2021-01-02                      (a)                              1          1001
2021-01-03                      (a)                              1          1002
2021-01-04                      (a)                              1          1003
>>>2
>>>=0
