xref: /freebsd/usr.bin/uniq/tests/uniq_test.sh (revision c3f8900e696998c410dc16f9bd9d45c24c413e6b)
1e762fd81SDag-Erling Smørgrav#
2e762fd81SDag-Erling Smørgrav# Copyright (c) 2024 Klara, Inc.
3e762fd81SDag-Erling Smørgrav#
4e762fd81SDag-Erling Smørgrav# SPDX-License-Identifier: BSD-2-Clause
5e762fd81SDag-Erling Smørgrav#
6e762fd81SDag-Erling Smørgrav
7e762fd81SDag-Erling Smørgravatf_check_uniq() {
8e762fd81SDag-Erling Smørgrav	atf_check uniq "$@" input actual
9e762fd81SDag-Erling Smørgrav	atf_check diff -u actual expected
10e762fd81SDag-Erling Smørgrav	atf_check uniq "$@" - actual <input
11e762fd81SDag-Erling Smørgrav	atf_check diff -u actual expected
12e762fd81SDag-Erling Smørgrav	atf_check -o file:expected uniq "$@" input
13e762fd81SDag-Erling Smørgrav	atf_check -o file:expected uniq "$@" <input
14e762fd81SDag-Erling Smørgrav	atf_check -o file:expected uniq "$@" - <input
15e762fd81SDag-Erling Smørgrav}
16e762fd81SDag-Erling Smørgrav
17e762fd81SDag-Erling Smørgravatf_test_case basic
18e762fd81SDag-Erling Smørgravbasic_head() {
19e762fd81SDag-Erling Smørgrav	atf_set descr "basic test without options"
20e762fd81SDag-Erling Smørgrav}
21e762fd81SDag-Erling Smørgravbasic_body() {
22e762fd81SDag-Erling Smørgrav	printf "a\na\nb\nb\na\na\n" >input
23e762fd81SDag-Erling Smørgrav	printf "a\nb\na\n" >expected
24e762fd81SDag-Erling Smørgrav	atf_check_uniq
25e762fd81SDag-Erling Smørgrav}
26e762fd81SDag-Erling Smørgrav
27e762fd81SDag-Erling Smørgravatf_test_case count
28e762fd81SDag-Erling Smørgravcount_head() {
29e762fd81SDag-Erling Smørgrav	atf_set descr "basic test showing counts"
30e762fd81SDag-Erling Smørgrav}
31e762fd81SDag-Erling Smørgravcount_body() {
32e762fd81SDag-Erling Smørgrav	printf "a\na\nb\nb\nb\na\na\na\na\n" >input
33e762fd81SDag-Erling Smørgrav	printf "   2 a\n   3 b\n   4 a\n" >expected
34e762fd81SDag-Erling Smørgrav	atf_check_uniq -c
35e762fd81SDag-Erling Smørgrav	atf_check_uniq --count
36e762fd81SDag-Erling Smørgrav}
37e762fd81SDag-Erling Smørgrav
38e762fd81SDag-Erling Smørgravatf_test_case repeated
39e762fd81SDag-Erling Smørgravrepeated_head() {
40e762fd81SDag-Erling Smørgrav	atf_set descr "print repeated lines only"
41e762fd81SDag-Erling Smørgrav}
42e762fd81SDag-Erling Smørgravrepeated_body() {
43e762fd81SDag-Erling Smørgrav	printf "a\na\nb\na\na\n" >input
44e762fd81SDag-Erling Smørgrav	printf "a\na\n" >expected
45e762fd81SDag-Erling Smørgrav	atf_check_uniq -d
46e762fd81SDag-Erling Smørgrav	atf_check_uniq --repeated
47e762fd81SDag-Erling Smørgrav}
48e762fd81SDag-Erling Smørgrav
49e762fd81SDag-Erling Smørgravatf_test_case count_repeated
50e762fd81SDag-Erling Smørgravcount_repeated_head() {
51e762fd81SDag-Erling Smørgrav	atf_set descr "count and print repeated lines only"
52e762fd81SDag-Erling Smørgrav}
53e762fd81SDag-Erling Smørgravcount_repeated_body() {
54e762fd81SDag-Erling Smørgrav	printf "a\na\nb\nb\na\n" >input
55e762fd81SDag-Erling Smørgrav	printf "   2 a\n   2 b\n" >expected
56b93791f5SDag-Erling Smørgrav	atf_check_uniq -cd
57b93791f5SDag-Erling Smørgrav	atf_check_uniq -c -d
58b93791f5SDag-Erling Smørgrav	atf_check_uniq -dc
59b93791f5SDag-Erling Smørgrav	atf_check_uniq -d -c
60e762fd81SDag-Erling Smørgrav	atf_check_uniq --count --repeated
61b93791f5SDag-Erling Smørgrav	atf_check_uniq --repeated --count
62e762fd81SDag-Erling Smørgrav}
63e762fd81SDag-Erling Smørgrav
64e762fd81SDag-Erling Smørgravatf_test_case all_repeated
65e762fd81SDag-Erling Smørgravall_repeated_head() {
66e762fd81SDag-Erling Smørgrav	atf_set descr "print every instance of repeated lines"
67e762fd81SDag-Erling Smørgrav}
68e762fd81SDag-Erling Smørgravall_repeated_body() {
69e762fd81SDag-Erling Smørgrav	printf "a\na\nb\na\na\n" >input
70e762fd81SDag-Erling Smørgrav	printf "a\na\na\na\n" >expected
71e762fd81SDag-Erling Smørgrav	atf_check_uniq -D
72b93791f5SDag-Erling Smørgrav	atf_check_uniq -Dnone
73e762fd81SDag-Erling Smørgrav	atf_check_uniq --all-repeated
74b93791f5SDag-Erling Smørgrav	atf_check_uniq --all-repeated=none
75b93791f5SDag-Erling Smørgrav	printf "\na\na\n\na\na\n" >expected
76b93791f5SDag-Erling Smørgrav	atf_check_uniq -Dprepend
77b93791f5SDag-Erling Smørgrav	atf_check_uniq --all-repeated=prepend
78b93791f5SDag-Erling Smørgrav	printf "a\na\n\na\na\n" >expected
79b93791f5SDag-Erling Smørgrav	atf_check_uniq -Dseparate
80b93791f5SDag-Erling Smørgrav	atf_check_uniq --all-repeated=separate
81e762fd81SDag-Erling Smørgrav}
82e762fd81SDag-Erling Smørgrav
83*c3f8900eSDag-Erling Smørgravatf_test_case count_all_repeated
84*c3f8900eSDag-Erling Smørgravcount_all_repeated_head() {
85*c3f8900eSDag-Erling Smørgrav	atf_set descr "count and print every instance of repeated lines"
86*c3f8900eSDag-Erling Smørgrav}
87*c3f8900eSDag-Erling Smørgravcount_all_repeated_body() {
88*c3f8900eSDag-Erling Smørgrav	printf "a\na\nb\na\na\n" >input
89*c3f8900eSDag-Erling Smørgrav	printf "   1 a\n   2 a\n   1 a\n   2 a\n" >expected
90*c3f8900eSDag-Erling Smørgrav	atf_check_uniq -D -c
91*c3f8900eSDag-Erling Smørgrav	atf_check_uniq -Dnone -c
92*c3f8900eSDag-Erling Smørgrav	atf_check_uniq -cD
93*c3f8900eSDag-Erling Smørgrav	atf_check_uniq -cDnone
94*c3f8900eSDag-Erling Smørgrav	atf_check_uniq -c -D
95*c3f8900eSDag-Erling Smørgrav	atf_check_uniq -c -Dnone
96*c3f8900eSDag-Erling Smørgrav	atf_check_uniq --all-repeated --count
97*c3f8900eSDag-Erling Smørgrav	atf_check_uniq --all-repeated=none --count
98*c3f8900eSDag-Erling Smørgrav	atf_check_uniq --count --all-repeated
99*c3f8900eSDag-Erling Smørgrav	atf_check_uniq --count --all-repeated=none
100*c3f8900eSDag-Erling Smørgrav}
101*c3f8900eSDag-Erling Smørgrav
102e762fd81SDag-Erling Smørgravatf_test_case skip_fields
103e762fd81SDag-Erling Smørgravskip_fields_head() {
104e762fd81SDag-Erling Smørgrav	atf_set descr "skip fields"
105e762fd81SDag-Erling Smørgrav}
106e762fd81SDag-Erling Smørgravskip_fields_body() {
107e762fd81SDag-Erling Smørgrav	printf "1 a\n2 a\n3 b\n4 b\n5 a\n6 a\n" >input
108e762fd81SDag-Erling Smørgrav	printf "1 a\n3 b\n5 a\n" >expected
109e2ec8ee0SDag-Erling Smørgrav	atf_check_uniq -1
110e762fd81SDag-Erling Smørgrav	atf_check_uniq -f 1
111e762fd81SDag-Erling Smørgrav	atf_check_uniq --skip-fields 1
112e762fd81SDag-Erling Smørgrav}
113e762fd81SDag-Erling Smørgrav
114e762fd81SDag-Erling Smørgravatf_test_case skip_fields_tab
115e762fd81SDag-Erling Smørgravskip_fields_tab_head() {
116e762fd81SDag-Erling Smørgrav	atf_set descr "skip fields (with tabs)"
117e762fd81SDag-Erling Smørgrav}
118e762fd81SDag-Erling Smørgravskip_fields_tab_body() {
119e762fd81SDag-Erling Smørgrav	printf "1\ta\n2\ta\n3\tb\n4\tb\n5\ta\n6\ta\n" >input
120e762fd81SDag-Erling Smørgrav	printf "1\ta\n3\tb\n5\ta\n" >expected
121e2ec8ee0SDag-Erling Smørgrav	atf_check_uniq -1
122e762fd81SDag-Erling Smørgrav	atf_check_uniq -f 1
123e762fd81SDag-Erling Smørgrav	atf_check_uniq --skip-fields 1
124e762fd81SDag-Erling Smørgrav}
125e762fd81SDag-Erling Smørgrav
126e762fd81SDag-Erling Smørgravatf_test_case ignore_case
127e762fd81SDag-Erling Smørgravignore_case_head() {
128e762fd81SDag-Erling Smørgrav	atf_set descr "ignore case"
129e762fd81SDag-Erling Smørgrav}
130e762fd81SDag-Erling Smørgravignore_case_body() {
131e762fd81SDag-Erling Smørgrav	printf "a\nA\nb\nB\na\nA\n" >input
132e762fd81SDag-Erling Smørgrav	printf "a\nb\na\n" >expected
133e762fd81SDag-Erling Smørgrav	atf_check_uniq -i
134e762fd81SDag-Erling Smørgrav	atf_check_uniq --ignore-case
135e762fd81SDag-Erling Smørgrav}
136e762fd81SDag-Erling Smørgrav
137e762fd81SDag-Erling Smørgravatf_test_case skip_chars
138e762fd81SDag-Erling Smørgravskip_chars_head() {
139e762fd81SDag-Erling Smørgrav	atf_set descr "skip chars"
140e762fd81SDag-Erling Smørgrav}
141e762fd81SDag-Erling Smørgravskip_chars_body() {
142e762fd81SDag-Erling Smørgrav	printf "1 a\n2 a\n3 b\n4 b\n5 a\n6 a\n" >input
143e762fd81SDag-Erling Smørgrav	printf "1 a\n3 b\n5 a\n" >expected
144e2ec8ee0SDag-Erling Smørgrav	atf_check_uniq +2
145e762fd81SDag-Erling Smørgrav	atf_check_uniq -s 2
146e762fd81SDag-Erling Smørgrav	atf_check_uniq --skip-chars 2
147e762fd81SDag-Erling Smørgrav}
148e762fd81SDag-Erling Smørgrav
149e762fd81SDag-Erling Smørgravatf_test_case unique
150e762fd81SDag-Erling Smørgravunique_head() {
151e762fd81SDag-Erling Smørgrav	atf_set descr "print non-repeated lines only"
152e762fd81SDag-Erling Smørgrav}
153e762fd81SDag-Erling Smørgravunique_body() {
154e762fd81SDag-Erling Smørgrav	printf "a\na\nb\na\na\n" >input
155e762fd81SDag-Erling Smørgrav	printf "b\n" >expected
156e762fd81SDag-Erling Smørgrav	atf_check_uniq -u
157e762fd81SDag-Erling Smørgrav	atf_check_uniq --unique
158e762fd81SDag-Erling Smørgrav}
159e762fd81SDag-Erling Smørgrav
160e762fd81SDag-Erling Smørgravatf_test_case count_unique
161e762fd81SDag-Erling Smørgravcount_unique_head() {
162e762fd81SDag-Erling Smørgrav	atf_set descr "print non-repeated lines with count"
163e762fd81SDag-Erling Smørgrav}
164e762fd81SDag-Erling Smørgravcount_unique_body() {
165e762fd81SDag-Erling Smørgrav	printf "a\na\nb\n" >input
166e762fd81SDag-Erling Smørgrav	printf "   1 b\n" >expected
167e762fd81SDag-Erling Smørgrav	atf_check_uniq --unique --count
168e762fd81SDag-Erling Smørgrav	atf_check_uniq --count --unique
169e762fd81SDag-Erling Smørgrav}
170e762fd81SDag-Erling Smørgrav
17111715600SDag-Erling Smørgravatf_test_case interactive
17211715600SDag-Erling Smørgravinteractive_head() {
17311715600SDag-Erling Smørgrav	atf_set descr "test interactive use"
17411715600SDag-Erling Smørgrav}
17511715600SDag-Erling Smørgravinteractive_body() {
17611715600SDag-Erling Smørgrav	sh -c 'yes | stdbuf -oL uniq >actual' &
17711715600SDag-Erling Smørgrav	pid=$!
17811715600SDag-Erling Smørgrav	sleep 1
17911715600SDag-Erling Smørgrav	kill $!
18011715600SDag-Erling Smørgrav	atf_check -o inline:"y\n" cat actual
18111715600SDag-Erling Smørgrav}
18211715600SDag-Erling Smørgrav
18311715600SDag-Erling Smørgravatf_test_case interactive_repeated
18411715600SDag-Erling Smørgravinteractive_repeated_head() {
18511715600SDag-Erling Smørgrav	atf_set descr "test interactive use with -d"
18611715600SDag-Erling Smørgrav}
18711715600SDag-Erling Smørgravinteractive_repeated_body() {
18811715600SDag-Erling Smørgrav	sh -c 'yes | stdbuf -oL uniq -d >actual' &
18911715600SDag-Erling Smørgrav	pid=$!
19011715600SDag-Erling Smørgrav	sleep 1
19111715600SDag-Erling Smørgrav	kill $!
19211715600SDag-Erling Smørgrav	atf_check -o inline:"y\n" cat actual
19311715600SDag-Erling Smørgrav}
19411715600SDag-Erling Smørgrav
195899837e8SDag-Erling Smørgravatf_test_case stdout
196899837e8SDag-Erling Smørgravstdout_head() {
197899837e8SDag-Erling Smørgrav	atf_set descr "error writing to stdout"
198899837e8SDag-Erling Smørgrav}
199899837e8SDag-Erling Smørgravstdout_body() {
200899837e8SDag-Erling Smørgrav	(
201899837e8SDag-Erling Smørgrav		trap "" PIPE
202d9220f64SMark Johnston		# Give true(1) some time to exit.
203d9220f64SMark Johnston		sleep 1
204899837e8SDag-Erling Smørgrav		echo a | uniq 2>stderr
205899837e8SDag-Erling Smørgrav		echo $? >result
206899837e8SDag-Erling Smørgrav	) | true
207899837e8SDag-Erling Smørgrav	atf_check -o inline:"1\n" cat result
208899837e8SDag-Erling Smørgrav	atf_check -o match:"stdout" cat stderr
209899837e8SDag-Erling Smørgrav}
210899837e8SDag-Erling Smørgrav
211e762fd81SDag-Erling Smørgravatf_init_test_cases()
212e762fd81SDag-Erling Smørgrav{
213e762fd81SDag-Erling Smørgrav	atf_add_test_case basic
214e762fd81SDag-Erling Smørgrav	atf_add_test_case count
215e762fd81SDag-Erling Smørgrav	atf_add_test_case repeated
216e762fd81SDag-Erling Smørgrav	atf_add_test_case count_repeated
217e762fd81SDag-Erling Smørgrav	atf_add_test_case all_repeated
218*c3f8900eSDag-Erling Smørgrav	atf_add_test_case count_all_repeated
219e762fd81SDag-Erling Smørgrav	atf_add_test_case skip_fields
220e762fd81SDag-Erling Smørgrav	atf_add_test_case skip_fields_tab
221e762fd81SDag-Erling Smørgrav	atf_add_test_case ignore_case
222e762fd81SDag-Erling Smørgrav	atf_add_test_case skip_chars
223e762fd81SDag-Erling Smørgrav	atf_add_test_case unique
224e762fd81SDag-Erling Smørgrav	atf_add_test_case count_unique
22511715600SDag-Erling Smørgrav	atf_add_test_case interactive
22611715600SDag-Erling Smørgrav	atf_add_test_case interactive_repeated
227899837e8SDag-Erling Smørgrav	atf_add_test_case stdout
228e762fd81SDag-Erling Smørgrav}
229