The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl
use strict;
use warnings;

use lib 't';
use MyTestHeader;

use Carp qw/confess/;
use Test::More tests => 2;
use Test::LectroTest::Compat
  regressions => $Regfile;


use_ok('Physics::Lorentz');

use PDL;


# Check addition of vectors
my $add_works = Property  {
    ##[ 
        x <- Float, y <- Float, z <- Float, t <- Float
        e <- Float, kx <- Float, ky <- Float, kz <- Float
    ]##
    # WTF? Undefined values? FIXME
    for ($x, $y, $z, $t, $e, $kx, $ky, $kz) {
        $_ = 0 if not defined $_;
    }

    my $v1 = Physics::Lorentz::Vector->new([$t, $x, $y, $z]);
    my $v2 = Physics::Lorentz::Vector->new([$e, $kx, $ky, $kz]);

    my $v12 = Physics::Lorentz::Vector->new([$t+$e,$x+$kx,$y+$ky,$z+$kz]);

    my $sum = $v1->add($v2);
    myisa($sum, 'Physics::Lorentz::Vector');
    pdl_approx_equiv($sum->get_pdl(), $v12->get_pdl(), 1e-8)
      or confess("v1->add(v2) breaks. Expected: $v12. Got: $sum.");

    $sum = $v2->add($v1);
    myisa($sum, 'Physics::Lorentz::Vector');
    pdl_approx_equiv($sum->get_pdl(), $v12->get_pdl(), 1e-8)
      or confess("v2->add(v1) breaks. Expected: $v12. Got: $sum.");
    
    $sum = $v1 + $v2;
    myisa($sum, 'Physics::Lorentz::Vector');
    pdl_approx_equiv($sum->get_pdl(), $v12->get_pdl(), 1e-8)
      or confess("v1 + v2 breaks. Expected: $v12. Got: $sum.");

    $sum = $v2 + $v1;
    myisa($sum, 'Physics::Lorentz::Vector');
    pdl_approx_equiv($sum->get_pdl(), $v12->get_pdl(), 1e-8)
      or confess("v2 + v1 breaks. Expected: $v12. Got: $sum.");

    $v1 += $v2;
    myisa($v1, 'Physics::Lorentz::Vector');
    pdl_approx_equiv($v1->get_pdl(), $v12->get_pdl(), 1e-8)
      or confess("v1 += v2 breaks. Expected: $v12. Got: $v1.");
}, name => 'Addition of vectors works';

holds($add_works, trials => $Trials);