xref: /freebsd/usr.bin/uniq/tests/uniq_test.sh (revision fd45b686f9d92f583366c75b22c04c7ee49709c0)
1#
2# Copyright (c) 2024 Klara, Inc.
3#
4# SPDX-License-Identifier: BSD-2-Clause
5#
6
7atf_check_uniq() {
8	atf_check uniq "$@" input actual
9	atf_check diff -u actual expected
10	atf_check uniq "$@" - actual <input
11	atf_check diff -u actual expected
12	atf_check -o file:expected uniq "$@" input
13	atf_check -o file:expected uniq "$@" <input
14	atf_check -o file:expected uniq "$@" - <input
15}
16
17atf_test_case basic
18basic_head() {
19	atf_set descr "basic test without options"
20}
21basic_body() {
22	printf "a\na\nb\nb\na\na\n" >input
23	printf "a\nb\na\n" >expected
24	atf_check_uniq
25}
26
27atf_test_case count
28count_head() {
29	atf_set descr "basic test showing counts"
30}
31count_body() {
32	printf "a\na\nb\nb\nb\na\na\na\na\n" >input
33	printf "   2 a\n   3 b\n   4 a\n" >expected
34	atf_check_uniq -c
35	atf_check_uniq --count
36}
37
38atf_test_case repeated
39repeated_head() {
40	atf_set descr "print repeated lines only"
41}
42repeated_body() {
43	printf "a\na\nb\na\na\n" >input
44	printf "a\na\n" >expected
45	atf_check_uniq -d
46	atf_check_uniq --repeated
47}
48
49atf_test_case count_repeated
50count_repeated_head() {
51	atf_set descr "count and print repeated lines only"
52}
53count_repeated_body() {
54	printf "a\na\nb\nb\na\n" >input
55	printf "   2 a\n   2 b\n" >expected
56	atf_check_uniq --count --repeated
57}
58
59atf_test_case all_repeated
60all_repeated_head() {
61	atf_set descr "print every instance of repeated lines"
62}
63all_repeated_body() {
64	printf "a\na\nb\na\na\n" >input
65	printf "a\na\na\na\n" >expected
66	atf_check_uniq -D
67	atf_check_uniq --all-repeated
68}
69
70atf_test_case skip_fields
71skip_fields_head() {
72	atf_set descr "skip fields"
73}
74skip_fields_body() {
75	printf "1 a\n2 a\n3 b\n4 b\n5 a\n6 a\n" >input
76	printf "1 a\n3 b\n5 a\n" >expected
77	atf_check_uniq -1
78	atf_check_uniq -f 1
79	atf_check_uniq --skip-fields 1
80}
81
82atf_test_case skip_fields_tab
83skip_fields_tab_head() {
84	atf_set descr "skip fields (with tabs)"
85}
86skip_fields_tab_body() {
87	printf "1\ta\n2\ta\n3\tb\n4\tb\n5\ta\n6\ta\n" >input
88	printf "1\ta\n3\tb\n5\ta\n" >expected
89	atf_check_uniq -1
90	atf_check_uniq -f 1
91	atf_check_uniq --skip-fields 1
92}
93
94atf_test_case ignore_case
95ignore_case_head() {
96	atf_set descr "ignore case"
97}
98ignore_case_body() {
99	printf "a\nA\nb\nB\na\nA\n" >input
100	printf "a\nb\na\n" >expected
101	atf_check_uniq -i
102	atf_check_uniq --ignore-case
103}
104
105atf_test_case skip_chars
106skip_chars_head() {
107	atf_set descr "skip chars"
108}
109skip_chars_body() {
110	printf "1 a\n2 a\n3 b\n4 b\n5 a\n6 a\n" >input
111	printf "1 a\n3 b\n5 a\n" >expected
112	atf_check_uniq +2
113	atf_check_uniq -s 2
114	atf_check_uniq --skip-chars 2
115}
116
117atf_test_case unique
118unique_head() {
119	atf_set descr "print non-repeated lines only"
120}
121unique_body() {
122	printf "a\na\nb\na\na\n" >input
123	printf "b\n" >expected
124	atf_check_uniq -u
125	atf_check_uniq --unique
126}
127
128atf_test_case count_unique
129count_unique_head() {
130	atf_set descr "print non-repeated lines with count"
131}
132count_unique_body() {
133	printf "a\na\nb\n" >input
134	printf "   1 b\n" >expected
135	atf_check_uniq --unique --count
136	atf_check_uniq --count --unique
137}
138
139atf_test_case interactive
140interactive_head() {
141	atf_set descr "test interactive use"
142}
143interactive_body() {
144	sh -c 'yes | stdbuf -oL uniq >actual' &
145	pid=$!
146	sleep 1
147	kill $!
148	atf_check -o inline:"y\n" cat actual
149}
150
151atf_test_case interactive_repeated
152interactive_repeated_head() {
153	atf_set descr "test interactive use with -d"
154}
155interactive_repeated_body() {
156	sh -c 'yes | stdbuf -oL uniq -d >actual' &
157	pid=$!
158	sleep 1
159	kill $!
160	atf_check -o inline:"y\n" cat actual
161}
162
163atf_test_case stdout
164stdout_head() {
165	atf_set descr "error writing to stdout"
166}
167stdout_body() {
168	(
169		trap "" PIPE
170		echo a | uniq 2>stderr
171		echo $? >result
172	) | true
173	atf_check -o inline:"1\n" cat result
174	atf_check -o match:"stdout" cat stderr
175}
176
177atf_init_test_cases()
178{
179	atf_add_test_case basic
180	atf_add_test_case count
181	atf_add_test_case repeated
182	atf_add_test_case count_repeated
183	atf_add_test_case all_repeated
184	atf_add_test_case skip_fields
185	atf_add_test_case skip_fields_tab
186	atf_add_test_case ignore_case
187	atf_add_test_case skip_chars
188	atf_add_test_case unique
189	atf_add_test_case count_unique
190	atf_add_test_case interactive
191	atf_add_test_case interactive_repeated
192	atf_add_test_case stdout
193}
194