#!/usr/bin/perl -w
use blib;
use strict;
use Carp;
use Math::Units;
my $failed = 0;
my $total = 0;
my %good_results = (
'100@ton@tonne' => 90.718474, #--R--
'10@ton@lb' => 20000, #--R--
'10@tonf@lbf' => 20000, #--R--
'50@N@lbf' => 11.24044715, #--R--
'9990@N@tonf' => 1.122920671, #--R--
'2000@rpm@Hz' => 33.33333333, #--R--
'2000@rpm@cycle/min' => 2000, #--R--
'2000@rpm@deg/sec' => 12000, #--R--
'87@jerk@N/kg sec' => 26.5176, #--R--
'123@jerk@N/kg sec' => 37.4904, #--R--
'12000@jerk@lbf/ton sec' => 745942.8041, #--R--
'123@meters per second per second@yd/s/s' => 134.5144357, #--R--
'123@5^2/m^2@25 m^-1/m' => 123, #--R--
'220@K@F' => -63.67, #--R--
'20@C@F' => 68, #--R--
'2@Cd@Fd' => 3.6, #--R--
'1@m/Cd@in/Fd' => 21.87226597, #--R--
'1@m@in' => 39.37007874, #--R--
'50@hectare@ft^2' => 5381955.208, #--R--
'1@m/s@ft/s' => 3.280839895, #--R--
'100@ft/sec@ft/min' => 6000, #--R--
'100@km/hr@mi/hr' => 62.13711922, #--R--
'1@Pa/Hz@Pa/kHz' => 1000, #--R--
'1@N@lb in/s^2' => 86.79616621, #--R--
'2789@in m@are' => 0.708406, #--R--
'1@hp@m N/s' => 745.6998716, #--R--
'1@m m@ft yd' => 3.587970139, #--R--
'1@l@qt' => 1.056688209, #--R--
'8@ft lbf/s@W' => 10.84654359, #--R--
'89@kg/m m@lb/in ft' => 1.519053065, #--R--
'167@N@lbf' => 37.5430935, #--R--
'278@N^2@lbf^2' => 14.04985893, #--R--
'1@25 barrel^2@floz^2' => 722534400, #--R--
'0.1@F^-1@C^-1' => 32.18, #--R--
'1@m s^-1@ft s^-1' => 3.280839895, #--R--
'1@l@qt' => 1.056688209, #--R--
'1@m^3@gal' => 264.1720524, #--R--
'100@in^3@qt' => 1.731601732, #--R--
'7001@cc@qt' => 7.397874154, #--R--
'1@m^6@l^2' => 1000000, #--R--
'786@m in@ft yd' => 71.63167104, #--R--
'786@m in@ft yd' => 71.63167104, #--R--
'1@lbf@N' => 4.448221615, #--R--
'10@m/Cd@m/Fd' => 5.555555556, #--R--
'55550@angstroms@microns' => 5.555, #--R--
'5000000000000@angstroms@in' => 19685.03937, #--R--
'9000@Hz@kHz' => 9, #--R--
'1@gal@in^3' => 231, #--R--
'10@gal@pnt^3' => 862202880, #--R--
'100@pnt^2@mm^2' => 12.44521605, #--R--
'9000000000@pnt@km' => 3175, #--R--
'100@ft@m' => 30.48, #--R--
'100@km/hr@mi/hr' => 62.13711922, #--R--
'100@ft/sec@ft/min' => 6000, #--R--
'100@ft/sec@m/sec' => 30.48, #--R--
'100@feet per second squared@ft/min^2' => 360000, #--R--
'100@ft/sec@m/sec' => 30.48, #--R--
'1@N^2@g^2 km^2/s^4' => 1, #--R--
'17@N@lb in/s^2' => 1475.534826, #--R--
'212@F@C' => 100, #--R--
'32@F@C' => 0, #--R--
'70@F@C' => 21.11111111, #--R--
'98.6@F@C' => 37, #--R--
'1e+20@cubic microns@cubic inches' => 6102374.409, #--R--
'980@microns@milliinches' => 38.58267717, #--R--
'9700@microns@milli-inches' => 381.8897638, #--R--
'8976@microns@m-in' => 353.3858268, #--R--
'4500@cc@l' => 4.5, #--R--
'500@in^3@l' => 8.193532, #--R--
'500@in^3@qt' => 8.658008658, #--R--
'17896@m^2/m m^3@in in/in^4' => 11.54578336 #--R--
);
sub doit ($$$) {
my($in_v, $in_u, $out_u) = @_;
my $good_v = $good_results{"$in_v\@$in_u\@$out_u"};
my $out_v = Math::Units::convert($in_v, $in_u, $out_u);
++$total;
if (abs($good_v - $out_v) > 0.001) {
++$failed;
print "$in_v $in_u -> $out_v $out_u (should be $good_v) -- FAILED\n";
}
else {
print "$in_v $in_u -> $out_v $out_u -- OK\n";
}
}
# The three common types of errors:
#
#eval {
# doit(123, "(m/s)^2", "(in/s)^2"); # incorrect syntax
#};
#
#print $@;
#
#eval {
# doit(123, "m", "m^2"); # incompatible units
# doit(123, "in ft", "m yd ft");
#};
#
#print $@;
#
#eval {
# doit(123, "foo", "m^2"); # unknown units
#};
#
#print $@;
my $i;
for ($i = 0; $i < 3; ++$i)
{
doit(100, "ton", "tonne");
doit(10, "ton", "lb");
doit(10, "tonf", "lbf");
doit(50, "N", "lbf");
doit(9990, "N", "tonf");
doit(2000, "rpm", "Hz");
doit(2000, "rpm", "cycle/min");
doit(2000, "rpm", "deg/sec");
doit(87, "jerk", "N/kg sec");
doit(123, 'jerk', 'N/kg sec');
doit(12000, 'jerk', 'lbf/ton sec');
doit(123, "meters per second per second", "yd/s/s");
doit(123, "5^2/m^2", "25 m^-1/m");
doit(220, "K", "F");
doit(20, "C", "F");
doit(2, "Cd", "Fd");
doit(1, "m/Cd", "in/Fd");
doit(1, "m", "in");
doit(50, "hectare", "ft^2");
doit(1, "m/s", "ft/s");
doit(100, "ft/sec", "ft/min");
doit(100, "km/hr", "mi/hr");
doit(1, "Pa/Hz", "Pa/kHz");
doit(1, "N", "lb in/s^2");
doit(2789, "in m", "are");
doit(1, "hp", "m N/s");
doit(1, "m m", "ft yd");
doit(1, "l", "qt");
doit(8, "ft lbf/s", "W");
doit(89, "kg/m m", "lb/in ft");
doit(167, "N", "lbf");
doit(278, "N^2", "lbf^2");
doit(1, "25 barrel^2", "floz^2");
doit(0.1, "F^-1", "C^-1");
doit(1, "m s^-1", "ft s^-1");
doit(1, "l", "qt");
doit(1, "m^3", "gal");
doit(100, "in^3", "qt");
doit(7001, "cc", "qt");
doit(1, "m^6", "l^2");
doit(786, "m in", "ft yd");
doit(786, "m in", "ft yd");
doit(1, "lbf", "N");
doit(10, "m/Cd", "m/Fd");
doit(55550, "angstroms", "microns");
doit(5e12, "angstroms", "in");
doit(9000, "Hz", "kHz");
doit(1, "gal", "in^3");
doit(10, "gal", "pnt^3");
doit(100, "pnt^2", "mm^2");
doit(9e9, "pnt", "km");
doit(100, "ft", "m");
doit(100, "km/hr", "mi/hr");
doit(100, "ft/sec", "ft/min");
doit(100, "ft/sec", "m/sec");
doit(100, "feet per second squared", "ft/min^2");
doit(100, "ft/sec", "m/sec");
doit(1, "N^2", "g^2 km^2/s^4");
doit(17, "N", "lb in/s^2");
doit(212, "F", "C");
doit(32, "F", "C");
doit(70, "F", "C");
doit(98.6, "F", "C");
doit(1e20, "cubic microns", "cubic inches");
doit(980, "microns", "milliinches");
doit(9700, "microns", "milli-inches");
doit(8976, "microns", "m-in");
doit(4500, "cc", "l");
doit(500, "in^3", "l");
doit(500, "in^3", "qt");
doit(17896, "m^2/m m^3", "in in/in^4");
}
print "passed ", ($total - $failed), " out of $total tests.\n";
if ($failed) {
print "\nPlease report your Perl configuration (perl -V) to fox\@vulpes.com\n";
print "with the output of this test script. You should not use this module\n";
print "until the cause of the problem is discovered and fixed.\n";
exit 1;
}
else {
exit 0;
}
syntax highlighted by Code2HTML, v. 0.9.1