@@ -11,17 +11,22 @@ export namespace CppUtils::UnitTest::Container::NetworkPtr
1111 using StringNetworkPtr = CppUtils::Container::NetworkPtr<std::string>;
1212
1313 suite.addTest("Create root", [&] {
14- auto _ = NetworkPtr::makeRoot("Root");
14+ auto root = NetworkPtr::makeRoot("Root");
15+ auto accessor = root->sharedAccess();
16+ suite.expectEqual(accessor->getDistanceFromRoot(), 0uz);
1517 });
1618
1719 suite.addTest("Create node", [&] {
18- auto _ = NetworkPtr::make("Node");
20+ auto node = NetworkPtr::make("Node");
21+ auto accessor = node->sharedAccess();
22+ suite.expectEqual(accessor->getDistanceFromRoot(), std::numeric_limits<std::size_t>::max());
1923 });
2024
2125 suite.addTest("Read value", [&] {
2226 auto node = StringNetworkPtr::make("Node");
2327 {
2428 auto accessor = node->sharedAccess();
29+ suite.expectEqual(accessor->getDistanceFromRoot(), std::numeric_limits<std::size_t>::max());
2530 suite.expectEqual(accessor->value, "Node");
2631 }
2732 });
@@ -45,7 +50,9 @@ export namespace CppUtils::UnitTest::Container::NetworkPtr
4550 auto accessor = CppUtils::Thread::MultipleAccessor{*root, *branch};
4651 auto& rootRef = std::get<0>(accessor.values);
4752 auto& branchRef = std::get<1>(accessor.values);
53+ suite.expectEqual(branchRef.getDistanceFromRoot(), std::numeric_limits<std::size_t>::max());
4854 rootRef.attachChild(branch, branchRef);
55+ suite.expectEqual(branchRef.getDistanceFromRoot(), 1uz);
4956 }
5057 Logger::print("Persistance de Branch\n");
5158 });
@@ -59,19 +66,46 @@ export namespace CppUtils::UnitTest::Container::NetworkPtr
5966 auto& rootRef = std::get<0>(accessor.values);
6067 auto& branchRef = std::get<1>(accessor.values);
6168 rootRef.attachChild(branch, branchRef);
69+ suite.expectEqual(rootRef.getDistanceFromRoot(), 0uz);
70+ suite.expectEqual(branchRef.getDistanceFromRoot(), 1uz);
6271 }
6372 {
6473 auto leaf = NetworkPtr::make("Leaf", 2uz);
6574 auto accessor = CppUtils::Thread::MultipleAccessor{*branch, *leaf};
6675 auto& branchRef = std::get<0>(accessor.values);
6776 auto& leafRef = std::get<1>(accessor.values);
6877 branchRef.attachChild(leaf, leafRef);
78+ suite.expectEqual(branchRef.getDistanceFromRoot(), 1uz);
79+ suite.expectEqual(leafRef.getDistanceFromRoot(), 2uz);
6980 }
7081 Logger::print("Persistance de Leaf\n");
7182 }
7283 Logger::print("Persistance de Branch\n");
7384 });
7485
86+ suite.addTest("Cut leaf", [&] {
87+ auto root = NetworkPtr::makeRoot("Root");
88+ {
89+ auto leaf = NetworkPtr::make("Leaf", 1uz);
90+ {
91+ auto accessor = CppUtils::Thread::MultipleAccessor{*root, *leaf};
92+ auto& rootRef = std::get<0>(accessor.values);
93+ auto& leafRef = std::get<1>(accessor.values);
94+ suite.expectEqual(leafRef.getDistanceFromRoot(), std::numeric_limits<std::size_t>::max());
95+ rootRef.attachChild(leaf, leafRef);
96+ suite.expectEqual(leafRef.getDistanceFromRoot(), 1uz);
97+ }
98+ Logger::print("Persistance de Leaf\n");
99+ auto accessor = CppUtils::Thread::MultipleAccessor{*root, *leaf};
100+ auto& rootRef = std::get<0>(accessor.values);
101+ auto& leafRef = std::get<1>(accessor.values);
102+ suite.expectEqual(leafRef.getDistanceFromRoot(), 1uz);
103+ rootRef.detachChild(leaf, leafRef);
104+ suite.expectEqual(leafRef.getDistanceFromRoot(), std::numeric_limits<std::size_t>::max());
105+ }
106+ Logger::print("Non-persistance de Leaf\n");
107+ });
108+
75109 suite.addTest("Cut branch", [&] {
76110 auto root = NetworkPtr::makeRoot("Root");
77111 {
@@ -93,7 +127,9 @@ export namespace CppUtils::UnitTest::Container::NetworkPtr
93127 auto accessor = CppUtils::Thread::MultipleAccessor{*root, *branch};
94128 auto& rootRef = std::get<0>(accessor.values);
95129 auto& branchRef = std::get<1>(accessor.values);
130+ suite.expectEqual(branchRef.getDistanceFromRoot(), 1uz);
96131 rootRef.detachChild(branch, branchRef);
132+ suite.expectEqual(branchRef.getDistanceFromRoot(), std::numeric_limits<std::size_t>::max());
97133 }
98134 Logger::print("Non-persistance de Branch\n");
99135 });
@@ -107,6 +143,8 @@ export namespace CppUtils::UnitTest::Container::NetworkPtr
107143 auto& rootRef = std::get<0>(accessor.values);
108144 auto& branchRef = std::get<1>(accessor.values);
109145 rootRef.attachChild(branch, branchRef);
146+ suite.expectEqual(rootRef.getDistanceFromRoot(), 0uz);
147+ suite.expectEqual(branchRef.getDistanceFromRoot(), 1uz);
110148 }
111149 Logger::print("Persistance de Branch\n");
112150 {
@@ -115,8 +153,72 @@ export namespace CppUtils::UnitTest::Container::NetworkPtr
115153 auto& branchRef = std::get<1>(accessor.values);
116154 Logger::print("Création d'une boucle\n");
117155 branchRef.attachChild(root, rootRef);
156+ suite.expectEqual(rootRef.getDistanceFromRoot(), 0uz);
157+ suite.expectEqual(branchRef.getDistanceFromRoot(), 1uz);
118158 }
119159 Logger::print("Libération de la boucle\n");
120160 });
161+
162+ suite.addTest("Detach child with multiple links", [&] {
163+ auto root = NetworkPtr::makeRoot("Root");
164+ {
165+ auto leaf = NetworkPtr::make("Leaf", 1uz);
166+ {
167+ auto accessor = CppUtils::Thread::MultipleAccessor{*root, *leaf};
168+ auto& rootRef = std::get<0>(accessor.values);
169+ auto& leafRef = std::get<1>(accessor.values);
170+ suite.expectEqual(leafRef.getDistanceFromRoot(), std::numeric_limits<std::size_t>::max());
171+
172+ rootRef.attachChild(leaf, leafRef);
173+ suite.expectEqual(leafRef.getDistanceFromRoot(), 1uz);
174+
175+ rootRef.attachChild(leaf, leafRef);
176+ suite.expectEqual(leafRef.getDistanceFromRoot(), 1uz);
177+
178+ rootRef.detachChild(leaf, leafRef);
179+ suite.expectEqual(leafRef.getDistanceFromRoot(), 1uz);
180+
181+ rootRef.detachChild(leaf, leafRef);
182+ suite.expectEqual(leafRef.getDistanceFromRoot(), std::numeric_limits<std::size_t>::max());
183+ }
184+ Logger::print("Non-persistance de Leaf\n");
185+ }
186+ Logger::print("Persistance de Branch\n");
187+ });
188+
189+ suite.addTest("Attach and detach root on itself", [&] {
190+ auto root = NetworkPtr::makeRoot("Root");
191+ auto accessor = root->uniqueAccess();
192+ accessor->attachChild(root, accessor.value());
193+ suite.expectEqual(accessor->getDistanceFromRoot(), 0uz);
194+ accessor->detachChild(root, accessor.value());
195+ suite.expectEqual(accessor->getDistanceFromRoot(), 0uz);
196+ });
197+
198+ suite.addTest("Attach and detach node on itself", [&] {
199+ auto root = NetworkPtr::makeRoot("Root");
200+ auto node = NetworkPtr::make("Node", 1uz);
201+ {
202+ auto accessor = CppUtils::Thread::MultipleAccessor{*root, *node};
203+ auto& rootRef = std::get<0>(accessor.values);
204+ auto& nodeRef = std::get<1>(accessor.values);
205+ rootRef.attachChild(node, nodeRef);
206+ suite.expectEqual(nodeRef.getDistanceFromRoot(), 1uz);
207+ }
208+ {
209+ auto accessor = node->uniqueAccess();
210+ accessor->attachChild(node, accessor.value());
211+ suite.expectEqual(accessor->getDistanceFromRoot(), 1uz);
212+ accessor->detachChild(node, accessor.value());
213+ suite.expectEqual(accessor->getDistanceFromRoot(), 1uz);
214+ }
215+ {
216+ auto accessor = CppUtils::Thread::MultipleAccessor{*root, *node};
217+ auto& rootRef = std::get<0>(accessor.values);
218+ auto& nodeRef = std::get<1>(accessor.values);
219+ rootRef.detachChild(node, nodeRef);
220+ suite.expectEqual(nodeRef.getDistanceFromRoot(), std::numeric_limits<std::size_t>::max());
221+ }
222+ });
121223 }};
122224}
0 commit comments