7 void require(
bool condition,
const char *message)
11 throw std::runtime_error(message);
17 for (
const auto &entry :
mesh.simplexFactory<
order>().liveSimplices())
19 const auto &
simplex = entry.second;
21 if constexpr (
order > 0)
23 for (
const auto &child :
simplex->children())
25 require(
mesh.simplexFactory<
order - 1>().get(child->xID) == child,
"Child is not shared");
26 require(child->parents().at(
simplex->xID) == simplex,
"Missing reciprocal parent");
30 if constexpr (
order > 0)
36 void exercise(
const std::string &path)
38 std::weak_ptr<model::Simplex<3, 0>> weakVertex;
39 std::shared_ptr<model::Simplex<3, 2>> retainedFace;
43 auto root =
mesh.simplices().begin()->second;
46 std::reverse(reversed.begin(), reversed.end());
47 require(
mesh.simplexFactory<3>().getOrCreate(reversed,
root->region->regionID) == root,
48 "Canonical factory lookup duplicated a simplex");
49 const auto before =
mesh.simplexFactory<3>().liveSimplices().size();
50 bool rejected =
false;
53 mesh.simplexFactory<3>().getOrCreate(
key,
root->region->regionID + 100000);
55 catch (
const std::runtime_error &)
59 require(rejected,
"Conflicting region was accepted");
60 require(
mesh.simplexFactory<3>().liveSimplices().size() == before,
"Failed creation changed the hierarchy");
63 const auto regionID =
root->region->regionID;
65 const auto children =
root->children();
66 std::weak_ptr<model::Simplex<3, 3>> previous =
root;
69 require(previous.expired(),
"Children retain their deleted parent");
70 root =
mesh.simplexFactory<3>().getOrCreate(
key, regionID);
71 mesh.simplices().emplace(
key, root);
72 for (
const auto &child : children)
74 require(child->parents().at(
key) == root,
"Recreation did not replace expired parent link");
78 retainedFace =
root->children().front();
79 weakVertex = retainedFace->children().front()->children().front();
80 std::weak_ptr<model::Simplex<3, 3>> weakRoot =
root;
82 mesh.simplices().clear();
83 require(weakRoot.expired(),
"Parent/child ownership cycle retains volume simplex");
84 require(retainedFace->parents().empty(),
"Expired parents remain in topology queries");
85 require(
mesh.simplexFactory<3>().liveSimplices().empty(),
"Factory owns volume simplices");
86 mesh.simplexFactory<3>().pruneExpired();
87 require(
mesh.simplexFactory<3>().empty(),
"Expired factory entries were not pruned");
88 require(!weakVertex.expired(),
"Retained face lost its children");
90 require(retainedFace->parents().empty(),
"Retained face has dangling parent links");
91 for (
const auto*
vertex : retainedFace->vertices())
93 require(
vertex !=
nullptr &&
vertex->P0.allFinite(),
"Retained simplex lost its vertex geometry");
96 require(weakVertex.expired(),
"Simplex hierarchy leaked after final owner release");
105 for (
const auto *name : {
"bicrystal_48",
"polycrystalCube_10_periodicX",
"polycrystalCube_10_periodicXY"})
107 exercise(std::string(
argv[1]) +
"/Library/Meshes/" + name +
".msh");
109 std::cout <<
"PASS: shared simplex identity, weak parent links, failed creation, and lifetime cleanup\n";
112 catch (
const std::exception &error)
114 std::cerr << error.what() <<
'\n';
void exercise(const std::filesystem::path &root, int rank, bool clamp)
void require(bool value, const char *message)
void check(bool ok, const char *message)