# * valuation tests, part 2.

<
; some market prices
P 2019-01-01 B   10 A
P 2019-01-01 C    2 B
P 2019-01-01 A  100 D
P 2019-01-01 E    3 D

; a transaction with both amounts in B
2019-06-01
    a  1 B
    b

; tests follow. This comment directive makes this file readable
; by hledger, as well as shelltest; useful when troubleshooting.
comment

# ** 1. normal unvalued output
$ hledger -f- print -x
2019-06-01
    a             1 B
    b            -1 B

>=

# ** 2. current market value in default valuation commodity
$ hledger -f- print -x -V
2019-06-01
    a            10 A
    b           -10 A

>=

# ** 3. same as above, but request commodity A explicitly
$ hledger -f- print -x --value=now,A
2019-06-01
    a            10 A
    b           -10 A

>=

# ** 4. request commodity B - no effect
$ hledger -f- print -x --value=now,B
2019-06-01
    a             1 B
    b            -1 B

>=

# ** 5. request commodity we don't have prices for - no effect
$ hledger -f- print -x --value=now,Z
2019-06-01
    a             1 B
    b            -1 B

>=

# ** 6. request commodity C - uses reverse of C->B price.
# There's nothing setting C display style, so the default style is used,
# but the precision is increased to show all significant decimal digits
# (otherwise it would show C0).
$ hledger -f- print -x --value=now,C
2019-06-01
    a            C0.5
    b           C-0.5

>=

# ** 7. request commodity D - chains B->A, A->D prices
$ hledger -f- print -x --value=now,D
2019-06-01
    a          1000 D
    b         -1000 D

>=

# ** 8. request commodity E - chains B->A, A->D, reverse of D->E prices.
# As with C above, E gets the default display style, but with the precision
# increased to show the decimal digits, but no more than 8.
$ hledger -f- print -x --value=now,E
2019-06-01
    a     E333.33333333
    b    E-333.33333333

>=

# Document some print behaviour. 
# I think I've forgotten some other weird cases meant for here.
# First an example with no market price, just a transaction price.
# ** 9. Normal print output.
<
2000/01/01
    a         -1A @ 1B
    b          1B

$ hledger -f- print
2000-01-01
    a        -1A @ 1B
    b              1B

>=0

# ** 10. Valuing in a commodity with no market price has no effect.
$ hledger -f- print -XZ
2000-01-01
    a        -1A @ 1B
    b              1B

>=0

# ** 11. -B converts to the transaction price's commodity.
$ hledger -f- print -B
2000-01-01
    a             -1B
    b              1B

>=0

# ** 12. Note the -XZ does not nullify the -B here.
# (-B -XZ is equivalent to --cost --value=end,Z).
$ hledger -f- print -B -XZ
2000-01-01
    a             -1B
    b              1B

>=0

# With a market price: same as above.
<
P 2000/1/1 A 1B

2000/01/01
    a         -1A @ 1B
    b          1B

# ** 13. 
$ hledger -f- print
2000-01-01
    a        -1A @ 1B
    b              1B

>=0

# ** 14. 
$ hledger -f- print -XZ
2000-01-01
    a        -1A @ 1B
    b              1B

>=0

# ** 15. 
$ hledger -f- print -B
2000-01-01
    a             -1B
    b              1B

>=0

# ** 16. 
$ hledger -f- print -B -XA
2000-01-01
    a             -1A
    b              1A

>=0

# A few more tests for -V (and -X, which should work similarly). #1083.
<
P 2000/01/01 A  2 B
P 2002/01/01 A  3 B

2000/01/01
  (a)      1 A

# ** 17. -V uses today as the default valuation date, unlike --value=end.
$ hledger -f- reg -V
2000-01-01                      (a)                            3 B           3 B

# ** 18. -V uses the report end date, if specified, as valuation date.
$ hledger -f- reg -V -e 2001
2000-01-01                      (a)                            2 B           2 B

# ** 19. In balance reports too.
$ hledger -f- bal -N -V
                 3 B  a

# ** 20.
$ hledger -f- bal -N -V -e 2001
                 2 B  a

