1#!/bin/bash 2 3# Copyright 2013 Robin Mittal <robinmittal.it@gmail.com> 4# Copyright 2013 Divya Kothari <divya.s.kothari@gmail.com> 5 6[ -f testing.sh ] && . testing.sh 7 8#testing "name" "command" "result" "infile" "stdin" 9 10# Disable shell builtin 11PRINTF="$(which printf)" 12 13testing "text" "$PRINTF TEXT" "TEXT" "" "" 14testing "escapes" "$PRINTF 'one\ntwo\n\v\t\r\f\e\b\athree'" \ 15 "one\ntwo\n\v\t\r\f\e\b\athree" "" "" 16testing "%b escapes" "$PRINTF %b 'one\ntwo\n\v\t\r\f\e\b\athree'" \ 17 "one\ntwo\n\v\t\r\f\e\b\athree" "" "" 18testing "null" "$PRINTF 'x\0y' | od -An -tx1" ' 78 00 79\n' "" "" 19testing "trailing slash" "$PRINTF 'abc\'" 'abc\' "" "" 20testing "octal" "$PRINTF ' \1\002\429\045x'" ' \001\002"9%x' "" "" 21testing "not octal" "$PRINTF '\9'" '\9' "" "" 22testing "hex" "$PRINTF 'A\x1b\x2B\x3Q\xa' | od -An -tx1" \ 23 ' 41 1b 2b 03 51 0a\n' "" "" 24testing "%x" "$PRINTF '%x\n' 0x2a" "2a\n" "" "" 25 26testing "%d 42" "$PRINTF %d 42" "42" "" "" 27testing "%d 0x2a" "$PRINTF %d 0x2a" "42" "" "" 28testing "%d 052" "$PRINTF %d 052" "42" "" "" 29 30testing "%s width precision" \ 31 "$PRINTF '%3s,%.3s,%10s,%10.3s' abcde fghij klmno pqrst" \ 32 "abcde,fgh, klmno, pqr" "" "" 33 34# posix: "The format operand shall be reused as often as necessary to satisfy 35# the argument operands." 36 37testing "extra args" "$PRINTF 'abc%s!%ddef\n' X 42 ARG 36" \ 38 "abcX!42def\nabcARG!36def\n" "" "" 39 40testing "'%3c'" "$PRINTF '%3c' x" " x" "" "" 41testing "'%-3c'" "$PRINTF '%-3c' x" "x " "" "" 42testing "'%+d'" "$PRINTF '%+d' 5" "+5" "" "" 43 44 45testing "'%5d%4d' 1 21 321 4321 54321" \ 46 "$PRINTF '%5d%4d' 1 21 321 4321 54321" " 1 21 321432154321 0" "" "" 47testing "'%c %c' 78 79" "$PRINTF '%c %c' 78 79" "7 7" "" "" 48testing "'%d %d' 78 79" "$PRINTF '%d %d' 78 79" "78 79" "" "" 49testing "'%f %f' 78 79" "$PRINTF '%f %f' 78 79" \ 50 "78.000000 79.000000" "" "" 51testing "'f f' 78 79" "$PRINTF 'f f' 78 79 2>/dev/null" "f f" "" "" 52testing "'%i %i' 78 79" "$PRINTF '%i %i' 78 79" "78 79" "" "" 53testing "'%o %o' 78 79" "$PRINTF '%o %o' 78 79" "116 117" "" "" 54testing "'%u %u' 78 79" "$PRINTF '%u %u' 78 79" "78 79" "" "" 55testing "'%u %u' -1 -2" "$PRINTF '%u %u' -1 -2" \ 56 "18446744073709551615 18446744073709551614" "" "" 57testing "'%x %X' 78 79" "$PRINTF '%x %X' 78 79" "4e 4F" "" "" 58testing "'%g %G' 78 79" "$PRINTF '%g %G' 78 79" "78 79" "" "" 59testing "'%s %s' 78 79" "$PRINTF '%s %s' 78 79" "78 79" "" "" 60 61testing "%.s acts like %.0s" "$PRINTF %.s_ 1 2 3 4 5" "_____" "" "" 62testing "corner case" "$PRINTF '\\8'" '\8' '' '' 63 64# The posix spec explicitly specifies inconsistent behavior, 65# so treating the \0066 in %b like the \0066 not in %b is wrong because posix. 66testing "printf posix inconsistency" "$PRINTF '\\0066-%b' '\\0066'" "\x066-6" \ 67 "" "" 68 69testing "printf \x" "$PRINTF 'A\x1b\x2B\x3Q\xa' | od -An -tx1" \ 70 " 41 1b 2b 03 51 0a\n" "" "" 71 72testing "printf \c" "$PRINTF 'one\ctwo'" "one" "" "" 73 74# An extra leading 0 is fine for %b, but not as a direct escape, for some 75# reason... 76testing "printf octal %b" "$PRINTF '\0007%b' '\0007' | xxd -p" "003707\n" "" "" 77 78# Unlike echo, printf errors out on bad hex. 79testcmd "invalid hex 1" "'one\xvdtwo' 2>/dev/null || echo err" "oneerr\n" "" "" 80testcmd "invalid hex 2" "'one\xavtwo'" "one\nvtwo" "" "" 81# But bad octal is shown as text. 82testcmd "invalid oct" "'one\079two'" "one\a9two" "" "" 83 84# extension for ESC 85testcmd "%b \e" "'%b' '\\e' | xxd -p" "1b\n" "" "" 86testcmd "\e" "'\\e' | xxd -p" "1b\n" "" "" 87