| 1 | #!/bin/sh |
| 2 | TEST_PREFIX="[printf]" |
| 3 | . "$(cd "$(dirname "$0")" && pwd)/test_harness.sh" |
| 4 | |
| 5 | section "1. printf format specifiers" |
| 6 | compare_output "printf %s string" 'printf "%s\n" hello' |
| 7 | compare_output "printf %d decimal" 'printf "%d\n" 42' |
| 8 | compare_output "printf %x hex lowercase" 'printf "%x\n" 255' |
| 9 | compare_output "printf %X hex uppercase" 'printf "%X\n" 255' |
| 10 | compare_output "printf %o octal" 'printf "%o\n" 8' |
| 11 | compare_output "printf %c character" 'printf "%c\n" A' |
| 12 | compare_output "printf %i integer" 'printf "%i\n" 42' |
| 13 | |
| 14 | section "2. printf width and precision" |
| 15 | compare_output "printf left-aligned %-10s" 'printf "[%-10s]\n" hi' |
| 16 | compare_output "printf right-aligned %10s" 'printf "[%10s]\n" hi' |
| 17 | compare_output "printf precision truncate %.5s" 'printf "%.5s\n" "hello world"' |
| 18 | compare_output "printf zero-padded %05d" 'printf "%05d\n" 42' |
| 19 | compare_output "printf width with string %8s" 'printf "[%8s]\n" "abc"' |
| 20 | compare_output "printf negative number" 'printf "%d\n" -5' |
| 21 | |
| 22 | section "3. printf escape sequences" |
| 23 | compare_output "printf newline in format" 'printf "a\nb\n"' |
| 24 | compare_output "printf tab in format" 'printf "a\tb\n"' |
| 25 | compare_output "printf backslash in format" 'printf "a\\\\b\n"' |
| 26 | compare_output "printf carriage return" 'printf "hello\rworld\n"' |
| 27 | compare_output "printf literal percent" 'printf "100%%\n"' |
| 28 | |
| 29 | section "4. printf multiple args and %b" |
| 30 | compare_output "printf recycles format for multiple args" 'printf "%s\n" a b c' |
| 31 | compare_output "printf %b interprets escapes in arg" 'printf "%b\n" "hello\nworld"' |
| 32 | compare_output "printf multiple %s in format" 'printf "%s=%s\n" key val' |
| 33 | compare_output "printf mixed format" 'printf "%s is %d\n" age 25' |
| 34 | |
| 35 | section "5. printf error handling" |
| 36 | compare_exit "printf missing format string" 'printf' |
| 37 | compare_output "printf missing arg uses default" 'printf "%s %d\n"' |
| 38 | compare_output "printf extra args recycle" 'printf "%s\n" a b c d' |
| 39 | check_output "printf %d with non-numeric arg" 'printf "%d\n" abc 2>&1' "fortsh: printf: abc: invalid number |
| 40 | 0" |
| 41 | |
| 42 | section "6. printf special formats" |
| 43 | compare_output "printf %q shell-quoted string" 'printf "%q\n" "hello world"' |
| 44 | compare_output "printf octal escape in format" 'printf "\101\n"' |
| 45 | compare_output "printf hex escape in format" 'printf "\x41\n"' |
| 46 | |
| 47 | print_summary |