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