summaryrefslogtreecommitdiff
path: root/tests/misc/numfmt.pl
diff options
context:
space:
mode:
Diffstat (limited to 'tests/misc/numfmt.pl')
-rwxr-xr-xtests/misc/numfmt.pl438
1 files changed, 248 insertions, 190 deletions
diff --git a/tests/misc/numfmt.pl b/tests/misc/numfmt.pl
index dfb4b2e0..0e4dc79c 100755
--- a/tests/misc/numfmt.pl
+++ b/tests/misc/numfmt.pl
@@ -1,7 +1,7 @@
#!/usr/bin/perl
# Basic tests for "numfmt".
-# Copyright (C) 2012-2014 Free Software Foundation, Inc.
+# Copyright (C) 2012-2015 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -21,6 +21,8 @@ use strict;
(my $program_name = $0) =~ s|.*/||;
my $prog = 'numfmt';
+my $limits = getlimits ();
+
# TODO: add localization tests with "grouping"
# Turn off localization of executable's output.
@ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3;
@@ -92,10 +94,16 @@ my @Tests =
['unit-6', '--from-unit=54W --from=iec --to=iec 4M',
{ERR => "$prog: invalid unit size: '54W'\n"},
{EXIT => '1'}],
- # Not fully documented.. "--{from,to}-unit" can accept IEC suffixes
- ['unit-7', '--from-unit=2K --to=iec 30', {OUT=>"60K"}],
- ['unit-8', '--from-unit=1234567890123456789012345 --to=iec 30',
- {ERR => "$prog: invalid unit size: '1234567890123456789012345'\n"},
+ ['unit-7', '--from-unit=K 30', {OUT=>"30000"}],
+ ['unit-7.1', '--from-unit=Ki 30', {OUT=>"30720"}],
+ ['unit-7.2', '--from-unit=i 0',
+ {ERR => "$prog: invalid unit size: 'i'\n"},
+ {EXIT => '1'}],
+ ['unit-7.3', '--from-unit=1i 0',
+ {ERR => "$prog: invalid unit size: '1i'\n"},
+ {EXIT => '1'}],
+ ['unit-8', '--from-unit='.$limits->{UINTMAX_OFLOW}.' --to=iec 30',
+ {ERR => "$prog: invalid unit size: '$limits->{UINTMAX_OFLOW}'\n"},
{EXIT => '1'}],
['unit-9', '--from-unit=0 1',
{ERR => "$prog: invalid unit size: '0'\n"},
@@ -188,21 +196,16 @@ my @Tests =
['delim-3', '--delimiter=" " --from=auto "40M Foo"',{OUT=>'40000000 Foo'}],
['delim-4', '--delimiter=: --from=auto 40M:60M', {OUT=>'40000000:60M'}],
['delim-5', '-d: --field=2 --from=auto :40M:60M', {OUT=>':40000000:60M'}],
- ['delim-6', '--delimiter=: --field 3 --from=auto 40M:60M',
- {EXIT=>2},
- {ERR=>"$prog: input line is too short, no numbers found " .
- "to convert in field 3\n"}],
+ ['delim-6', '-d: --field 3 --from=auto 40M:60M', {OUT=>"40M:60M"}],
#Fields
['field-1', '--field A',
{ERR => "$prog: invalid field value 'A'\n"},
{EXIT => '1'}],
- ['field-1.1', '--field -5',
- {ERR => "$prog: invalid field value '-5'\n"},
- {EXIT => '1'}],
['field-2', '--field 2 --from=auto "Hello 40M World 90G"',
{OUT=>'Hello 40000000 World 90G'}],
['field-3', '--field 3 --from=auto "Hello 40M World 90G"',
+ {OUT=>"Hello 40M "},
{ERR=>"$prog: invalid number: 'World'\n"},
{EXIT => 2},],
# Last field - no text after number
@@ -217,10 +220,32 @@ my @Tests =
{OUT=>"Hello:40000000:World:90G"}],
# not enough fields
- ['field-8', '--field 3 --to=si "Hello World"',
- {EXIT=>2},
- {ERR=>"$prog: input line is too short, no numbers found " .
- "to convert in field 3\n"}],
+ ['field-8', '--field 3 --to=si "Hello World"', {OUT=>"Hello World"}],
+
+ # Multiple fields
+ ['field-range-1', '--field 2,4 --to=si "1000 2000 3000 4000 5000"',
+ {OUT=>"1000 2.0K 3000 4.0K 5000"}],
+
+ ['field-range-2', '--field 2-4 --to=si "1000 2000 3000 4000 5000"',
+ {OUT=>"1000 2.0K 3.0K 4.0K 5000"}],
+
+ ['field-range-3', '--field 1,2,3-5 --to=si "1000 2000 3000 4000 5000"',
+ {OUT=>"1.0K 2.0K 3.0K 4.0K 5.0K"}],
+
+ ['field-range-4', '--field 1-5 --to=si "1000 2000 3000 4000 5000"',
+ {OUT=>"1.0K 2.0K 3.0K 4.0K 5.0K"}],
+
+ ['field-range-5', '--field 1-3,5 --to=si "1000 2000 3000 4000 5000"',
+ {OUT=>"1.0K 2.0K 3.0K 4000 5.0K"}],
+
+ ['field-range-6', '--field 3- --to=si "1000 2000 3000 4000 5000"',
+ {OUT=>"1000 2000 3.0K 4.0K 5.0K"}],
+
+ ['field-range-7', '--field -3 --to=si "1000 2000 3000 4000 5000"',
+ {OUT=>"1.0K 2.0K 3.0K 4000 5000"}],
+
+ ['all-fields-1', '--field=- --to=si "1000 2000 3000 4000 5000"',
+ {OUT=>"1.0K 2.0K 3.0K 4.0K 5.0K"}],
# Auto-consume white-space, setup auto-padding
['whitespace-1', '--to=si --field 2 "A 500 B"', {OUT=>"A 500 B"}],
@@ -336,15 +361,6 @@ my @Tests =
{ERR=>"$prog: invalid number: ''\n"},
{EXIT=> 2}],
- # INTEGRAL_OVERFLOW
- ['strtod-3', '--from=si "1234567890123456789012345678901234567890'.
- '1234567890123456789012345678901234567890"',
- {ERR=>"$prog: value too large to be converted: '" .
- "1234567890123456789012345678901234567890" .
- "1234567890123456789012345678901234567890'\n",
- },
- {EXIT=> 2}],
-
# FRACTION_NO_DIGITS_FOUND
['strtod-5', '--from=si 12.',
{ERR=>"$prog: invalid number: '12.'\n"},
@@ -358,15 +374,6 @@ my @Tests =
{ERR=>"$prog: invalid number: '12. 2'\n"},
{EXIT=>2}],
- # FRACTION_OVERFLOW
- ['strtod-7', '--from=si "12.1234567890123456789012345678901234567890'.
- '1234567890123456789012345678901234567890"',
- {ERR=>"$prog: value too large to be converted: '" .
- "12.1234567890123456789012345678901234567890" .
- "1234567890123456789012345678901234567890'\n",
- },
- {EXIT=> 2}],
-
# INVALID_SUFFIX
['strtod-9', '--from=si 12.2Q',
{ERR=>"$prog: invalid suffix in input: '12.2Q'\n"},
@@ -502,128 +509,35 @@ my @Tests =
{OUT=>"5.8594\n-5.8594"}],
- # Large Values
- ['large-1','1000000000000000', {OUT=>"1000000000000000"}],
- # 18 digits is OK
- ['large-2','1000000000000000000', {OUT=>"1000000000000000000"}],
- # 19 digits is too much (without output scaling)
- ['large-3','10000000000000000000',
- {ERR => "$prog: value too large to be printed: '1e+19' " .
- "(consider using --to)\n"},
- {EXIT=>2}],
-
- # Test input:
- # Up to 27 digits is OK.
- ['large-3.1', '--to=si 1', {OUT=> "1"}],
- ['large-3.2', '--to=si 10', {OUT=> "10"}],
- ['large-3.3', '--to=si 100', {OUT=> "100"}],
- ['large-3.4', '--to=si 1000', {OUT=>"1.0K"}],
- ['large-3.5', '--to=si 10000', {OUT=> "10K"}],
- ['large-3.6', '--to=si 100000', {OUT=>"100K"}],
- ['large-3.7', '--to=si 1000000', {OUT=>"1.0M"}],
- ['large-3.8', '--to=si 10000000', {OUT=> "10M"}],
- ['large-3.9', '--to=si 100000000', {OUT=>"100M"}],
- ['large-3.10','--to=si 1000000000', {OUT=>"1.0G"}],
- ['large-3.11','--to=si 10000000000', {OUT=> "10G"}],
- ['large-3.12','--to=si 100000000000', {OUT=>"100G"}],
- ['large-3.13','--to=si 1000000000000', {OUT=>"1.0T"}],
- ['large-3.14','--to=si 10000000000000', {OUT=> "10T"}],
- ['large-3.15','--to=si 100000000000000', {OUT=>"100T"}],
- ['large-3.16','--to=si 1000000000000000', {OUT=>"1.0P"}],
- ['large-3.17','--to=si 10000000000000000', {OUT=> "10P"}],
- ['large-3.18','--to=si 100000000000000000', {OUT=>"100P"}],
- ['large-3.19','--to=si 1000000000000000000', {OUT=>"1.0E"}],
- ['large-3.20','--to=si 10000000000000000000', {OUT=> "10E"}],
- ['large-3.21','--to=si 210000000000000000000', {OUT=>"210E"}],
- ['large-3.22','--to=si 3210000000000000000000', {OUT=>"3.3Z"}],
- ['large-3.23','--to=si 43210000000000000000000', {OUT=> "44Z"}],
- ['large-3.24','--to=si 543210000000000000000000', {OUT=>"544Z"}],
- ['large-3.25','--to=si 6543210000000000000000000', {OUT=>"6.6Y"}],
- ['large-3.26','--to=si 76543210000000000000000000', {OUT=> "77Y"}],
- ['large-3.27','--to=si 876543210000000000000000000', {OUT=>"877Y"}],
-
- # More than 27 digits is not OK
- ['large-3.28','--to=si 9876543210000000000000000000',
- {ERR => "$prog: value too large to be converted: " .
- "'9876543210000000000000000000'\n"},
- {EXIT => 2}],
-
- # Test Output
- ['large-4.1', '--from=si 9.7M', {OUT=>"9700000"}],
- ['large-4.2', '--from=si 10M', {OUT =>"10000000"}],
- ['large-4.3', '--from=si 200M', {OUT =>"200000000"}],
- ['large-4.4', '--from=si 3G', {OUT =>"3000000000"}],
- ['large-4.5', '--from=si 40G', {OUT =>"40000000000"}],
- ['large-4.6', '--from=si 500G', {OUT =>"500000000000"}],
- ['large-4.7', '--from=si 6T', {OUT =>"6000000000000"}],
- ['large-4.8', '--from=si 70T', {OUT =>"70000000000000"}],
- ['large-4.9', '--from=si 800T', {OUT =>"800000000000000"}],
- ['large-4.10','--from=si 9P', {OUT =>"9000000000000000"}],
- ['large-4.11','--from=si 10P', {OUT =>"10000000000000000"}],
- ['large-4.12','--from=si 200P', {OUT =>"200000000000000000"}],
- ['large-4.13','--from=si 3E', {OUT =>"3000000000000000000"}],
-
- # More than 18 digits of output without scaling - no good.
- ['large-4.14','--from=si 40E',
- {ERR => "$prog: value too large to be printed: '4e+19' " .
- "(consider using --to)\n"},
- {EXIT => 2}],
- ['large-4.15','--from=si 500E',
- {ERR => "$prog: value too large to be printed: '5e+20' " .
- "(consider using --to)\n"},
- {EXIT => 2}],
- ['large-4.16','--from=si 6Z',
- {ERR => "$prog: value too large to be printed: '6e+21' " .
- "(consider using --to)\n"},
- {EXIT => 2}],
- ['large-4.17','--from=si 70Z',
- {ERR => "$prog: value too large to be printed: '7e+22' " .
- "(consider using --to)\n"},
+ # Leading zeros weren't handled appropriately before 8.24
+ ['leading-1','0000000000000000000000000001', {OUT=>"1"}],
+ ['leading-2','.1', {OUT=>"0.1"}],
+ ['leading-3','bad.1',
+ {ERR => "$prog: invalid number: 'bad.1'\n"},
{EXIT => 2}],
- ['large-4.18','--from=si 800Z',
- {ERR => "$prog: value too large to be printed: '8e+23' " .
- "(consider using --to)\n"},
+ ['leading-4','..1',
+ {ERR => "$prog: invalid suffix in input: '..1'\n"},
{EXIT => 2}],
- ['large-4.19','--from=si 9Y',
- {ERR => "$prog: value too large to be printed: '9e+24' " .
- "(consider using --to)\n"},
- {EXIT => 2}],
- ['large-4.20','--from=si 10Y',
- {ERR => "$prog: value too large to be printed: '1e+25' " .
- "(consider using --to)\n"},
- {EXIT => 2}],
- ['large-4.21','--from=si 200Y',
- {ERR => "$prog: value too large to be printed: '2e+26' " .
- "(consider using --to)\n"},
- {EXIT => 2}],
-
- ['large-5.1','--to=si 1000000000000000000', {OUT=>"1.0E"}],
- ['large-5','--from=si --to=si 2E', {OUT=>"2.0E"}],
- ['large-6','--from=si --to=si 3.4Z', {OUT=>"3.4Z"}],
- ['large-7','--from=si --to=si 80Y', {OUT=>"80Y"}],
- ['large-8','--from=si --to=si 9000Z', {OUT=>"9.0Y"}],
-
- ['large-10','--from=si --to=si 999Y', {OUT=>"999Y"}],
- ['large-11','--from=si --to=iec 999Y', {OUT=>"827Y"}],
- ['large-12','--from=si --round=down --to=iec 999Y', {OUT=>"826Y"}],
-
- # units can also affect the output
- ['large-13','--from=si --from-unit=1000000 9P',
- {ERR => "$prog: value too large to be printed: '9e+21' " .
- "(consider using --to)\n"},
+ ['leading-5','1.',
+ {ERR => "$prog: invalid number: '1.'\n"},
{EXIT => 2}],
- ['large-13.1','--from=si --from-unit=1000000 --to=si 9P', {OUT=>"9.0Z"}],
- # Numbers>999Y are never acceptable, regardless of scaling
- ['large-14','--from=si --to=si 999Y', {OUT=>"999Y"}],
- ['large-14.1','--from=si --to=si 1000Y',
- {ERR => "$prog: value too large to be printed: '1e+27' " .
- "(cannot handle values > 999Y)\n"},
- {EXIT => 2}],
- ['large-14.2','--from=si --to=si --from-unit=10000 1Y',
- {ERR => "$prog: value too large to be printed: '1e+28' " .
- "(cannot handle values > 999Y)\n"},
- {EXIT => 2}],
+ # precision override
+ ['precision-1','--format=%.4f 9991239123 --to=si', {OUT=>"9.9913G"}],
+ ['precision-2','--format=%.1f 9991239123 --to=si', {OUT=>"10.0G"}],
+ ['precision-3','--format=%.1f 1', {OUT=>"1.0"}],
+ ['precision-4','--format=%.1f 1.12', {OUT=>"1.2"}],
+ ['precision-5','--format=%.1f 9991239123 --to-unit=G', {OUT=>"10.0"}],
+ ['precision-6','--format="% .1f" 9991239123 --to-unit=G', {OUT=>"10.0"}],
+ ['precision-7','--format=%.-1f 1.1',
+ {ERR => "$prog: invalid precision in format '%.-1f'\n"},
+ {EXIT => 1}],
+ ['precision-8','--format=%.+1f 1.1',
+ {ERR => "$prog: invalid precision in format '%.+1f'\n"},
+ {EXIT => 1}],
+ ['precision-9','--format="%. 1f" 1.1',
+ {ERR => "$prog: invalid precision in format '%. 1f'\n"},
+ {EXIT => 1}],
# debug warnings
['debug-1', '--debug 4096', {OUT=>"4096"},
@@ -632,14 +546,6 @@ my @Tests =
['debug-1.1', '--debug --padding 10 4096', {OUT=>" 4096"}],
['debug-2', '--debug --grouping --from=si 4.0K', {OUT=>"4000"},
{ERR=>"$prog: grouping has no effect in this locale\n"}],
- ['debug-4', '--to=si --debug 12345678901234567890',
- {OUT=>"13E"},
- {ERR=>"$prog: large input value '12345678901234567890':" .
- " possible precision loss\n"}],
- ['debug-5', '--to=si --from=si --debug 1.12345678901234567890Y',
- {OUT=>"1.2Y"},
- {ERR=>"$prog: large input value '1.12345678901234567890Y':" .
- " possible precision loss\n"}],
# dev-debug messages - the actual messages don't matter
# just ensure the program works, and for code coverage testing.
@@ -673,14 +579,12 @@ my @Tests =
['devdebug-11', '---debug --format "%\'-10f" 10000',{OUT=>"10000 "},
{ERR=>""},
{ERR_SUBST=>"s/.*//msg"}],
- ['devdebug-12', '---debug --field 2 A',{OUT=>""},
- {ERR=>""}, {EXIT=>2},
- {ERR_SUBST=>"s/.*//msg"}],
# Invalid parameters
['help-1', '--foobar',
- {ERR=>"$prog: unrecognized option '--foobar'\n" .
+ {ERR=>"$prog: unrecognized option\n" .
"Try '$prog --help' for more information.\n"},
+ {ERR_SUBST=>"s/option.*/option/; s/unknown/unrecognized/"},
{EXIT=>1}],
## Format string - check error detection
@@ -695,17 +599,17 @@ my @Tests =
{EXIT=>1}],
['fmt-err-4', '--format "%d"',
{ERR=>"$prog: invalid format '%d', " .
- "directive must be %[0]['][-][N]f\n"},
+ "directive must be %[0]['][-][N][.][N]f\n"},
{EXIT=>1}],
['fmt-err-5', '--format "% -43 f"',
{ERR=>"$prog: invalid format '% -43 f', " .
- "directive must be %[0]['][-][N]f\n"},
+ "directive must be %[0]['][-][N][.][N]f\n"},
{EXIT=>1}],
['fmt-err-6', '--format "%f %f"',
{ERR=>"$prog: format '%f %f' has too many % directives\n"},
{EXIT=>1}],
- ['fmt-err-7', '--format "%123456789012345678901234567890f"',
- {ERR=>"$prog: invalid format '%123456789012345678901234567890f'".
+ ['fmt-err-7', '--format "%'.$limits->{LONG_OFLOW}.'f"',
+ {ERR=>"$prog: invalid format '%$limits->{LONG_OFLOW}f'".
" (width overflow)\n"},
{EXIT=>1}],
['fmt-err-9', '--format "%f" --grouping',
@@ -781,11 +685,6 @@ my @Tests =
{ERR => "$prog: invalid number: 'World'\n"},
{OUT => "Hello 40M World 90G\n"},
{EXIT => 2}],
- ['ign-err-6', '--invalid=fail --field 3 --to=si "Hello World"',
- {ERR => "$prog: input line is too short, no numbers found " .
- "to convert in field 3\n"},
- {OUT => "Hello World\n"},
- {EXIT => 2}],
['ign-err-7', '--invalid=fail --from=si "foo"',
{ERR => "$prog: invalid number: 'foo'\n"},
{OUT => "foo\n"},
@@ -800,16 +699,6 @@ my @Tests =
"'12M' (e.g Ki/Mi/Gi)\n"},
{OUT => "12M\n"},
{EXIT=>2}],
- ['ign-err-10','--invalid=fail 10000000000000000000',
- {ERR => "$prog: value too large to be printed: '1e+19' " .
- "(consider using --to)\n"},
- {OUT => "10000000000000000000\n"},
- {EXIT=>2}],
- ['ign-err-11','--invalid=fail --to=si 9876543210000000000000000000',
- {ERR => "$prog: value too large to be converted: " .
- "'9876543210000000000000000000'\n"},
- {OUT => "9876543210000000000000000000\n"},
- {EXIT => 2}],
## Ignore Errors with multiple conversions
['ign-err-m1', '--invalid=ignore --to=si 1000 2000 bad 3000',
@@ -849,15 +738,184 @@ my @Tests =
{OUT => "A 1000 x\nB Foo y\nC 2.8G z\n"},
{ERR => "$prog: invalid number: 'Foo'\n"},
{EXIT => 2}],
- # one of the lines is too short
- ['ign-err-m3.2', '--invalid=fail --field 2 --from=si --to=iec',
- {IN_PIPE => "A 1K x\nB\nC 3G z\n"},
- {OUT => "A 1000 x\nB\nC 2.8G z\n"},
- {ERR => "$prog: input line is too short, no numbers found " .
- "to convert in field 2\n"},
- {EXIT => 2}],
);
+my @Limit_Tests =
+ (
+ # Large Values
+ ['large-1','1000000000000000', {OUT=>"1000000000000000"}],
+ # 18 digits is OK
+ ['large-2','1000000000000000000', {OUT=>"1000000000000000000"}],
+ # 19 digits is too much (without output scaling)
+ ['large-3','10000000000000000000',
+ {ERR => "$prog: value too large to be printed: '1e+19' " .
+ "(consider using --to)\n"},
+ {EXIT=>2}],
+ ['large-4','1000000000000000000.0',
+ {ERR => "$prog: value/precision too large to be printed: " .
+ "'1e+18/1' (consider using --to)\n"},
+ {EXIT=>2}],
+
+
+ # Test input:
+ # Up to 27 digits is OK.
+ ['large-3.1', '--to=si 1', {OUT=> "1"}],
+ ['large-3.2', '--to=si 10', {OUT=> "10"}],
+ ['large-3.3', '--to=si 100', {OUT=> "100"}],
+ ['large-3.4', '--to=si 1000', {OUT=>"1.0K"}],
+ ['large-3.5', '--to=si 10000', {OUT=> "10K"}],
+ ['large-3.6', '--to=si 100000', {OUT=>"100K"}],
+ ['large-3.7', '--to=si 1000000', {OUT=>"1.0M"}],
+ ['large-3.8', '--to=si 10000000', {OUT=> "10M"}],
+ ['large-3.9', '--to=si 100000000', {OUT=>"100M"}],
+ ['large-3.10','--to=si 1000000000', {OUT=>"1.0G"}],
+ ['large-3.11','--to=si 10000000000', {OUT=> "10G"}],
+ ['large-3.12','--to=si 100000000000', {OUT=>"100G"}],
+ ['large-3.13','--to=si 1000000000000', {OUT=>"1.0T"}],
+ ['large-3.14','--to=si 10000000000000', {OUT=> "10T"}],
+ ['large-3.15','--to=si 100000000000000', {OUT=>"100T"}],
+ ['large-3.16','--to=si 1000000000000000', {OUT=>"1.0P"}],
+ ['large-3.17','--to=si 10000000000000000', {OUT=> "10P"}],
+ ['large-3.18','--to=si 100000000000000000', {OUT=>"100P"}],
+ ['large-3.19','--to=si 1000000000000000000', {OUT=>"1.0E"}],
+ ['large-3.20','--to=si 10000000000000000000', {OUT=> "10E"}],
+ ['large-3.21','--to=si 210000000000000000000', {OUT=>"210E"}],
+ ['large-3.22','--to=si 3210000000000000000000', {OUT=>"3.3Z"}],
+ ['large-3.23','--to=si 43210000000000000000000', {OUT=> "44Z"}],
+ ['large-3.24','--to=si 543210000000000000000000', {OUT=>"544Z"}],
+ ['large-3.25','--to=si 6543210000000000000000000', {OUT=>"6.6Y"}],
+ ['large-3.26','--to=si 76543210000000000000000000', {OUT=> "77Y"}],
+ ['large-3.27','--to=si 876543210000000000000000000', {OUT=>"877Y"}],
+
+ # More than 27 digits is not OK
+ ['large-3.28','--to=si 9876543210000000000000000000',
+ {ERR => "$prog: value too large to be converted: " .
+ "'9876543210000000000000000000'\n"},
+ {EXIT => 2}],
+
+ # Test Output
+ ['large-4.1', '--from=si 9.7M', {OUT=>"9700000"}],
+ ['large-4.2', '--from=si 10M', {OUT =>"10000000"}],
+ ['large-4.3', '--from=si 200M', {OUT =>"200000000"}],
+ ['large-4.4', '--from=si 3G', {OUT =>"3000000000"}],
+ ['large-4.5', '--from=si 40G', {OUT =>"40000000000"}],
+ ['large-4.6', '--from=si 500G', {OUT =>"500000000000"}],
+ ['large-4.7', '--from=si 6T', {OUT =>"6000000000000"}],
+ ['large-4.8', '--from=si 70T', {OUT =>"70000000000000"}],
+ ['large-4.9', '--from=si 800T', {OUT =>"800000000000000"}],
+ ['large-4.10','--from=si 9P', {OUT =>"9000000000000000"}],
+ ['large-4.11','--from=si 10P', {OUT =>"10000000000000000"}],
+ ['large-4.12','--from=si 200P', {OUT =>"200000000000000000"}],
+ ['large-4.13','--from=si 3E', {OUT =>"3000000000000000000"}],
+
+ # More than 18 digits of output without scaling - no good.
+ ['large-4.14','--from=si 40E',
+ {ERR => "$prog: value too large to be printed: '4e+19' " .
+ "(consider using --to)\n"},
+ {EXIT => 2}],
+ ['large-4.15','--from=si 500E',
+ {ERR => "$prog: value too large to be printed: '5e+20' " .
+ "(consider using --to)\n"},
+ {EXIT => 2}],
+ ['large-4.16','--from=si 6Z',
+ {ERR => "$prog: value too large to be printed: '6e+21' " .
+ "(consider using --to)\n"},
+ {EXIT => 2}],
+ ['large-4.17','--from=si 70Z',
+ {ERR => "$prog: value too large to be printed: '7e+22' " .
+ "(consider using --to)\n"},
+ {EXIT => 2}],
+ ['large-4.18','--from=si 800Z',
+ {ERR => "$prog: value too large to be printed: '8e+23' " .
+ "(consider using --to)\n"},
+ {EXIT => 2}],
+ ['large-4.19','--from=si 9Y',
+ {ERR => "$prog: value too large to be printed: '9e+24' " .
+ "(consider using --to)\n"},
+ {EXIT => 2}],
+ ['large-4.20','--from=si 10Y',
+ {ERR => "$prog: value too large to be printed: '1e+25' " .
+ "(consider using --to)\n"},
+ {EXIT => 2}],
+ ['large-4.21','--from=si 200Y',
+ {ERR => "$prog: value too large to be printed: '2e+26' " .
+ "(consider using --to)\n"},
+ {EXIT => 2}],
+
+ ['large-5.1','--to=si 1000000000000000000', {OUT=>"1.0E"}],
+ ['large-5','--from=si --to=si 2E', {OUT=>"2.0E"}],
+ ['large-6','--from=si --to=si 3.4Z', {OUT=>"3.4Z"}],
+ ['large-7','--from=si --to=si 80Y', {OUT=>"80Y"}],
+ ['large-8','--from=si --to=si 9000Z', {OUT=>"9.0Y"}],
+
+ ['large-10','--from=si --to=si 999Y', {OUT=>"999Y"}],
+ ['large-11','--from=si --to=iec 999Y', {OUT=>"827Y"}],
+ ['large-12','--from=si --round=down --to=iec 999Y', {OUT=>"826Y"}],
+
+ # units can also affect the output
+ ['large-13','--from=si --from-unit=1000000 9P',
+ {ERR => "$prog: value too large to be printed: '9e+21' " .
+ "(consider using --to)\n"},
+ {EXIT => 2}],
+ ['large-13.1','--from=si --from-unit=1000000 --to=si 9P', {OUT=>"9.0Z"}],
+
+ # Numbers>999Y are never acceptable, regardless of scaling
+ ['large-14','--from=si --to=si 999Y', {OUT=>"999Y"}],
+ ['large-14.1','--from=si --to=si 1000Y',
+ {ERR => "$prog: value too large to be printed: '1e+27' " .
+ "(cannot handle values > 999Y)\n"},
+ {EXIT => 2}],
+ ['large-14.2','--from=si --to=si --from-unit=10000 1Y',
+ {ERR => "$prog: value too large to be printed: '1e+28' " .
+ "(cannot handle values > 999Y)\n"},
+ {EXIT => 2}],
+
+ # intmax_t overflow when rounding caused this to fail before 8.24
+ ['large-15',$limits->{INTMAX_OFLOW}, {OUT=>$limits->{INTMAX_OFLOW}}],
+ ['large-16','9.300000000000000000', {OUT=>'9.300000000000000000'}],
+
+ # INTEGRAL_OVERFLOW
+ ['strtod-3', '--from=si "1234567890123456789012345678901234567890'.
+ '1234567890123456789012345678901234567890"',
+ {ERR=>"$prog: value too large to be converted: '" .
+ "1234567890123456789012345678901234567890" .
+ "1234567890123456789012345678901234567890'\n",
+ },
+ {EXIT=> 2}],
+
+ # FRACTION_OVERFLOW
+ ['strtod-7', '--from=si "12.1234567890123456789012345678901234567890'.
+ '1234567890123456789012345678901234567890"',
+ {ERR=>"$prog: value too large to be converted: '" .
+ "12.1234567890123456789012345678901234567890" .
+ "1234567890123456789012345678901234567890'\n",
+ },
+ {EXIT=> 2}],
+
+ ['debug-4', '--to=si --debug 12345678901234567890',
+ {OUT=>"13E"},
+ {ERR=>"$prog: large input value '12345678901234567890':" .
+ " possible precision loss\n"}],
+ ['debug-5', '--to=si --from=si --debug 1.12345678901234567890Y',
+ {OUT=>"1.2Y"},
+ {ERR=>"$prog: large input value '1.12345678901234567890Y':" .
+ " possible precision loss\n"}],
+
+ ['ign-err-10','--invalid=fail 10000000000000000000',
+ {ERR => "$prog: value too large to be printed: '1e+19' " .
+ "(consider using --to)\n"},
+ {OUT => "10000000000000000000\n"},
+ {EXIT=>2}],
+ ['ign-err-11','--invalid=fail --to=si 9876543210000000000000000000',
+ {ERR => "$prog: value too large to be converted: " .
+ "'9876543210000000000000000000'\n"},
+ {OUT => "9876543210000000000000000000\n"},
+ {EXIT => 2}],
+ );
+# Restrict these tests to systems with LDBL_DIG == 18
+(system "$prog ---debug 1 2>&1|grep 'MAX_UNSCALED_DIGITS: 18' > /dev/null") == 0
+ and push @Tests, @Limit_Tests;
+
my @Locale_Tests =
(
# Locale that supports grouping, but without '--grouping' parameter