#include "RifVtkImportUtil.h" #include "RiaTestDataDirectory.h" #include #include "pugixml.hpp" #include #include #include // Helper: parse an XML string and return the child of static pugi::xml_node parsePiece( pugi::xml_document& doc, const std::string& xml ) { doc.load_string( xml.c_str() ); return doc.child( "UnstructuredGrid" ).child( "Piece" ); } //-------------------------------------------------------------------------------------------------- // parsePvdDatasets //-------------------------------------------------------------------------------------------------- TEST( RifVtkImportUtilTest, ParsePvdDatasets_ReturnsCorrectCount ) { std::filesystem::path pvdPath = std::filesystem::path( TEST_DATA_DIR ) / "RifVtkReader" / "model.pvd"; auto datasets = RifVtkImportUtil::parsePvdDatasets( pvdPath ); ASSERT_EQ( datasets.size(), 2u ); EXPECT_DOUBLE_EQ( datasets[0].timestep, 1.0 ); EXPECT_DOUBLE_EQ( datasets[1].timestep, 2.0 ); } TEST( RifVtkImportUtilTest, ParsePvdDatasets_PathsAreAbsolute ) { std::filesystem::path pvdPath = std::filesystem::path( TEST_DATA_DIR ) / "RifVtkReader" / "model.pvd"; auto datasets = RifVtkImportUtil::parsePvdDatasets( pvdPath ); for ( const auto& ds : datasets ) { EXPECT_TRUE( ds.filepath.is_absolute() ); EXPECT_TRUE( std::filesystem::exists( ds.filepath ) ); } } TEST( RifVtkImportUtilTest, ParsePvdDatasets_MissingFile ) { auto datasets = RifVtkImportUtil::parsePvdDatasets( "nonexistent.pvd" ); EXPECT_TRUE( datasets.empty() ); } //-------------------------------------------------------------------------------------------------- // readPoints //-------------------------------------------------------------------------------------------------- TEST( RifVtkImportUtilTest, ReadPoints_ReturnsCoordinatesWithNegatedZ ) { pugi::xml_document doc; auto piece = parsePiece( doc, R"( 1 2 3 4 5 6 )" ); auto points = RifVtkImportUtil::readPoints( piece ); ASSERT_EQ( points.size(), 2u ); EXPECT_DOUBLE_EQ( points[0].x(), 1.0 ); EXPECT_DOUBLE_EQ( points[0].y(), 2.0 ); EXPECT_DOUBLE_EQ( points[0].z(), -3.0 ); // z is negated EXPECT_DOUBLE_EQ( points[1].x(), 4.0 ); EXPECT_DOUBLE_EQ( points[1].y(), 5.0 ); EXPECT_DOUBLE_EQ( points[1].z(), -6.0 ); // z is negated } TEST( RifVtkImportUtilTest, ReadPoints_MissingPointsSection ) { pugi::xml_document doc; auto piece = parsePiece( doc, R"( )" ); auto points = RifVtkImportUtil::readPoints( piece ); EXPECT_TRUE( points.empty() ); } TEST( RifVtkImportUtilTest, ReadPoints_WrongDataArrayName ) { pugi::xml_document doc; auto piece = parsePiece( doc, R"( 1 2 3 )" ); auto points = RifVtkImportUtil::readPoints( piece ); EXPECT_TRUE( points.empty() ); } //-------------------------------------------------------------------------------------------------- // readDisplacements //-------------------------------------------------------------------------------------------------- TEST( RifVtkImportUtilTest, ReadDisplacements_ReturnsVectorsWithNegatedZ ) { pugi::xml_document doc; auto piece = parsePiece( doc, R"( 0.1 0.2 0.3 -0.4 -0.5 -0.6 )" ); auto displacements = RifVtkImportUtil::readDisplacements( piece ); ASSERT_EQ( displacements.size(), 2u ); EXPECT_NEAR( displacements[0].x(), 0.1f, 1e-6f ); EXPECT_NEAR( displacements[0].y(), 0.2f, 1e-6f ); EXPECT_NEAR( displacements[0].z(), -0.3f, 1e-6f ); // z is negated EXPECT_NEAR( displacements[1].x(), -0.4f, 1e-6f ); EXPECT_NEAR( displacements[1].y(), -0.5f, 1e-6f ); EXPECT_NEAR( displacements[1].z(), 0.6f, 1e-6f ); // z is negated } TEST( RifVtkImportUtilTest, ReadDisplacements_MissingPointDataSection ) { pugi::xml_document doc; auto piece = parsePiece( doc, R"( )" ); auto displacements = RifVtkImportUtil::readDisplacements( piece ); EXPECT_TRUE( displacements.empty() ); } TEST( RifVtkImportUtilTest, ReadDisplacements_WrongFieldName ) { pugi::xml_document doc; auto piece = parsePiece( doc, R"( 1 2 3 )" ); auto displacements = RifVtkImportUtil::readDisplacements( piece ); EXPECT_TRUE( displacements.empty() ); } //-------------------------------------------------------------------------------------------------- // readConnectivity //-------------------------------------------------------------------------------------------------- TEST( RifVtkImportUtilTest, ReadConnectivity_ReturnsIndices ) { pugi::xml_document doc; auto piece = parsePiece( doc, R"( 0 1 4 3 6 7 10 9 1 2 5 4 7 8 11 10 8 16 12 12 )" ); auto connectivity = RifVtkImportUtil::readConnectivity( piece ); ASSERT_EQ( connectivity.size(), 16u ); EXPECT_EQ( connectivity[0], 0u ); EXPECT_EQ( connectivity[1], 1u ); EXPECT_EQ( connectivity[7], 9u ); EXPECT_EQ( connectivity[8], 1u ); EXPECT_EQ( connectivity[15], 10u ); } TEST( RifVtkImportUtilTest, ReadConnectivity_MissingCellsSection ) { pugi::xml_document doc; auto piece = parsePiece( doc, R"( )" ); auto connectivity = RifVtkImportUtil::readConnectivity( piece ); EXPECT_TRUE( connectivity.empty() ); } //-------------------------------------------------------------------------------------------------- // readProperties //-------------------------------------------------------------------------------------------------- TEST( RifVtkImportUtilTest, ReadProperties_ReturnsNamedScalars ) { pugi::xml_document doc; auto piece = parsePiece( doc, R"( 100.0 200.0 1.5 2.5 )" ); auto properties = RifVtkImportUtil::readProperties( piece ); ASSERT_EQ( properties.size(), 2u ); ASSERT_TRUE( properties.count( "Stress" ) > 0 ); ASSERT_TRUE( properties.count( "Pressure" ) > 0 ); ASSERT_EQ( properties["Stress"].size(), 2u ); EXPECT_FLOAT_EQ( properties["Stress"][0], 100.0f ); EXPECT_FLOAT_EQ( properties["Stress"][1], 200.0f ); ASSERT_EQ( properties["Pressure"].size(), 2u ); EXPECT_FLOAT_EQ( properties["Pressure"][0], 1.5f ); EXPECT_FLOAT_EQ( properties["Pressure"][1], 2.5f ); } TEST( RifVtkImportUtilTest, ReadProperties_HandlesNaN ) { pugi::xml_document doc; auto piece = parsePiece( doc, R"( 1.0 nan 3.0 )" ); auto properties = RifVtkImportUtil::readProperties( piece ); ASSERT_TRUE( properties.count( "Perm" ) > 0 ); ASSERT_EQ( properties["Perm"].size(), 3u ); EXPECT_FLOAT_EQ( properties["Perm"][0], 1.0f ); EXPECT_TRUE( std::isnan( properties["Perm"][1] ) ); EXPECT_FLOAT_EQ( properties["Perm"][2], 3.0f ); } TEST( RifVtkImportUtilTest, ReadProperties_MissingCellDataSection ) { pugi::xml_document doc; auto piece = parsePiece( doc, R"( )" ); auto properties = RifVtkImportUtil::readProperties( piece ); EXPECT_TRUE( properties.empty() ); }