From 92a3ea48f9c244b1d0dba7b0dcf05c5eedb66d2f Mon Sep 17 00:00:00 2001 From: Simon Michael Date: Fri, 28 Nov 2025 21:08:06 -0800 Subject: [PATCH] dev:test:journal: clean up, expand include tests --- .../journal/include/.cycle/cycle2/cycle2.j | 1 - hledger/test/journal/include/a.j | 5 +- hledger/test/journal/include/a.timeclock | 2 - hledger/test/journal/include/b.j | 2 + hledger/test/journal/include/b.timeclock | 2 + .../journal/include/{.cycle => cycle}/cycle.j | 0 .../journal/include/cycle/cycle2/cycle2.j | 1 + .../include/cycle/cycle2/cycle3/cycle3.j | 1 + .../{.cycle/cycleglob.j => cycle/globcycle.j} | 0 hledger/test/journal/include/glob-deep/a.j | 1 + .../{ => glob-deep}/b/.dotdir/dotdirb.j | 0 .../journal/include/{ => glob-deep}/b/b.j | 0 .../{ => glob-deep}/b/bb/.dotdir/dotdirbb.j | 0 .../journal/include/{ => glob-deep}/b/bb/bb.j | 0 .../journal/include/{ => glob-deep}/c/c.j | 0 .../include/{.dota.j => glob-dot/.c/c.j} | 0 .../journal/include/{a2.j => glob-dot/a.j} | 0 hledger/test/journal/include/glob-dot/b/.d.j | 0 .../test/journal/include/glob-dot/b/.e/e.j | 0 hledger/test/journal/include/glob-dot/b/b.j | 0 hledger/test/journal/include/glob-self.j | 1 + .../journal/include/glob-symlinked-dir/a.j | 1 + .../journal/include/glob-symlinked-dir/c/c.j | 1 + .../include/glob-symlinked-dotdir/.c/c.j | 1 + .../journal/include/glob-symlinked-dotdir/a.j | 1 + .../include/glob-symlinked-dotfile/.c.j | 1 + .../include/glob-symlinked-dotfile/a.j | 1 + .../include/glob-symlinked-dotfile/b.j | 1 + .../journal/include/glob-symlinked-file/a.j | 1 + .../journal/include/glob-symlinked-file/b.j | 1 + .../journal/include/glob-symlinked-file/c.j | 1 + hledger/test/journal/include/include.test | 204 +++++++++++------- hledger/test/journal/include/selfglob.j | 1 - 33 files changed, 142 insertions(+), 89 deletions(-) delete mode 100644 hledger/test/journal/include/.cycle/cycle2/cycle2.j delete mode 100644 hledger/test/journal/include/a.timeclock create mode 100644 hledger/test/journal/include/b.j create mode 100644 hledger/test/journal/include/b.timeclock rename hledger/test/journal/include/{.cycle => cycle}/cycle.j (100%) create mode 100644 hledger/test/journal/include/cycle/cycle2/cycle2.j create mode 100644 hledger/test/journal/include/cycle/cycle2/cycle3/cycle3.j rename hledger/test/journal/include/{.cycle/cycleglob.j => cycle/globcycle.j} (100%) create mode 100644 hledger/test/journal/include/glob-deep/a.j rename hledger/test/journal/include/{ => glob-deep}/b/.dotdir/dotdirb.j (100%) rename hledger/test/journal/include/{ => glob-deep}/b/b.j (100%) rename hledger/test/journal/include/{ => glob-deep}/b/bb/.dotdir/dotdirbb.j (100%) rename hledger/test/journal/include/{ => glob-deep}/b/bb/bb.j (100%) rename hledger/test/journal/include/{ => glob-deep}/c/c.j (100%) rename hledger/test/journal/include/{.dota.j => glob-dot/.c/c.j} (100%) rename hledger/test/journal/include/{a2.j => glob-dot/a.j} (100%) create mode 100644 hledger/test/journal/include/glob-dot/b/.d.j create mode 100644 hledger/test/journal/include/glob-dot/b/.e/e.j create mode 100644 hledger/test/journal/include/glob-dot/b/b.j create mode 100644 hledger/test/journal/include/glob-self.j create mode 100644 hledger/test/journal/include/glob-symlinked-dir/a.j create mode 100644 hledger/test/journal/include/glob-symlinked-dir/c/c.j create mode 100644 hledger/test/journal/include/glob-symlinked-dotdir/.c/c.j create mode 100644 hledger/test/journal/include/glob-symlinked-dotdir/a.j create mode 100644 hledger/test/journal/include/glob-symlinked-dotfile/.c.j create mode 100644 hledger/test/journal/include/glob-symlinked-dotfile/a.j create mode 120000 hledger/test/journal/include/glob-symlinked-dotfile/b.j create mode 100644 hledger/test/journal/include/glob-symlinked-file/a.j create mode 120000 hledger/test/journal/include/glob-symlinked-file/b.j create mode 100644 hledger/test/journal/include/glob-symlinked-file/c.j delete mode 100644 hledger/test/journal/include/selfglob.j diff --git a/hledger/test/journal/include/.cycle/cycle2/cycle2.j b/hledger/test/journal/include/.cycle/cycle2/cycle2.j deleted file mode 100644 index b22e22c1f..000000000 --- a/hledger/test/journal/include/.cycle/cycle2/cycle2.j +++ /dev/null @@ -1 +0,0 @@ -include ../cycle.j diff --git a/hledger/test/journal/include/a.j b/hledger/test/journal/include/a.j index b8edfa9da..3ac0ffd7d 100644 --- a/hledger/test/journal/include/a.j +++ b/hledger/test/journal/include/a.j @@ -1,4 +1 @@ -include a*.j - -2016-01-01 - (a) 1 +2025-01-01 a diff --git a/hledger/test/journal/include/a.timeclock b/hledger/test/journal/include/a.timeclock deleted file mode 100644 index 394258589..000000000 --- a/hledger/test/journal/include/a.timeclock +++ /dev/null @@ -1,2 +0,0 @@ -i 2016-01-01 12:00:00 a:aa -o 2016-01-01 16:00:00 diff --git a/hledger/test/journal/include/b.j b/hledger/test/journal/include/b.j new file mode 100644 index 000000000..f99e54a22 --- /dev/null +++ b/hledger/test/journal/include/b.j @@ -0,0 +1,2 @@ +2016-01-01 + (b) 1 diff --git a/hledger/test/journal/include/b.timeclock b/hledger/test/journal/include/b.timeclock new file mode 100644 index 000000000..ec3fc74cb --- /dev/null +++ b/hledger/test/journal/include/b.timeclock @@ -0,0 +1,2 @@ +i 2016-01-01 12:00:00 b:bb +o 2016-01-01 16:00:00 diff --git a/hledger/test/journal/include/.cycle/cycle.j b/hledger/test/journal/include/cycle/cycle.j similarity index 100% rename from hledger/test/journal/include/.cycle/cycle.j rename to hledger/test/journal/include/cycle/cycle.j diff --git a/hledger/test/journal/include/cycle/cycle2/cycle2.j b/hledger/test/journal/include/cycle/cycle2/cycle2.j new file mode 100644 index 000000000..f52c6dc2f --- /dev/null +++ b/hledger/test/journal/include/cycle/cycle2/cycle2.j @@ -0,0 +1 @@ +include cycle3/cycle3.j diff --git a/hledger/test/journal/include/cycle/cycle2/cycle3/cycle3.j b/hledger/test/journal/include/cycle/cycle2/cycle3/cycle3.j new file mode 100644 index 000000000..38e9e15b4 --- /dev/null +++ b/hledger/test/journal/include/cycle/cycle2/cycle3/cycle3.j @@ -0,0 +1 @@ +include ../../cycle.j diff --git a/hledger/test/journal/include/.cycle/cycleglob.j b/hledger/test/journal/include/cycle/globcycle.j similarity index 100% rename from hledger/test/journal/include/.cycle/cycleglob.j rename to hledger/test/journal/include/cycle/globcycle.j diff --git a/hledger/test/journal/include/glob-deep/a.j b/hledger/test/journal/include/glob-deep/a.j new file mode 100644 index 000000000..794c875ba --- /dev/null +++ b/hledger/test/journal/include/glob-deep/a.j @@ -0,0 +1 @@ +include */**.j diff --git a/hledger/test/journal/include/b/.dotdir/dotdirb.j b/hledger/test/journal/include/glob-deep/b/.dotdir/dotdirb.j similarity index 100% rename from hledger/test/journal/include/b/.dotdir/dotdirb.j rename to hledger/test/journal/include/glob-deep/b/.dotdir/dotdirb.j diff --git a/hledger/test/journal/include/b/b.j b/hledger/test/journal/include/glob-deep/b/b.j similarity index 100% rename from hledger/test/journal/include/b/b.j rename to hledger/test/journal/include/glob-deep/b/b.j diff --git a/hledger/test/journal/include/b/bb/.dotdir/dotdirbb.j b/hledger/test/journal/include/glob-deep/b/bb/.dotdir/dotdirbb.j similarity index 100% rename from hledger/test/journal/include/b/bb/.dotdir/dotdirbb.j rename to hledger/test/journal/include/glob-deep/b/bb/.dotdir/dotdirbb.j diff --git a/hledger/test/journal/include/b/bb/bb.j b/hledger/test/journal/include/glob-deep/b/bb/bb.j similarity index 100% rename from hledger/test/journal/include/b/bb/bb.j rename to hledger/test/journal/include/glob-deep/b/bb/bb.j diff --git a/hledger/test/journal/include/c/c.j b/hledger/test/journal/include/glob-deep/c/c.j similarity index 100% rename from hledger/test/journal/include/c/c.j rename to hledger/test/journal/include/glob-deep/c/c.j diff --git a/hledger/test/journal/include/.dota.j b/hledger/test/journal/include/glob-dot/.c/c.j similarity index 100% rename from hledger/test/journal/include/.dota.j rename to hledger/test/journal/include/glob-dot/.c/c.j diff --git a/hledger/test/journal/include/a2.j b/hledger/test/journal/include/glob-dot/a.j similarity index 100% rename from hledger/test/journal/include/a2.j rename to hledger/test/journal/include/glob-dot/a.j diff --git a/hledger/test/journal/include/glob-dot/b/.d.j b/hledger/test/journal/include/glob-dot/b/.d.j new file mode 100644 index 000000000..e69de29bb diff --git a/hledger/test/journal/include/glob-dot/b/.e/e.j b/hledger/test/journal/include/glob-dot/b/.e/e.j new file mode 100644 index 000000000..e69de29bb diff --git a/hledger/test/journal/include/glob-dot/b/b.j b/hledger/test/journal/include/glob-dot/b/b.j new file mode 100644 index 000000000..e69de29bb diff --git a/hledger/test/journal/include/glob-self.j b/hledger/test/journal/include/glob-self.j new file mode 100644 index 000000000..481399d28 --- /dev/null +++ b/hledger/test/journal/include/glob-self.j @@ -0,0 +1 @@ +include glob-sel*.j diff --git a/hledger/test/journal/include/glob-symlinked-dir/a.j b/hledger/test/journal/include/glob-symlinked-dir/a.j new file mode 100644 index 000000000..bb0d5bb13 --- /dev/null +++ b/hledger/test/journal/include/glob-symlinked-dir/a.j @@ -0,0 +1 @@ +include b*/*.j diff --git a/hledger/test/journal/include/glob-symlinked-dir/c/c.j b/hledger/test/journal/include/glob-symlinked-dir/c/c.j new file mode 100644 index 000000000..935a8012e --- /dev/null +++ b/hledger/test/journal/include/glob-symlinked-dir/c/c.j @@ -0,0 +1 @@ +2025-01-01 c diff --git a/hledger/test/journal/include/glob-symlinked-dotdir/.c/c.j b/hledger/test/journal/include/glob-symlinked-dotdir/.c/c.j new file mode 100644 index 000000000..935a8012e --- /dev/null +++ b/hledger/test/journal/include/glob-symlinked-dotdir/.c/c.j @@ -0,0 +1 @@ +2025-01-01 c diff --git a/hledger/test/journal/include/glob-symlinked-dotdir/a.j b/hledger/test/journal/include/glob-symlinked-dotdir/a.j new file mode 100644 index 000000000..bb0d5bb13 --- /dev/null +++ b/hledger/test/journal/include/glob-symlinked-dotdir/a.j @@ -0,0 +1 @@ +include b*/*.j diff --git a/hledger/test/journal/include/glob-symlinked-dotfile/.c.j b/hledger/test/journal/include/glob-symlinked-dotfile/.c.j new file mode 100644 index 000000000..935a8012e --- /dev/null +++ b/hledger/test/journal/include/glob-symlinked-dotfile/.c.j @@ -0,0 +1 @@ +2025-01-01 c diff --git a/hledger/test/journal/include/glob-symlinked-dotfile/a.j b/hledger/test/journal/include/glob-symlinked-dotfile/a.j new file mode 100644 index 000000000..7dcb62644 --- /dev/null +++ b/hledger/test/journal/include/glob-symlinked-dotfile/a.j @@ -0,0 +1 @@ +include b*.j diff --git a/hledger/test/journal/include/glob-symlinked-dotfile/b.j b/hledger/test/journal/include/glob-symlinked-dotfile/b.j new file mode 120000 index 000000000..58525b607 --- /dev/null +++ b/hledger/test/journal/include/glob-symlinked-dotfile/b.j @@ -0,0 +1 @@ +.c.j \ No newline at end of file diff --git a/hledger/test/journal/include/glob-symlinked-file/a.j b/hledger/test/journal/include/glob-symlinked-file/a.j new file mode 100644 index 000000000..b4305f92f --- /dev/null +++ b/hledger/test/journal/include/glob-symlinked-file/a.j @@ -0,0 +1 @@ +include b* diff --git a/hledger/test/journal/include/glob-symlinked-file/b.j b/hledger/test/journal/include/glob-symlinked-file/b.j new file mode 120000 index 000000000..40b5285ee --- /dev/null +++ b/hledger/test/journal/include/glob-symlinked-file/b.j @@ -0,0 +1 @@ +c.j \ No newline at end of file diff --git a/hledger/test/journal/include/glob-symlinked-file/c.j b/hledger/test/journal/include/glob-symlinked-file/c.j new file mode 100644 index 000000000..935a8012e --- /dev/null +++ b/hledger/test/journal/include/glob-symlinked-file/c.j @@ -0,0 +1 @@ +2025-01-01 c diff --git a/hledger/test/journal/include/include.test b/hledger/test/journal/include/include.test index 70932b359..21f30ed52 100644 --- a/hledger/test/journal/include/include.test +++ b/hledger/test/journal/include/include.test @@ -1,137 +1,179 @@ # * include directive -# ** 1. journal, timeclock, and timedot files can be included. +# ** 1. The old !include spelling still works. +< +!include a.j +$ hledger -f- print +2025-01-01 a + +>= + +# ** 2. journal, timeclock, and timedot files can be included. # Trailing whitespace or comments are ignored. # The order of includes is respected. -include a.j -include b.timedot ; comment -include a.timeclock +< +include b.j +include b.timeclock ; comment +include b.timedot ; comment $ hledger -f - print 2016-01-01 - (a) 1 + (b) 1 + +2016-01-01 * 12:00-16:00 + (b:bb) 4.00h 2016-01-01 * (b.bb) 1.00 -2016-01-01 * 12:00-16:00 - (a:aa) 4.00h - ->= - -# ** 2. The old !include spelling still works. -< -!include f.journal -$ printf '2018/01/01\n (A) 1\n' >f.journal; hledger -f - print; rm -f f.journal -2018-01-01 - (A) 1 - >= # ** 3. A leading tilde is expanded to $HOME. < -include ~/included.journal -$ printf '2018/01/01\n (A) 1\n' >included.journal; HOME="$PWD" hledger -f - print; rm -rf included.journal -2018-01-01 - (A) 1 +include ~/a.j +$ HOME="$PWD" hledger -f - print +2025-01-01 a >= 0 -# ** 4. include with no argument -> argument error +# ** 4. include followed by whitespace and/or comment -> missing argument error < -include -$ hledger -f- files +include ;just a comment +$ hledger -f- print >2 /include needs a.*argument/ >=1 -# ** 5. include a nonexistent file -> no files matched error +# ** 5. include followed by nothing at all -> missing argument error +< +include +$ hledger -f- print +>2 /include needs a.*argument/ +>=1 + +# ** 6. include a nonexistent file -> no files matched error < include nosuchfile -$ hledger -f- files +$ hledger -f- print >2 /No files were matched/ >=1 -# ** 6. Including a directory literally -> no files matched error +# ** 7. Including a directory literally -> no files matched error < -include b -$ hledger -f- files +include glob-deep +$ hledger -f- print >2 /No files were matched/ >=1 -# ** 7. Include invalid glob patterns -> invalid glob error +# ** 8. Include invalid glob patterns -> invalid glob error < include [.journal $ hledger -f - print >2 /Invalid glob/ >= 1 -# ** 8. Three or more *'s -> invalid glob error +# ** 9. Three or more *'s -> invalid glob error < include *** $ hledger -f- files >2 /Invalid glob/ >=1 -# ** 9. Including the current file literally -> cycle error. +# ** 10. Including the current file literally -> cycle error. $ hledger -f self.j files +>2 /included file forms a cycle/ +>=1 + +# ** 11. Including a multi-file cycle, all literally -> cycle error. +$ hledger -f cycle/cycle.j files +>2 /included file forms a cycle/ +>=1 + +# ** 12. Including the current file via glob -> harmless, globs ignore current file. +$ hledger -f glob-self.j files | sed -E 's|.*hledger/test/journal/include/||' +glob-self.j + +# ** 13. Including a cycle, involving globs -> cycle error +$ hledger -f cycle/globcycle.j files >2 /cycle/ >=1 -# ** 10. Including the current file via glob -> harmless, globs ignore current file. -$ hledger -f selfglob.j files | sed -E 's|.*hledger/test/journal/include/||' -selfglob.j +# ** 14. Old-style deep glob **/*.j -> all non-dot .j files in current dir or non-dot subdirs. +< +include glob-deep/**/*.j +$ hledger -f - files | sed -E 's|.*/glob-deep/|glob-deep/|' +- +glob-deep/a.j +glob-deep/b/b.j +glob-deep/b/bb/bb.j +glob-deep/c/c.j +glob-deep/b/b.j +glob-deep/b/bb/bb.j +glob-deep/c/c.j -# ** 11. Including a cycle, all literally -> cycle error -$ hledger -f .cycle/cycle.j files ->2 /cycle/ ->=1 +# ** 15. Simpler deep glob **.j -> same as above. +< +include glob-deep/**/*.j +$ hledger -f - files | sed -E 's|.*/glob-deep/|glob-deep/|' +- +glob-deep/a.j +glob-deep/b/b.j +glob-deep/b/bb/bb.j +glob-deep/c/c.j +glob-deep/b/b.j +glob-deep/b/bb/bb.j +glob-deep/c/c.j -# ** 12. Including a cycle, involving globs -> cycle error -$ hledger -f .cycle/cycleglob.j files ->2 /cycle/ ->=1 - -# ** 13. Glob patterns ignore the current file (once). -$ hledger -f a.j files | sed -E 's|.*hledger/test/journal/include/||' +# ** 16. --old-glob preserves pre-1.50 glob behaviour: avoiding dot things at top (.c/) and bottom (b/.d.j), +# but searching intermediate dot dirs (b/.e/). +< +include glob-dot/**.j +$ hledger -f - files --old-glob | sed -E 's|.*/glob-dot/||' +- a.j -a2.j - -# ** 14. Include */**/*.j -> all non-dot .j files in or below non-dot subdirectories. -< -include */**/*.j -$ hledger -f - files | sed -E 's|.*hledger/test/journal/include/||' -- +b/.e/e.j b/b.j -b/bb/bb.j + +# ** 17. Otherwise, globs avoid all paths involving dot dirs (.c/, b/.d.j, b/.e/) (a workaround). +< +include glob-dot/**.j +$ hledger -f - files | sed -E 's|.*/glob-dot/||' +- +a.j +b/b.j + +# ** 18. A non-glob path can match dot things. +< +include glob-dot/.c/c.j +include glob-dot/b/.d.j +include glob-dot/b/.e/e.j +$ hledger -f - files | sed -E 's|.*/glob-dot/||' +- +.c/c.j +b/.d.j +b/.e/e.j + +# ** 19. A glob follows a symlink to a regular file (and shows the target file's path). +$ hledger -f glob-symlinked-file/a.j files | sed -E 's|.*/glob-symlinked-file/||' +a.j +c.j + +# ** 20. A glob follows a symlink to a regular dir. +$ hledger -f glob-symlinked-dir/a.j files | sed -E 's|.*/glob-symlinked-dir/||' +a.j c/c.j -# ** 15. ** without a slash can also match filename start, equivalent to **/* -> same result as above. -< -include */**.j -$ hledger -f - files | sed -E 's|.*hledger/test/journal/include/||' -- -b/b.j -b/bb/bb.j -c/c.j +# ** 21. A glob follows a symlink to a dot file. +$ hledger -f glob-symlinked-dotfile/a.j files | sed -E 's|.*/glob-symlinked-dotfile/||' +a.j +.c.j -# ** 16. To avoid intermediate dot dirs in the above, we exclude all glob-matched paths involving dot dirs. -# So this does not find b/bb/.dotdir/dotdirbb.j, unfortunately: -< -include b/.dotdir/*.j -$ hledger -f - files | sed -E 's|.*hledger/test/journal/include/||' ->2 /No files were matched/ -# sed hides the non-zero exit code - -# ** 17. This workaround can be disabled with --old-glob, for now. -$ hledger -f - files --old-glob | sed -E 's|.*hledger/test/journal/include/||' -- -b/.dotdir/dotdirb.j - -# ** 18. A literal path can always match dot files/dirs. -< -include b/.dotdir/dotdirb.j -$ hledger -f - files | sed -E 's|.*hledger/test/journal/include/||' -- -b/.dotdir/dotdirb.j +# ** 22. A glob does not follow a symlink to a dot dir. +$ hledger -f glob-symlinked-dotdir/a.j files | sed -E 's|.*/glob-symlinked-dotdir/||' +>2 /No files were matched by glob pattern/ +#>=1 # sed hides this +# ** 23. A glob does follow a symlink to a dot dir if --old-glob is used. +$ hledger -f glob-symlinked-dotdir/a.j files --old-glob | sed -E 's|.*/glob-symlinked-dotdir/||' +a.j +.c/c.j diff --git a/hledger/test/journal/include/selfglob.j b/hledger/test/journal/include/selfglob.j deleted file mode 100644 index 0323e0b54..000000000 --- a/hledger/test/journal/include/selfglob.j +++ /dev/null @@ -1 +0,0 @@ -include selfg*.j