diff options
Diffstat (limited to 'contrib/netbsd-tests/usr.bin/sort/t_sort.sh')
-rwxr-xr-x | contrib/netbsd-tests/usr.bin/sort/t_sort.sh | 1023 |
1 files changed, 1023 insertions, 0 deletions
diff --git a/contrib/netbsd-tests/usr.bin/sort/t_sort.sh b/contrib/netbsd-tests/usr.bin/sort/t_sort.sh new file mode 100755 index 0000000..a36457c --- /dev/null +++ b/contrib/netbsd-tests/usr.bin/sort/t_sort.sh @@ -0,0 +1,1023 @@ +# $NetBSD: t_sort.sh,v 1.1 2012/03/17 16:33:15 jruoho Exp $ +# +# Copyright (c) 2008, 2009, 2010 The NetBSD Foundation, Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS +# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +atf_test_case basic +basic_head() +{ + atf_set "descr" "Basic functionality test" +} +basic_body() +{ + cat >in <<EOF +z b m f +y c o e +x a n h +x a n g +EOF + + cat >expout <<EOF +x a n g +x a n h +y c o e +z b m f +EOF + + atf_check -o file:expout sort in +} + +atf_test_case empty_file +empty_file_head() +{ + atf_set "descr" "Tests sorting an empty file" +} +empty_file_body() +{ + touch empty + atf_check -o empty sort -S empty + atf_check sort -S -c empty + atf_check sort -S -c -u empty +} + +atf_test_case end_of_options +end_of_options_head() +{ + atf_set "descr" "Determination of end of option list" +} +end_of_options_body() +{ + echo x >-k + atf_check -o file:-k -x "sort -S -- -k </dev/null" + atf_check -s not-exit:1 -e ignore -x "sort -S - -c </dev/null" +} + +atf_test_case missing_newline +missing_newline_head() +{ + atf_set "descr" "Tests with missing new line in input file" +} +missing_newline_body() +{ + printf '%s' x >in + atf_check -o inline:'x\n' sort in +} + +atf_test_case null_bytes +null_bytes_head() +{ + atf_set "descr" "Tests the behavior of null bytes" +} +null_bytes_body() +{ + printf '\0b\n\0a\n' >in + atf_check -o inline:'\0a\n\0b\n' sort -S in +} + +atf_test_case long_records +long_records_head() +{ + atf_set "descr" "Tests long lines and keys" +} +long_records_body() +{ + awk 'BEGIN { x="x" + for(i=1; i<=12; i++) x = x x + for(i=15; i<=25; i++) print x i +}' >in + + awk 'BEGIN { x="x" + for(i=1; i<=12; i++) x = x x + for(i=25; i>=15; i--) print x i +}' >out + + atf_check -o file:out sort -r in + atf_check -o file:out sort -k 1,1r -k 1 in +} + +atf_test_case long_file +long_file_head() +{ + atf_set "descr" "Tests with a long file to try to force intermediate" \ + "files" +} +long_file_body() +{ + awk 'BEGIN { for(i=0; i<20000; i++) print rand() }' >in + sort -S -r in | awk '$0 "x" != x { print ; x = $0 "x" }' >out + atf_check -o file:out sort -u -r in +} + +atf_test_case any_char +any_char_head() +{ + atf_set "descr" "Tests with files containing non-printable/extended" \ + "characters" +} +any_char_body() +{ + atf_check -o file:$(atf_get_srcdir)/d_any_char_dflag_out.txt \ + sort -d -k 2 $(atf_get_srcdir)/d_any_char_in.txt + + atf_check -o file:$(atf_get_srcdir)/d_any_char_fflag_out.txt \ + sort -f -k 2 $(atf_get_srcdir)/d_any_char_in.txt + + atf_check -o file:$(atf_get_srcdir)/d_any_char_iflag_out.txt \ + sort -i -k 2 $(atf_get_srcdir)/d_any_char_in.txt +} + +atf_test_case bflag +bflag_head() +{ + atf_set "descr" "Tests the -b flag" +} +bflag_body() +{ + cat >in <<EOF + b + a +EOF + + atf_check -o file:in sort -b in + atf_check -o file:in -x "sort -b <in" + atf_check -s exit:1 -o ignore -e ignore -x "sort in | sort -c -r" +} + +atf_test_case cflag +cflag_head() +{ + atf_set "descr" "Tests the -c flag" +} +cflag_body() +{ + cat >in <<EOF +b +a +EOF + + atf_check -s exit:1 -e ignore sort -S -c in +} + +atf_test_case kflag_one_field +kflag_one_field_head() +{ + atf_set "descr" "Tests the -k flag with one field" +} +kflag_one_field_body() +{ + cat >in <<EOF +z b m f +y c o e +x a n h +x a n g +EOF + + cat >expout <<EOF +x a n g +x a n h +z b m f +y c o e +EOF + + atf_check -o file:expout sort -k2.1 in +} + +atf_test_case kflag_two_fields +kflag_two_fields_head() +{ + atf_set "descr" "Tests the -k flag with two fields" +} +kflag_two_fields_body() +{ + cat >in <<EOF +z b m f +y c o e +x a n h +x a n g +EOF + + cat >expout <<EOF +x a n h +x a n g +z b m f +y c o e +EOF + atf_check -o file:expout sort -k2.1,2.0 in +} + +atf_test_case kflag_many_fields +kflag_many_fields_head() +{ + atf_set "descr" "Tests the -k flag with many fields" +} +kflag_many_fields_body() +{ + cat >in <<EOF +0:2:3:4:5:6:7:8:9 +1:1:3:4:5:6:7:8:9 +1:2:2:4:5:6:7:8:9 +1:2:3:3:5:6:7:8:9 +1:2:3:4:4:6:7:8:9 +1:2:3:4:5:5:7:8:9 +1:2:3:4:5:6:6:8:9 +1:2:3:4:5:6:7:7:9 +1:2:3:4:5:6:7:8:8 +EOF + + cat >out <<EOF +1:2:3:4:5:6:7:8:8 +1:2:3:4:5:6:7:7:9 +1:2:3:4:5:6:6:8:9 +1:2:3:4:5:5:7:8:9 +1:2:3:4:4:6:7:8:9 +1:2:3:3:5:6:7:8:9 +1:2:2:4:5:6:7:8:9 +1:1:3:4:5:6:7:8:9 +0:2:3:4:5:6:7:8:9 +EOF + + atf_check -o file:out sort -t: -k9 -k8 -k7 -k6 -k5 -k4 -k3 \ + -k2 -k1 in +} + +atf_test_case kflag_outofbounds +kflag_outofbounds_head() +{ + atf_set "descr" "Tests the -k flag with out of bounds fields" +} +kflag_outofbounds_body() +{ + cat >in <<EOF +0 5 +1 4 +2 3 +3 2 +4 1 +5 0 +EOF + + atf_check -o file:in sort -k2.2,2.1 -k2.3,2.4 in +} + +atf_test_case kflag_nonmonotone +kflag_nonmonotone_head() +{ + atf_set "descr" "Tests the -k flag with apparently nonmonotone" \ + "field specs" +} +kflag_nonmonotone_body() +{ + cat >in <<EOF +aaaa c +x a +0 b +EOF + + atf_check -o file:in sort -k2,1.3 -k2.5,2.5 in +} + +atf_test_case kflag_limits +kflag_limits_head() +{ + atf_set "descr" "Tests the -k flag field limits" +} +kflag_limits_body() +{ + cat >in <<EOF +a 2 +a 1 +b 2 +b 1 +EOF + + cat >out <<EOF +b 2 +b 1 +a 2 +a 1 +EOF + + atf_check -o file:out sort -r -k1,1 -k2n in +} + +atf_test_case kflag_alpha +kflag_alpha_head() +{ + atf_set "descr" "Tests the -k flag with various alpha fields" +} +kflag_alpha_body() +{ + sort >in <<EOF +01:04:19:01:16:01:21:01 a +02:03:13:15:13:19:15:02 a +03:02:07:09:07:13:09:03 a +04:01:01:03:01:07:03:04 a +05:08:20:16:17:02:20:05 aa +06:07:14:18:14:20:14:06 aa +07:06:08:10:08:14:08:07 aa +08:05:02:04:02:08:02:08 aa +09:16:22:02:22:04:24:13 b +10:15:16:20:19:22:18:14 b +11:14:10:12:10:16:12:15 b +12:13:04:06:04:10:06:16 b +13:24:24:22:24:06:22:21 bb +14:23:18:24:21:24:16:22 bb +15:22:12:14:12:18:10:23 bb +16:21:06:08:06:12:04:24 bb +17:12:21:21:18:03:19:09 ab +18:11:15:19:15:21:13:10 ab +19:10:09:11:09:15:07:11 ab +20:09:03:05:03:09:01:12 ab +21:20:23:17:23:05:23:17 ba +22:19:17:23:20:23:17:18 ba +23:18:11:13:11:17:11:19 ba +24:17:05:07:05:11:05:20 ba +EOF + + atf_check -x "sort -S -k2b -k2 in >xx" + atf_check -e ignore sort -c -t: -k2n xx + + atf_check -x "sort -S -k2,2.1b -k2 in >xx" + atf_check -e ignore sort -c -t: -k3n xx + + atf_check -x "sort -S -k2.3 -k2 in >xx" + atf_check -e ignore sort -c -t: -k4n xx + + atf_check -x "sort -S -k2b,2.3 -k2 in >xx" + atf_check -e ignore sort -c -t: -k5n xx + + atf_check -x "sort -S -k2.3,2.1b -k2 in >xx" + atf_check -e ignore sort -c -t: -k6n xx + + atf_check -x "sort -S -k2,2.1b -k2r in >xx" + atf_check -e ignore sort -c -t: -k7n xx + + atf_check -x "sort -S -b -k2,2 -k2 in >xx" + atf_check -e ignore sort -c -t: -k8n xx + + # XXX This test is broken. The standard is not clear on the behavior. + #atf_check -x "sort -S -b -k2,2b -k2 in >xx" + #atf_check -e ignore sort -c -t: -k3n xx +} + +atf_test_case kflag_no_end +kflag_no_end_head() +{ + atf_set "descr" "Tests the -k flag with a field without end" +} +kflag_no_end_body() +{ + cat >in <<EOF +a-B +a+b +a b +A+b +a b +EOF + + cat >out <<EOF +a b +a b +A+b +a-B +a+b +EOF + + atf_check -o file:out sort -df -k 1 -k 1d <in +} + +atf_test_case mflag +mflag_head() +{ + atf_set "descr" "Tests the -m flag" +} +mflag_body() +{ + cat >in1 <<EOF +a +ab +ab +bc +ca +EOF + cat >in2 <<EOF +Z +a +aa +ac +c +EOF + cat >out <<EOF +Z +a +a +aa +ab +ab +ac +bc +c +ca +EOF + + atf_check -o file:out sort -S -m in1 in2 +} + +atf_test_case mflag_uflag +mflag_uflag_head() +{ + atf_set "descr" "Tests the -m flag together with -u" +} +mflag_uflag_body() +{ + cat >in <<EOF +a +b +c +d +EOF + + atf_check -o file:in sort -m -u in +} + +atf_test_case mflag_uflag_first +mflag_uflag_first_head() +{ + atf_set "descr" "Tests that the -m flag together with -u picks the" \ + "first among equal" +} +mflag_uflag_first_body() +{ + cat >in <<EOF +3B +3b +3B2 +~3B2 +4.1 +41 +5 +5. +EOF + + cat >out <<EOF +3B +3B2 +4.1 +5 +EOF + + atf_check -o file:out sort -mudf in + atf_check -o file:out sort -mudf -k1 in +} + +atf_test_case nflag +nflag_head() +{ + atf_set "descr" "Tests the -n flag" +} +nflag_body() +{ + cat >in <<EOF +-99.0 +-99.1 +-.0002 +-10 +2 +0010.000000000000000000000000000000000001 +10 +3x +x +EOF + + cat >expout <<EOF +-99.1 +-99.0 +-10 +-.0002 +x +2 +3x +10 +0010.000000000000000000000000000000000001 +EOF + + atf_check -o file:expout sort -n in +} + +atf_test_case nflag_rflag +nflag_rflag_head() +{ + atf_set "descr" "Tests the -n and -r flag combination" +} +nflag_rflag_body() +{ + cat >in <<EOF +1 +123 +2 +EOF + + cat >expout <<EOF +123 +2 +1 +EOF + + atf_check -o file:expout sort -rn in +} + +atf_test_case oflag +oflag_head() +{ + atf_set "descr" "Tests the -o flag" +} +oflag_body() +{ + cat >in <<EOF +1 +1 +2 +2 +3 +3 +4 +4 +EOF + + atf_check sort -u -o in in + + cat >expout <<EOF +1 +2 +3 +4 +EOF + + atf_check -o file:expout cat in +} + +atf_test_case oflag_displaced +oflag_displaced_head() +{ + atf_set "descr" "Tests the -o flag after the file names" +} +oflag_displaced_body() +{ + atf_check sort -S /dev/null -o out + test -f out || atf_fail "File not created" +} + +atf_test_case rflag +rflag_head() +{ + atf_set "descr" "Tests the -r flag" +} +rflag_body() +{ + cat >in <<EOF +z b m f +y c o e +x a n h +x a n g +EOF + + cat >expout <<EOF +z b m f +y c o e +x a n h +x a n g +EOF + + atf_check -o file:expout sort -r in +} + +atf_test_case sflag +sflag_head() +{ + atf_set "descr" "Tests the -s flag" +} +sflag_body() +{ + cat >in <<EOF +a 2 +b 1 +c 2 +a 1 +b 2 +c 1 +EOF + + cat >out <<EOF +a 2 +a 1 +b 1 +b 2 +c 2 +c 1 +EOF + + atf_check -o file:out sort -s -k1,1 in +} + +atf_test_case sflag_many_files +sflag_many_files_head() +{ + atf_set "descr" "Tests the -s flag with multiple files" +} +sflag_many_files_body() +{ + cat >in1 <<EOF +c 2 +a 2 +EOF + + cat >in2 <<EOF +c 1 +b 1 +a 1 +EOF + + cat >out <<EOF +c 2 +b 1 +a 2 +EOF + + atf_check -o file:out sort -smru -k1,1 in1 in1 in2 in2 +} + +atf_test_case tflag +tflag_head() +{ + atf_set "descr" "Tests the -t flag" +} +tflag_body() +{ + cat >in <<EOF +a: +a! +EOF + + atf_check -o file:in sort -t : -r +0 in + atf_check -o file:in sort -t : +0 -1 in + atf_check -o file:in sort -t : -r -k 1 in + atf_check -o file:in sort -t : -k 1,1 in +} + +atf_test_case tflag_alphabetic +tflag_alphabetic_head() +{ + atf_set "descr" "Tests the -t flag with a character as the delimiter" +} +tflag_alphabetic_body() +{ + cat >in <<EOF +zXa +yXa +zXb +EOF + + atf_check -o file:in sort -tX -k2 -k1r,1 in +} + +atf_test_case tflag_char_pos +tflag_char_pos_head() +{ + atf_set "descr" "Tests the -t flag with character positions in fields" +} +tflag_char_pos_body() +{ + cat >in <<EOF +: ab +:bac +EOF + + cat >out <<EOF +:bac +: ab +EOF + + atf_check -o file:out sort -b -t: +1.1 in + atf_check -o file:out sort -t: +1.1r in + atf_check -o file:out sort -b -t: -k 2.2 in + atf_check -o file:out sort -t: -k 2.2r in +} + +atf_test_case tflag_whitespace +tflag_whitespace_head() +{ + atf_set "descr" "Tests the -t flag with spaces and tabs as the" \ + "delimiter" +} +tflag_whitespace_body() +{ + cat >in <<EOF + b c + b c + b c +EOF + + atf_check -o file:in sort -t ' ' -k2,2 in + atf_check -o file:in sort -t ' ' -k2.1,2.0 in + + cat >out <<EOF + b c + b c + b c +EOF + + atf_check -o file:out sort -t ' ' -k2,2 in + atf_check -o file:out sort -t ' ' -k2.1,2.0 in + + cat >out <<EOF + b c + b c + b c +EOF + + atf_check -o file:out sort -S -k2 in + + cat >out <<EOF + b c + b c + b c +EOF + + atf_check -o file:out sort -S -k2b in +} + +atf_test_case uflag +uflag_head() +{ + atf_set "descr" "Tests the -u flag" +} +uflag_body() +{ + cat >in <<EOF +a +aa +aaa +aa +EOF + + cat >expout <<EOF +a +aa +aaa +EOF + + atf_check -o file:expout sort -u in +} + +atf_test_case uflag_rflag +uflag_rflag_head() +{ + atf_set "descr" "Tests the -u and -r flag combination" +} +uflag_rflag_body() +{ + cat >in <<EOF +a +aa +aaa +aa +EOF + + cat >expout <<EOF +aaa +aa +a +EOF + + atf_check -o file:expout sort -ru in +} + +atf_test_case plus_one +plus_one_head() +{ + atf_set "descr" "Tests +- addressing: +1 should become -k2.1" +} +plus_one_body() +{ + cat >in <<EOF +z b m f +y c o e +x a n h +x a n g +EOF + + cat >expout <<EOF +x a n g +x a n h +z b m f +y c o e +EOF + + atf_check -o file:expout sort +1 in +} + +atf_test_case plus_one_minus_two +plus_one_minus_two_head() +{ + atf_set "descr" "Tests +- addressing: +1 -2 should become -k2.1,2.0" +} +plus_one_minus_two_body() +{ + cat >in <<EOF +z b m f +y c o e +x a n h +x a n g +EOF + + cat >expout <<EOF +x a n h +x a n g +z b m f +y c o e +EOF + + atf_check -o file:expout sort +1 -2 in +} + +atf_test_case plus_zero +plus_zero_head() +{ + atf_set "descr" "Tests +- addressing: '-- +0' raised a '-k1.1: No" \ + "such file or directory' error" +} +plus_zero_body() +{ + echo 'good contents' >./+0 + + atf_check -o file:+0 sort -- +0 +} + +atf_test_case plus_nonmonotone +plus_nonmonotone_head() +{ + atf_set "descr" "Tests += addressing: apparently nonmonotone field" \ + "specs" +} +plus_nonmonotone_body() +{ + cat >in <<EOF +aaaa c +x a +0 b +EOF + + atf_check -o file:in sort +1 -0.3 +1.4 -1.5 in +} + +atf_test_case plus_as_path +plus_as_path_head() +{ + atf_set "descr" "Tests +- addressing: 'file +0' raised a '-k1.1: No" \ + "such file or directory' error" +} +plus_as_path_body() +{ + echo 'good contents' >./+0 + echo 'more contents' >in + cat ./+0 in >expout + + atf_check -o file:expout sort in +0 +} + +atf_test_case plus_bad_tempfile +plus_bad_tempfile_head() +{ + atf_set "descr" "Tests +- addressing: intermediate wrong behavior" \ + "that raised a '+0: No such file or directory' error" +} +plus_bad_tempfile_body() +{ + echo 'good contents' >in + atf_check -o file:in sort -T /tmp +0 in +} + +atf_test_case plus_rflag_invalid +plus_rflag_invalid_head() +{ + atf_set "descr" "Tests +- addressing: invalid record delimiter" +} +plus_rflag_invalid_body() +{ + ( + echo 'z b m f' + echo 'y c o e' + echo 'x a n h' + echo 'x a n g' + ) | tr '\n' '+' >in + + atf_check -o inline:'x a n g+x a n h+z b m f+y c o e+' \ + sort -R + -k2 in +} + +atf_test_case plus_tflag +plus_tflag_head() +{ + atf_set "descr" "Tests +- addressing: using -T caused a 'No such file" \ + "or directory' error" +} +plus_tflag_body() +{ + mkdir ./+ + yes | sed 200000q | sort -T + >/dev/null || atf_fail "program failed" +} + +atf_test_case plus_no_end +plus_no_end_head() +{ + atf_set "descr" "Tests +- addressing: field without end" +} +plus_no_end_body() +{ + cat >in <<EOF +a-B +a+b +a b +A+b +a b +EOF + + cat >out <<EOF +a b +a b +A+b +a-B +a+b +EOF + + atf_check -o file:out sort -df +0 +0d in +} + +atf_init_test_cases() +{ + atf_add_test_case basic + atf_add_test_case empty_file + atf_add_test_case end_of_options + atf_add_test_case missing_newline + atf_add_test_case null_bytes + atf_add_test_case long_records + atf_add_test_case long_file + atf_add_test_case any_char + atf_add_test_case bflag + atf_add_test_case cflag + atf_add_test_case kflag_one_field + atf_add_test_case kflag_two_fields + atf_add_test_case kflag_many_fields + atf_add_test_case kflag_outofbounds + atf_add_test_case kflag_nonmonotone + atf_add_test_case kflag_limits + atf_add_test_case kflag_alpha + atf_add_test_case kflag_no_end + atf_add_test_case mflag + atf_add_test_case mflag_uflag + atf_add_test_case mflag_uflag_first + atf_add_test_case nflag + atf_add_test_case nflag_rflag + atf_add_test_case oflag + atf_add_test_case oflag_displaced + atf_add_test_case rflag + atf_add_test_case sflag + atf_add_test_case sflag_many_files + atf_add_test_case tflag + atf_add_test_case tflag_alphabetic + atf_add_test_case tflag_char_pos + atf_add_test_case tflag_whitespace + atf_add_test_case uflag + atf_add_test_case uflag_rflag + atf_add_test_case plus_one + atf_add_test_case plus_one_minus_two + atf_add_test_case plus_zero + atf_add_test_case plus_nonmonotone + atf_add_test_case plus_as_path + atf_add_test_case plus_bad_tempfile + atf_add_test_case plus_rflag_invalid + atf_add_test_case plus_tflag + atf_add_test_case plus_no_end +} |