#
<
P 2001/01/01 A  1 B
P 2002/01/01 A  2 B

2000-01-01
  (a)  1 A

# ** 21. The valuation date is the last day of the report period. In
# other words, the report end date is exclusive with respect to price
# directives. This is a change from older hledger and Ledger, where it
# was inclusive.
$ hledger -f- bal -N -V -e 2002-01-01
                 1 B  a

# Test market prices inferred from transactions.

# ** 22. Market price is not inferred from transactions by default.
<
2020-01-01
  (a)   1 A @ 2 B

$ hledger -f- bal -N -V
                 1 A  a

# ** 23. Market price is inferred from transactions with --infer-market-prices,
# and -V can work with no P directives.
$ hledger -f- bal -N -V --infer-market-prices
                  B2  a

# ** 24. A P-declared market price on the same date as a transaction price has precedence.
<
P 2020-01-01 A  1 B

2020-01-01
  (a)   1 A @ 2 B

$ hledger -f- bal -N -V --infer-market-prices
                 1 B  a

# ** 25. A transaction-inferred price newer than a P-declared price has precedence.
<
P 2020-01-01 A  1 B

2020-01-02
  (a)   1 A @ 2 B

$ hledger -f- bal -N -V --infer-market-prices
                 2 B  a

# ** 26. A later-dated P directive sets the valuation commodity even if parsed out of order.
<
P 2020-02-01 A  1 C
P 2020-01-01 A  1 B

2020-02-01
  (a)   1 A @ 2 B

$ hledger -f- bal -N -V
                 1 C  a

# ** 27. A later-dated transaction price sets the valuation commodity even if parsed out of order.
<
2020-01-01
  (a)   1 A @ 1 C  ; date: 2020-01-02
  (a)   1 A @ 1 D  ; date: 2020-01-02
  (a)   1 A @ 1 B

$ hledger -f- bal -N -V --infer-market-prices
                  D3  a

# ** 28. #1402 It should pick the direct (forward) A 3.00 price for B here,
# not the reverse price.
<
2020-11-10 
    (a)  B 1.00

P 2020-11-01 B A 3.00
P 2020-11-02 A B 0.40

$ hledger -f- bal -N -e 2020-11-20 -X A
              A 3.00  a

# ** 29. #1402 It should pick the direct B->A price here, not the indirect B->C->A price.
<
2020-11-10
    (a)  B 1.00

P 2020-11-01 B C 2
P 2020-11-02 C A 3
P 2020-11-03 B A 5

$ hledger -f- bal -N -e 2020-11-20 -X A
                 A 5  a

# ** 30. #1439 Lots of price edges like the below should not cause any slowdown.
<
2020-01-01
  (a)  1A

P 2020-01-01 Z 1A
P 2020-01-01 A 10Y
P 2020-01-01 B 20Y
P 2020-01-01 C 30Y
P 2020-01-01 D 40Y
P 2020-01-01 E 50Y
P 2020-01-01 F 60Y
P 2020-01-01 G 70Y
P 2020-01-01 H 80Y
P 2020-01-01 I 90Y
P 2020-01-01 J 100Y
P 2020-01-01 K 120Y
P 2020-01-01 L 130Y
P 2020-01-01 M 140Y

$ hledger -f- bal -N -X Z
                  Z1  a

# ** 31. #1443 It should always pick the shortest price path, A>P>Z here.
<
2020-01-01
  (a)  1A

P 2020-01-01 A 1B
P 2020-01-01 B 1C
P 2020-01-01 C 1D
P 2020-01-01 D 1Z

P 2020-01-01 A 1P
P 2020-01-01 P 100Z

$ hledger -f- bal -N -X Z
                100Z  a

# ** 32. #1851 It should use posting date 2 if requested.
<
2019-12-31 FOO
    Assets:A        $1.00
    Income:B

2020-01-01=2019-12-30 BAR
    Assets:A        $1.00
    Income:B

$ hledger -f- bal -Y --date2 -V -N
Balance changes in 2019, valued at period ends:

          ||   2019 
==========++========
 Assets:A ||  $2.00 
 Income:B || $-2.00 
