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