#include <catch.hpp>

#include <ItemType.hpp>

TEST_CASE("ItemType", "[connectivity]") {

  ItemType node_type = ItemType::node;
  ItemType edge_type = ItemType::edge;
  ItemType face_type = ItemType::face;
  ItemType cell_type = ItemType::cell;

  SECTION("checking for item type differences") {
    REQUIRE(((node_type != edge_type) and
             (node_type != face_type) and
             (node_type != cell_type) and
             (edge_type != face_type) and
             (edge_type != cell_type) and
             (face_type != cell_type)));
  }

  SECTION("checking for item type names") {
    REQUIRE(itemName(node_type)=="node");
    REQUIRE(itemName(edge_type)=="edge");
    REQUIRE(itemName(face_type)=="face");
    REQUIRE(itemName(cell_type)=="cell");
  }

  SECTION("checking for item ids in 1d") {
    REQUIRE(ItemId<1>::itemId(cell_type)==0);
    REQUIRE(ItemId<1>::itemId(edge_type)==1);
    REQUIRE(ItemId<1>::itemId(face_type)==1);
    REQUIRE(ItemId<1>::itemId(node_type)==1);
  }

  SECTION("checking for item ids in 2d") {
    REQUIRE(ItemId<2>::itemId(cell_type)==0);
    REQUIRE(ItemId<2>::itemId(edge_type)==1);
    REQUIRE(ItemId<2>::itemId(face_type)==1);
    REQUIRE(ItemId<2>::itemId(node_type)==2);
  }

  SECTION("checking for item ids in 3d") {
    REQUIRE(ItemId<3>::itemId(cell_type)==0);
    REQUIRE(ItemId<3>::itemId(edge_type)==1);
    REQUIRE(ItemId<3>::itemId(face_type)==2);
    REQUIRE(ItemId<3>::itemId(node_type)==3);
  }
}