@@ -293,5 +293,81 @@ export namespace CppUtils::UnitTest::Container::MeshNetwork
293293 }
294294 }
295295 });
296+
297+ suite.addTest("Attach (operator>>)", [&] {
298+ auto root = StringMeshNode::makeRoot("root");
299+ auto child = StringMeshNode::make("child");
300+
301+ root["branch"] >> child;
302+
303+ auto rootAccessor = root->sharedAccess();
304+ const auto& branches = rootAccessor->value.branches;
305+ suite.expectEqual(std::size(branches), 1uz);
306+ const auto& children = branches.at("branch");
307+ suite.expectEqual(std::size(children), 1uz);
308+ auto childAccessor = child->sharedAccess();
309+ suite.expectEqual(childAccessor->getDistanceFromRoot(), 1uz);
310+ });
311+
312+ suite.addTest("Chaining (operator>>)", [&] {
313+ auto root = StringMeshNode::makeRoot("root");
314+ auto child1 = StringMeshNode::make("child1");
315+ auto child2 = StringMeshNode::make("child2");
316+
317+ root["branch1"] >> child1["branch2"] >> child2;
318+
319+ auto rootAccessor = root->sharedAccess();
320+ const auto& rootBranches = rootAccessor->value.branches;
321+ suite.expectEqual(std::size(rootBranches), 1uz);
322+ auto child1Accessor = child1->sharedAccess();
323+ const auto& child1Branches = child1Accessor->value.branches;
324+ suite.expectEqual(std::size(child1Branches), 1uz);
325+ });
326+
327+ suite.addTest("Unlink (operator-)", [&] {
328+ auto root = StringMeshNode::makeRoot("root");
329+ auto child = StringMeshNode::make("child");
330+
331+ root["branch"] >> child;
332+ root["branch"] - child;
333+
334+ auto rootAccessor = root->sharedAccess();
335+ const auto& branches = rootAccessor->value.branches;
336+ suite.expect(std::empty(branches));
337+ });
338+
339+ suite.addTest("Bidirectional link (operator&)", [&] {
340+ auto fruit = StringMeshNode::makeRoot("fruit");
341+ auto apple = StringMeshNode::make("apple");
342+
343+ fruit["elements"] & apple["category"];
344+ {
345+ auto fruitAccessor = fruit->sharedAccess();
346+ const auto& fruitBranches = fruitAccessor->value.branches;
347+ suite.expectEqual(std::size(fruitBranches), 1uz);
348+ suite.expectEqual(std::size(fruitBranches.at("category")), 1uz);
349+
350+ auto appleAccessor = apple->sharedAccess();
351+ const auto& appleBranches = appleAccessor->value.branches;
352+ suite.expectEqual(std::size(appleBranches), 1uz);
353+ suite.expectEqual(std::size(appleBranches.at("elements")), 1uz);
354+ }
355+ });
356+
357+ suite.addTest("Bidirectional unlink (operator/)", [&] {
358+ auto fruit = StringMeshNode::makeRoot("fruit");
359+ auto apple = StringMeshNode::make("apple");
360+
361+ fruit["elements"] & apple["category"];
362+ fruit["elements"] / apple["category"];
363+ {
364+ auto fruitAccessor = fruit->sharedAccess();
365+ const auto& fruitBranches = fruitAccessor->value.branches;
366+ suite.expect(std::empty(fruitBranches));
367+ auto appleAccessor = apple->sharedAccess();
368+ const auto& appleBranches = appleAccessor->value.branches;
369+ suite.expect(std::empty(appleBranches));
370+ }
371+ });
296372 }};
297373}
0 commit comments