Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.busybox.net/busybox.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Leonard <d+busybox@adaptive-enterprises.com>2022-02-20 07:29:45 +0300
committerDenys Vlasenko <vda.linux@googlemail.com>2022-05-02 15:25:36 +0300
commit4642cf5b388bf60f6bea67ce3a5031d24bccd48a (patch)
tree8f6cec270d99a47627b16402531db303076a34ef /testsuite
parent52a7bf6fa677abdb80f8e484f6ba77ed3d34e444 (diff)
tsort: new applet
function old new delta tsort_main - 578 +578 .rodata 104884 104906 +22 applet_names 2759 2765 +6 applet_main 1596 1600 +4 packed_usage 34290 34288 -2 ------------------------------------------------------------------------------ (add/remove: 2/0 grow/shrink: 3/1 up/down: 610/-2) Total: 608 bytes Signed-off-by: David Leonard <d+busybox@adaptive-enterprises.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'testsuite')
-rwxr-xr-xtestsuite/tsort.tests110
1 files changed, 110 insertions, 0 deletions
diff --git a/testsuite/tsort.tests b/testsuite/tsort.tests
new file mode 100755
index 000000000..c6fe78272
--- /dev/null
+++ b/testsuite/tsort.tests
@@ -0,0 +1,110 @@
+#!/bin/sh
+
+# SUSv3 compliant sort tests.
+# Public Domain, David Leonard 2022
+
+. ./testing.sh
+
+# name cmd expected ./input stdin
+testing "" "tsort" "a\n" "" "a a\n"
+testing "" "tsort -" "a\n" "" "a a\n"
+testing "" "tsort input" "a\n" "a a\n" ""
+testing "tsort input (w/o eol)" "tsort input" "a\n" "a a" ""
+testing "" "tsort /dev/null" "" "" ""
+
+testing "tsort empty" tsort "" "" ""
+testing "tsort blank" tsort "" "" "\n"
+testing "tsort blanks" tsort "" "" "\n\n \t\n "
+
+# simple inputs having exactly one solution
+testing "tsort 1-edge" tsort "a\nb\n" "" "a b\n"
+testing "tsort 2-edge" tsort "a\nb\nc\n" "" "a b b c\n"
+
+
+# The following test helper accommodates future variable output because, as
+# tsort is allowed to emit any total ordering that satisfies its input,
+# should the implementation changes, these tests will remain valid.
+#
+# The idea is to verify that:
+# - each input word is present EXACTLY ONCE in tsort's output
+# - for each input pair 'a b', the occurrence of 'a' APPEARS BEFORE 'b'
+# - the exit code is 0
+
+tsort_test () {
+ fail=
+ name="$1"; shift
+ args="$*"
+ if [ $VERBOSE ]; then
+ echo "============"
+ echo "echo \"$args\" | tsort >actual"
+ fi
+ echo "$args" | tsort >actual
+ ec=$?
+ if [ $ec -ne 0 ]; then
+ fail "tsort exit $ec, expected 0"
+ fi
+ while [ $# -ne 0 ]; do
+ a=$1; shift
+ b=$1; shift
+ aline=$(grep -nxF "$a" <actual | cut -d: -f1)
+ bline=$(grep -nxF "$b" <actual | cut -d: -f1)
+ case $aline in
+ "") fail "word $a missing from output ($args)";;
+ *" "*) fail "word $a duplicated ($args)";;
+ esac
+ case $bline in
+ "") fail "word $b missing from output ($args)";;
+ *" "*) fail "word $b duplicated ($args)";;
+ esac
+ if [ $aline -gt $bline ]; then
+ fail "$a appears after $b ($args)"
+ fi
+ done
+ if [ $fail ] && [ $VERBOSE ]; then
+ echo "exit $ec, actual:"
+ cat actual
+ fi
+ rm actual
+ report "$name"
+}
+
+# Test that erroneous input causes an unsuccessful exit code
+# we don't test the output error message
+tsort_test_err () {
+ fail=
+ name="$1"; shift
+ echo "$*" | tsort >/dev/null 2>/dev/null
+ ec=$?
+ if [ $ec -eq 0 ]; then
+ fail "$name: unexpected exit 0 ($*)"
+ fi
+ report "$name"
+}
+
+fail () {
+ [ $VERBOSE ] && echo "ERROR: $*"
+ fail=1
+}
+
+report () {
+ if [ $fail ]; then
+ FAILCOUNT=$(($FAILCOUNT + 1))
+ echo "FAIL: $*"
+ else
+ echo "PASS: $*"
+ fi
+}
+
+tsort_test "tsort empty2"
+tsort_test "tsort singleton" a a
+tsort_test "tsort simple" a b b c
+tsort_test "tsort 2singleton" a a b b
+tsort_test "tsort medium" a b a b b c
+tsort_test "tsort std.example" a b c c d e g g f g e f h h
+tsort_test "tsort prefixes" a aa aa aaa aaaa aaaaa a aaaaa
+
+tsort_test_err "tsort odd" a
+tsort_test_err "tsort odd2" a b c
+tsort_test_err "tsort cycle" a b b a
+
+exit $FAILCOUNT