hledger/hledger/test/query-expr.test
Simon Michael fd930ff567 dev: make func tests compatible with ghc 9.10
Work around ghc 9.10's extra newline in error output.
https://gitlab.haskell.org/ghc/ghc/-/issues/25116
2024-09-30 17:20:53 -10:00

161 lines
5.1 KiB
Plaintext

# * expr: (boolean) queries
<
2022-01-01 Transaction 1 ; transactiontag:A
assets:bank:main -1 ; A comment
expenses:food
2022-01-01 Transaction 2 ; transactiontag:A
assets:bank:main -1
assets:bank:secondary -1 ; atag:a
expenses:food
2022-01-01 Transaction 3 ; transactiontag:B
assets:bank:main -1 ; A comment
expenses:drink
2022-01-01 Transaction 4 ; transactiontag:B
assets:bank:main -1 ; A comment
expenses:food 2
expenses:drink
# ** 1. Simple queries can be directly embedded in expression queries
$ hledger -f - print expr:"tag:transactiontag=B"
2022-01-01 Transaction 3 ; transactiontag:B
assets:bank:main -1 ; A comment
expenses:drink
2022-01-01 Transaction 4 ; transactiontag:B
assets:bank:main -1 ; A comment
expenses:food 2
expenses:drink
>=
# ** 2. Simple queries can be encased in an arbitrary number of parentheses
$ hledger -f - print "expr:(((tag:transactiontag=B)))"
2022-01-01 Transaction 3 ; transactiontag:B
assets:bank:main -1 ; A comment
expenses:drink
2022-01-01 Transaction 4 ; transactiontag:B
assets:bank:main -1 ; A comment
expenses:food 2
expenses:drink
>=
# ** 3. Simple boolean AND query works
$ hledger -f - print expr:"tag:'transactiontag=B' AND desc:3"
2022-01-01 Transaction 3 ; transactiontag:B
assets:bank:main -1 ; A comment
expenses:drink
>=
# ** 4. AND + OR works without parentheses
$ hledger -f - print expr:"tag:'transactiontag=B' AND desc:3 OR desc:1"
2022-01-01 Transaction 1 ; transactiontag:A
assets:bank:main -1 ; A comment
expenses:food
2022-01-01 Transaction 3 ; transactiontag:B
assets:bank:main -1 ; A comment
expenses:drink
>=
# ** 5. Unnecessary NOT + OR works without parentheses
$ hledger -f - print expr:"NOT tag:'transactiontag=B' OR desc:1"
2022-01-01 Transaction 1 ; transactiontag:A
assets:bank:main -1 ; A comment
expenses:food
2022-01-01 Transaction 2 ; transactiontag:A
assets:bank:main -1
assets:bank:secondary -1 ; atag:a
expenses:food
>=
# ** 6. Necessary NOT + OR works without parentheses
$ hledger -f - print expr:"NOT tag:'transactiontag=B' OR desc:4"
2022-01-01 Transaction 1 ; transactiontag:A
assets:bank:main -1 ; A comment
expenses:food
2022-01-01 Transaction 2 ; transactiontag:A
assets:bank:main -1
assets:bank:secondary -1 ; atag:a
expenses:food
2022-01-01 Transaction 4 ; transactiontag:B
assets:bank:main -1 ; A comment
expenses:food 2
expenses:drink
>=
# ** 7. Boolean expression query keywords are case insensitive
$ hledger -f - print expr:"NoT tag:'transactiontag=B' OR desc:4"
2022-01-01 Transaction 1 ; transactiontag:A
assets:bank:main -1 ; A comment
expenses:food
2022-01-01 Transaction 2 ; transactiontag:A
assets:bank:main -1
assets:bank:secondary -1 ; atag:a
expenses:food
2022-01-01 Transaction 4 ; transactiontag:B
assets:bank:main -1 ; A comment
expenses:food 2
expenses:drink
>=
# ** 8. Lower case not is not confused with existing not: queries
$ hledger -f - print expr:"not tag:transactiontag=B"
2022-01-01 Transaction 1 ; transactiontag:A
assets:bank:main -1 ; A comment
expenses:food
2022-01-01 Transaction 2 ; transactiontag:A
assets:bank:main -1
assets:bank:secondary -1 ; atag:a
expenses:food
>=
# ** 9. Having parentheses directly follow 'not' sees 'not' as part of a query.
$ hledger -f - print expr:"not(tag:transactiontag=B)"
>2 /hledger: Error: This regular expression is invalid or unsupported, please correct it:
not\(tag:transactiontag=B
/
>=1
# XXX regex needed for error tests with ghc 9.10, https://gitlab.haskell.org/ghc/ghc/-/issues/25116
# ** 10. ... whereas parentheses with a space between 'not' and '(' is fine.
$ hledger -f - print expr:"not (tag:transactiontag=B)"
2022-01-01 Transaction 1 ; transactiontag:A
assets:bank:main -1 ; A comment
expenses:food
2022-01-01 Transaction 2 ; transactiontag:A
assets:bank:main -1
assets:bank:secondary -1 ; atag:a
expenses:food
>=
# ** 11. With expr:, it's possible for a query (with OR) to specify multiple different date periods.
# This is problematic for report semantics in several ways. For example,
# expr:'(date:2023 AND drinks) OR (date:2024 AND food)' produces two disjoint result sets, and
# expr:'date:feb or date:may or date:nov' produces three disjoint report periods with holes between them.
# Can all of our reports handle holes properly, calculate historical starting balances properly, etc ?
# For now the answer is no and therefore OR-ing of date periods must be disallowed. (#2178)
$ hledger -f- reg expr:'date:2023 OR date:2024'
>2 /using date: in OR expressions is not supported/
>=1