]> git.draconx.ca Git - dxcommon.git/blobdiff - tests/functions.at
dx_getline: Fix EOF handling in standard C fallback.
[dxcommon.git] / tests / functions.at
index 115b8cffa08593530fb533d928a5cc15d27b0351..bede78eb4cfbbf7eb7486884954dc84bb667f796 100644 (file)
@@ -1,26 +1,8 @@
-dnl Copyright © 2015 Nick Bowler
-dnl
-dnl License WTFPL2: Do What The Fuck You Want To Public License, version 2.
-dnl This is free software: you are free to do what the fuck you want to.
-dnl There is NO WARRANTY, to the extent permitted by law.
-
-m4_divert_push([PREPARE_TESTS])dnl
-test_run_tap () {
-  "$builddir/t/$1" > "$1.tap"
-  status=$?
-  cat "$1.tap"
-  prove -e cat "$1.tap"
-  return $status
-}
-m4_divert_pop([PREPARE_TESTS])
-
-m4_define([TEST_TAP], [AT_CHECK([test_run_tap "$1"], [0], [ignore])])
-m4_define([TEST_TAP_SIMPLE], [dnl
-AT_SETUP([$1])
-AT_KEYWORDS([$4])dnl
-m4_n([$3])dnl
-TEST_TAP([$2])
-AT_CLEANUP])
+# Copyright © 2015, 2021-2024 Nick Bowler
+#
+# License GPLv3+: GNU General Public License version 3 or any later version.
+# This is free software: you are free to change and redistribute it.
+# There is NO WARRANTY, to the extent permitted by law.
 
 AT_BANNER([Binary packing functions])
 
@@ -28,3 +10,169 @@ TEST_TAP_SIMPLE([signed unpacking], [packtests], [], [pack])
 TEST_TAP_SIMPLE([unsigned unpacking], [packtestu], [], [pack])
 TEST_TAP_SIMPLE([64-bit signed unpacking], [packtests64], [], [pack])
 TEST_TAP_SIMPLE([64-bit unsigned unpacking], [packtestu64], [], [pack])
