// Description: Testing for alignedbox-alignedbox containment
// DocumentationOf: contains_alignedbox_alignedbox.h
#include "test/test_init.h"
#include "pastel/geometry/containment/contains_alignedbox_alignedbox.h"
#include "pastel/sys/rational.h"
#include <iostream>
using std::cout;
using std::endl;
namespace
{
    using Real = Rational<integer>;
}
TEST_CASE("Same (contains_alignedbox_alignedbox)")
{
    AlignedBox<Real, 2> aBox(0, 0, 1, 1);
    AlignedBox<Real, 2> bBox(0, 0, 1, 1);
    REQUIRE(contains(aBox, bBox));
    REQUIRE(contains(bBox, aBox));
    aBox.maxTopology().set(Topology::Closed);
    REQUIRE(contains(aBox, bBox));
    REQUIRE(!contains(bBox, aBox));
}
TEST_CASE("Easy (contains_alignedbox_alignedbox)")
{
    AlignedBox<Real, 2> aBox(0, 0, 3, 3);
    AlignedBox<Real, 2> bBox(1, 1, 2, 2);
    REQUIRE(contains(aBox, bBox));
    REQUIRE(!contains(bBox, aBox));
}
TEST_CASE("Empty (contains_alignedbox_alignedbox)")
{
    {
        AlignedBox<Real, 2> aBox(0, 0, 2, 2);
        AlignedBox<Real, 2> bBox(1, 1, 1, 1);
        REQUIRE(contains(aBox, bBox));
        REQUIRE(!contains(bBox, aBox));
    }
    {
        AlignedBox<Real, 2> aBox(0, 0, 2, 2);
        AlignedBox<Real, 2> bBox(-1, -3, -1, -3);
        REQUIRE(contains(aBox, bBox));
        REQUIRE(!contains(bBox, aBox));
    }
    {
        AlignedBox<Real, 2> aBox(0, 0, 3, 3);
        AlignedBox<Real, 2> bBox(1, 1, -1, 2);
        REQUIRE(contains(aBox, bBox));
        REQUIRE(!contains(bBox, aBox));
    }
    {
        AlignedBox<Real, 2> aBox(0, 0, 0, 0);
        AlignedBox<Real, 2> bBox(0, 0, 0, 0);
        REQUIRE(contains(aBox, bBox));
        REQUIRE(contains(bBox, aBox));
    }
    {
        AlignedBox<Real, 2> aBox(0, 0, 0, 0);
        AlignedBox<Real, 2> bBox(1, 1, 1, 1);
        REQUIRE(contains(aBox, bBox));
        REQUIRE(contains(bBox, aBox));
    }
}
TEST_CASE("Partial (contains_alignedbox_alignedbox)")
{
    {
        AlignedBox<Real, 2> aBox(0, 0, 3, 3);
        AlignedBox<Real, 2> bBox(1, 1, 4, 2);
        REQUIRE(!contains(aBox, bBox));
        REQUIRE(!contains(bBox, aBox));
    }
    {
        AlignedBox<Real, 2> aBox(0, 0, 3, 3);
        AlignedBox<Real, 2> bBox(-1, 1, 2, 2);
        REQUIRE(!contains(aBox, bBox));
        REQUIRE(!contains(bBox, aBox));
    }
    {
        AlignedBox<Real, 2> aBox(0, 0, 3, 3);
        AlignedBox<Real, 2> bBox(1, 1, 2, 4);
        REQUIRE(!contains(aBox, bBox));
        REQUIRE(!contains(bBox, aBox));
    }
    {
        AlignedBox<Real, 2> aBox(0, 0, 3, 3);
        AlignedBox<Real, 2> bBox(1, -1, 2, 2);
        REQUIRE(!contains(aBox, bBox));
        REQUIRE(!contains(bBox, aBox));
    }
}