test_distance.cpp

Back to Orphans

test/pastel/math/

// Description: Testing for distances
// DocumentationOf: pastel/math/distance.h

#include "test/test_init.h"

#include "pastel/math/distance.h"

template <typename Distance>
void testBasic()
{
    auto distance = Distance((dreal)2);
    auto copy = distance;
    REQUIRE(copy == distance);
    REQUIRE(copy <= distance);
    REQUIRE(copy >= distance);
    REQUIRE(!(copy != distance));
    REQUIRE(!(copy < distance));
    REQUIRE(!(copy > distance));

    REQUIRE(copy == 2);
    REQUIRE(2 == copy);
}

TEST_CASE("Distance (Manhattan)")
{
    using Distance = Manhattan_Distance<dreal>;
    PASTEL_CONCEPT_CHECK(Distance, Distance_Concept);

    auto distance = Distance();
    testBasic<Distance>();

    distance.set(0, 2);
    REQUIRE(~distance == 2);

    distance.replace(0, 2, 4);
    REQUIRE(~distance == 4);
}

TEST_CASE("Distance (Euclidean)")
{
    using Distance = Euclidean_Distance<dreal>;
    PASTEL_CONCEPT_CHECK(Distance, Distance_Concept);

    auto distance = Distance();
    testBasic<Distance>();

    distance.set(0, 2);
    REQUIRE(~distance == 2*2);

    distance.replace(0, 2, 4);
    REQUIRE(~distance == 4*4);
}

TEST_CASE("Distance (Maximum)")
{
    using Distance = Maximum_Distance<dreal>;
    PASTEL_CONCEPT_CHECK(Distance, Distance_Concept);

    auto distance = Distance();
    testBasic<Distance>();

    distance.set(0, 2);
    REQUIRE(~distance == 2);

    distance.replace(0, 2, 4);
    REQUIRE(~distance == 4);
}

TEST_CASE("Distance (Minkowski)")
{
    using Distance = Minkowski_Distance<dreal>;
    PASTEL_CONCEPT_CHECK(Distance, Distance_Concept);

    auto distance = Distance();
    testBasic<Distance>();

    distance.set(0, 2);
    REQUIRE(~distance == 2*2);

    distance.replace(0, 2, 4);
    REQUIRE(~distance == 4*4);
}

TEST_CASE("Distance (Product)")
{
    using Distance = Product_Distance<dreal, Euclidean_Distance<dreal>, Manhattan_Distance<dreal>>;

    auto distance = Distance((integer)2);
    testBasic<Distance>();

    distance.set(0, 2);
    REQUIRE(~distance == 2*2);

    distance.replace(0, 2, 4);
    REQUIRE(~distance == 4*4);

    distance.set(1, 2);
    REQUIRE(~distance == 4*4 + 2*2);

    distance.set(2, 100);
    REQUIRE(~distance == std::max(4*4 + 2*2, 100));

    distance.set(3, 10);
    REQUIRE(~distance == std::max(4*4 + 2*2, 100 + 10));
}