TEST(Mesh, MappingLineXZ2)
{
    UnstructuredMesh* msh = createLineElement(GeoLib::Point(1,0,1), GeoLib::Point(2,0,2), CoordinateSystemType::XZ);
    ElementCoordinatesMappingLocal emap(msh, *msh->getElement(0), msh->getGeometricProperty()->getCoordinateSystem());

    GeoLib::Point* p1 = emap.getNodePoint(0);
    GeoLib::Point* p2 = emap.getNodePoint(1);

    ASSERT_EQ(GeoLib::Point(0,0,0), *p1);
    ASSERT_EQ(GeoLib::Point(sqrt(2.),0,0), *p2);
}
TEST(Mesh, MappingTriYZ1)
{
    UnstructuredMesh* msh = createTriangleElement(GeoLib::Point(0,1,1), GeoLib::Point(0,3,1), GeoLib::Point(0,1,3), CoordinateSystemType::YZ);
    ElementCoordinatesMappingLocal emap(msh, *msh->getElement(0), msh->getGeometricProperty()->getCoordinateSystem());

    GeoLib::Point* p1 = emap.getNodePoint(0);
    GeoLib::Point* p2 = emap.getNodePoint(1);
    GeoLib::Point* p3 = emap.getNodePoint(2);

//    ASSERT_EQ(GeoLib::Point(0,0,0), *p1);
//    ASSERT_EQ(GeoLib::Point(2,0,0), *p2);
//    ASSERT_EQ(GeoLib::Point(0,2,0), *p3);

    ASSERT_EQ(GeoLib::Point(1,1,0), *p1);
    ASSERT_EQ(GeoLib::Point(3,1,0), *p2);
    ASSERT_EQ(GeoLib::Point(1,3,0), *p3);
}
void calculateMeshGeometricProperties(UnstructuredMesh &msh)
{
    MeshGeometricProperty* geo_prop = msh.getGeometricProperty();
    //double tol = std::numeric_limits<double>::epsilon();

    // coordinate systems
    geo_prop->setCoordinateSystem(getCoordinateSystemFromBoundingBox(geo_prop->getBoundingBox()));

    //
//    GeoLib::Point pt_diff = geo_prop->getBoundingBox().getMaxPoint() - geo_prop->getBoundingBox().getMinPoint();
//    double max_len = std::max(pt_diff[0], pt_diff[1]);
//    max_len = std::max(max_len, pt_diff[2]);
//    double min_edge_len = max_len / msh.getNumberOfNodes();
    double min_edge_len = calculateMeshMinimumEdgeLength(msh);
    geo_prop->setMinEdgeLength(min_edge_len);

    INFO("-> calculate mesh geometric properties");
    INFO("* min. edge length = %f", min_edge_len);

}