#include #include #include "serif/discretization/domain/mesh/topology.hpp" #include "serif/discretization/domain/physical_domains.hpp" #include "serif/discretization/domain/relation/relations.hpp" #include "serif/discretization/domain/relation/validation/runtime.hpp" #include "serif/discretization/domain/schema/schemas.hpp" #include "serif/discretization/domain/schema/validation/connected.hpp" #include "serif/discretization/domain/types.hpp" #include "serif/tests/test_tags.hpp" #include "serif/tests/discritization/domain/domain_test_utils.hpp" namespace domain = serif::discretization::domain; namespace relation = domain::relation; namespace schema = domain::schema; namespace validation = schema::validation; using domain::mesh::MeshTopology; TEST_CASE( "Connected Accepts Face Connected Atomic And Composite Domains", tags::unit &tags::mesh &tags::utils &tags::domain ) { const mfem::Mesh mesh = domain_test_utils::make_layered_mesh(); const MeshTopology topology{mesh}; const auto coreResult = validation::RelationValidator>::template validate(topology); REQUIRE(coreResult); REQUIRE(coreResult.connectedDiagnostics.has_value()); CHECK(coreResult.connectedDiagnostics->domainElementCount == 1); CHECK(coreResult.connectedDiagnostics->visitedElementCount == 1); const auto stellarResult = validation::RelationValidator>::template validate(topology); REQUIRE(stellarResult); REQUIRE(stellarResult.connectedDiagnostics.has_value()); CHECK(stellarResult.connectedDiagnostics->domainElementCount == 9); CHECK(stellarResult.connectedDiagnostics->visitedElementCount == 9); } TEST_CASE( "Connected Rejects An Absent Domain", tags::unit &tags::mesh &tags::utils &tags::domain ) { const mfem::Mesh mesh = domain_test_utils::make_grid_mesh(2, 1, {2, 2}, {}); const auto result = validation::RelationValidator>::template validate(MeshTopology{mesh}); CHECK_FALSE(result); CHECK(result.failure == validation::RelationValidationFailure::DomainAbsent); REQUIRE(result.connectedDiagnostics.has_value()); CHECK(result.connectedDiagnostics->domainElementCount == 0); CHECK(result.connectedDiagnostics->visitedElementCount == 0); } TEST_CASE( "Connected Rejects Multiple Face Disconnected Components", tags::unit &tags::mesh &tags::utils &tags::domain ) { const mfem::Mesh mesh = domain_test_utils::make_grid_mesh(3, 1, {1, 2, 1}, {}); const auto result = validation::RelationValidator>::template validate(MeshTopology{mesh}); CHECK_FALSE(result); CHECK(result.failure == validation::RelationValidationFailure::DomainDisconnected); REQUIRE(result.connectedDiagnostics.has_value()); CHECK(result.connectedDiagnostics->domainElementCount == 2); CHECK(result.connectedDiagnostics->visitedElementCount == 1); CHECK(result.connectedDiagnostics->elementID >= 0); }