Added support for GMSH22 surface loading
PiperOrigin-RevId: 629734063 Change-Id: I6a250b81de4e7c8f7520795bfe74a81d719dfb50
This commit is contained in:
committed by
Copybara-Service
parent
57b1dbac65
commit
131b1745db
+108
-3
@@ -23,6 +23,8 @@
|
||||
#include <mujoco/mujoco.h>
|
||||
#include "test/fixture.h"
|
||||
|
||||
|
||||
|
||||
namespace mujoco {
|
||||
namespace {
|
||||
|
||||
@@ -32,6 +34,8 @@ using ::testing::HasSubstr;
|
||||
using UserFlexTest = MujocoTest;
|
||||
|
||||
|
||||
|
||||
|
||||
TEST_F(UserFlexTest, ParentMustHaveName) {
|
||||
static constexpr char xml[] = R"(
|
||||
<mujoco>
|
||||
@@ -255,6 +259,56 @@ TEST_F(UserFlexTest, LoadMSHBinaryGMSH_22_Success) {
|
||||
mj_deleteData(d);
|
||||
}
|
||||
|
||||
TEST_F(UserFlexTest, LoadMSHSurfaceBinaryGMSH_41_Success) {
|
||||
const std::string xml_path =
|
||||
GetTestDataFilePath("user/testdata/cube_41_binary_surf_gmshApp.xml");
|
||||
std::array<char, 1024> error;
|
||||
mjModel* m = mj_loadXML(xml_path.c_str(), 0, error.data(), error.size());
|
||||
ASSERT_THAT(m, NotNull()) << error.data();
|
||||
mjData* d = mj_makeData(m);
|
||||
EXPECT_EQ(m->nflexvert, 14);
|
||||
EXPECT_EQ(m->nflexelem, 24);
|
||||
|
||||
// first node x y z
|
||||
EXPECT_EQ(m->flex_xvert0[0], -0.5 );
|
||||
EXPECT_EQ(m->flex_xvert0[1], -0.5 );
|
||||
EXPECT_EQ(m->flex_xvert0[2], 0 );
|
||||
|
||||
// first element
|
||||
EXPECT_EQ(m->flex_elem[0], 9-1 );
|
||||
EXPECT_EQ(m->flex_elem[1], 4-1 );
|
||||
EXPECT_EQ(m->flex_elem[2], 3-1 );
|
||||
|
||||
mj_step(m, d);
|
||||
mj_deleteModel(m);
|
||||
mj_deleteData(d);
|
||||
}
|
||||
|
||||
TEST_F(UserFlexTest, LoadMSHSurfaceBinaryGMSH_22_Success) {
|
||||
const std::string xml_path =
|
||||
GetTestDataFilePath("user/testdata/cube_22_binary_surf_gmshApp.xml");
|
||||
std::array<char, 1024> error;
|
||||
mjModel* m = mj_loadXML(xml_path.c_str(), 0, error.data(), error.size());
|
||||
ASSERT_THAT(m, NotNull()) << error.data();
|
||||
mjData* d = mj_makeData(m);
|
||||
EXPECT_EQ(m->nflexvert, 14);
|
||||
EXPECT_EQ(m->nflexelem, 24);
|
||||
|
||||
// first node x y z
|
||||
EXPECT_EQ(m->flex_xvert0[0], -0.5 );
|
||||
EXPECT_EQ(m->flex_xvert0[1], -0.5 );
|
||||
EXPECT_EQ(m->flex_xvert0[2], 0 );
|
||||
|
||||
// first element
|
||||
EXPECT_EQ(m->flex_elem[0], 9-1 );
|
||||
EXPECT_EQ(m->flex_elem[1], 4-1 );
|
||||
EXPECT_EQ(m->flex_elem[2], 3-1 );
|
||||
|
||||
mj_step(m, d);
|
||||
mj_deleteModel(m);
|
||||
mj_deleteData(d);
|
||||
}
|
||||
|
||||
TEST_F(UserFlexTest, LoadMSHBinaryFTETWILD_22_Success) {
|
||||
const std::string xml_path =
|
||||
GetTestDataFilePath("user/testdata/shark_22_binary_fTetWild.xml");
|
||||
@@ -297,6 +351,56 @@ TEST_F(UserFlexTest, LoadMSHASCIIGMSH_22_Success) {
|
||||
mj_deleteData(d);
|
||||
}
|
||||
|
||||
TEST_F(UserFlexTest, LoadMSHSurfaceASCIIGMSH_41_Success) {
|
||||
const std::string xml_path =
|
||||
GetTestDataFilePath("user/testdata/cube_41_ascii_surf_gmshApp.xml");
|
||||
std::array<char, 1024> error;
|
||||
mjModel* m = mj_loadXML(xml_path.c_str(), 0, error.data(), error.size());
|
||||
ASSERT_THAT(m, NotNull()) << error.data();
|
||||
mjData* d = mj_makeData(m);
|
||||
EXPECT_EQ(m->nflexvert, 14);
|
||||
EXPECT_EQ(m->nflexelem, 24);
|
||||
|
||||
// first node x y z
|
||||
EXPECT_EQ(m->flex_xvert0[0], -0.5 );
|
||||
EXPECT_EQ(m->flex_xvert0[1], -0.5 );
|
||||
EXPECT_EQ(m->flex_xvert0[2], 0 );
|
||||
|
||||
// first element
|
||||
EXPECT_EQ(m->flex_elem[0], 9-1 );
|
||||
EXPECT_EQ(m->flex_elem[1], 4-1 );
|
||||
EXPECT_EQ(m->flex_elem[2], 3-1 );
|
||||
|
||||
mj_step(m, d);
|
||||
mj_deleteModel(m);
|
||||
mj_deleteData(d);
|
||||
}
|
||||
|
||||
TEST_F(UserFlexTest, LoadMSHSurfaceASCIIGMSH_22_Success) {
|
||||
const std::string xml_path =
|
||||
GetTestDataFilePath("user/testdata/cube_22_ascii_surf_gmshApp.xml");
|
||||
std::array<char, 1024> error;
|
||||
mjModel* m = mj_loadXML(xml_path.c_str(), 0, error.data(), error.size());
|
||||
ASSERT_THAT(m, NotNull()) << error.data();
|
||||
mjData* d = mj_makeData(m);
|
||||
EXPECT_EQ(m->nflexvert, 14);
|
||||
EXPECT_EQ(m->nflexelem, 24);
|
||||
|
||||
// first node x y z
|
||||
EXPECT_EQ(m->flex_xvert0[0], -0.5 );
|
||||
EXPECT_EQ(m->flex_xvert0[1], -0.5 );
|
||||
EXPECT_EQ(m->flex_xvert0[2], 0 );
|
||||
|
||||
// first element
|
||||
EXPECT_EQ(m->flex_elem[0], 9-1 );
|
||||
EXPECT_EQ(m->flex_elem[1], 4-1 );
|
||||
EXPECT_EQ(m->flex_elem[2], 3-1 );
|
||||
|
||||
mj_step(m, d);
|
||||
mj_deleteModel(m);
|
||||
mj_deleteData(d);
|
||||
}
|
||||
|
||||
TEST_F(UserFlexTest, LoadMSHASCIIFTETWILD_22_Success) {
|
||||
const std::string xml_path =
|
||||
GetTestDataFilePath("user/testdata/shark_22_ascii_fTetWild.xml");
|
||||
@@ -329,7 +433,7 @@ TEST_F(UserFlexTest, LoadMSHASCII_41_MissingNodeIndex_Fail) {
|
||||
std::array<char, 1024> error;
|
||||
mjModel* m = mj_loadXML(xml_path.c_str(), 0, error.data(), error.size());
|
||||
EXPECT_THAT(error.data(), HasSubstr(
|
||||
"XML Error: Element size must be a multiple of dim+1"));
|
||||
"XML Error: Error: Node tags must be sequential"));
|
||||
mj_deleteModel(m);
|
||||
}
|
||||
|
||||
@@ -361,8 +465,9 @@ TEST_F(UserFlexTest, LoadMSHASCII_22_MissingNumNodes_Fail) {
|
||||
"user/testdata/malformed_shark_22_ascii_missing_num_nodes.xml");
|
||||
std::array<char, 1024> error;
|
||||
mjModel* m = mj_loadXML(xml_path.c_str(), 0, error.data(), error.size());
|
||||
EXPECT_THAT(error.data(), HasSubstr(
|
||||
"XML Error: Element size must be a multiple of dim+1"));
|
||||
// TODO(mohammadhamid): Replace with an assertion about the error message. For
|
||||
// some reason, on Windows the error message is different on GH Actions
|
||||
EXPECT_THAT(m, IsNull());
|
||||
mj_deleteModel(m);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user