1*57718be8SEnji Cooper# $NetBSD: t_awk.sh,v 1.5 2012/12/10 20:30:06 christos Exp $ 2*57718be8SEnji Cooper# 3*57718be8SEnji Cooper# Copyright (c) 2012 The NetBSD Foundation, Inc. 4*57718be8SEnji Cooper# All rights reserved. 5*57718be8SEnji Cooper# 6*57718be8SEnji Cooper# This code is derived from software contributed to The NetBSD Foundation 7*57718be8SEnji Cooper# by Christos Zoulas 8*57718be8SEnji Cooper# 9*57718be8SEnji Cooper# Redistribution and use in source and binary forms, with or without 10*57718be8SEnji Cooper# modification, are permitted provided that the following conditions 11*57718be8SEnji Cooper# are met: 12*57718be8SEnji Cooper# 1. Redistributions of source code must retain the above copyright 13*57718be8SEnji Cooper# notice, this list of conditions and the following disclaimer. 14*57718be8SEnji Cooper# 2. Redistributions in binary form must reproduce the above copyright 15*57718be8SEnji Cooper# notice, this list of conditions and the following disclaimer in the 16*57718be8SEnji Cooper# documentation and/or other materials provided with the distribution. 17*57718be8SEnji Cooper# 18*57718be8SEnji Cooper# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 19*57718be8SEnji Cooper# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 20*57718be8SEnji Cooper# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 21*57718be8SEnji Cooper# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 22*57718be8SEnji Cooper# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23*57718be8SEnji Cooper# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24*57718be8SEnji Cooper# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25*57718be8SEnji Cooper# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26*57718be8SEnji Cooper# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27*57718be8SEnji Cooper# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28*57718be8SEnji Cooper# POSSIBILITY OF SUCH DAMAGE. 29*57718be8SEnji Cooper# 30*57718be8SEnji Cooper 31*57718be8SEnji Cooperawk=awk 32*57718be8SEnji Cooper 33*57718be8SEnji Cooperh_check() 34*57718be8SEnji Cooper{ 35*57718be8SEnji Cooper local fname=d_$1 36*57718be8SEnji Cooper for sfx in in out awk; do 37*57718be8SEnji Cooper cp -r $(atf_get_srcdir)/$fname.$sfx . 38*57718be8SEnji Cooper done 39*57718be8SEnji Cooper shift 1 40*57718be8SEnji Cooper atf_check -o file:$fname.out -x "awk $@ -f $fname.awk < $fname.in" 41*57718be8SEnji Cooper} 42*57718be8SEnji Cooper 43*57718be8SEnji Cooperatf_test_case big_regexp 44*57718be8SEnji Cooper 45*57718be8SEnji Cooperbig_regexp_head() { 46*57718be8SEnji Cooper atf_set "descr" "Checks matching long regular expressions (PR/33392)" 47*57718be8SEnji Cooper} 48*57718be8SEnji Cooper 49*57718be8SEnji Cooperbig_regexp_body() { 50*57718be8SEnji Cooper h_check big_regexp 51*57718be8SEnji Cooper} 52*57718be8SEnji Cooper 53*57718be8SEnji Cooperatf_test_case end 54*57718be8SEnji Cooper 55*57718be8SEnji Cooperend_head() { 56*57718be8SEnji Cooper atf_set "descr" "Checks that the last line of the input" \ 57*57718be8SEnji Cooper "is available under END pattern (PR/29659)" 58*57718be8SEnji Cooper} 59*57718be8SEnji Cooper 60*57718be8SEnji Cooperend_body() { 61*57718be8SEnji Cooper h_check end1 62*57718be8SEnji Cooper h_check end2 63*57718be8SEnji Cooper} 64*57718be8SEnji Cooper 65*57718be8SEnji Cooperatf_test_case string1 66*57718be8SEnji Cooper 67*57718be8SEnji Cooperstring1_head() { 68*57718be8SEnji Cooper atf_set "descr" "Checks escaping newlines in string literals" 69*57718be8SEnji Cooper} 70*57718be8SEnji Cooper 71*57718be8SEnji Cooperstring1_body() { 72*57718be8SEnji Cooper for sfx in out awk; do 73*57718be8SEnji Cooper cp -r $(atf_get_srcdir)/d_string1.$sfx . 74*57718be8SEnji Cooper done 75*57718be8SEnji Cooper atf_check -o file:d_string1.out awk -f d_string1.awk 76*57718be8SEnji Cooper} 77*57718be8SEnji Cooper 78*57718be8SEnji Cooperatf_test_case multibyte 79*57718be8SEnji Cooper 80*57718be8SEnji Coopermultibyte_head() { 81*57718be8SEnji Cooper atf_set "descr" "Checks multibyte charsets support" \ 82*57718be8SEnji Cooper "in tolower and toupper (PR/36394)" 83*57718be8SEnji Cooper} 84*57718be8SEnji Cooper 85*57718be8SEnji Coopermultibyte_body() { 86*57718be8SEnji Cooper export LANG=en_US.UTF-8 87*57718be8SEnji Cooper 88*57718be8SEnji Cooper h_check tolower 89*57718be8SEnji Cooper h_check toupper 90*57718be8SEnji Cooper} 91*57718be8SEnji Cooper 92*57718be8SEnji Cooperatf_test_case period 93*57718be8SEnji Cooper 94*57718be8SEnji Cooperperiod_head() { 95*57718be8SEnji Cooper atf_set "descr" "Checks that the period character is recognised" \ 96*57718be8SEnji Cooper "in awk program regardless of locale (bin/42320)" 97*57718be8SEnji Cooper} 98*57718be8SEnji Cooper 99*57718be8SEnji Cooperperiod_body() { 100*57718be8SEnji Cooper export LANG=ru_RU.KOI8-R 101*57718be8SEnji Cooper 102*57718be8SEnji Cooper h_check period -v x=0.5 103*57718be8SEnji Cooper} 104*57718be8SEnji Cooper 105*57718be8SEnji Cooperatf_test_case assign_NF 106*57718be8SEnji Cooper 107*57718be8SEnji Cooperassign_NF_head() { 108*57718be8SEnji Cooper atf_set "descr" 'Checks that assign to NF changes $0 and $n (PR/44063)' 109*57718be8SEnji Cooper} 110*57718be8SEnji Cooper 111*57718be8SEnji Cooperassign_NF_body() { 112*57718be8SEnji Cooper h_check assign_NF 113*57718be8SEnji Cooper} 114*57718be8SEnji Cooper 115*57718be8SEnji Cooperatf_test_case single_char_rs 116*57718be8SEnji Cooper 117*57718be8SEnji Coopersingle_char_rs_head() { 118*57718be8SEnji Cooper atf_set "descr" "Test awk(1) with single character RS" 119*57718be8SEnji Cooper} 120*57718be8SEnji Cooper 121*57718be8SEnji Coopersingle_char_rs_body() { 122*57718be8SEnji Cooper atf_check \ 123*57718be8SEnji Cooper -o "inline:1\n2\n\n3\n\n\n4\n\n" \ 124*57718be8SEnji Cooper -x "echo 1a2aa3aaa4 | $awk 1 RS=a" 125*57718be8SEnji Cooper} 126*57718be8SEnji Cooper 127*57718be8SEnji Cooperatf_test_case two_char_rs 128*57718be8SEnji Cooper 129*57718be8SEnji Coopertwo_char_rs_head() { 130*57718be8SEnji Cooper atf_set "descr" "Test awk(1) with two characters RS" 131*57718be8SEnji Cooper} 132*57718be8SEnji Cooper 133*57718be8SEnji Coopertwo_char_rs_body() { 134*57718be8SEnji Cooper atf_check \ 135*57718be8SEnji Cooper -o "inline:1\n2\n3\n4\n\n" \ 136*57718be8SEnji Cooper -x "echo 1ab2ab3ab4 | $awk 1 RS=ab" 137*57718be8SEnji Cooper} 138*57718be8SEnji Cooper 139*57718be8SEnji Cooperatf_test_case single_char_regex_group_rs 140*57718be8SEnji Cooper 141*57718be8SEnji Coopersingle_char_regex_group_rs_head() { 142*57718be8SEnji Cooper atf_set "descr" "Test awk(1) with single character regex group RS" 143*57718be8SEnji Cooper} 144*57718be8SEnji Cooper 145*57718be8SEnji Coopersingle_char_regex_group_rs_body() { 146*57718be8SEnji Cooper atf_check \ 147*57718be8SEnji Cooper -o "inline:1\n2\n\n3\n\n\n4\n\n" \ 148*57718be8SEnji Cooper -x "echo 1a2aa3aaa4 | $awk 1 RS='[a]'" 149*57718be8SEnji Cooper} 150*57718be8SEnji Cooper 151*57718be8SEnji Cooperatf_test_case two_char_regex_group_rs 152*57718be8SEnji Cooper 153*57718be8SEnji Coopertwo_char_regex_group_rs_head() { 154*57718be8SEnji Cooper atf_set "descr" "Test awk(1) with two characters regex group RS" 155*57718be8SEnji Cooper} 156*57718be8SEnji Cooper 157*57718be8SEnji Coopertwo_char_regex_group_rs_body() { 158*57718be8SEnji Cooper atf_check \ 159*57718be8SEnji Cooper -o "inline:1\n2\n\n3\n\n\n4\n\n" \ 160*57718be8SEnji Cooper -x "echo 1a2ab3aba4 | $awk 1 RS='[ab]'" 161*57718be8SEnji Cooper} 162*57718be8SEnji Cooper 163*57718be8SEnji Cooperatf_test_case single_char_regex_star_rs 164*57718be8SEnji Cooper 165*57718be8SEnji Coopersingle_char_regex_star_rs_head() { 166*57718be8SEnji Cooper atf_set "descr" "Test awk(1) with single character regex star RS" 167*57718be8SEnji Cooper} 168*57718be8SEnji Cooper 169*57718be8SEnji Coopersingle_char_regex_star_rs_body() { 170*57718be8SEnji Cooper atf_check \ 171*57718be8SEnji Cooper -o "inline:1\n2\n3\n4\n\n" \ 172*57718be8SEnji Cooper -x "echo 1a2aa3aaa4 | $awk 1 RS='a*'" 173*57718be8SEnji Cooper} 174*57718be8SEnji Cooper 175*57718be8SEnji Cooperatf_test_case two_char_regex_star_rs 176*57718be8SEnji Cooper 177*57718be8SEnji Coopertwo_char_regex_star_rs_head() { 178*57718be8SEnji Cooper atf_set "descr" "Test awk(1) with two characters regex star RS" 179*57718be8SEnji Cooper} 180*57718be8SEnji Cooper 181*57718be8SEnji Coopertwo_char_regex_star_rs_body() { 182*57718be8SEnji Cooper atf_check \ 183*57718be8SEnji Cooper -o "inline:1\n2\n3\n4\n\n" \ 184*57718be8SEnji Cooper -x "echo 1a2aa3aaa4 | $awk 1 RS='aa*'" 185*57718be8SEnji Cooper} 186*57718be8SEnji Cooper 187*57718be8SEnji Cooperatf_test_case regex_two_star_rs 188*57718be8SEnji Cooper 189*57718be8SEnji Cooperregex_two_star_rs_head() { 190*57718be8SEnji Cooper atf_set "descr" "Test awk(1) with regex two star RS" 191*57718be8SEnji Cooper} 192*57718be8SEnji Cooper 193*57718be8SEnji Cooperregex_two_star_rs_body() { 194*57718be8SEnji Cooper atf_check \ 195*57718be8SEnji Cooper -o "inline:1\n2\n3\n4\n\n" \ 196*57718be8SEnji Cooper -x "echo 1a2ab3aab4 | $awk 1 RS='aa*b*'" 197*57718be8SEnji Cooper} 198*57718be8SEnji Cooper 199*57718be8SEnji Cooperatf_test_case regex_or_1_rs 200*57718be8SEnji Cooper 201*57718be8SEnji Cooperregex_or_1_rs_head() { 202*57718be8SEnji Cooper atf_set "descr" "Test awk(1) with regex | case 1 RS" 203*57718be8SEnji Cooper} 204*57718be8SEnji Cooper 205*57718be8SEnji Cooperregex_or_1_rs_body() { 206*57718be8SEnji Cooper atf_check \ 207*57718be8SEnji Cooper -o "inline:1a\nc\n\n" \ 208*57718be8SEnji Cooper -x "echo 1abc | $awk 1 RS='abcde|b'" 209*57718be8SEnji Cooper} 210*57718be8SEnji Cooper 211*57718be8SEnji Cooperatf_test_case regex_or_2_rs 212*57718be8SEnji Cooper 213*57718be8SEnji Cooperregex_or_2_rs_head() { 214*57718be8SEnji Cooper atf_set "descr" "Test awk(1) with regex | case 2 RS" 215*57718be8SEnji Cooper} 216*57718be8SEnji Cooper 217*57718be8SEnji Cooperregex_or_2_rs_body() { 218*57718be8SEnji Cooper atf_check \ 219*57718be8SEnji Cooper -o "inline:1a\ncdf2\n\n" \ 220*57718be8SEnji Cooper -x "echo 1abcdf2 | $awk 1 RS='abcde|b'" 221*57718be8SEnji Cooper} 222*57718be8SEnji Cooper 223*57718be8SEnji Cooperatf_test_case regex_or_3_rs 224*57718be8SEnji Cooper 225*57718be8SEnji Cooperregex_or_3_rs_head() { 226*57718be8SEnji Cooper atf_set "descr" "Test awk(1) with regex | case 3 RS" 227*57718be8SEnji Cooper} 228*57718be8SEnji Cooper 229*57718be8SEnji Cooperregex_or_3_rs_body() { 230*57718be8SEnji Cooper atf_check \ 231*57718be8SEnji Cooper -o "inline:1\n\nf2\n\n" \ 232*57718be8SEnji Cooper -x "echo 1abcdebf2 | $awk 1 RS='abcde|b'" 233*57718be8SEnji Cooper} 234*57718be8SEnji Cooper 235*57718be8SEnji Cooperatf_test_case regex_or_4_rs 236*57718be8SEnji Cooper 237*57718be8SEnji Cooperregex_or_4_rs_head() { 238*57718be8SEnji Cooper atf_set "descr" "Test awk(1) with regex | case 4 RS" 239*57718be8SEnji Cooper} 240*57718be8SEnji Cooper 241*57718be8SEnji Cooperregex_or_4_rs_body() { 242*57718be8SEnji Cooper atf_check \ 243*57718be8SEnji Cooper -o "inline:1\nbcdf2\n\n" \ 244*57718be8SEnji Cooper -x "echo 1abcdf2 | $awk 1 RS='abcde|a'" 245*57718be8SEnji Cooper 246*57718be8SEnji Cooper} 247*57718be8SEnji Cooper 248*57718be8SEnji Cooperatf_test_case regex_caret_1_rs 249*57718be8SEnji Cooper 250*57718be8SEnji Cooperregex_caret_1_rs_head() { 251*57718be8SEnji Cooper atf_set "descr" "Test awk(1) with regex ^ case 1 RS" 252*57718be8SEnji Cooper} 253*57718be8SEnji Cooper 254*57718be8SEnji Cooperregex_caret_1_rs_body() { 255*57718be8SEnji Cooper atf_check \ 256*57718be8SEnji Cooper -o "inline:\n1a2a3a\n\n" \ 257*57718be8SEnji Cooper -x "echo a1a2a3a | $awk 1 RS='^a'" 258*57718be8SEnji Cooper 259*57718be8SEnji Cooper} 260*57718be8SEnji Cooper 261*57718be8SEnji Cooperatf_test_case regex_caret_2_rs 262*57718be8SEnji Cooper 263*57718be8SEnji Cooperregex_caret_2_rs_head() { 264*57718be8SEnji Cooper atf_set "descr" "Test awk(1) with regex ^ case 2 RS" 265*57718be8SEnji Cooper} 266*57718be8SEnji Cooper 267*57718be8SEnji Cooperregex_caret_2_rs_body() { 268*57718be8SEnji Cooper atf_check \ 269*57718be8SEnji Cooper -o "inline:\naa1a2a\n\n" \ 270*57718be8SEnji Cooper -x "echo aaa1a2a | $awk 1 RS='^a'" 271*57718be8SEnji Cooper 272*57718be8SEnji Cooper} 273*57718be8SEnji Cooper 274*57718be8SEnji Cooperatf_test_case regex_dollar_1_rs 275*57718be8SEnji Cooper 276*57718be8SEnji Cooperregex_dollar_1_rs_head() { 277*57718be8SEnji Cooper atf_set "descr" "Test awk(1) with regex $ case 1 RS" 278*57718be8SEnji Cooper} 279*57718be8SEnji Cooper 280*57718be8SEnji Cooperregex_dollar_1_rs_body() { 281*57718be8SEnji Cooper atf_check \ 282*57718be8SEnji Cooper -o "inline:a1a2a3a\n\n" \ 283*57718be8SEnji Cooper -x "echo a1a2a3a | $awk 1 RS='a$'" 284*57718be8SEnji Cooper 285*57718be8SEnji Cooper} 286*57718be8SEnji Cooper 287*57718be8SEnji Cooperatf_test_case regex_dollar_2_rs 288*57718be8SEnji Cooper 289*57718be8SEnji Cooperregex_dollar_2_rs_head() { 290*57718be8SEnji Cooper atf_set "descr" "Test awk(1) with regex $ case 2 RS" 291*57718be8SEnji Cooper} 292*57718be8SEnji Cooper 293*57718be8SEnji Cooperregex_dollar_2_rs_body() { 294*57718be8SEnji Cooper atf_check \ 295*57718be8SEnji Cooper -o "inline:a1a2aaa\n\n" \ 296*57718be8SEnji Cooper -x "echo a1a2aaa | $awk 1 RS='a$'" 297*57718be8SEnji Cooper 298*57718be8SEnji Cooper} 299*57718be8SEnji Cooper 300*57718be8SEnji Cooperatf_test_case regex_reallocation_rs 301*57718be8SEnji Cooper 302*57718be8SEnji Cooperregex_reallocation_rs_head() { 303*57718be8SEnji Cooper atf_set "descr" "Test awk(1) with regex reallocation RS" 304*57718be8SEnji Cooper} 305*57718be8SEnji Cooper 306*57718be8SEnji Cooperregex_reallocation_rs_body() { 307*57718be8SEnji Cooper atf_check \ 308*57718be8SEnji Cooper -o "inline:a\na\na\na\na\na\na\na\na\na10000\n\n" \ 309*57718be8SEnji Cooper -x "jot -s a 10000 | $awk 'NR>1' RS='999[0-9]'" 310*57718be8SEnji Cooper 311*57718be8SEnji Cooper} 312*57718be8SEnji Cooper 313*57718be8SEnji Cooperatf_test_case empty_rs 314*57718be8SEnji Cooper 315*57718be8SEnji Cooperempty_rs_head() { 316*57718be8SEnji Cooper atf_set "descr" "Test awk(1) with empty RS" 317*57718be8SEnji Cooper} 318*57718be8SEnji Cooper 319*57718be8SEnji Cooperempty_rs_body() { 320*57718be8SEnji Cooper atf_check \ 321*57718be8SEnji Cooper -o "inline:foo\n" \ 322*57718be8SEnji Cooper -x "echo foo | $awk 1 RS=''" 323*57718be8SEnji Cooper 324*57718be8SEnji Cooper} 325*57718be8SEnji Cooper 326*57718be8SEnji Cooperatf_test_case newline_rs 327*57718be8SEnji Cooper 328*57718be8SEnji Coopernewline_rs_head() { 329*57718be8SEnji Cooper atf_set "descr" "Test awk(1) with newline RS" 330*57718be8SEnji Cooper} 331*57718be8SEnji Cooper 332*57718be8SEnji Coopernewline_rs_body() { 333*57718be8SEnji Cooper atf_check \ 334*57718be8SEnji Cooper -o "inline:r1f1:r1f2\nr2f1:r2f2\n" \ 335*57718be8SEnji Cooper -x "printf '\n\n\nr1f1\nr1f2\n\nr2f1\nr2f2\n\n\n' | $awk '{\$1=\$1}1' RS= OFS=:" 336*57718be8SEnji Cooper} 337*57718be8SEnji Cooper 338*57718be8SEnji Cooperatf_test_case modify_subsep 339*57718be8SEnji Cooper 340*57718be8SEnji Coopermodify_subsep_head() { 341*57718be8SEnji Cooper atf_set "descr" "Test awk(1) SUPSEP modification (PR/47306)" 342*57718be8SEnji Cooper} 343*57718be8SEnji Cooper 344*57718be8SEnji Coopermodify_subsep_body() { 345*57718be8SEnji Cooper atf_check \ 346*57718be8SEnji Cooper -o "inline:1\n1\n1\n" \ 347*57718be8SEnji Cooper -x "printf '1\n1 2\n' | \ 348*57718be8SEnji Cooper $awk '1{ arr[\$1 SUBSEP \$2 SUBSEP ++cnt[\$1]]=1} {for (f in arr) print arr[f];}'" 349*57718be8SEnji Cooper} 350*57718be8SEnji Cooper 351*57718be8SEnji Cooperatf_init_test_cases() { 352*57718be8SEnji Cooper 353*57718be8SEnji Cooper atf_add_test_case big_regexp 354*57718be8SEnji Cooper atf_add_test_case end 355*57718be8SEnji Cooper atf_add_test_case string1 356*57718be8SEnji Cooper atf_add_test_case multibyte 357*57718be8SEnji Cooper atf_add_test_case period 358*57718be8SEnji Cooper atf_add_test_case assign_NF 359*57718be8SEnji Cooper 360*57718be8SEnji Cooper atf_add_test_case single_char_rs 361*57718be8SEnji Cooper atf_add_test_case two_char_rs 362*57718be8SEnji Cooper atf_add_test_case single_char_regex_group_rs 363*57718be8SEnji Cooper atf_add_test_case two_char_regex_group_rs 364*57718be8SEnji Cooper atf_add_test_case two_char_regex_star_rs 365*57718be8SEnji Cooper atf_add_test_case single_char_regex_star_rs 366*57718be8SEnji Cooper atf_add_test_case regex_two_star_rs 367*57718be8SEnji Cooper atf_add_test_case regex_or_1_rs 368*57718be8SEnji Cooper atf_add_test_case regex_or_2_rs 369*57718be8SEnji Cooper atf_add_test_case regex_or_3_rs 370*57718be8SEnji Cooper atf_add_test_case regex_caret_1_rs 371*57718be8SEnji Cooper atf_add_test_case regex_caret_2_rs 372*57718be8SEnji Cooper atf_add_test_case regex_dollar_1_rs 373*57718be8SEnji Cooper atf_add_test_case regex_dollar_2_rs 374*57718be8SEnji Cooper atf_add_test_case regex_reallocation_rs 375*57718be8SEnji Cooper atf_add_test_case empty_rs 376*57718be8SEnji Cooper atf_add_test_case newline_rs 377*57718be8SEnji Cooper atf_add_test_case modify_subsep 378*57718be8SEnji Cooper} 379