1272343Sngie# $NetBSD: t_sort.sh,v 1.1 2012/03/17 16:33:15 jruoho Exp $
2272343Sngie#
3272343Sngie# Copyright (c) 2008, 2009, 2010 The NetBSD Foundation, Inc.
4272343Sngie# All rights reserved.
5272343Sngie#
6272343Sngie# Redistribution and use in source and binary forms, with or without
7272343Sngie# modification, are permitted provided that the following conditions
8272343Sngie# are met:
9272343Sngie# 1. Redistributions of source code must retain the above copyright
10272343Sngie#    notice, this list of conditions and the following disclaimer.
11272343Sngie# 2. Redistributions in binary form must reproduce the above copyright
12272343Sngie#    notice, this list of conditions and the following disclaimer in the
13272343Sngie#    documentation and/or other materials provided with the distribution.
14272343Sngie#
15272343Sngie# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16272343Sngie# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17272343Sngie# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18272343Sngie# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19272343Sngie# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20272343Sngie# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21272343Sngie# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22272343Sngie# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23272343Sngie# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24272343Sngie# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25272343Sngie# POSSIBILITY OF SUCH DAMAGE.
26272343Sngie#
27272343Sngie
28272343Sngieatf_test_case basic
29272343Sngiebasic_head()
30272343Sngie{
31272343Sngie	atf_set "descr" "Basic functionality test"
32272343Sngie}
33272343Sngiebasic_body()
34272343Sngie{
35272343Sngie	cat >in <<EOF
36272343Sngiez b m f
37272343Sngiey c o e
38272343Sngiex a n h
39272343Sngiex a n g
40272343SngieEOF
41272343Sngie
42272343Sngie	cat >expout <<EOF
43272343Sngiex a n g
44272343Sngiex a n h
45272343Sngiey c o e
46272343Sngiez b m f
47272343SngieEOF
48272343Sngie
49272343Sngie	atf_check -o file:expout sort in
50272343Sngie}
51272343Sngie
52272343Sngieatf_test_case empty_file
53272343Sngieempty_file_head()
54272343Sngie{
55272343Sngie	atf_set "descr" "Tests sorting an empty file"
56272343Sngie}
57272343Sngieempty_file_body()
58272343Sngie{
59272343Sngie	touch empty
60272343Sngie	atf_check -o empty sort -S empty
61272343Sngie	atf_check sort -S -c empty
62272343Sngie	atf_check sort -S -c -u empty
63272343Sngie}
64272343Sngie
65272343Sngieatf_test_case end_of_options
66272343Sngieend_of_options_head()
67272343Sngie{
68272343Sngie	atf_set "descr" "Determination of end of option list"
69272343Sngie}
70272343Sngieend_of_options_body()
71272343Sngie{
72272343Sngie	echo x >-k
73272343Sngie	atf_check -o file:-k -x "sort -S -- -k </dev/null"
74272343Sngie	atf_check -s not-exit:1 -e ignore -x "sort -S - -c </dev/null"
75272343Sngie}
76272343Sngie
77272343Sngieatf_test_case missing_newline
78272343Sngiemissing_newline_head()
79272343Sngie{
80272343Sngie	atf_set "descr" "Tests with missing new line in input file"
81272343Sngie}
82272343Sngiemissing_newline_body()
83272343Sngie{
84272343Sngie	printf '%s' x >in
85272343Sngie	atf_check -o inline:'x\n' sort in
86272343Sngie}
87272343Sngie
88272343Sngieatf_test_case null_bytes
89272343Sngienull_bytes_head()
90272343Sngie{
91272343Sngie	atf_set "descr" "Tests the behavior of null bytes"
92272343Sngie}
93272343Sngienull_bytes_body()
94272343Sngie{
95272343Sngie	printf '\0b\n\0a\n' >in
96272343Sngie	atf_check -o inline:'\0a\n\0b\n' sort -S in
97272343Sngie}
98272343Sngie
99272343Sngieatf_test_case long_records
100272343Sngielong_records_head()
101272343Sngie{
102272343Sngie	atf_set "descr" "Tests long lines and keys"
103272343Sngie}
104272343Sngielong_records_body()
105272343Sngie{
106272343Sngie	awk 'BEGIN {	x="x"
107272343Sngie	for(i=1; i<=12; i++) x = x x
108272343Sngie	for(i=15; i<=25; i++) print x i
109272343Sngie}' >in
110272343Sngie
111272343Sngie	awk 'BEGIN {	x="x"
112272343Sngie	for(i=1; i<=12; i++) x = x x
113272343Sngie	for(i=25; i>=15; i--) print x i
114272343Sngie}' >out
115272343Sngie
116272343Sngie	atf_check -o file:out sort -r in
117272343Sngie	atf_check -o file:out sort -k 1,1r -k 1 in
118272343Sngie}
119272343Sngie
120272343Sngieatf_test_case long_file
121272343Sngielong_file_head()
122272343Sngie{
123272343Sngie	atf_set "descr" "Tests with a long file to try to force intermediate" \
124272343Sngie	    "files"
125272343Sngie}
126272343Sngielong_file_body()
127272343Sngie{
128272343Sngie	awk 'BEGIN { for(i=0; i<20000; i++) print rand() }' >in
129272343Sngie	sort -S -r in | awk '$0 "x" != x { print ; x = $0 "x" }' >out
130272343Sngie	atf_check -o file:out sort -u -r in
131272343Sngie}
132272343Sngie
133272343Sngieatf_test_case any_char
134272343Sngieany_char_head()
135272343Sngie{
136272343Sngie	atf_set "descr" "Tests with files containing non-printable/extended" \
137272343Sngie	    "characters"
138272343Sngie}
139272343Sngieany_char_body()
140272343Sngie{
141272343Sngie	atf_check -o file:$(atf_get_srcdir)/d_any_char_dflag_out.txt \
142272343Sngie	    sort -d -k 2 $(atf_get_srcdir)/d_any_char_in.txt
143272343Sngie
144272343Sngie	atf_check -o file:$(atf_get_srcdir)/d_any_char_fflag_out.txt \
145272343Sngie	    sort -f -k 2 $(atf_get_srcdir)/d_any_char_in.txt
146272343Sngie
147272343Sngie	atf_check -o file:$(atf_get_srcdir)/d_any_char_iflag_out.txt \
148272343Sngie	    sort -i -k 2 $(atf_get_srcdir)/d_any_char_in.txt
149272343Sngie}
150272343Sngie
151272343Sngieatf_test_case bflag
152272343Sngiebflag_head()
153272343Sngie{
154272343Sngie	atf_set "descr" "Tests the -b flag"
155272343Sngie}
156272343Sngiebflag_body()
157272343Sngie{
158272343Sngie	cat >in <<EOF
159272343Sngie  b
160272343Sngie a
161272343SngieEOF
162272343Sngie
163272343Sngie	atf_check -o file:in sort -b in
164272343Sngie	atf_check -o file:in -x "sort -b <in"
165272343Sngie	atf_check -s exit:1 -o ignore -e ignore -x "sort in | sort -c -r"
166272343Sngie}
167272343Sngie
168272343Sngieatf_test_case cflag
169272343Sngiecflag_head()
170272343Sngie{
171272343Sngie	atf_set "descr" "Tests the -c flag"
172272343Sngie}
173272343Sngiecflag_body()
174272343Sngie{
175272343Sngie	cat >in <<EOF
176272343Sngieb
177272343Sngiea
178272343SngieEOF
179272343Sngie
180272343Sngie	atf_check -s exit:1 -e ignore sort -S -c in
181272343Sngie}
182272343Sngie
183272343Sngieatf_test_case kflag_one_field
184272343Sngiekflag_one_field_head()
185272343Sngie{
186272343Sngie	atf_set "descr" "Tests the -k flag with one field"
187272343Sngie}
188272343Sngiekflag_one_field_body()
189272343Sngie{
190272343Sngie	cat >in <<EOF
191272343Sngiez b m f
192272343Sngiey c o e
193272343Sngiex a n h
194272343Sngiex a n g
195272343SngieEOF
196272343Sngie
197272343Sngie	cat >expout <<EOF
198272343Sngiex a n g
199272343Sngiex a n h
200272343Sngiez b m f
201272343Sngiey c o e
202272343SngieEOF
203272343Sngie
204272343Sngie	atf_check -o file:expout sort -k2.1 in
205272343Sngie}
206272343Sngie
207272343Sngieatf_test_case kflag_two_fields
208272343Sngiekflag_two_fields_head()
209272343Sngie{
210272343Sngie	atf_set "descr" "Tests the -k flag with two fields"
211272343Sngie}
212272343Sngiekflag_two_fields_body()
213272343Sngie{
214272343Sngie	cat >in <<EOF
215272343Sngiez b m f
216272343Sngiey c o e
217272343Sngiex a n h
218272343Sngiex a n g
219272343SngieEOF
220272343Sngie
221272343Sngie	cat >expout <<EOF
222272343Sngiex a n h
223272343Sngiex a n g
224272343Sngiez b m f
225272343Sngiey c o e
226272343SngieEOF
227272343Sngie	atf_check -o file:expout sort -k2.1,2.0 in
228272343Sngie}
229272343Sngie
230272343Sngieatf_test_case kflag_many_fields
231272343Sngiekflag_many_fields_head()
232272343Sngie{
233272343Sngie	atf_set "descr" "Tests the -k flag with many fields"
234272343Sngie}
235272343Sngiekflag_many_fields_body()
236272343Sngie{
237272343Sngie	cat >in <<EOF
238272343Sngie0:2:3:4:5:6:7:8:9
239272343Sngie1:1:3:4:5:6:7:8:9
240272343Sngie1:2:2:4:5:6:7:8:9
241272343Sngie1:2:3:3:5:6:7:8:9
242272343Sngie1:2:3:4:4:6:7:8:9
243272343Sngie1:2:3:4:5:5:7:8:9
244272343Sngie1:2:3:4:5:6:6:8:9
245272343Sngie1:2:3:4:5:6:7:7:9
246272343Sngie1:2:3:4:5:6:7:8:8
247272343SngieEOF
248272343Sngie
249272343Sngie	cat >out <<EOF
250272343Sngie1:2:3:4:5:6:7:8:8
251272343Sngie1:2:3:4:5:6:7:7:9
252272343Sngie1:2:3:4:5:6:6:8:9
253272343Sngie1:2:3:4:5:5:7:8:9
254272343Sngie1:2:3:4:4:6:7:8:9
255272343Sngie1:2:3:3:5:6:7:8:9
256272343Sngie1:2:2:4:5:6:7:8:9
257272343Sngie1:1:3:4:5:6:7:8:9
258272343Sngie0:2:3:4:5:6:7:8:9
259272343SngieEOF
260272343Sngie
261272343Sngie	atf_check -o file:out sort -t: -k9 -k8 -k7 -k6 -k5 -k4 -k3 \
262272343Sngie	    -k2 -k1 in
263272343Sngie}
264272343Sngie
265272343Sngieatf_test_case kflag_outofbounds
266272343Sngiekflag_outofbounds_head()
267272343Sngie{
268272343Sngie	atf_set "descr" "Tests the -k flag with out of bounds fields"
269272343Sngie}
270272343Sngiekflag_outofbounds_body()
271272343Sngie{
272272343Sngie	cat >in <<EOF
273272343Sngie0 5
274272343Sngie1 4
275272343Sngie2 3
276272343Sngie3 2
277272343Sngie4 1
278272343Sngie5 0
279272343SngieEOF
280272343Sngie
281272343Sngie	atf_check -o file:in sort -k2.2,2.1 -k2.3,2.4 in
282272343Sngie}
283272343Sngie
284272343Sngieatf_test_case kflag_nonmonotone
285272343Sngiekflag_nonmonotone_head()
286272343Sngie{
287272343Sngie	atf_set "descr" "Tests the -k flag with apparently nonmonotone" \
288272343Sngie	    "field specs"
289272343Sngie}
290272343Sngiekflag_nonmonotone_body()
291272343Sngie{
292272343Sngie	cat >in <<EOF
293272343Sngieaaaa c
294272343Sngiex a
295272343Sngie0 b
296272343SngieEOF
297272343Sngie
298272343Sngie	atf_check -o file:in sort -k2,1.3 -k2.5,2.5 in
299272343Sngie}
300272343Sngie
301272343Sngieatf_test_case kflag_limits
302272343Sngiekflag_limits_head()
303272343Sngie{
304272343Sngie	atf_set "descr" "Tests the -k flag field limits"
305272343Sngie}
306272343Sngiekflag_limits_body()
307272343Sngie{
308272343Sngie	cat >in <<EOF
309272343Sngiea	2
310272343Sngiea	1
311272343Sngieb	2
312272343Sngieb	1
313272343SngieEOF
314272343Sngie
315272343Sngie	cat >out <<EOF
316272343Sngieb	2
317272343Sngieb	1
318272343Sngiea	2
319272343Sngiea	1
320272343SngieEOF
321272343Sngie
322272343Sngie	atf_check -o file:out sort -r -k1,1 -k2n in
323272343Sngie}
324272343Sngie
325272343Sngieatf_test_case kflag_alpha
326272343Sngiekflag_alpha_head()
327272343Sngie{
328272343Sngie	atf_set "descr" "Tests the -k flag with various alpha fields"
329272343Sngie}
330272343Sngiekflag_alpha_body()
331272343Sngie{
332272343Sngie	sort >in <<EOF
333272343Sngie01:04:19:01:16:01:21:01 a
334272343Sngie02:03:13:15:13:19:15:02  a
335272343Sngie03:02:07:09:07:13:09:03   a
336272343Sngie04:01:01:03:01:07:03:04    a
337272343Sngie05:08:20:16:17:02:20:05 aa
338272343Sngie06:07:14:18:14:20:14:06  aa
339272343Sngie07:06:08:10:08:14:08:07   aa
340272343Sngie08:05:02:04:02:08:02:08    aa
341272343Sngie09:16:22:02:22:04:24:13 b
342272343Sngie10:15:16:20:19:22:18:14  b
343272343Sngie11:14:10:12:10:16:12:15   b
344272343Sngie12:13:04:06:04:10:06:16    b
345272343Sngie13:24:24:22:24:06:22:21 bb
346272343Sngie14:23:18:24:21:24:16:22  bb
347272343Sngie15:22:12:14:12:18:10:23   bb
348272343Sngie16:21:06:08:06:12:04:24    bb
349272343Sngie17:12:21:21:18:03:19:09 ab
350272343Sngie18:11:15:19:15:21:13:10  ab
351272343Sngie19:10:09:11:09:15:07:11   ab
352272343Sngie20:09:03:05:03:09:01:12    ab
353272343Sngie21:20:23:17:23:05:23:17 ba
354272343Sngie22:19:17:23:20:23:17:18  ba
355272343Sngie23:18:11:13:11:17:11:19   ba
356272343Sngie24:17:05:07:05:11:05:20    ba
357272343SngieEOF
358272343Sngie
359272343Sngie	atf_check -x "sort -S -k2b -k2 in >xx"
360272343Sngie	atf_check -e ignore sort -c -t: -k2n xx
361272343Sngie
362272343Sngie	atf_check -x "sort -S -k2,2.1b -k2 in >xx"
363272343Sngie	atf_check -e ignore sort -c -t: -k3n xx
364272343Sngie
365272343Sngie	atf_check -x "sort -S -k2.3 -k2 in >xx"
366272343Sngie	atf_check -e ignore sort -c -t: -k4n xx
367272343Sngie
368272343Sngie	atf_check -x "sort -S -k2b,2.3 -k2 in >xx"
369272343Sngie	atf_check -e ignore sort -c -t: -k5n xx
370272343Sngie
371272343Sngie	atf_check -x "sort -S -k2.3,2.1b -k2 in >xx"
372272343Sngie	atf_check -e ignore sort -c -t: -k6n xx
373272343Sngie
374272343Sngie	atf_check -x "sort -S -k2,2.1b -k2r in >xx"
375272343Sngie	atf_check -e ignore sort -c -t: -k7n xx
376272343Sngie
377272343Sngie	atf_check -x "sort -S -b -k2,2 -k2 in >xx"
378272343Sngie	atf_check -e ignore sort -c -t: -k8n xx
379272343Sngie
380272343Sngie	# XXX This test is broken.  The standard is not clear on the behavior.
381272343Sngie	#atf_check -x "sort -S -b -k2,2b -k2 in >xx"
382272343Sngie	#atf_check -e ignore sort -c -t: -k3n xx
383272343Sngie}
384272343Sngie
385272343Sngieatf_test_case kflag_no_end
386272343Sngiekflag_no_end_head()
387272343Sngie{
388272343Sngie	atf_set "descr" "Tests the -k flag with a field without end"
389272343Sngie}
390272343Sngiekflag_no_end_body()
391272343Sngie{
392272343Sngie	cat >in <<EOF
393272343Sngiea-B
394272343Sngiea+b
395272343Sngiea b
396272343SngieA+b
397272343Sngiea	b
398272343SngieEOF
399272343Sngie
400272343Sngie	cat >out <<EOF
401272343Sngiea	b
402272343Sngiea b
403272343SngieA+b
404272343Sngiea-B
405272343Sngiea+b
406272343SngieEOF
407272343Sngie
408272343Sngie	atf_check -o file:out sort -df -k 1 -k 1d <in
409272343Sngie}
410272343Sngie
411272343Sngieatf_test_case mflag
412272343Sngiemflag_head()
413272343Sngie{
414272343Sngie	atf_set "descr" "Tests the -m flag"
415272343Sngie}
416272343Sngiemflag_body()
417272343Sngie{
418272343Sngie	cat >in1 <<EOF
419272343Sngiea
420272343Sngieab
421272343Sngieab
422272343Sngiebc
423272343Sngieca
424272343SngieEOF
425272343Sngie	cat >in2 <<EOF
426272343SngieZ
427272343Sngiea
428272343Sngieaa
429272343Sngieac
430272343Sngiec
431272343SngieEOF
432272343Sngie	cat >out <<EOF
433272343SngieZ
434272343Sngiea
435272343Sngiea
436272343Sngieaa
437272343Sngieab
438272343Sngieab
439272343Sngieac
440272343Sngiebc
441272343Sngiec
442272343Sngieca
443272343SngieEOF
444272343Sngie
445272343Sngie	atf_check -o file:out sort -S -m in1 in2
446272343Sngie}
447272343Sngie
448272343Sngieatf_test_case mflag_uflag
449272343Sngiemflag_uflag_head()
450272343Sngie{
451272343Sngie	atf_set "descr" "Tests the -m flag together with -u"
452272343Sngie}
453272343Sngiemflag_uflag_body()
454272343Sngie{
455272343Sngie	cat >in <<EOF
456272343Sngiea
457272343Sngieb
458272343Sngiec
459272343Sngied
460272343SngieEOF
461272343Sngie
462272343Sngie	atf_check -o file:in sort -m -u in
463272343Sngie}
464272343Sngie
465272343Sngieatf_test_case mflag_uflag_first
466272343Sngiemflag_uflag_first_head()
467272343Sngie{
468272343Sngie	atf_set "descr" "Tests that the -m flag together with -u picks the" \
469272343Sngie	    "first among equal"
470272343Sngie}
471272343Sngiemflag_uflag_first_body()
472272343Sngie{
473272343Sngie	cat >in <<EOF
474272343Sngie3B
475272343Sngie3b
476272343Sngie3B2
477272343Sngie~3B2
478272343Sngie4.1
479272343Sngie41
480272343Sngie5
481272343Sngie5.
482272343SngieEOF
483272343Sngie
484272343Sngie	cat >out <<EOF
485272343Sngie3B
486272343Sngie3B2
487272343Sngie4.1
488272343Sngie5
489272343SngieEOF
490272343Sngie
491272343Sngie	atf_check -o file:out sort -mudf in
492272343Sngie	atf_check -o file:out sort -mudf -k1 in
493272343Sngie}
494272343Sngie
495272343Sngieatf_test_case nflag
496272343Sngienflag_head()
497272343Sngie{
498272343Sngie	atf_set "descr" "Tests the -n flag"
499272343Sngie}
500272343Sngienflag_body()
501272343Sngie{
502272343Sngie	cat >in <<EOF
503272343Sngie-99.0
504272343Sngie-99.1
505272343Sngie-.0002
506272343Sngie-10
507272343Sngie2
508272343Sngie0010.000000000000000000000000000000000001
509272343Sngie10
510272343Sngie3x
511272343Sngiex
512272343SngieEOF
513272343Sngie
514272343Sngie	cat >expout <<EOF
515272343Sngie-99.1
516272343Sngie-99.0
517272343Sngie-10
518272343Sngie-.0002
519272343Sngiex
520272343Sngie2
521272343Sngie3x
522272343Sngie10
523272343Sngie0010.000000000000000000000000000000000001
524272343SngieEOF
525272343Sngie
526272343Sngie	atf_check -o file:expout sort -n in
527272343Sngie}
528272343Sngie
529272343Sngieatf_test_case nflag_rflag
530272343Sngienflag_rflag_head()
531272343Sngie{
532272343Sngie	atf_set "descr" "Tests the -n and -r flag combination"
533272343Sngie}
534272343Sngienflag_rflag_body()
535272343Sngie{
536272343Sngie	cat >in <<EOF
537272343Sngie1
538272343Sngie123
539272343Sngie2
540272343SngieEOF
541272343Sngie
542272343Sngie	cat >expout <<EOF
543272343Sngie123
544272343Sngie2
545272343Sngie1
546272343SngieEOF
547272343Sngie
548272343Sngie	atf_check -o file:expout sort -rn in
549272343Sngie}
550272343Sngie
551272343Sngieatf_test_case oflag
552272343Sngieoflag_head()
553272343Sngie{
554272343Sngie	atf_set "descr" "Tests the -o flag"
555272343Sngie}
556272343Sngieoflag_body()
557272343Sngie{
558272343Sngie	cat >in <<EOF
559272343Sngie1
560272343Sngie1
561272343Sngie2
562272343Sngie2
563272343Sngie3
564272343Sngie3
565272343Sngie4
566272343Sngie4
567272343SngieEOF
568272343Sngie
569272343Sngie	atf_check sort -u -o in in
570272343Sngie
571272343Sngie	cat >expout <<EOF
572272343Sngie1
573272343Sngie2
574272343Sngie3
575272343Sngie4
576272343SngieEOF
577272343Sngie
578272343Sngie	atf_check -o file:expout cat in
579272343Sngie}
580272343Sngie
581272343Sngieatf_test_case oflag_displaced
582272343Sngieoflag_displaced_head()
583272343Sngie{
584272343Sngie	atf_set "descr" "Tests the -o flag after the file names"
585272343Sngie}
586272343Sngieoflag_displaced_body()
587272343Sngie{
588272343Sngie	atf_check sort -S /dev/null -o out
589272343Sngie	test -f out || atf_fail "File not created"
590272343Sngie}
591272343Sngie
592272343Sngieatf_test_case rflag
593272343Sngierflag_head()
594272343Sngie{
595272343Sngie	atf_set "descr" "Tests the -r flag"
596272343Sngie}
597272343Sngierflag_body()
598272343Sngie{
599272343Sngie	cat >in <<EOF
600272343Sngiez b m f
601272343Sngiey c o e
602272343Sngiex a n h
603272343Sngiex a n g
604272343SngieEOF
605272343Sngie
606272343Sngie	cat >expout <<EOF
607272343Sngiez b m f
608272343Sngiey c o e
609272343Sngiex a n h
610272343Sngiex a n g
611272343SngieEOF
612272343Sngie
613272343Sngie	atf_check -o file:expout sort -r in
614272343Sngie}
615272343Sngie
616272343Sngieatf_test_case sflag
617272343Sngiesflag_head()
618272343Sngie{
619272343Sngie	atf_set "descr" "Tests the -s flag"
620272343Sngie}
621272343Sngiesflag_body()
622272343Sngie{
623272343Sngie	cat >in <<EOF
624272343Sngiea 2
625272343Sngieb 1
626272343Sngiec 2
627272343Sngiea 1
628272343Sngieb 2
629272343Sngiec 1
630272343SngieEOF
631272343Sngie
632272343Sngie	cat >out <<EOF
633272343Sngiea 2
634272343Sngiea 1
635272343Sngieb 1
636272343Sngieb 2
637272343Sngiec 2
638272343Sngiec 1
639272343SngieEOF
640272343Sngie
641272343Sngie	atf_check -o file:out sort -s -k1,1 in
642272343Sngie}
643272343Sngie
644272343Sngieatf_test_case sflag_many_files
645272343Sngiesflag_many_files_head()
646272343Sngie{
647272343Sngie	atf_set "descr" "Tests the -s flag with multiple files"
648272343Sngie}
649272343Sngiesflag_many_files_body()
650272343Sngie{
651272343Sngie	cat >in1 <<EOF
652272343Sngiec 2
653272343Sngiea 2
654272343SngieEOF
655272343Sngie
656272343Sngie	cat >in2 <<EOF
657272343Sngiec 1
658272343Sngieb 1
659272343Sngiea 1
660272343SngieEOF
661272343Sngie
662272343Sngie	cat >out <<EOF
663272343Sngiec 2
664272343Sngieb 1
665272343Sngiea 2
666272343SngieEOF
667272343Sngie
668272343Sngie	atf_check -o file:out sort -smru -k1,1 in1 in1 in2 in2
669272343Sngie}
670272343Sngie
671272343Sngieatf_test_case tflag
672272343Sngietflag_head()
673272343Sngie{
674272343Sngie	atf_set "descr" "Tests the -t flag"
675272343Sngie}
676272343Sngietflag_body()
677272343Sngie{
678272343Sngie	cat >in <<EOF
679272343Sngiea:
680272343Sngiea!
681272343SngieEOF
682272343Sngie
683272343Sngie	atf_check -o file:in sort -t : -r +0 in
684272343Sngie	atf_check -o file:in sort -t : +0 -1 in
685272343Sngie	atf_check -o file:in sort -t : -r -k 1 in
686272343Sngie	atf_check -o file:in sort -t : -k 1,1 in
687272343Sngie}
688272343Sngie
689272343Sngieatf_test_case tflag_alphabetic
690272343Sngietflag_alphabetic_head()
691272343Sngie{
692272343Sngie	atf_set "descr" "Tests the -t flag with a character as the delimiter"
693272343Sngie}
694272343Sngietflag_alphabetic_body()
695272343Sngie{
696272343Sngie	cat >in <<EOF
697272343SngiezXa
698272343SngieyXa
699272343SngiezXb
700272343SngieEOF
701272343Sngie
702272343Sngie	atf_check -o file:in sort -tX -k2 -k1r,1 in
703272343Sngie}
704272343Sngie
705272343Sngieatf_test_case tflag_char_pos
706272343Sngietflag_char_pos_head()
707272343Sngie{
708272343Sngie	atf_set "descr" "Tests the -t flag with character positions in fields"
709272343Sngie}
710272343Sngietflag_char_pos_body()
711272343Sngie{
712272343Sngie	cat >in <<EOF
713272343Sngie: ab
714272343Sngie:bac
715272343SngieEOF
716272343Sngie
717272343Sngie	cat >out <<EOF
718272343Sngie:bac
719272343Sngie: ab
720272343SngieEOF
721272343Sngie
722272343Sngie	atf_check -o file:out sort -b -t: +1.1 in
723272343Sngie	atf_check -o file:out sort -t: +1.1r in
724272343Sngie	atf_check -o file:out sort -b -t: -k 2.2 in
725272343Sngie	atf_check -o file:out sort -t: -k 2.2r in
726272343Sngie}
727272343Sngie
728272343Sngieatf_test_case tflag_whitespace
729272343Sngietflag_whitespace_head()
730272343Sngie{
731272343Sngie	atf_set "descr" "Tests the -t flag with spaces and tabs as the" \
732272343Sngie	    "delimiter"
733272343Sngie}
734272343Sngietflag_whitespace_body()
735272343Sngie{
736272343Sngie	cat >in <<EOF
737272343Sngie b c
738272343Sngie b	c
739272343Sngie	b c
740272343SngieEOF
741272343Sngie
742272343Sngie	atf_check -o file:in sort -t ' ' -k2,2 in
743272343Sngie	atf_check -o file:in sort -t ' ' -k2.1,2.0 in
744272343Sngie
745272343Sngie	cat >out <<EOF
746272343Sngie b c
747272343Sngie	b c
748272343Sngie b	c
749272343SngieEOF
750272343Sngie
751272343Sngie	atf_check -o file:out sort -t '	' -k2,2 in
752272343Sngie	atf_check -o file:out sort -t '	' -k2.1,2.0 in
753272343Sngie
754272343Sngie	cat >out <<EOF
755272343Sngie b	c
756272343Sngie	b c
757272343Sngie b c
758272343SngieEOF
759272343Sngie
760272343Sngie	atf_check -o file:out sort -S -k2 in
761272343Sngie
762272343Sngie	cat >out <<EOF
763272343Sngie	b c
764272343Sngie b	c
765272343Sngie b c
766272343SngieEOF
767272343Sngie
768272343Sngie	atf_check -o file:out sort -S -k2b in
769272343Sngie}
770272343Sngie
771272343Sngieatf_test_case uflag
772272343Sngieuflag_head()
773272343Sngie{
774272343Sngie	atf_set "descr" "Tests the -u flag"
775272343Sngie}
776272343Sngieuflag_body()
777272343Sngie{
778272343Sngie	cat >in <<EOF
779272343Sngiea
780272343Sngieaa
781272343Sngieaaa
782272343Sngieaa
783272343SngieEOF
784272343Sngie
785272343Sngie	cat >expout <<EOF
786272343Sngiea
787272343Sngieaa
788272343Sngieaaa
789272343SngieEOF
790272343Sngie
791272343Sngie	atf_check -o file:expout sort -u in
792272343Sngie}
793272343Sngie
794272343Sngieatf_test_case uflag_rflag
795272343Sngieuflag_rflag_head()
796272343Sngie{
797272343Sngie	atf_set "descr" "Tests the -u and -r flag combination"
798272343Sngie}
799272343Sngieuflag_rflag_body()
800272343Sngie{
801272343Sngie	cat >in <<EOF
802272343Sngiea
803272343Sngieaa
804272343Sngieaaa
805272343Sngieaa
806272343SngieEOF
807272343Sngie
808272343Sngie	cat >expout <<EOF
809272343Sngieaaa
810272343Sngieaa
811272343Sngiea
812272343SngieEOF
813272343Sngie
814272343Sngie	atf_check -o file:expout sort -ru in
815272343Sngie}
816272343Sngie
817272343Sngieatf_test_case plus_one
818272343Sngieplus_one_head()
819272343Sngie{
820272343Sngie	atf_set "descr" "Tests +- addressing: +1 should become -k2.1"
821272343Sngie}
822272343Sngieplus_one_body()
823272343Sngie{
824272343Sngie	cat >in <<EOF
825272343Sngiez b m f
826272343Sngiey c o e
827272343Sngiex a n h
828272343Sngiex a n g
829272343SngieEOF
830272343Sngie
831272343Sngie	cat >expout <<EOF
832272343Sngiex a n g
833272343Sngiex a n h
834272343Sngiez b m f
835272343Sngiey c o e
836272343SngieEOF
837272343Sngie
838272343Sngie	atf_check -o file:expout sort +1 in
839272343Sngie}
840272343Sngie
841272343Sngieatf_test_case plus_one_minus_two
842272343Sngieplus_one_minus_two_head()
843272343Sngie{
844272343Sngie	atf_set "descr" "Tests +- addressing: +1 -2 should become -k2.1,2.0"
845272343Sngie}
846272343Sngieplus_one_minus_two_body()
847272343Sngie{
848272343Sngie	cat >in <<EOF
849272343Sngiez b m f
850272343Sngiey c o e
851272343Sngiex a n h
852272343Sngiex a n g
853272343SngieEOF
854272343Sngie
855272343Sngie	cat >expout <<EOF
856272343Sngiex a n h
857272343Sngiex a n g
858272343Sngiez b m f
859272343Sngiey c o e
860272343SngieEOF
861272343Sngie
862272343Sngie	atf_check -o file:expout sort +1 -2 in
863272343Sngie}
864272343Sngie
865272343Sngieatf_test_case plus_zero
866272343Sngieplus_zero_head()
867272343Sngie{
868272343Sngie	atf_set "descr" "Tests +- addressing: '-- +0' raised a '-k1.1: No" \
869272343Sngie	    "such file or directory' error"
870272343Sngie}
871272343Sngieplus_zero_body()
872272343Sngie{
873272343Sngie	echo 'good contents' >./+0
874272343Sngie
875272343Sngie	atf_check -o file:+0 sort -- +0
876272343Sngie}
877272343Sngie
878272343Sngieatf_test_case plus_nonmonotone
879272343Sngieplus_nonmonotone_head()
880272343Sngie{
881272343Sngie	atf_set "descr" "Tests += addressing: apparently nonmonotone field" \
882272343Sngie	    "specs"
883272343Sngie}
884272343Sngieplus_nonmonotone_body()
885272343Sngie{
886272343Sngie	cat >in <<EOF
887272343Sngieaaaa c
888272343Sngiex a
889272343Sngie0 b
890272343SngieEOF
891272343Sngie
892272343Sngie	atf_check -o file:in sort +1 -0.3 +1.4 -1.5 in
893272343Sngie}
894272343Sngie
895272343Sngieatf_test_case plus_as_path
896272343Sngieplus_as_path_head()
897272343Sngie{
898272343Sngie	atf_set "descr" "Tests +- addressing: 'file +0' raised a '-k1.1: No" \
899272343Sngie	    "such file or directory' error"
900272343Sngie}
901272343Sngieplus_as_path_body()
902272343Sngie{
903272343Sngie	echo 'good contents' >./+0
904272343Sngie	echo 'more contents' >in
905272343Sngie	cat ./+0 in >expout
906272343Sngie
907272343Sngie	atf_check -o file:expout sort in +0
908272343Sngie}
909272343Sngie
910272343Sngieatf_test_case plus_bad_tempfile
911272343Sngieplus_bad_tempfile_head()
912272343Sngie{
913272343Sngie	atf_set "descr" "Tests +- addressing: intermediate wrong behavior" \
914272343Sngie	    "that raised a '+0: No such file or directory' error"
915272343Sngie}
916272343Sngieplus_bad_tempfile_body()
917272343Sngie{
918272343Sngie	echo 'good contents' >in
919272343Sngie	atf_check -o file:in sort -T /tmp +0 in
920272343Sngie}
921272343Sngie
922272343Sngieatf_test_case plus_rflag_invalid
923272343Sngieplus_rflag_invalid_head()
924272343Sngie{
925272343Sngie	atf_set "descr" "Tests +- addressing: invalid record delimiter"
926272343Sngie}
927272343Sngieplus_rflag_invalid_body()
928272343Sngie{
929272343Sngie	(
930272343Sngie	    echo 'z b m f'
931272343Sngie	    echo 'y c o e'
932272343Sngie	    echo 'x a n h'
933272343Sngie	    echo 'x a n g'
934272343Sngie	) | tr '\n' '+' >in
935272343Sngie
936272343Sngie	atf_check -o inline:'x a n g+x a n h+z b m f+y c o e+' \
937272343Sngie	    sort -R + -k2 in
938272343Sngie}
939272343Sngie
940272343Sngieatf_test_case plus_tflag
941272343Sngieplus_tflag_head()
942272343Sngie{
943272343Sngie	atf_set "descr" "Tests +- addressing: using -T caused a 'No such file" \
944272343Sngie	    "or directory' error"
945272343Sngie}
946272343Sngieplus_tflag_body()
947272343Sngie{
948272343Sngie	mkdir ./+
949272343Sngie	yes | sed 200000q | sort -T + >/dev/null || atf_fail "program failed"
950272343Sngie}
951272343Sngie
952272343Sngieatf_test_case plus_no_end
953272343Sngieplus_no_end_head()
954272343Sngie{
955272343Sngie	atf_set "descr" "Tests +- addressing: field without end"
956272343Sngie}
957272343Sngieplus_no_end_body()
958272343Sngie{
959272343Sngie	cat >in <<EOF
960272343Sngiea-B
961272343Sngiea+b
962272343Sngiea b
963272343SngieA+b
964272343Sngiea	b
965272343SngieEOF
966272343Sngie
967272343Sngie	cat >out <<EOF
968272343Sngiea	b
969272343Sngiea b
970272343SngieA+b
971272343Sngiea-B
972272343Sngiea+b
973272343SngieEOF
974272343Sngie
975272343Sngie	atf_check -o file:out sort -df +0 +0d in
976272343Sngie}
977272343Sngie
978272343Sngieatf_init_test_cases()
979272343Sngie{
980272343Sngie	atf_add_test_case basic
981272343Sngie	atf_add_test_case empty_file
982272343Sngie	atf_add_test_case end_of_options
983272343Sngie	atf_add_test_case missing_newline
984272343Sngie	atf_add_test_case null_bytes
985272343Sngie	atf_add_test_case long_records
986272343Sngie	atf_add_test_case long_file
987272343Sngie	atf_add_test_case any_char
988272343Sngie	atf_add_test_case bflag
989272343Sngie	atf_add_test_case cflag
990272343Sngie	atf_add_test_case kflag_one_field
991272343Sngie	atf_add_test_case kflag_two_fields
992272343Sngie	atf_add_test_case kflag_many_fields
993272343Sngie	atf_add_test_case kflag_outofbounds
994272343Sngie	atf_add_test_case kflag_nonmonotone
995272343Sngie	atf_add_test_case kflag_limits
996272343Sngie	atf_add_test_case kflag_alpha
997272343Sngie	atf_add_test_case kflag_no_end
998272343Sngie	atf_add_test_case mflag
999272343Sngie	atf_add_test_case mflag_uflag
1000272343Sngie	atf_add_test_case mflag_uflag_first
1001272343Sngie	atf_add_test_case nflag
1002272343Sngie	atf_add_test_case nflag_rflag
1003272343Sngie	atf_add_test_case oflag
1004272343Sngie	atf_add_test_case oflag_displaced
1005272343Sngie	atf_add_test_case rflag
1006272343Sngie	atf_add_test_case sflag
1007272343Sngie	atf_add_test_case sflag_many_files
1008272343Sngie	atf_add_test_case tflag
1009272343Sngie	atf_add_test_case tflag_alphabetic
1010272343Sngie	atf_add_test_case tflag_char_pos
1011272343Sngie	atf_add_test_case tflag_whitespace
1012272343Sngie	atf_add_test_case uflag
1013272343Sngie	atf_add_test_case uflag_rflag
1014272343Sngie	atf_add_test_case plus_one
1015272343Sngie	atf_add_test_case plus_one_minus_two
1016272343Sngie	atf_add_test_case plus_zero
1017272343Sngie	atf_add_test_case plus_nonmonotone
1018272343Sngie	atf_add_test_case plus_as_path
1019272343Sngie	atf_add_test_case plus_bad_tempfile
1020272343Sngie	atf_add_test_case plus_rflag_invalid
1021272343Sngie	atf_add_test_case plus_tflag
1022272343Sngie	atf_add_test_case plus_no_end
1023272343Sngie}
1024