The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More tests => 16;

BEGIN {
    use_ok('Geometry::Primitive::Point');
    use_ok('Geometry::Primitive::Line');
};

my $point1 = Geometry::Primitive::Point->new(x => 1, y => 2);
my $point2 = Geometry::Primitive::Point->new(x => 3, y => 4);

my $line = Geometry::Primitive::Line->new(start => $point1, end => $point2);

ok($line->point_start->equal_to($point1), 'point_start');
ok($line->point_end->equal_to($point2), 'point_end');

cmp_ok($line->slope, '==', 1, 'slope');
cmp_ok($line->length, '==', sqrt(8), 'length');
cmp_ok($line->y_intercept, '==', 1, 'y_intercept');

ok($line->contains_point(-2, -1), 'contains_point');
ok(!$line->contains_point(-1, -1), 'contains_point (wrong)');

my $vert = Geometry::Primitive::Line->new(
    start => Geometry::Primitive::Point->new( x => 0, y => 0 ),
    end => Geometry::Primitive::Point->new( x => 0, y => 5 ),
);
ok(!defined($vert->slope), 'slope of vertical line');

my $horiz = Geometry::Primitive::Line->new(
    start => Geometry::Primitive::Point->new( x => 0, y => 0 ),
    end => Geometry::Primitive::Point->new( x => 5, y => 0 ),
);
cmp_ok($horiz->slope, '==', 0, 'slope of horizontal line');
ok($horiz->is_perpendicular($vert), 'vert/horiz perpendicular');
ok($vert->is_perpendicular($horiz), 'horiz/vert perpendicular');

my $line1 = Geometry::Primitive::Line->new(
    start => Geometry::Primitive::Point->new( x => 0, y => 1 ),
    end => Geometry::Primitive::Point->new( x => 1, y => 0 ),
);
my $line2 = Geometry::Primitive::Line->new(
    start => Geometry::Primitive::Point->new( x => 0, y => 0 ),
    end => Geometry::Primitive::Point->new( x => 1, y => 1 ),
);
ok($line1->is_perpendicular($line2), 'perpendicular');

my $cline = Geometry::Primitive::Line->new(start => [0, 0], end => [5, 5]);
cmp_ok($cline->start->x, '==', 0, 'point coercion');
ok($cline->slope, 'coerced line');