The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
#!perl

use utf8;
use strict;

use Math::PhaseOnlyCorrelation;

BEGIN {
    use Test::Most tests => 6;
}

my ( $array1, $array2, $got );

subtest 'Give different length array' => sub {
    $array1 = [ 1, 2, 3, 4 ];
    $array2 = [ 1, 2, 3, 4, 5, 6, 7, 8 ];
    lives_ok { Math::PhaseOnlyCorrelation::poc( $array1, $array2 ) };
};

subtest 'Give not 2^n length array and die' => sub {
    $array1 = [ 1, 2, 3, 4, 5 ];
    $array2 = [ 1, 2, 3, 4, 5 ];
    dies_ok { Math::PhaseOnlyCorrelation::poc( $array1, $array2 ) };
};

subtest 'Correlation same signal' => sub {
    $array1 = [ 1, 2, 3, 4, 5, 6, 7, 8 ];
    $array2 = [ 1, 2, 3, 4, 5, 6, 7, 8 ];
    $got = Math::PhaseOnlyCorrelation::poc( $array1, $array2 );
    ok(sprintf('%1.7f', $got->[0])  == sprintf('%1.7f', 1));
    ok(sprintf('%1.7f', $got->[1])  == sprintf('%1.7f', 0));
    ok(sprintf('%1.7f', $got->[2])  == sprintf('%1.7f', -3.92523114670944e-17));
    ok(sprintf('%1.7f', $got->[3])  == sprintf('%1.7f', 0));
    ok(sprintf('%1.7f', $got->[4])  == sprintf('%1.7f', 5.55111512312578e-17));
    ok(sprintf('%1.7f', $got->[5])  == sprintf('%1.7f', 0));
    ok(sprintf('%1.7f', $got->[6])  == sprintf('%1.7f', 3.92523114670944e-17));
    ok(sprintf('%1.7f', $got->[7])  == sprintf('%1.7f', 0));
    ok(sprintf('%1.7f', $got->[8])  == sprintf('%1.7f', 0));
    ok(sprintf('%1.7f', $got->[9])  == sprintf('%1.7f', 0));
    ok(sprintf('%1.7f', $got->[10]) == sprintf('%1.7f', 3.92523114670944e-17));
    ok(sprintf('%1.7f', $got->[11]) == sprintf('%1.7f', 0));
    ok(sprintf('%1.7f', $got->[12]) == sprintf('%1.7f', 5.55111512312578e-17));
    ok(sprintf('%1.7f', $got->[13]) == sprintf('%1.7f', 0));
    ok(sprintf('%1.7f', $got->[14]) == sprintf('%1.7f', -3.92523114670944e-17));
    ok(sprintf('%1.7f', $got->[15]) == sprintf('%1.7f', 0));
};

subtest 'Correlation different signal' => sub {
    $array2 = [ 1, -2, 3, -4, 5, -6, 7, -8 ];
    $got = Math::PhaseOnlyCorrelation::poc( $array1, $array2 );
    ok(sprintf('%1.7f', $got->[0])  == sprintf('%1.7f', -0.25));
    ok(sprintf('%1.7f', $got->[1])  == sprintf('%1.7f', 0));
    ok(sprintf('%1.7f', $got->[2])  == sprintf('%1.7f', 0.603553390593274));
    ok(sprintf('%1.7f', $got->[3])  == sprintf('%1.7f', 0));
    ok(sprintf('%1.7f', $got->[4])  == sprintf('%1.7f', -0.25));
    ok(sprintf('%1.7f', $got->[5])  == sprintf('%1.7f', 0));
    ok(sprintf('%1.7f', $got->[6])  == sprintf('%1.7f', 0.103553390593274));
    ok(sprintf('%1.7f', $got->[7])  == sprintf('%1.7f', 0));
    ok(sprintf('%1.7f', $got->[8])  == sprintf('%1.7f', -0.25));
    ok(sprintf('%1.7f', $got->[9])  == sprintf('%1.7f', 0));
    ok(sprintf('%1.7f', $got->[10]) == sprintf('%1.7f', -0.103553390593274));
    ok(sprintf('%1.7f', $got->[11]) == sprintf('%1.7f', 0));
    ok(sprintf('%1.7f', $got->[12]) == sprintf('%1.7f', -0.25));
    ok(sprintf('%1.7f', $got->[13]) == sprintf('%1.7f', 0));
    ok(sprintf('%1.7f', $got->[14]) == sprintf('%1.7f', -0.603553390593274));
    ok(sprintf('%1.7f', $got->[15]) == sprintf('%1.7f', 0));
};

subtest 'Correlation similar signal' => sub {
    $array2 = [ 1.1, 2, 3.3, 4, 5.5, 6, 7.7, 8 ];
    $got = Math::PhaseOnlyCorrelation::poc( $array1, $array2 );
    ok(sprintf('%1.7f', $got->[0])  == sprintf('%1.7f', 0.998032565636364));
    ok(sprintf('%1.7f', $got->[1])  == sprintf('%1.7f', 0));
    ok(sprintf('%1.7f', $got->[2])  == sprintf('%1.7f', 0.0366894970913469));
    ok(sprintf('%1.7f', $got->[3])  == sprintf('%1.7f', 0));
    ok(sprintf('%1.7f', $got->[4])  == sprintf('%1.7f', -0.0233394555681124));
    ok(sprintf('%1.7f', $got->[5])  == sprintf('%1.7f', 0));
    ok(sprintf('%1.7f', $got->[6])  == sprintf('%1.7f', 0.0106622350554301));
    ok(sprintf('%1.7f', $got->[7])  == sprintf('%1.7f', 0));
    ok(sprintf('%1.7f', $got->[8])  == sprintf('%1.7f', 0.00140150322585453));
    ok(sprintf('%1.7f', $got->[9])  == sprintf('%1.7f', 0));
    ok(sprintf('%1.7f', $got->[10]) == sprintf('%1.7f', -0.0129069223836222));
    ok(sprintf('%1.7f', $got->[11]) == sprintf('%1.7f', 0));
    ok(sprintf('%1.7f', $got->[12]) == sprintf('%1.7f', 0.0239053867058937));
    ok(sprintf('%1.7f', $got->[13]) == sprintf('%1.7f', 0));
    ok(sprintf('%1.7f', $got->[14]) == sprintf('%1.7f', -0.0344448097631548));
    ok(sprintf('%1.7f', $got->[15]) == sprintf('%1.7f', 0));
};

subtest 'Check non destructive' => sub {
    is_deeply( $array1, [ 1,   2, 3,   4, 5,   6, 7,   8 ] );
    is_deeply( $array2, [ 1.1, 2, 3.3, 4, 5.5, 6, 7.7, 8 ] );
};

done_testing();