The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -T

use strict;
use warnings;
use Geometry::Formula;
use Test::More tests => 22;

BEGIN {
    eval "use Test::Exception";
    plan skip_all => "Test::Exception needed" if $@;
}

my $test = Geometry::Formula->new;

my $lateral_surface_area = $test->frustum_of_right_circular_cone(
    formula      => 'lateral_surface_area',
    slant_height => 5,
    small_radius => 10,
    large_radius => 15
);
like( $lateral_surface_area, qr/555.36035/, 'calculation test' );

my $total_surface_area = $test->frustum_of_right_circular_cone(
    formula      => 'total_surface_area',
    height       => 5,
    small_radius => 10,
    large_radius => 15
);
like( $total_surface_area, qr/1576.37795279637/, 'calculation test' );

my $volume = $test->frustum_of_right_circular_cone(
    formula      => 'volume',
    height       => 5,
    small_radius => 10,
    large_radius => 15

);
like( $volume, qr/2487.09414166667/, 'calculation test' );

throws_ok {
    $test->frustum_of_right_circular_cone(
        formula      => 'foo',
        height       => 5,
        small_radius => 10,
        large_radius => 15
    );
}
qr/invalid formula name: foo specified/, 'valid formula name test';

throws_ok {
    $test->frustum_of_right_circular_cone(
        formula      => 'lateral_surface_area',
        small_radius => 5,
        large_radius => 10
    );
}
qr/required parameter 'slant_height' not defined/,
  'required parameter exception for slant_height';

throws_ok {
    $test->frustum_of_right_circular_cone(
        formula      => 'lateral_surface_area',
        slant_height => 5,
        large_radius => 10
    );
}
qr/required parameter 'small_radius' not defined/,
  'required parameter exception for small_radius';

throws_ok {
    $test->frustum_of_right_circular_cone(
        formula      => 'lateral_surface_area',
        slant_height => 5,
        small_radius => 10
    );
}
qr/required parameter 'large_radius' not defined/,
  'required parameter exception for large_radius';

throws_ok {
    $test->frustum_of_right_circular_cone(
        formula      => 'total_surface_area',
        small_radius => 5,
        large_radius => 10
    );
}
qr/required parameter 'height' not defined/,
  'required parameter exception for height';

throws_ok {
    $test->frustum_of_right_circular_cone(
        formula      => 'total_surface_area',
        height       => 5,
        large_radius => 10
    );
}
qr/required parameter 'small_radius' not defined/,
  'required parameter exception for small_radius';

throws_ok {
    $test->frustum_of_right_circular_cone(
        formula      => 'total_surface_area',
        height       => 5,
        small_radius => 10
    );
}
qr/required parameter 'large_radius' not defined/,
  'required parameter exception for large_radius';

throws_ok {
    $test->frustum_of_right_circular_cone(
        formula      => 'volume',
        small_radius => 5,
        large_radius => 10
    );
}
qr/required parameter 'height' not defined/,
  'required parameter exception for height';

throws_ok {
    $test->frustum_of_right_circular_cone(
        formula      => 'volume',
        height       => 5,
        large_radius => 10
    );
}
qr/required parameter 'small_radius' not defined/,
  'required parameter exception for small_radius';

throws_ok {
    $test->frustum_of_right_circular_cone(
        formula      => 'volume',
        height       => 5,
        small_radius => 10
    );
}
qr/required parameter 'large_radius' not defined/,
  'required parameter exception for large_radius';

throws_ok {
    $test->frustum_of_right_circular_cone(
        formula      => 'lateral_surface_area',
        slant_height => '5a',
        small_radius => 10,
        large_radius => 15
    );
}
qr/parameter 'slant_height' requires a numeric value/,
  'formula parameter slant_height is numeric';

throws_ok {
    $test->frustum_of_right_circular_cone(
        formula      => 'lateral_surface_area',
        slant_height => 5,
        small_radius => '10a',
        large_radius => 15
    );
}
qr/parameter 'small_radius' requires a numeric value/,
  'formula parameter small_radius is numeric';

throws_ok {
    $test->frustum_of_right_circular_cone(
        formula      => 'lateral_surface_area',
        slant_height => 5,
        small_radius => 10,
        large_radius => '15a'
    );
}
qr/parameter 'large_radius' requires a numeric value/,
  'formula parameter large_radius is numeric';

throws_ok {
    $test->frustum_of_right_circular_cone(
        formula      => 'total_surface_area',
        height       => '5a',
        small_radius => 10,
        large_radius => 15
    );
}
qr/parameter 'height' requires a numeric value/,
  'formula parameter height is numeric';

throws_ok {
    $test->frustum_of_right_circular_cone(
        formula      => 'total_surface_area',
        height       => 5,
        small_radius => '10a',
        large_radius => 15
    );
}
qr/parameter 'small_radius' requires a numeric value/,
  'formula parameter small_radius is numeric';

throws_ok {
    $test->frustum_of_right_circular_cone(
        formula      => 'total_surface_area',
        height       => 5,
        small_radius => 10,
        large_radius => '15a'
    );
}
qr/parameter 'large_radius' requires a numeric value/,
  'formula parameter large_radius is numeric';

throws_ok {
    $test->frustum_of_right_circular_cone(
        formula      => 'volume',
        height       => '5a',
        small_radius => 10,
        large_radius => 15
    );
}
qr/parameter 'height' requires a numeric value/,
  'formula parameter height is numeric';

throws_ok {
    $test->frustum_of_right_circular_cone(
        formula      => 'volume',
        height       => 5,
        small_radius => '10a',
        large_radius => 15
    );
}
qr/parameter 'small_radius' requires a numeric value/,
  'formula parameter small_radius is numeric';

throws_ok {
    $test->frustum_of_right_circular_cone(
        formula      => 'volume',
        height       => 5,
        small_radius => 10,
        large_radius => '15a'
    );
}
qr/parameter 'large_radius' requires a numeric value/,
  'formula parameter large_radius is numeric';