// Description: Testing for Gf2
// DocumentationOf: gf2.h
#include "test/test_init.h"
#include "pastel/sys/gf2.h"
TEST_CASE("Gf2 (Gf2)")
{
    {
        using F = Gf2<1>;
        REQUIRE(F(0) + F(0) == F(0));
        REQUIRE(F(0) + F(1) == F(1));
        REQUIRE(F(1) + F(0) == F(1));
        REQUIRE(F(1) + F(1) == F(0));
        REQUIRE(F(0) * F(0) == F(0));
        REQUIRE(F(0) * F(1) == F(0));
        REQUIRE(F(1) * F(0) == F(0));
        REQUIRE(F(1) * F(1) == F(1));
        REQUIRE((F(0) << 1) == F(0));
        REQUIRE((F(1) << 1) == F(0));
        REQUIRE((F(0) << 2) == F(0));
        REQUIRE((F(1) << 2) == F(0));
    }
    {
        using F = Gf2<2>;
        REQUIRE(F(0) + F(0) == F(0));
        REQUIRE(F(0) + F(1) == F(1));
        REQUIRE(F(0) + F(2) == F(2));
        REQUIRE(F(0) + F(3) == F(3));
        REQUIRE(F(1) + F(0) == F(1));
        REQUIRE(F(1) + F(1) == F(0));
        REQUIRE(F(1) + F(2) == F(3));
        REQUIRE(F(1) + F(3) == F(2));
        REQUIRE(F(2) + F(0) == F(2));
        REQUIRE(F(2) + F(1) == F(3));
        REQUIRE(F(2) + F(2) == F(0));
        REQUIRE(F(2) + F(3) == F(1));
        REQUIRE(F(3) + F(0) == F(3));
        REQUIRE(F(3) + F(1) == F(2));
        REQUIRE(F(3) + F(2) == F(1));
        REQUIRE(F(3) + F(3) == F(0));
        REQUIRE(F(0) * F(0) == F(0));
        REQUIRE(F(0) * F(1) == F(0));
        REQUIRE(F(0) * F(2) == F(0));
        REQUIRE(F(0) * F(3) == F(0));
        REQUIRE(F(1) * F(0) == F(0));
        REQUIRE(F(1) * F(1) == F(1));
        REQUIRE(F(1) * F(2) == F(2));
        REQUIRE(F(1) * F(3) == F(3));
        REQUIRE(F(2) * F(0) == F(0));
        REQUIRE(F(2) * F(1) == F(2));
        REQUIRE(F(2) * F(2) == F(3));
        REQUIRE(F(2) * F(3) == F(1));
        REQUIRE(F(3) * F(0) == F(0));
        REQUIRE(F(3) * F(1) == F(3));
        REQUIRE(F(3) * F(2) == F(1));
        REQUIRE(F(3) * F(3) == F(2));
        REQUIRE((F(0) << 1) == F(0) * F(2));
        REQUIRE((F(1) << 1) == F(1) * F(2));
        REQUIRE((F(2) << 1) == F(2) * F(2));
        REQUIRE((F(3) << 1) == F(3) * F(2));
        REQUIRE((F(0) << 2) == F(0) * F(2) * F(2));
        REQUIRE((F(1) << 2) == F(1) * F(2) * F(2));
        REQUIRE((F(2) << 2) == F(2) * F(2) * F(2));
        REQUIRE((F(3) << 2) == F(3) * F(2) * F(2));
    }
}