1#! /usr/bin/ksh 2# 3# 4# This file and its contents are supplied under the terms of the 5# Common Development and Distribution License ("CDDL"), version 1.0. 6# You may only use this file in accordance with the terms of version 7# 1.0 of the CDDL. 8# 9# A full copy of the text of the CDDL should have accompanied this 10# source. A copy of the CDDL is also available via the Internet at 11# http://www.illumos.org/license/CDDL. 12# 13 14# 15# Copyright 2014 Garrett D'Amore <garrett@damore.org> 16# 17 18PRINTF=${PRINTF:=/usr/bin/printf} 19 20test_start() { 21 print "TEST STARTING ${1}: ${2}" 22} 23 24test_pass() { 25 print "TEST PASS: ${1}" 26} 27 28test_fail() { 29 print "TEST FAIL: ${1}: ${2}" 30 exit -1 31} 32 33checkrv() { 34 if [[ $? -ne 0 ]]; then 35 test_fail $1 "exit failure" 36 fi 37} 38 39compare() { 40 if [[ "$2" != "$3" ]]; then 41 test_fail $1 "compare mismatch, got [$2] expected [$3]" 42 fi 43} 44 45typeset -A tests=() 46 47 48typeset -A tests[01]=() 49tests[01][desc]="hexadecimal lowercase" 50tests[01][format]='%04x' 51tests[01][args]="255" 52tests[01][result]="00ff" 53 54typeset -A tests[02]=() 55tests[02][desc]="hexadecimal 32-bit" 56tests[02][format]='%08x' 57tests[02][args]='65537' 58tests[02][result]=00010001 59 60typeset -A tests[03]=() 61tests[03][desc]="multiple arguments" 62tests[03][format]='%d %s ' 63tests[03][args]="1 one 2 two 3 three" 64tests[03][result]='1 one 2 two 3 three ' 65 66typeset -A tests[04]=() 67tests[04][desc]="variable position parameters" 68tests[04][format]='%2$s %1$d ' 69tests[04][args]="1 one 2 two 3 three" 70tests[04][result]='one 1 two 2 three 3 ' 71 72typeset -A tests[05]=() 73tests[05][desc]="width" 74tests[05][format]='%10s' 75tests[05][args]="abcdef" 76tests[05][result]=' abcdef' 77 78typeset -A tests[06]=() 79tests[06][desc]="width and precision" 80tests[06][format]='%10.3s' 81tests[06][args]="abcdef" 82tests[06][result]=' abc' 83 84typeset -A tests[07]=() 85tests[07][desc]="variable width and precision" 86tests[07][format]='%*.*s' 87tests[07][args]="10 3 abcdef" 88tests[07][result]=' abc' 89 90typeset -A tests[08]=() 91tests[08][desc]="variable position width and precision" 92tests[08][format]='%2$*1$.*3$s' 93tests[08][args]="10 abcdef 3" 94tests[08][result]=' abc' 95 96typeset -A tests[09]=() 97tests[09][desc]="multi variable position width and precision" 98tests[09][format]='%2$*1$.*3$s' 99tests[09][args]="10 abcdef 3 5 xyz 1" 100tests[09][result]=' abc x' 101 102typeset -A tests[10]=() 103tests[10][desc]="decimal from hex" 104tests[10][format]='%d ' 105tests[10][args]="0x1000 0XA" 106tests[10][result]='4096 10 ' 107 108typeset -A tests[11]=() 109tests[11][desc]="negative dec (64-bit)" 110tests[11][format]='%x' 111tests[11][args]="-1" 112tests[11][result]='ffffffffffffffff' 113 114typeset -A tests[12]=() 115tests[12][desc]="float (basic)" 116tests[12][format]='%f' 117tests[12][args]="3.14" 118tests[12][result]='3.140000' 119 120typeset -A tests[12]=() 121tests[12][desc]="float precision" 122tests[12][format]='%.2f' 123tests[12][args]="3.14159" 124tests[12][result]='3.14' 125 126typeset -A tests[13]=() 127tests[13][desc]="left justify" 128tests[13][format]='%-5d' 129tests[13][args]="45" 130tests[13][result]='45 ' 131 132typeset -A tests[14]=() 133tests[14][desc]="newlines" 134tests[14][format]='%s\n%s\n%s' 135tests[14][args]="one two three" 136tests[14][result]='one 137two 138three' 139 140typeset -A tests[15]=() 141tests[15][desc]="embedded octal escape" 142tests[15][format]='%s\41%s' 143tests[15][args]="one two" 144tests[15][result]='one!two' 145 146typeset -A tests[16]=() 147tests[16][desc]="backslash string (%b)" 148tests[16][format]='%b' 149tests[16][args]='\0101\0102\0103' 150tests[16][result]='ABC' 151 152typeset -A tests[17]=() 153tests[17][desc]="backslash c in %b" 154tests[17][format]='%b%s' 155tests[17][args]='\0101\cone two' 156tests[17][result]='A' 157 158typeset -A tests[18]=() 159tests[18][desc]="backslash octal in format" 160tests[18][format]='HI\1120K\0112tabbed\11again' 161tests[18][args]= 162tests[18][result]='HIJ0K 2tabbed again' 163 164typeset -A tests[19]=() 165tests[19][desc]="backslash octal in %b" 166tests[19][format]="%b" 167tests[19][args]='HI\0112K\011tabbed' 168tests[19][result]='HIJK tabbed' 169 170typeset -A tests[20]=() 171tests[20][desc]="numeric %d and ASCII conversions" 172tests[20][format]='%d ' 173tests[20][args]="3 +3 -3 \"3 \"+ '-" 174tests[20][result]='3 3 -3 51 43 45 ' 175 176typeset -A tests[21]=() 177tests[21][desc]="verify second arg only" 178tests[21][format]='%2$s' 179tests[21][args]='abc xyz' 180tests[21][result]="xyz" 181 182typeset -A tests[22]=() 183tests[22][desc]="verify missing signed arg" 184tests[22][format]='%d %d' 185tests[22][args]='151' 186tests[22][result]="151 0" 187 188typeset -A tests[23]=() 189tests[23][desc]="verify missing unsigned arg" 190tests[23][format]='%u %u' 191tests[23][args]='151' 192tests[23][result]="151 0" 193 194#debug=yes 195 196for i in "${!tests[@]}"; do 197 t=test_$i 198 desc=${tests[$i][desc]} 199 format=${tests[$i][format]} 200 args="${tests[$i][args]}" 201 result=${tests[$i][result]} 202 203 test_start $t "${tests[$i][desc]}" 204 [[ -n "$debug" ]] && echo $PRINTF "$format" "${args[@]}" 205 comp=$($PRINTF "$format" ${args[@]}) 206 checkrv $t 207 [[ -n "$debug" ]] && echo "got [$comp]" 208 good=$result 209 compare $t "$comp" "$good" 210 test_pass $t 211done 212