Skip to content

Commit

Permalink
refactor t/units.t
Browse files Browse the repository at this point in the history
  • Loading branch information
briandfoy committed Jun 16, 2023
1 parent 2db83ec commit b00baf4
Showing 1 changed file with 83 additions and 78 deletions.
161 changes: 83 additions & 78 deletions t/units.t
Expand Up @@ -5,102 +5,107 @@
use strict;
use warnings;

use Test::More tests => 28;

use FindBin;
use Test::More;

run_tests();

sub run_tests {
my ( $progname, $argv_ar ) = @_;

require $FindBin::Bin . '/../bin/units';

my %got;
my $rounded;

my $class = 'PerlPowerTools::units';

# linear dimension tests, returning type => 'dimless'

%got = PerlPowerTools::units::test($class, 'm','m');
is rnd($got{p}), 1;
is rnd($got{q}), 1;

%got = PerlPowerTools::units::test($class, 'm','cm');
is rnd($got{p}), 0.01;
is rnd($got{q}), 100;

%got = PerlPowerTools::units::test($class, 'meters','feet');
is rnd($got{q}), 3.28084;
is rnd($got{p}), 0.3048;

%got = PerlPowerTools::units::test($class, 'cm3','gallons');
is rnd($got{q}), 0.000264172;
is rnd($got{p}), 3785.41;

%got = PerlPowerTools::units::test($class, 'meters/s','furlongs/fortnight');
is rnd($got{q}), 6012.88;
is rnd($got{p}), 0.00016631;

%got = PerlPowerTools::units::test($class, '1|2 in','cm');
is rnd($got{q}), 1.27;
is rnd($got{p}), 0.787402;

%got = PerlPowerTools::units::test($class, 'month','year');
is rnd($got{q}), rnd(1/12);
is rnd($got{p}), 12;
my $class = require './bin/units';

# affine dimension tests, returing type => 'temperature'
subtest sanity => sub {
can_ok $class, 'test'
};

%got = PerlPowerTools::units::test($class, 'K','K');
is rnd($got{t}), 0;
calendar_test($class);
distance_test($class);
temp_test($class);
volume_test($class);

%got = PerlPowerTools::units::test($class, 'K','C');
is rnd($got{t}), -273.15;

%got = PerlPowerTools::units::test($class, 'K','R');
is rnd($got{t}), 0;

%got = PerlPowerTools::units::test($class, 'C','K');
is rnd($got{t}), 273.15;

%got = PerlPowerTools::units::test($class, 'R','K');
is rnd($got{t}), 0;

%got = PerlPowerTools::units::test($class, 'C','K');
is rnd($got{t}), 273.15;
return;
}

%got = PerlPowerTools::units::test($class, 'C','F');
is rnd($got{t}), 32;
done_testing();

%got = PerlPowerTools::units::test($class, '0C','F');
is rnd($got{t}), 32;
sub calendar_test {
my($class) = @_;

%got = PerlPowerTools::units::test($class, '100 C','F');
is rnd($got{t}), 212;
subtest calendar => sub {
my @table = (
[qw(month year 12), round(1/12)]
);

%got = PerlPowerTools::units::test($class, '-40 C','F');
is rnd($got{t}), -40;
inverse($class, $_) for @table;
};
}

%got = PerlPowerTools::units::test($class, '98.6F','C');
is rnd($got{t}), 37;
sub distance_test {
my($class) = @_;

subtest distance => sub {
my @table = (
# have want p q
[ qw( m m 1 1 ) ],
[ qw( m cm 0.01 100 ) ],
[ qw( meters feet 0.3048 3.28084 ) ],
[ qw( meters/s furlongs/fortnight 0.00016631 6012.88 ) ],
[ '1|2 in', 'cm', qw( 0.787402 1.27 ) ],
);

inverse($class, $_) for @table;
};
}

# ice/salt mixture
sub inverse {
my( $class, $tuple ) = @_;
my( $have, $want, $expected, $inverse ) = @$tuple;
my %got = $class->test( $have, $want );
is round($got{'p'}), $expected, "$have -> $want";
is round($got{'q'}), $inverse, "$want -> $have"
}

%got = PerlPowerTools::units::test($class, '255.37K','C');
is rnd($got{t}), -17.78;
sub temp_test {
my($class) = @_;

subtest temperature => sub {
my @table = (
[qw( K K 0 ) ],
[qw( K C -273.15 ) ],
[qw( K R 0 ) ],
[qw( C K 273.15 ) ],
[qw( R K 0 ) ],
[qw( C F 32 ) ],
[qw( 0C F 32 ) ],
[ '100 C', 'F', '212' ],
[ '-40 C', 'F', '-40' ],
[ '98.6F', 'C', '37' ],
[qw( 255.37K C -17.78 ) ],
[ '99.9836 C', 'K', '373.134' ],
);

foreach my $tuple ( @table ) {
my( $have, $want, $expected ) = @$tuple;
my %got = $class->test( $have, $want );
is round($got{t}), $expected, "$have -> $want";
}

my %got = $class->test('-17.78C','F');
ok round($got{t}) < 0.00001;

};
}

%got = PerlPowerTools::units::test($class, '-17.78C','F');
ok rnd($got{t}) < 0.00001;
sub volume_test {
my($class) = @_;

# water boils at STP
%got = PerlPowerTools::units::test($class, '99.9836 C','K');
is rnd($got{t}), 373.134;
subtest volume => sub {
my @table = (
[qw(cm3 gallons 3785.41 0.000264172)]
);

return;
inverse($class, $_) for @table;
};
}

sub rnd {
sub round {
sprintf '%.6g', $_[0];
}

0 comments on commit b00baf4

Please sign in to comment.