4 # Copyright (C) 2008-2023 Free Software Foundation, Inc.
6 # This program is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <https://www.gnu.org/licenses/>.
21 # Turn off localization of executable's output.
22 @ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x
3;
25 my $normalize_strerror = "s/': .*/'/";
29 # -b option is no longer an official option. But it's still working to
30 # get a downward compatibility. Now (version 1.19m or newer) -COLUMN
31 # only is equivalent to -b -COLUMN.
33 # test_name options input-file-name(s) expected-output-group-file-name
34 # expected-return-code
35 # -------------------------------------------------------------------------
36 # Following tests with "FF set" don't contain a complete set of all
37 # combinations of options and FF-arrangements
39 # One FF at start of file (one empty page)
40 # ['1a', '', [\'0Ft'], [\'0F'], 0],
41 ['1b', '', [\'0Fnt
'], [\'0F'], 0],
42 ['1c', '+3', [\'0Ft
'], [\'3-0F'], 0],
43 ['1d', '+3 -f', [\'0Ft
'], [\'3f-0F'], 0],
44 ['1e', '-a -3', [\'0Ft
'], [\'a3-0F'], 0],
45 ['1f', '-a -3 -f', [\'0Ft
'], [\'a3f-0F'], 0],
46 ['1g', '-a -3 -f', [\'0Fnt
'], [\'a3f-0F'], 0],
47 ['1h', '+3 -a -3 -f', [\'0Ft
'], [\'3a3f-0F'], 0],
48 ['1i', '-b -3', [\'0Ft
'], [\'b3-0F'], 0],
49 ['1j', '-b -3 -f', [\'0Ft
'], [\'b3f-0F'], 0],
50 ['1k', '-b -3 -f', [\'0Fnt
'], [\'b3f-0F'], 0],
51 ['1l', '+3 -b -3 -f', [\'0Ft
'], [\'3b3f-0F'], 0],
52 # Two FF at start of file (two empty page)
53 ['2a', '', [\'0FFt
'], [\'0FF'], 0],
54 ['2b', '', [\'0FnFnt
'], [\'0FF'], 0],
55 ['2c', '-a -3 -f', [\'0FFt
'], [\'a3f-0FF'], 0],
56 ['2d', '-a -3 -f', [\'0FFnt
'], [\'a3f-0FF'], 0],
57 ['2e', '-b -3 -f', [\'0FFt
'], [\'b3f-0FF'], 0],
58 ['2f', '-b -3 -f', [\'0FFnt
'], [\'b3f-0FF'], 0],
59 ['2g', '-b -3 -f', [\'0FnFt
'], [\'b3f-0FF'], 0],
60 ['2h', '-b -3 -f', [\'0FnFnt
'], [\'b3f-0FF'], 0],
61 ['2i', '+3 -b -3 -f', [\'0FFt
'], [\'3b3f-0FF'], 0],
62 ['2j', '+3 -b -3 -f', [\'0FFnt
'], [\'3b3f-0FF'], 0],
64 # FFs in text (none / one / two empty page(s))
65 ['3a', '', [\'FFn
'], [\'FF'], 0],
66 ['3b', '', [\'FnFn
'], [\'FF'], 0],
67 ['3c', '+3', [\'FFn
'], [\'3-FF'], 0],
68 ['3d', '+3 -f', [\'FFn
'], [\'3f-FF'], 0],
69 ['3e', '-a -3 -f', [\'FFn
'], [\'a3f-FF'], 0],
70 ['3f', '-a -3 -f', [\'FFtn
'], [\'a3f-FF'], 0],
71 ['3g', '-b -3 -f', [\'FFn
'], [\'b3f-FF'], 0],
72 ['3h', '-b -3 -f', [\'FFtn
'], [\'b3f-FF'], 0],
73 ['3i', '-b -3 -f', [\'FnFn
'], [\'b3f-FF'], 0],
74 ['3j', '-b -3 -f', [\'tFFn
'], [\'b3f-FF'], 0],
75 ['3k', '-b -3 -f', [\'tFnFt
'], [\'b3f-FF'], 0],
76 ['3l', '+3 -b -3 -f', [\'FFn
'], [\'3b3f-FF'], 0],
77 ['3m', '+3 -b -3 -f', [\'FFtn
'], [\'3b3f-FF'], 0],
78 # A full page printed (lines_left_on_page = 0) without a FF found.
79 # Avoid an extra empty page if a FF follows in the next input line.
80 ['3la', '-l 24', [\'FFn
'], [\'l24-FF'], 0],
81 ['3lb', '-l 24', [\'FFtn
'], [\'l24-FF'], 0],
82 ['3lc', '-l 24', [\'FnFn
'], [\'l24-FF'], 0],
83 ['3ld', '-l 24', [\'tFFn
'], [\'l24-FF'], 0],
84 ['3le', '-l 24', [\'tFnFt
'], [\'l24-FF'], 0],
85 ['3lf', '-l 24', [\'tFFt
'], [\'l24-FF'], 0],
86 ['3aa', '-a -2 -l 17', [\'FFn
'], [\'a2l17-FF'], 0],
87 ['3ab', '-a -2 -l 17', [\'FFtn
'], [\'a2l17-FF'], 0],
88 ['3ac', '-a -2 -l 17', [\'FnFn
'], [\'a2l17-FF'], 0],
89 ['3ad', '-a -2 -l 17', [\'tFFn
'], [\'a2l17-FF'], 0],
90 ['3ae', '-a -2 -l 17', [\'tFnFt
'], [\'a2l17-FF'], 0],
91 ['3af', '-a -2 -l 17', [\'tFFt
'], [\'a2l17-FF'], 0],
92 ['3ag', '-a -2 -l 15', [\'FFn
'], [\'a2l15-FF'], 0],
93 ['3ah', '-a -2 -l 15', [\'FFtn
'], [\'a2l15-FF'], 0],
94 ['3ai', '-a -2 -l 15', [\'FnFn
'], [\'a2l15-FF'], 0],
95 ['3aj', '-a -2 -l 15', [\'tFFn
'], [\'a2l15-FF'], 0],
96 ['3ak', '-a -2 -l 15', [\'tFnFt
'], [\'a2l15-FF'], 0],
97 ['3ba', '-b -2 -l 17', [\'FFn
'], [\'b2l17-FF'], 0],
98 ['3bb', '-b -2 -l 17', [\'FFtn
'], [\'b2l17-FF'], 0],
99 ['3bc', '-b -2 -l 17', [\'FnFn
'], [\'b2l17-FF'], 0],
100 ['3bd', '-b -2 -l 17', [\'tFFn
'], [\'b2l17-FF'], 0],
101 ['3be', '-b -2 -l 17', [\'tFnFt
'], [\'b2l17-FF'], 0],
102 ['3bf', '-b -2 -l 17', [\'tFFt
'], [\'b2l17-FF'], 0],
103 ['3bg', '-b -2 -l 15', [\'FFn
'], [\'b2l15-FF'], 0],
104 ['3bh', '-b -2 -l 15', [\'FFtn
'], [\'b2l15-FF'], 0],
105 ['3bi', '-b -2 -l 15', [\'FnFn
'], [\'b2l15-FF'], 0],
106 ['3bj', '-b -2 -l 15', [\'tFFn
'], [\'b2l15-FF'], 0],
107 ['3bk', '-b -2 -l 15', [\'tFnFt
'], [\'b2l15-FF'], 0],
108 ['3Pa', '+4 -l 24', [\'FFn
'], [\'4l24-FF'], 0],
109 ['3Pb', '+4 -l 24', [\'FFtn
'], [\'4l24-FF'], 0],
110 ['3Pc', '+4 -l 24', [\'FnFn
'], [\'4l24-FF'], 0],
111 ['3Pd', '+4 -l 24', [\'tFFn
'], [\'4l24-FF'], 0],
112 ['3Pe', '+4 -l 24', [\'tFnFt
'], [\'4l24-FF'], 0],
113 ['3Pf', '+4 -l 24', [\'tFFt
'], [\'4l24-FF'], 0],
114 ['3Pg', '+4:7 -l 24', [\'tFFt
'], [\'4-7l24-FF'], 0],
115 ['3Paa', '+3 -a -2 -l 17', [\'FFn
'], [\'3a2l17-FF'], 0],
116 ['3Pab', '+3 -a -2 -l 17', [\'FFtn
'], [\'3a2l17-FF'], 0],
117 ['3Pac', '+3 -a -2 -l 17', [\'FnFn
'], [\'3a2l17-FF'], 0],
118 ['3Pad', '+3 -a -2 -l 17', [\'tFFn
'], [\'3a2l17-FF'], 0],
119 ['3Pae', '+3 -a -2 -l 17', [\'tFnFt
'], [\'3a2l17-FF'], 0],
120 ['3Paf', '+3 -a -2 -l 17', [\'tFFt
'], [\'3a2l17-FF'], 0],
121 ['3Pba', '+3 -b -2 -l 17', [\'FFn
'], [\'3b2l17-FF'], 0],
122 ['3Pbb', '+3 -b -2 -l 17', [\'FFtn
'], [\'3b2l17-FF'], 0],
123 ['3Pbc', '+3 -b -2 -l 17', [\'FnFn
'], [\'3b2l17-FF'], 0],
124 ['3Pbd', '+3 -b -2 -l 17', [\'tFFn
'], [\'3b2l17-FF'], 0],
125 ['3Pbe', '+3 -b -2 -l 17', [\'tFnFt
'], [\'3b2l17-FF'], 0],
126 ['3Pbf', '+3 -b -2 -l 17', [\'tFFt
'], [\'3b2l17-FF'], 0],
128 # Without "FF set by hand"
129 ['4a', '-l 24', [\'tn
'], [\'l24-t'], 0],
130 ['4b', '-l 24 -f', [\'tn
'], [\'l24f-t'], 0],
131 ['4c', '+3 -l 24', [\'tn
'], [\'3l24-t'], 0],
132 ['4d', '+3 -l 24 -f', [\'tn
'], [\'3l24f-t'], 0],
133 ['4e', '+3:5 -l 24 -f', [\'tn
'], [\'3-5l24f-t'], 0],
134 ['4f', '-a -3 -l 15', [\'tn
'], [\'a3l15-t'], 0],
135 ['4g', '-a -3 -l 15 -f', [\'tn
'], [\'a3l15f-t'], 0],
136 ['4h', '+3 -a -3 -l 15', [\'tn
'], [\'3a3l15-t'], 0],
137 ['4i', '+3 -a -3 -l 15 -f', [\'tn
'], [\'3a3l15f-t'], 0],
138 ['4j', '-b -3 -l 15', [\'tn
'], [\'b3l15-t'], 0],
139 ['4k', '-b -3 -l 15 -f', [\'tn
'], [\'b3l15f-t'], 0],
140 ['4l', '+3 -b -3 -l 15', [\'tn
'], [\'3b3l15-t'], 0],
141 ['4m', '+3 -b -3 -l 15 -f', [\'tn
'], [\'3b3l15f-t'], 0],
143 # Merge input files (-m option)
144 ['5a', '-m -l 24', [\'tn
', \'tn'], [\'ml24
-t
'], 0],
145 ['5b
', '-m
-l
24 -f
', [\'tn', \'tn
'], [\'ml24f-t'], 0],
146 ['5c', '+3 -m -l 24', [\'tn
', \'tn'], [\'3ml24
-t
'], 0],
147 ['5d
', '+3 -m
-l
24 -f
', [\'tn', \'tn
'], [\'3ml24f-t'], 0],
148 ['5e', '-m -l 24 -f', [\'0Ft
', \'0Ft'], [\'ml24f
-0F
'], 0],
149 ['5f
', '-m
-l
24 -f
', [\'0Ft', \'0Fnt
'], [\'ml24f-0F'], 0],
150 ['5g', '-m -l 24 -f', [\'tn
', \'0Ft'], [\'ml24f
-t
-0F
'], 0],
151 # A full page printed (lines_left_on_page = 0) without a FF found.
152 # Avoid an extra empty page if a FF follows in the next input line.
153 ['5ma
', '-m
-l
24', [\'tFFn', \'tFnFt
'], [\'ml24-FF'], 0],
154 ['5mb', '-m -l 24', [\'tFFn
', \'FFn'], [\'ml24
-FF
'], 0],
155 ['5mc
', '-m
-l
24', [\'tn', \'FFn
'], [\'ml24-t-FF'], 0],
156 ['5md', '-m -l 20', [\'FFn
', \'tn'], [\'ml20
-FF
-t
'], 0],
157 ['5Pma
', '+3 -m
-l
24', [\'FFn', \'FnFn
'], [\'3ml24-FF'], 0],
158 ['5Pmb', '+3 -m -l 24', [\'tFFn
', \'FFn'], [\'3ml24
-FF
'], 0],
159 ['5Pmc
', '+3 -m
-l
24', [\'tn', \'FFn
'], [\'3ml24-t-FF'], 0],
161 # Do not print header and footer but retain "FF set by Hand"
163 ['6a', '-t -l 24', [\'tn
'], [\'t-t'], 0],
164 ['6b', '-t -l 24 -f', [\'tn
'], [\'t-t'], 0],
165 ['6c', '-t -l 24 -f', [\'tFFt
-bl
'], [\'t-bl'], 0],
166 ['6d', '-t -l 24', [\'0FnFnt
'], [\'t-0FF'], 0],
167 ['6e', '-t -l 24', [\'FFn
'], [\'t-FF'], 0],
168 ['6f', '-t -l 24', [\'FnFn
'], [\'t-FF'], 0],
169 ['6g', '-t -l 24 -f', [\'FFn
'], [\'t-FF'], 0],
170 ['6aa', '-t -a -3', [\'0FnFnt
'], [\'ta3-0FF'], 0],
171 ['6ab', '-t -a -3', [\'FFn
'], [\'ta3-FF'], 0],
172 ['6ac', '-t -a -3 -l 24', [\'FnFn
'], [\'ta3-FF'], 0],
173 ['6ba', '-t -b -3', [\'0FnFnt
'], [\'tb3-0FF'], 0],
174 ['6bb', '-t -b -3', [\'FFn
'], [\'tb3-FF'], 0],
175 ['6bc', '-t -b -3 -l 24', [\'FnFn
'], [\'tb3-FF'], 0],
177 # Do not print header and footer nor "FF set by Hand" (-T option)
178 ['7a', '-T -l 24', [\'tn
'], [\'tt-t'], 0],
179 ['7b', '-T -l 24 -f', [\'tn
'], [\'tt-t'], 0],
180 ['7c', '-T -l 24 -f', [\'tFFt
-bl
'], [\'tt-bl'], 0],
181 ['7d', '-T -l 24', [\'0FnFnt
'], [\'tt-0FF'], 0],
182 ['7e', '-T -l 24', [\'FFn
'], [\'tt-FF'], 0],
183 ['7f', '-T -l 24', [\'FnFn
'], [\'tt-FF'], 0],
184 ['7g', '-T -l 24 -f', [\'FFn
'], [\'tt-FF'], 0],
185 ['7aa', '-T -a -3', [\'0FnFnt
'], [\'tta3-0FF'], 0],
186 ['7ab', '-T -a -3', [\'FFn
'], [\'tta3-FF'], 0],
187 ['7ac', '-T -a -3 -l 24', [\'FnFn
'], [\'tta3-FF'], 0],
188 ['7ba', '-T -b -3', [\'0FnFnt
'], [\'ttb3-0FF'], 0],
189 ['7bb', '-T -b -3', [\'FFn
'], [\'ttb3-FF'], 0],
190 ['7bc', '-T -b -3 -l 24', [\'FnFn
'], [\'ttb3-FF'], 0],
192 # lhs-truncation of header
193 # pr-1.19m: Text line truncation only with column output
195 # numbering lines (-n -N option)
196 # skip pages (+FIRST_PAGE[:LAST_PAGE] option)
197 ['9a', '-n.3 -l 24 -f', [\'tFFt
-bl
'], [\'nl24f-bl'], 0],
198 ['9b', '-n.3 -N 15 -l 24 -f', [\'tFFt
-bl
'], [\'nN15l24f-bl'], 0],
199 ['9Pa', '-n.3 +2 -l 24 -f', [\'tFFt
-bl
'], [\'n+2l24f-bl'], 0],
200 ['9Pb', '-n.3 +3 -l 24 -f', [\'tFFt
-bl
'], [\'n+3l24f-bl'], 0],
201 ['9Pc', '-n.3 -N 1 +3 -l 24 -f', [\'tFFt
-bl
'], [\'nN1+3l24f-bl'], 0],
202 ['9Pe', '-n.3 +2 -l 24 -f', [\'0FFt
'], [\'n+2l24f-0FF'], 0],
203 ['9Pf', '-n.3 +2 -l 24 -f', [\'0FFnt
'], [\'n+2l24f-0FF'], 0],
204 ['9Pg', '-n.3 +2 -l 24 -f', [\'0FnFt
'], [\'n+2l24f-0FF'], 0],
205 ['9Ph', '-n.3 +2 -l 24 -f', [\'0FnFnt
'], [\'n+2l24f-0FF'], 0],
206 ['9Pi', '-n.3 +2:5 -l 24 -f', [\'0FFt
'], [\'n+2-5l24f-0FF'], 0],
207 ['9Pj', '-n.3 +3 -l 24 -f', [\'0FFt
'], [\'n+3l24f-0FF'], 0],
208 ['9Pk', '-n.3 +3 -l 24 -f', [\'0FFnt
'], [\'n+3l24f-0FF'], 0],
209 ['9Pl', '-n.3 +3 -l 24 -f', [\'0FnFt
'], [\'n+3l24f-0FF'], 0],
210 ['9Pm', '-n.3 +3 -l 24 -f', [\'0FnFnt
'], [\'n+3l24f-0FF'], 0],
211 ['9Pn', '-n.3 +7 -l 24', [\'FFn
'], [\'n+7l24-FF'], 0],
212 ['9Po', '-n.3 +7 -l 24', [\'FFtn
'], [\'n+7l24-FF'], 0],
213 ['9Pp', '-n.3 +7 -l 24', [\'FnFn
'], [\'n+7l24-FF'], 0],
214 ['9Pq', '-n.3 +3:7 -l 24', [\'FnFn
'], [\'n+3-7l24-FF'], 0],
215 ['9Pr', '-n.3 +8 -l 20', [\'tFFn
'], [\'n+8l20-FF'], 0],
216 ['9Ps', '-n.3 +8 -l 20', [\'tFnFt
'], [\'n+8l20-FF'], 0],
217 ['9Pt', '-n.3 +8 -l 20', [\'tFFt
'], [\'n+8l20-FF'], 0],
218 ['9Paa', '-n.3 +5 -a -3 -l 13 -f', [\'0FFt
'], [\'n+5a3l13f-0FF'], 0],
219 ['9Pab', '-n.3 +5 -a -3 -l 13 -f', [\'0FFnt
'], [\'n+5a3l13f-0FF'], 0],
220 ['9Pac', '-n.3 +5 -a -3 -l 13 -f', [\'0FnFt
'], [\'n+5a3l13f-0FF'], 0],
221 ['9Pad', '-n.3 +5 -a -3 -l 13 -f', [\'0FnFnt
'], [\'n+5a3l13f-0FF'], 0],
222 ['9Pae', '-n.3 +6 -a -2 -l 17', [\'FFn
'], [\'n+6a2l17-FF'], 0],
223 ['9Paf', '-n.3 +6 -a -2 -l 17', [\'FFtn
'], [\'n+6a2l17-FF'], 0],
224 ['9Pag', '-n.3 +6 -a -2 -l 17', [\'FnFn
'], [\'n+6a2l17-FF'], 0],
225 ['9Pah', '-n.3 +6 -a -2 -l 17', [\'tFFn
'], [\'n+6a2l17-FF'], 0],
226 ['9Pai', '-n.3 +6 -a -2 -l 17', [\'tFnFt
'], [\'n+6a2l17-FF'], 0],
227 ['9Paj', '-n.3 +6 -a -2 -l 17', [\'tFFt
'], [\'n+6a2l17-FF'], 0],
228 ['9Pak', '-n.3 +4:8 -a -2 -l 17', [\'tFFt
'], [\'n+4-8a2l17-FF'], 0],
229 ['9Pba', '-n.3 +4 -b -2 -l 17 -f', [\'0FFt
'], [\'n+4b2l17f-0FF'], 0],
230 ['9Pbb', '-n.3 +4 -b -2 -l 17 -f', [\'0FFnt
'], [\'n+4b2l17f-0FF'], 0],
231 ['9Pbc', '-n.3 +4 -b -2 -l 17 -f', [\'0FnFt
'], [\'n+4b2l17f-0FF'], 0],
232 ['9Pbd', '-n.3 +4 -b -2 -l 17 -f', [\'0FnFnt
'], [\'n+4b2l17f-0FF'], 0],
233 ['9Pbe', '-n.3 +6 -b -3 -l 13 -f', [\'FFn
'], [\'n+6b3l13f-FF'], 0],
234 ['9Pbf', '-n.3 +6 -b -3 -l 13 -f', [\'FFtn
'], [\'n+6b3l13f-FF'], 0],
235 ['9Pbg', '-n.3 +6 -b -3 -l 13 -f', [\'FnFn
'], [\'n+6b3l13f-FF'], 0],
236 ['9Pbh', '-n.3 +6 -b -3 -l 13 -f', [\'tFFn
'], [\'n+6b3l13f-FF'], 0],
237 ['9Pbi', '-n.3 +6 -b -3 -l 13 -f', [\'tFnFt
'], [\'n+6b3l13f-FF'], 0],
238 ['9Pbj', '-n.3 +6 -b -3 -l 13 -f', [\'tFFt
'], [\'n+6b3l13f-FF'], 0],
239 ['9Pbk', '-n.3 +5:8 -b -3 -l 17 -f', [\'FnFn
'], [\'n+5-8b3l17f-FF'], 0],
240 ['9Pma', '-n.3 +3 -m -l 20 -f', [\'tFFt
-bl
', \'FnFn'], [\'n
+3ml20f
-bl
-FF
'], 0],
241 ['9Pmb
', '-n
.3 +3 -m
-l
24 -f
', [\'tFFt-bl', \'tn
'], [\'n+3ml24f-bl-tn'], 0],
242 ['9Pmc', '-n.3 +3 -m -l 24 -f', [\'tn
', \'tFFt-bl'], [\'n
+3ml24f
-tn
-bl
'], 0],
244 # line truncation column alignment; header line truncation
245 # -w/W PAGE_WIDTH [-J] options
246 ['10wa
', '-W
72 -J
-l24
-f
', [\'tFFt-ll'], [\'W72Jl24f
-ll
'], 0],
247 ['10wb
', '-w
72 -J
-l24
-f
', [\'tFFt-ll'], [\'W72Jl24f
-ll
'], 0],
248 ['10wc
', '-W
72 -l24
-f
', [\'tFFt-ll'], [\'W
-72l24f
-ll
'], 0],
249 ['10wd
', '-w
72 -l24
-f
', [\'tFFt-ll'], [\'w72l24f
-ll
'], 0],
250 ['10we
', '-W
28 -l24
-f
', [\'tFFt-ll'], [\'W28l24f
-ll
'], 0],
251 ['10wf
', '-W
27 -l24
-f
', [\'tFFt-ll'], [\'W27l24f
-ll
'], 0],
252 ['10wg
', '-W
26 -l24
-f
', [\'tFFt-ll'], [\'W26l24f
-ll
'], 0],
253 ['10wh
', '-W
20 -l24
-f
', [\'tFFt-ll'], [\'W20l24f
-ll
'], 0],
254 ['10ma
', '-m
-l
24 -f
', [\'tFFt-lm', \'loli
'], [\'ml24f-lm-lo'], 0],
255 ['10mb', '-W 35 -m -l 24 -f', [\'tFFt
-lm
', \'loli'], [\'W35ml24f
-lm
-lo
'], 0],
256 ['10mc
', '-w
35 -m
-l
24 -f
', [\'tFFt-lm', \'loli
'], [\'W35ml24f-lm-lo'], 0],
257 ['10md', '-J -m -l 24 -f', [\'tFFt
-lm
', \'loli'], [\'Jml24f
-lm
-lo
'], 0],
258 ['10me
', '-W
35 -J
-m
-l
24 -f
', [\'tFFt-lm', \'loli
'], [\'W35Jml24f-lmlo'], 0],
259 ['10mf', '-w 35 -J -m -l 24 -f', [\'tFFt
-lm
', \'loli'], [\'W35Jml24f
-lmlo
'], 0],
260 ['10mg
', '-n
.3 -J
-m
-l
24 -f
', [\'tFFt-lm', \'tFFt
-lm
', \'loli'],
261 [\'nJml24f
-lmlmlo
'], 0],
262 ['10mh
', '-n
.3 -J
-m
-l
24 -f
', [\'tFFt-lm', \'loli
', \'tFFt-lm'],
263 [\'nJml24f
-lmlolm
'], 0],
264 ['10aa
', '-a
-3 -l
24 -f
', [\'tFFt-lm'], [\'a3l24f
-lm
'], 0],
265 ['10ab
', '-W
35 -a
-3 -l
24 -f
', [\'tFFt-lm'], [\'W35a3l24f
-lm
'], 0],
266 ['10ac
', '-J
-a
-3 -l
24 -f
', [\'tFFt-lm'], [\'Ja3l24f
-lm
'], 0],
267 ['10ad
', '-W
35 -J
-a
-3 -l
24 -f
', [\'tFFt-lm'], [\'W35Ja3l24f
-lm
'], 0],
268 ['10ba
', '-b
-3 -l
24 -f
', [\'tFFt-lm'], [\'b3l24f
-lm
'], 0],
269 ['10bb
', '-W
35 -b
-3 -l
24 -f
', [\'tFFt-lm'], [\'W35b3l24f
-lm
'], 0],
270 ['10bc
', '-J
-b
-3 -l
24 -f
', [\'tFFt-lm'], [\'Jb3l24f
-lm
'], 0],
271 ['10bd
', '-W
35 -J
-b
-3 -l
24 -f
', [\'tFFt-lm'], [\'W35Jb3l24f
-lm
'], 0],
273 # merge files (-m option) use separator string (-S option)
274 ['11sa
', '-n
.3 -S
:--: -m
-l
20 -f
', [\'tFFt-bl', \'FnFn
'],
275 [\'nSml20-bl-FF'], 0],
276 ['11sb', '-n.3 -S:--: -m -l 24 -f', [\'tFFt
-bl
', \'FnFn'],
277 [\'nSml24
-bl
-FF
'], 0],
278 ['11se
', '-n
.3 -S
:--: -m
-l
20 -f
', [\'tn', \'tn
', \'FnFn'],
279 [\'nSml20
-t
-t
-FF
'], 0],
280 ['11sf
', '-n
.3 -S
:--: -m
-l
24 -f
', [\'tn', \'tn
', \'FnFn'],
281 [\'nSml24
-t
-t
-FF
'], 0],
282 ['11sg
', '-n
.3 -S
:--: -m
-l
20 -f
', [\'tn', \'tn
', \'FnFn', \'FnFn
'],
283 [\'nSml20-t-tFFFF'], 0],
284 ['11sh', '-n.3 -S:--: -m -l 24 -f', [\'tn
', \'tn', \'FnFn
', \'FnFn'],
285 [\'nSml24
-t
-tFFFF
'], 0],
287 # left margin (-o option) and separator string (-S option)
288 ['12aa
', '-o3
-a
-3 -l24
-f
', [\'tn'], [\'o3a3l24f
-tn
'], 0],
289 ['12ab
', '-o3
-a
-3 -S
:--: -l24
-f
', [\'tn'], [\'o3a3Sl24f
-tn
'], 0],
290 ['12ac
', '-o3
-a
-3 -S
:--: -n
. -l24
-f
', [\'tn'], [\'o3a3Snl24f
-tn
'], 0],
291 ['12ba
', '-o3
-b
-3 -l24
-f
', [\'tn'], [\'o3b3l24f
-tn
'], 0],
292 ['12bb
', '-o3
-b
-3 -S
:--: -l24
-f
', [\'tn'], [\'o3b3Sl24f
-tn
'], 0],
293 ['12bc
', '-o3
-b
-3 -S
:--: -n
. -l24
-f
', [\'tn'], [\'o3b3Snl24f
-tn
'], 0],
294 ['12ma
', '-o3
-m
-l24
-f
', [\'tFFt-bl', \'tn
'], [\'o3ml24f-bl-tn'], 0],
295 ['12mb', '-o3 -m -S:--: -l24 -f', [\'tFFt
-bl
', \'tn'], [\'o3mSl24f
-bl
-tn
'], 0],
296 ['12mc
', '-o3
-m
-S
:--: -n
. -l24
-f
', [\'tFFt-bl', \'tn
'],
297 [\'o3mSnl24fbltn'], 0],
298 ['12md', '-o3 -J -m -l24 -f', [\'tFFt
-lm
', \'loli'], [\'o3Jml24f
-lm
-lo
'], 0],
301 # Single column output: POSIX compliant, adapt other UNIXes (SunOS.5.5.1 e.g.)
302 # number-separator TAB always an output TAB --> varying number/text-spacing
303 ['13a
', '-t
-n
-e8
', [\'t_tab'], [\'tne8
-t_tab
'], 0],
304 ['13b
', '-t
-n
-e8
-o3
', [\'t_tab'], [\'tne8o3
-t_tab
'], 0],
306 # POSIX compliant: multi-columns of equal width (unlike SunOS.5.5.1 e.g.)
308 ['13ba
', '-t
-n
-2 -e8
', [\'t_tab'], [\'tn2e8
-t_tab
'], 0],
309 ['13bb
', '-t
-n
: -2 -e8
', [\'t_tab'], [\'tn_2e8
-t_tab
'], 0],
310 ['13bc
', '-t
-n
: -2 -e8
-S
----', [\'t_tab'], [\'tn_2e8S
-t_tab
'], 0],
311 ['13bd
', '-t
-n
-2 -e8
-o3
', [\'t_tab'], [\'tn2e8o3
-t_tab
'], 0],
312 # number-separator TAB not treated as input text-tab, no '-e
' expansion
313 ['13be
', '-t
-n
-2 -e5
-o3
', [\'t_tab'], [\'tn2e5o3
-t_tab
'], 0],
314 # input-tab-char ':' not equal default (text) TABs
315 ['13bf
', '-t
-n
-2 -e
:8', [\'t_tab_'], [\'tn2e8
-t_tab
'], 0],
317 # options -w/-s: POSIX-compliant, means adapting the interference of -w/-s
318 # with multi-column output from other UNIXes (SunOS e.g.);
319 # columns, truncated = 72 / separator = space :
320 ['14a
', '-2 -f
', [\'t_notab'], [\'2f
-t_notab
'], 0],
321 # full lines, no truncation / separator = TAB :
322 ['14b
', '-2 -s
-f
', [\'t_notab'], [\'2sf
-t_notab
'], 0],
323 # full lines, no truncation / separator = ':' :
324 ['14c
', '-2 -s
: -f
', [\'t_notab'], [\'2s_f
-t_notab
'], 0],
325 # columns, truncated = 60 / separator = space :
326 ['14d
', '-2 -w60
-f
', [\'t_notab'], [\'2w60f
-t_notab
'], 0],
327 # columns, truncated = 60 / no separator (SunOS-BUG: line width to small):
328 ['14e
', '-2 -s
-w60
-f
', [\'t_notab'], [\'2sw60f
-t_notab
'], 0],
329 # columns, truncated = 60 / separator = ':' (HP-UX.10.20-2-BUG:
330 # ':' missing with -m option):
331 ['14f
', '-2 -s
: -w60
-f
', [\'t_notab'], [\'2s_w60f
-t_nota
'], 0],
333 # new long-options -W/-S/-J disentangle those options (see also No.'10*')
334 # columns, truncated = 72 / no separator :
335 ['14g
', '-2 -S
-f
', [\'t_notab'], [\'2-Sf
-t_notab
'], 0],
336 # full lines, no truncation / separator = TAB : (Input: -S"<TAB>")
337 ['14h
', '-2 -S
" " -J
-f
', [\'t_notab'], [\'2sf
-t_notab
'], 0],
338 # columns, truncated = 72 / separator ':' :
339 ['14i
', '-2 -S
: -f
', [\'t_notab'], [\'2-S_f
-t_notab
'], 0],
340 # full lines, no truncation / separator = ':' :
341 ['14j
', '-2 -S
: -J
-f
', [\'t_notab'], [\'2s_f
-t_notab
'], 0],
342 # columns, truncated = 60 / separator = space:
343 ['14k
', '-2 -W60
-f
', [\'t_notab'], [\'2w60f
-t_notab
'], 0],
344 # columns, truncated = 60 / no separator :
345 ['14l', '-2 -S
-W60
-f
', [\'t_notab'], [\'2sw60f
-t_notab
'], 0],
346 # columns, truncated = 60 / separator = ':' :
347 ['14m
', '-2 -S
: -W60
-f
', [\'t_notab'], [\'2s_w60f
-t_nota
'], 0],
349 # Tabify multiple spaces, -i option
350 # number of input spaces between a and b must not change; be careful
351 # comparing with other UNIXes (some other SunOS examples are OK !?)
352 # SunOS.5.5.1-BUG: 8 input spaces --> 11 output spaces between a and b;
353 ['i
-opt
-a
', '-tn
-i5
-h
""', "a b\n", " 1 a b\n", 0],
354 # SunOS.5.5.1-BUG: 8 input spaces --> 9 output spaces between a and b;
355 ['i
-opt
-b
', '-tn
-i5
-o9
-h
""', "a b\n",
358 # line number overflow not allowed: cut off leading digits;
359 # don't adapt other UNIXes
, no real standard to follow
, a consequent
360 # programming of column handling may change the GNU pr concept.
361 ['ncut-a', '-tn2 -N98', "y\ny\ny\ny\ny\n",
362 "98 y\n99 y\n00 y\n01 y\n02 y\n", 0],
363 ['ncut-b', '-tn:2 -N98', "y\ny\ny\ny\ny\n",
364 "98:y\n99:y\n00:y\n01:y\n02:y\n", 0],
366 ['margin-0', '-o 0', '', '', 0],
368 # BUG fixed: that leading space on 3rd line of output should not be there
369 ['dbl-sp-a', '-d -l 14 -h ""', "1\n2\n",
370 "\n\n-- Date/Time -- "
371 . "Page 1\n\n\n1\n\n2\n\n\n\n\n\n\n", 0],
372 # This test failed with 1.22e and earlier.
373 ['dbl-sp-b', '-d -t', "1\n2\n", "1\n\n2\n\n", 0],
375 # This test would segfault with 2.0f and earlier.
376 ['narrow-1', '-W1 -t', "12345\n", "1\n", 0],
378 # This test would fail with textutils-2.1 and earlier.
379 ['col-last', '-W3 -t2', "a\nb\nc\n", "a c\nb\n", 0],
381 # Make sure that -02 is treated just like -2.
382 ['col-02', '-W3 -t -02', "a\nb\nc\n", "a c\nb\n", 0],
383 # The -2 must override preceding column-count-specifying options.
384 ['col-2', '-W3 -t -4 --columns=1 -2', "a\nb\nc\n", "a c\nb\n", 0],
385 # The --columns=2 must override preceding column-count-specifying options.
386 ['col-long', '-W3 -t -1 --columns=2', "a\nb\nc\n", "a c\nb\n", 0],
387 # Make sure these fail.
388 ['col-0', '-0', '', '', 1,
389 "$prog: invalid number of columns: '0'\n", $normalize_strerror],
390 ['col-inval', '-'.'9'x100
, '', '', 1,
391 "$prog: invalid number of columns: '". ('9'x100
) ."'\n", $normalize_strerror],
393 # Before coreutils-5.3.1, --pages=1:-1 would be treated like
394 # --pages=1:18446744073709551615.
395 ['neg-page', '--pages=1:-1', '', '', 1,
396 "$prog: invalid --pages argument '1:-1'\n"],
398 # Up to coreutils-6.10, this would cause pr to decrement its
399 # internal "input_position" below zero and sometimes segfault.
400 ['neg-inp-pos1', '-t -e', "\b\b\b\b\b\b\tx\n", " x\n", 0],
401 # NB: while there are 4 backspaces in the input, there are only 3 in the output
402 ['neg-inp-pos2', '-t -e', "abc\b\b\b\b\tx", "abc\b\b\b x\n", 0],
404 # This would clobber so much of the heap, it'd segfault or abort every time.
405 ['smash-heap', '-t -e300', "a".("\b"x50
)."\t", "a\b".(" "x300
)."\n", 0],
406 ['smash-heap8', '-t -e', "a".("\b"x50
)."\t", "a\b".(" "x
8)."\n", 0],
408 # Before coreutils-8.13 page numbers were not handled correctly when
409 # headers were not printed (when -l <= 10 or -t or -T specified)
410 ['page-range', '+1:1 -2 -l1 -s" "', "a\nb\nc\n", "a b\n", 0],
412 # This padded with zeros before coreutils-8.21
413 ['padding1', '-t -n,15', "1\n", (" "x
14)."1,1\n", 0],
414 # This crashed with divide by zero before coreutils-8.21
415 ['padding2', '-t -n,64', "1\n", (" "x
63)."1,1\n", 0],
416 # Ensure we handle buffer truncation correctly
417 ['padding3', '-t -N1000000 -n,1', "1\n", "0,1\n", 0],
419 # This entered an infinite loop before coreutils-9.4
420 ['page-length1', '-dl1', "", "", 0],
423 # Convert the above old-style test vectors to the newer
424 # format used by Coreutils.pm.
426 my $pfx = "$ENV{abs_srcdir}/tests/pr";
428 # Normalize otherwise-variable output page headers.
429 my $common_option_prefix = '--date-format="-- Date/Time --" -h x';
434 my ($test_name, $flags, $in, $exp, $ret, $err_msg, $err_sub) = @
$t;
435 my $new_ent = [$test_name, $common_option_prefix, $flags];
438 push @
$new_ent, {IN
=>$in};
445 push @
$new_ent, {IN
=>{"$pfx/$file_name"=>undef}};
450 push @
$new_ent, {OUT
=>$exp};
454 foreach my $e (@
$exp)
457 push @
$new_ent, {OUT
=>{"$pfx/$file_name"=>undef}};
461 and push @
$new_ent, {EXIT
=>$ret}, {ERR
=>$err_msg}, {ERR_SUBST
=>$err_sub};
462 push @Tests, $new_ent;
465 # Exercise a bug with pr -m -s (commit 553d347)
467 ['merge-w-tabs', '-m -s -t',
468 {IN
=>{1=>"a\tb\tc\n"}},
469 {IN
=>{2=>"m\tn\to\n"}},
470 {IN
=>{3=>"x\ty\tz\n"}},
471 {OUT
=>join("\t", qw(a b c m n o x y z)) . "\n"} ];
472 # -s and -s$'\t' use different code paths
474 ['merge-w-tabs-sepstr', "-m -s'\t' -t",
475 {IN
=>{1=>"a\tb\tc\n"}},
476 {IN
=>{2=>"m\tn\to\n"}},
477 {IN
=>{3=>"x\ty\tz\n"}},
478 {OUT
=>join("\t", qw(a b c m n o x y z)) . "\n"} ];
480 # Exercise a variant of the bug with pr -m -s (commit 553d347)
481 # test 2 files, too (merging 3 files automatically aligns columns on TAB stops)
483 ['merge-2-w-tabs', '-m -s -t',
484 {IN
=>{1=>"a\tb\tc\n"}},
485 {IN
=>{2=>"m\tn\to\n"}},
486 {OUT
=>join("\t", qw(a b c m n o)) . "\n"} ];
487 # -s and -s$'\t' use different code paths
489 ['merge-2-w-tabs-sepstr', "-m -s'\t' -t",
490 {IN
=>{1=>"a\tb\tc\n"}},
491 {IN
=>{2=>"m\tn\to\n"}},
492 {OUT
=>join("\t", qw(a b c m n o)) . "\n"} ];
494 # This resulted in reading invalid memory before coreutils-8.26
496 ['asan1', "-m -S'\t\t\t' -t",
499 {OUT
=>"a\t\t\t\t \t\t\ta\n"} ];
501 # Exercise a bug with pr -t -2 (bug #46422)
503 ['mcol-w-tabs', '-t -2',
504 {IN
=>"x\tx\tx\tx\tx\nx\tx\tx\tx\tx\n"},
505 {OUT
=>"x\tx\tx\tx\tx x\t x\t x\t x\t x\n"} ];
507 # generalize case from commit 553d347 (problem results from -s, not -m)
509 ['mcol-w-tabs-w-tabsep', '-t -2 -s',
510 {IN
=>"x\tx\tx\tx\tx\nx\tx\tx\tx\tx\n"},
511 {OUT
=>"x\tx\tx\tx\tx\tx\tx\tx\tx\tx\n"} ];
512 # -s and -s$'\t' use different code paths
514 ['mcol-w-tabs-w-tabsep-sepstr', "-t -2 -s'\t'",
515 {IN
=>"x\tx\tx\tx\tx\nx\tx\tx\tx\tx\n"},
516 {OUT
=>"x\tx\tx\tx\tx\tx\tx\tx\tx\tx\n"} ];
518 @Tests = triple_test \
@Tests;
520 my $save_temps = $ENV{DEBUG
};
521 my $verbose = $ENV{VERBOSE
};
523 my $fail = run_tests
($prog, $prog, \
@Tests, $save_temps, $verbose);