+
+AT_BANNER([Help formatting functions])
+
+AT_SETUP([help_print_desc])
+AT_KEYWORDS([help])
+
+AT_SKIP_IF([test ! -x "$builddir/t/helpdesc"])
+
+AT_DATA([test.txt],
+[[this is the first line
+this is the second line
+this is the third line
+and so on
+]])
+
+sed -e '5,$s/^/     /' -e '6,$s/^/     /' \
+  -e '10,$s/^/                    /' \
+  -e '13s/^ *//' -e '14,$s/^/          /' \
+  test.txt test.txt test.txt test.txt >expout
+
+AT_CHECK(["$builddir/t/helpdesc" 0 0 10 5 30 20 40 40 <test.txt],
+  [0], [expout])
+
+AT_CHECK([AS_ECHO_N(["no trailing newline"]) |
+  "$builddir/t/helpdesc" 0 0], [0],
+[no trailing newline
+])
+
+AT_CLEANUP
+
+AT_SETUP([help_print_desc (empty description)])
+AT_KEYWORDS([help])
+
+AT_SKIP_IF([test ! -x "$builddir/t/helpdesc"])
+
+AT_CHECK(["$builddir/t/helpdesc" 0 0 0 20 </dev/null], [0], [
+
+])
+AT_CHECK(["$builddir/t/helpdesc" 1 20 </dev/null], [0], [
+])
+
+AT_CLEANUP
+
+AT_SETUP([help_print_optstring])
+AT_KEYWORDS([help])
+
+AT_DATA([expout],
+[[ --foo       6
+ -b, --bar     10
+ --baz=ARG     10
+ -B, --baz=ARG 14
+ --quux[=ARG]  13
+ -q, --quux[=ARG]      17
+ --hello-this-is-a-very-long-option
+       0
+ --hello-this-is-a-very-long-option    35
+ --not-long    11
+ --flagged     10
+]])
+
+# Some very old printf implementations return 0 on success instead of the
+# number of bytes written.  The help_print_optstring function is not fully
+# functional in this case.  It should fallback to printing a newline and
+# returning 0 so the overall --help output should be mostly acceptable.
+#
+# We verify that this indeed works properly by adjusting the expected
+# output accordingly, but ...
+AS_IF(["$builddir/t/printfchk" >/dev/null], [ancient_printf=false],
+[[sed -n -e 's/        [0-9]*$//' -e '/^ *-/p' -e 's/^ *-.*/   0/p' expout >expout.tmp
+mv -f expout.tmp expout
+ancient_printf=:]])
+
+AT_CHECK([m4_join([ ],
+  ["$builddir/t/helpopt"],
+  [--foo],
+  [--bar -b],
+  [--baz ARG],
+  [--baz -B ARG],
+  [--quux '@<:@ARG@:>@'],
+  [--quux -q '@<:@ARG@:>@'],
+  [--hello-this-is-a-very-long-option 20],
+  [--hello-this-is-a-very-long-option 50],
+  [--not-long 12],
+  [--flagged -f \&])], [0], [expout])
+
+# ... we ultimately skip the test so there's an indication (other than an
+# outright failure) that the function is not working completely.
+AT_SKIP_IF([$ancient_printf])
+
+AT_CLEANUP
+
+AT_SETUP([help_print_optstring (getopt_long_only)])
+AT_KEYWORDS([help])
+
+AT_DATA([expout],
+[[ -foo        5
+ -bar  5
+ -baz ARG      9
+ -baz ARG      9
+ -quux [ARG]   12
+ -quux [ARG]   12
+ -hello-this-is-a-very-long-option
+       0
+ -hello-this-is-a-very-long-option     34
+ -not-long     10
+ -flagged      9
+]])
+
+# Some very old printf implementations return 0 on success instead of the
+# number of bytes written.  The help_print_optstring function is not fully
+# functional in this case.  It should fallback to printing a newline and
+# returning 0 so the overall --help output should be mostly acceptable.
+#
+# We verify that this indeed works properly by adjusting the expected
+# output accordingly, but ...
+AS_IF(["$builddir/t/printfchk" >/dev/null], [ancient_printf=false],
+[[sed -n -e 's/        [0-9]*$//' -e '/^ *-/p' -e 's/^ *-.*/   0/p' expout >expout.tmp
+mv -f expout.tmp expout
+ancient_printf=:]])
+
+AT_CHECK([m4_join([ ],
+  ["$builddir/t/helpopt2"],
+  [--foo],
+  [--bar -b],
+  [--baz ARG],
+  [--baz -B ARG],
+  [--quux '@<:@ARG@:>@'],
+  [--quux -q '@<:@ARG@:>@'],
+  [--hello-this-is-a-very-long-option 20],
+  [--hello-this-is-a-very-long-option 50],
+  [--not-long 12],
+  [--flagged -f \&])], [0], [expout])
+
+# ... we ultimately skip the test so there's an indication (other than an
+# outright failure) that the function is not working completely.
+AT_SKIP_IF([$ancient_printf])
+
+AT_CLEANUP
+
+AT_SETUP([help_print_optstring (NLS fullwidth/halfwidth)])
+AT_KEYWORDS([help nls])
+
+AT_SKIP_IF([test ! -x "$builddir/t/helpopt3"])
+TEST_UTF8_LOCALE([locale_utf8])
+
+# Avoid some deficient shell parsers barfing on UTF-8 sequences by
+# generating them this way using octal escapes.
+$AWK 'BEGIN {
+  zenkaku = "--\345\205\250\350\247\222";
+  hankaku = "--\357\276\212\357\276\235\357\275\266\357\275\270"
+
+  print zenkaku, hankaku >"args"
+
+  print " " zenkaku "\t" "7"
+  print " " hankaku "\t" "7"
+}' >expout </dev/null
+
+AT_CHECK([LC_ALL=$locale_utf8 xargs "$builddir/t/helpopt3" <args],
+  [0], [expout])
+
+AT_CLEANUP
+
+AT_BANNER([Miscellaneous functions])
+
+TEST_TAP_SIMPLE([copyright_symbol], [copysym], [], [])
+TEST_TAP_SIMPLE([do_getline], [getline], [], [getline])