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