xref: /freebsd/usr.bin/uniq/tests/uniq_test.sh (revision d9220f64)
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
56e762fd81SDag-Erling Smørgrav	atf_check_uniq --count --repeated
57e762fd81SDag-Erling Smørgrav}
58e762fd81SDag-Erling Smørgrav
59e762fd81SDag-Erling Smørgravatf_test_case all_repeated
60e762fd81SDag-Erling Smørgravall_repeated_head() {
61e762fd81SDag-Erling Smørgrav	atf_set descr "print every instance of repeated lines"
62e762fd81SDag-Erling Smørgrav}
63e762fd81SDag-Erling Smørgravall_repeated_body() {
64e762fd81SDag-Erling Smørgrav	printf "a\na\nb\na\na\n" >input
65e762fd81SDag-Erling Smørgrav	printf "a\na\na\na\n" >expected
66e762fd81SDag-Erling Smørgrav	atf_check_uniq -D
67e762fd81SDag-Erling Smørgrav	atf_check_uniq --all-repeated
68e762fd81SDag-Erling Smørgrav}
69e762fd81SDag-Erling Smørgrav
70e762fd81SDag-Erling Smørgravatf_test_case skip_fields
71e762fd81SDag-Erling Smørgravskip_fields_head() {
72e762fd81SDag-Erling Smørgrav	atf_set descr "skip fields"
73e762fd81SDag-Erling Smørgrav}
74e762fd81SDag-Erling Smørgravskip_fields_body() {
75e762fd81SDag-Erling Smørgrav	printf "1 a\n2 a\n3 b\n4 b\n5 a\n6 a\n" >input
76e762fd81SDag-Erling Smørgrav	printf "1 a\n3 b\n5 a\n" >expected
77e2ec8ee0SDag-Erling Smørgrav	atf_check_uniq -1
78e762fd81SDag-Erling Smørgrav	atf_check_uniq -f 1
79e762fd81SDag-Erling Smørgrav	atf_check_uniq --skip-fields 1
80e762fd81SDag-Erling Smørgrav}
81e762fd81SDag-Erling Smørgrav
82e762fd81SDag-Erling Smørgravatf_test_case skip_fields_tab
83e762fd81SDag-Erling Smørgravskip_fields_tab_head() {
84e762fd81SDag-Erling Smørgrav	atf_set descr "skip fields (with tabs)"
85e762fd81SDag-Erling Smørgrav}
86e762fd81SDag-Erling Smørgravskip_fields_tab_body() {
87e762fd81SDag-Erling Smørgrav	printf "1\ta\n2\ta\n3\tb\n4\tb\n5\ta\n6\ta\n" >input
88e762fd81SDag-Erling Smørgrav	printf "1\ta\n3\tb\n5\ta\n" >expected
89e2ec8ee0SDag-Erling Smørgrav	atf_check_uniq -1
90e762fd81SDag-Erling Smørgrav	atf_check_uniq -f 1
91e762fd81SDag-Erling Smørgrav	atf_check_uniq --skip-fields 1
92e762fd81SDag-Erling Smørgrav}
93e762fd81SDag-Erling Smørgrav
94e762fd81SDag-Erling Smørgravatf_test_case ignore_case
95e762fd81SDag-Erling Smørgravignore_case_head() {
96e762fd81SDag-Erling Smørgrav	atf_set descr "ignore case"
97e762fd81SDag-Erling Smørgrav}
98e762fd81SDag-Erling Smørgravignore_case_body() {
99e762fd81SDag-Erling Smørgrav	printf "a\nA\nb\nB\na\nA\n" >input
100e762fd81SDag-Erling Smørgrav	printf "a\nb\na\n" >expected
101e762fd81SDag-Erling Smørgrav	atf_check_uniq -i
102e762fd81SDag-Erling Smørgrav	atf_check_uniq --ignore-case
103e762fd81SDag-Erling Smørgrav}
104e762fd81SDag-Erling Smørgrav
105e762fd81SDag-Erling Smørgravatf_test_case skip_chars
106e762fd81SDag-Erling Smørgravskip_chars_head() {
107e762fd81SDag-Erling Smørgrav	atf_set descr "skip chars"
108e762fd81SDag-Erling Smørgrav}
109e762fd81SDag-Erling Smørgravskip_chars_body() {
110e762fd81SDag-Erling Smørgrav	printf "1 a\n2 a\n3 b\n4 b\n5 a\n6 a\n" >input
111e762fd81SDag-Erling Smørgrav	printf "1 a\n3 b\n5 a\n" >expected
112e2ec8ee0SDag-Erling Smørgrav	atf_check_uniq +2
113e762fd81SDag-Erling Smørgrav	atf_check_uniq -s 2
114e762fd81SDag-Erling Smørgrav	atf_check_uniq --skip-chars 2
115e762fd81SDag-Erling Smørgrav}
116e762fd81SDag-Erling Smørgrav
117e762fd81SDag-Erling Smørgravatf_test_case unique
118e762fd81SDag-Erling Smørgravunique_head() {
119e762fd81SDag-Erling Smørgrav	atf_set descr "print non-repeated lines only"
120e762fd81SDag-Erling Smørgrav}
121e762fd81SDag-Erling Smørgravunique_body() {
122e762fd81SDag-Erling Smørgrav	printf "a\na\nb\na\na\n" >input
123e762fd81SDag-Erling Smørgrav	printf "b\n" >expected
124e762fd81SDag-Erling Smørgrav	atf_check_uniq -u
125e762fd81SDag-Erling Smørgrav	atf_check_uniq --unique
126e762fd81SDag-Erling Smørgrav}
127e762fd81SDag-Erling Smørgrav
128e762fd81SDag-Erling Smørgravatf_test_case count_unique
129e762fd81SDag-Erling Smørgravcount_unique_head() {
130e762fd81SDag-Erling Smørgrav	atf_set descr "print non-repeated lines with count"
131e762fd81SDag-Erling Smørgrav}
132e762fd81SDag-Erling Smørgravcount_unique_body() {
133e762fd81SDag-Erling Smørgrav	printf "a\na\nb\n" >input
134e762fd81SDag-Erling Smørgrav	printf "   1 b\n" >expected
135e762fd81SDag-Erling Smørgrav	atf_check_uniq --unique --count
136e762fd81SDag-Erling Smørgrav	atf_check_uniq --count --unique
137e762fd81SDag-Erling Smørgrav}
138e762fd81SDag-Erling Smørgrav
13911715600SDag-Erling Smørgravatf_test_case interactive
14011715600SDag-Erling Smørgravinteractive_head() {
14111715600SDag-Erling Smørgrav	atf_set descr "test interactive use"
14211715600SDag-Erling Smørgrav}
14311715600SDag-Erling Smørgravinteractive_body() {
14411715600SDag-Erling Smørgrav	sh -c 'yes | stdbuf -oL uniq >actual' &
14511715600SDag-Erling Smørgrav	pid=$!
14611715600SDag-Erling Smørgrav	sleep 1
14711715600SDag-Erling Smørgrav	kill $!
14811715600SDag-Erling Smørgrav	atf_check -o inline:"y\n" cat actual
14911715600SDag-Erling Smørgrav}
15011715600SDag-Erling Smørgrav
15111715600SDag-Erling Smørgravatf_test_case interactive_repeated
15211715600SDag-Erling Smørgravinteractive_repeated_head() {
15311715600SDag-Erling Smørgrav	atf_set descr "test interactive use with -d"
15411715600SDag-Erling Smørgrav}
15511715600SDag-Erling Smørgravinteractive_repeated_body() {
15611715600SDag-Erling Smørgrav	sh -c 'yes | stdbuf -oL uniq -d >actual' &
15711715600SDag-Erling Smørgrav	pid=$!
15811715600SDag-Erling Smørgrav	sleep 1
15911715600SDag-Erling Smørgrav	kill $!
16011715600SDag-Erling Smørgrav	atf_check -o inline:"y\n" cat actual
16111715600SDag-Erling Smørgrav}
16211715600SDag-Erling Smørgrav
163899837e8SDag-Erling Smørgravatf_test_case stdout
164899837e8SDag-Erling Smørgravstdout_head() {
165899837e8SDag-Erling Smørgrav	atf_set descr "error writing to stdout"
166899837e8SDag-Erling Smørgrav}
167899837e8SDag-Erling Smørgravstdout_body() {
168899837e8SDag-Erling Smørgrav	(
169899837e8SDag-Erling Smørgrav		trap "" PIPE
170*d9220f64SMark Johnston		# Give true(1) some time to exit.
171*d9220f64SMark Johnston		sleep 1
172899837e8SDag-Erling Smørgrav		echo a | uniq 2>stderr
173899837e8SDag-Erling Smørgrav		echo $? >result
174899837e8SDag-Erling Smørgrav	) | true
175899837e8SDag-Erling Smørgrav	atf_check -o inline:"1\n" cat result
176899837e8SDag-Erling Smørgrav	atf_check -o match:"stdout" cat stderr
177899837e8SDag-Erling Smørgrav}
178899837e8SDag-Erling Smørgrav
179e762fd81SDag-Erling Smørgravatf_init_test_cases()
180e762fd81SDag-Erling Smørgrav{
181e762fd81SDag-Erling Smørgrav	atf_add_test_case basic
182e762fd81SDag-Erling Smørgrav	atf_add_test_case count
183e762fd81SDag-Erling Smørgrav	atf_add_test_case repeated
184e762fd81SDag-Erling Smørgrav	atf_add_test_case count_repeated
185e762fd81SDag-Erling Smørgrav	atf_add_test_case all_repeated
186e762fd81SDag-Erling Smørgrav	atf_add_test_case skip_fields
187e762fd81SDag-Erling Smørgrav	atf_add_test_case skip_fields_tab
188e762fd81SDag-Erling Smørgrav	atf_add_test_case ignore_case
189e762fd81SDag-Erling Smørgrav	atf_add_test_case skip_chars
190e762fd81SDag-Erling Smørgrav	atf_add_test_case unique
191e762fd81SDag-Erling Smørgrav	atf_add_test_case count_unique
19211715600SDag-Erling Smørgrav	atf_add_test_case interactive
19311715600SDag-Erling Smørgrav	atf_add_test_case interactive_repeated
194899837e8SDag-Erling Smørgrav	atf_add_test_case stdout
195e762fd81SDag-Erling Smørgrav}
196