2 * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.yangtools.yang.data.tree.spi;
10 import static org.junit.jupiter.api.Assertions.assertEquals;
11 import static org.junit.jupiter.api.Assertions.assertNull;
12 import static org.junit.jupiter.api.Assertions.assertThrows;
13 import static org.mockito.Mockito.doReturn;
14 import static org.mockito.Mockito.mock;
15 import static org.opendaylight.yangtools.yang.data.tree.api.ModificationType.APPEARED;
16 import static org.opendaylight.yangtools.yang.data.tree.api.ModificationType.DELETE;
17 import static org.opendaylight.yangtools.yang.data.tree.api.ModificationType.DISAPPEARED;
18 import static org.opendaylight.yangtools.yang.data.tree.api.ModificationType.SUBTREE_MODIFIED;
19 import static org.opendaylight.yangtools.yang.data.tree.api.ModificationType.UNMODIFIED;
20 import static org.opendaylight.yangtools.yang.data.tree.api.ModificationType.WRITE;
22 import java.util.List;
23 import org.junit.jupiter.api.Test;
24 import org.opendaylight.yangtools.yang.common.QName;
25 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
26 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
27 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
28 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
29 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidate;
30 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidateNode;
31 import org.opendaylight.yangtools.yang.data.tree.api.ModificationType;
33 class DataTreeCandidatesAggregateTest {
34 private static final YangInstanceIdentifier ROOT_PATH = YangInstanceIdentifier.of(QName.create(
35 "urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:store:test:container",
36 "2014-03-13", "container"));
37 private static final YangInstanceIdentifier.PathArgument CHILD_ID = new NodeIdentifier(QName.create(
38 "urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:store:test:container:data",
39 "2014-03-13", "data"));
42 void testLeafUnmodifiedUnmodified() {
43 final var normalizedNode1 = normalizedNode("value1");
44 final var normalizedNode2 = normalizedNode("value1");
45 final var normalizedNode3 = normalizedNode("value1");
47 final var node1 = dataTreeCandidateNode(normalizedNode1, normalizedNode2, UNMODIFIED);
48 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
50 final var node2 = dataTreeCandidateNode(normalizedNode2, normalizedNode3, UNMODIFIED);
51 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
53 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
55 assertEquals(UNMODIFIED, aggregationResult.getRootNode().modificationType());
56 assertEquals("value1", aggregationResult.getRootNode().dataBefore().body());
57 assertEquals("value1", aggregationResult.getRootNode().dataAfter().body());
61 void testLeaftUnmodifiedWrite() {
62 final var normalizedNode1 = normalizedNode("value1");
63 final var normalizedNode2 = normalizedNode("value1");
64 final var normalizedNode3 = normalizedNode("value2");
66 final var node1 = dataTreeCandidateNode(normalizedNode1, normalizedNode2, UNMODIFIED);
67 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
69 final var node2 = dataTreeCandidateNode(normalizedNode2, normalizedNode3, WRITE);
70 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
72 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
74 assertEquals(WRITE, aggregationResult.getRootNode().modificationType());
75 assertEquals("value1", aggregationResult.getRootNode().dataBefore().body());
76 assertEquals("value2", aggregationResult.getRootNode().dataAfter().body());
80 void testLeafUnmodifiedDelete() {
81 final var normalizedNode1 = normalizedNode("value1");
82 final var normalizedNode2 = normalizedNode("value1");
84 final var node1 = dataTreeCandidateNode(normalizedNode1, normalizedNode2, UNMODIFIED);
85 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
87 final var node2 = dataTreeCandidateNode(normalizedNode2, null, DELETE);
88 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
90 DataTreeCandidate aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
92 assertEquals(DELETE, aggregationResult.getRootNode().modificationType());
93 assertEquals("value1", aggregationResult.getRootNode().dataBefore().body());
94 assertNull(aggregationResult.getRootNode().dataAfter());
98 void testLeafUnmodifiedDeleteWithoutDataBefore() {
99 final var node1 = dataTreeCandidateNode(null, null, UNMODIFIED);
100 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
102 final var node2 = dataTreeCandidateNode(null, null, DELETE);
103 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
105 assertThrows(IllegalArgumentException.class,
106 () -> DataTreeCandidates.aggregate(List.of(candidate1, candidate2)));
110 void testLeafUnmodifiedSubtreeModifiedWithoutDataBefore() {
111 final var node1 = dataTreeCandidateNode(null, null, UNMODIFIED);
112 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
114 final var node2 = dataTreeCandidateNode(null, null, SUBTREE_MODIFIED);
115 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
117 assertThrows(IllegalArgumentException.class,
118 () -> DataTreeCandidates.aggregate(List.of(candidate1, candidate2)));
122 void testLeafWriteUnmodified() {
123 final var normalizedNode1 = normalizedNode("value1");
124 final var normalizedNode2 = normalizedNode("value2");
126 final var node1 = dataTreeCandidateNode(normalizedNode1, normalizedNode2, WRITE);
127 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
129 final var node2 = dataTreeCandidateNode(normalizedNode2, normalizedNode2, UNMODIFIED);
130 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
132 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
134 assertEquals(WRITE, aggregationResult.getRootNode().modificationType());
135 assertEquals("value1", aggregationResult.getRootNode().dataBefore().body());
136 assertEquals("value2", aggregationResult.getRootNode().dataAfter().body());
140 void testLeafWriteWrite() {
141 final var normalizedNode1 = normalizedNode("value1");
142 final var normalizedNode2 = normalizedNode("value2");
143 final var normalizedNode3 = normalizedNode("value3");
145 final var node1 = dataTreeCandidateNode(normalizedNode1, normalizedNode2, WRITE);
146 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
148 final var node2 = dataTreeCandidateNode(normalizedNode2, normalizedNode3, WRITE);
149 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
151 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
153 assertEquals(WRITE, aggregationResult.getRootNode().modificationType());
154 assertEquals("value1", aggregationResult.getRootNode().dataBefore().body());
155 assertEquals("value3", aggregationResult.getRootNode().dataAfter().body());
159 void testLeafWriteDeleteWithoutChanges() {
160 final var normalizedNode = normalizedNode("value1");
162 final var node1 = dataTreeCandidateNode(null, normalizedNode, WRITE);
163 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
165 final var node2 = dataTreeCandidateNode(normalizedNode, null, DELETE);
166 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
168 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
170 assertEquals(UNMODIFIED, aggregationResult.getRootNode().modificationType());
171 assertNull(aggregationResult.getRootNode().dataBefore());
172 assertNull(aggregationResult.getRootNode().dataAfter());
176 void testLeafWriteDelete() {
177 final var normalizedNode1 = normalizedNode("value1");
178 final var normalizedNode2 = normalizedNode("value2");
180 final var node1 = dataTreeCandidateNode(normalizedNode1, normalizedNode2, WRITE);
181 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
183 final var node2 = dataTreeCandidateNode(normalizedNode2, null, DELETE);
184 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
186 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
188 assertEquals(DELETE, aggregationResult.getRootNode().modificationType());
189 assertEquals("value1", aggregationResult.getRootNode().dataBefore().body());
190 assertNull(aggregationResult.getRootNode().dataAfter());
194 void testLeafDeleteUnmodified() {
195 final var normalizedNode = normalizedNode("value");
197 final var node1 = dataTreeCandidateNode(normalizedNode, null, DELETE);
198 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
200 final var node2 = dataTreeCandidateNode(null, null, UNMODIFIED);
201 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
203 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
205 assertEquals(DELETE, aggregationResult.getRootNode().modificationType());
206 assertEquals("value", aggregationResult.getRootNode().dataBefore().body());
207 assertNull(aggregationResult.getRootNode().dataAfter());
211 void testLeafDeleteWrite() {
212 final var normalizedNode1 = normalizedNode("value1");
213 final var normalizedNode2 = normalizedNode("value2");
215 final var node1 = dataTreeCandidateNode(normalizedNode1, null, DELETE);
216 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
218 final var node2 = dataTreeCandidateNode(null, normalizedNode2, WRITE);
219 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
221 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
223 assertEquals(WRITE, aggregationResult.getRootNode().modificationType());
224 assertEquals("value1", aggregationResult.getRootNode().dataBefore().body());
225 assertEquals("value2", aggregationResult.getRootNode().dataAfter().body());
229 void testLeafDeleteDelete() {
230 final var normalizedNode1 = normalizedNode("value1");
232 final var node1 = dataTreeCandidateNode(normalizedNode1, null, DELETE);
233 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
235 final var node2 = dataTreeCandidateNode(null, null, DELETE);
236 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
238 assertThrows(IllegalArgumentException.class,
239 () -> DataTreeCandidates.aggregate(List.of(candidate1, candidate2)));
243 void testLeafDeleteDisappear() {
244 final var normalizedNode1 = normalizedNode("value1");
246 final var node1 = dataTreeCandidateNode(normalizedNode1, null, DELETE);
247 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
249 final var node2 = dataTreeCandidateNode(null, null, DISAPPEARED);
250 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
252 assertThrows(IllegalArgumentException.class,
253 () -> DataTreeCandidates.aggregate(List.of(candidate1, candidate2)));
257 void testLeafDeleteSubtreeModified() {
258 final var normalizedNode1 = normalizedNode("value1");
260 final var node1 = dataTreeCandidateNode(normalizedNode1, null, DELETE);
261 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
263 final var node2 = dataTreeCandidateNode(null, null, SUBTREE_MODIFIED);
264 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
266 assertThrows(IllegalArgumentException.class,
267 () -> DataTreeCandidates.aggregate(List.of(candidate1, candidate2)));
271 void testUnmodifiedUnmodified() {
272 final var parentNode = normalizedNode("container");
273 final var childNode = normalizedNode("child");
275 final var node1 = dataTreeCandidateNode(parentNode, parentNode, UNMODIFIED);
276 final var child1 = dataTreeCandidateNode(childNode, childNode, UNMODIFIED);
277 setChildNodes(node1, List.of(child1));
278 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
280 final var node2 = dataTreeCandidateNode(parentNode, parentNode, UNMODIFIED);
281 final var child2 = dataTreeCandidateNode(childNode, childNode, UNMODIFIED);
282 setChildNodes(node2, List.of(child2));
283 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
285 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
287 assertEquals(UNMODIFIED, aggregationResult.getRootNode().modificationType());
291 void testUnmodifiedDelete() {
292 final var parentNode = normalizedNode("container");
293 final var childNode = normalizedNode("child");
295 final var node1 = dataTreeCandidateNode(parentNode, parentNode, UNMODIFIED);
296 final var child1 = dataTreeCandidateNode(childNode, childNode, UNMODIFIED);
297 setChildNodes(node1, List.of(child1));
298 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
300 final var node2 = dataTreeCandidateNode(parentNode, null, DELETE);
301 final var child2 = dataTreeCandidateNode(childNode, null, DELETE);
302 setChildNodes(node2, List.of(child2));
303 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
305 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
307 assertEquals(DELETE, aggregationResult.getRootNode().modificationType());
311 void testUnmodifiedWrite() {
312 final var parentNode1 = normalizedNode("container1");
313 final var childNode1 = normalizedNode("child1");
314 final var parentNode2 = normalizedNode("container2");
315 final var childNode2 = normalizedNode("child2");
317 final var node1 = dataTreeCandidateNode(parentNode1, parentNode1, UNMODIFIED);
318 final var child1 = dataTreeCandidateNode(childNode1, childNode1, UNMODIFIED);
319 setChildNodes(node1, List.of(child1));
320 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
322 final var node2 = dataTreeCandidateNode(parentNode1, parentNode2, WRITE);
323 final var child2 = dataTreeCandidateNode(childNode1, childNode2, WRITE);
324 setChildNodes(node2, List.of(child2));
325 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
327 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
329 assertEquals(WRITE, aggregationResult.getRootNode().modificationType());
333 void testUnmodifiedSubtreeModifiedWithoutDataBefore() {
334 final var parentNode = normalizedNode("container");
335 final var childNode = normalizedNode("child");
337 final var node1 = dataTreeCandidateNode(null, null, UNMODIFIED);
338 final var child1 = dataTreeCandidateNode(null, null, UNMODIFIED);
339 setChildNodes(node1, List.of(child1));
340 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
342 final var node2 = dataTreeCandidateNode(parentNode, parentNode, SUBTREE_MODIFIED);
343 final var child2 = dataTreeCandidateNode(null, childNode, WRITE);
344 setChildNodes(node2, List.of(child2));
345 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
347 assertThrows(IllegalArgumentException.class,
348 () -> DataTreeCandidates.aggregate(List.of(candidate1, candidate2)));
353 void testUnmodifiedSubtreeModified() {
354 final var parentNode1 = normalizedNode("container1");
355 final var childNode1 = normalizedNode("child1");
356 final var parentNode2 = normalizedNode("container1");
357 final var childNode2 = normalizedNode("child2");
359 final var node1 = dataTreeCandidateNode(parentNode1, parentNode1, UNMODIFIED);
360 final var child1 = dataTreeCandidateNode(childNode1, childNode1, UNMODIFIED);
361 setChildNodes(node1, List.of(child1));
362 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
364 final var node2 = dataTreeCandidateNode(parentNode1, parentNode2, SUBTREE_MODIFIED);
365 final var child2 = dataTreeCandidateNode(childNode1, childNode2, WRITE);
366 setChildNodes(node2, List.of(child2));
367 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
369 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
371 assertEquals(SUBTREE_MODIFIED, aggregationResult.getRootNode().modificationType());
375 void testUnmodifiedAppearedWithDataBefore() {
376 final var parentNode1 = normalizedNode("container1");
377 final var childNode1 = normalizedNode("child1");
378 final var parentNode2 = normalizedNode("container1");
379 final var childNode2 = normalizedNode("child2");
381 final var node1 = dataTreeCandidateNode(parentNode1, parentNode1, UNMODIFIED);
382 final var child1 = dataTreeCandidateNode(childNode1, childNode1, UNMODIFIED);
383 setChildNodes(node1, List.of(child1));
384 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
386 final var node2 = dataTreeCandidateNode(parentNode1, parentNode2, APPEARED);
387 final var child2 = dataTreeCandidateNode(childNode1, childNode2, WRITE);
388 setChildNodes(node2, List.of(child2));
389 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
391 assertThrows(IllegalArgumentException.class,
392 () -> DataTreeCandidates.aggregate(List.of(candidate1, candidate2)));
397 void testUnmodifiedAppeared() {
398 final var parentNode = normalizedNode("container");
399 final var childNode = normalizedNode("child");
401 final var node1 = dataTreeCandidateNode(null, null, UNMODIFIED);
402 final var child1 = dataTreeCandidateNode(null, null, UNMODIFIED);
403 setChildNodes(node1, List.of(child1));
404 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
406 final var node2 = dataTreeCandidateNode(parentNode, parentNode, APPEARED);
407 final var child2 = dataTreeCandidateNode(null, childNode, WRITE);
408 setChildNodes(node2, List.of(child2));
409 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
411 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
413 assertEquals(APPEARED, aggregationResult.getRootNode().modificationType());
417 void testUnmodifiedDisappearWithoutDataBefore() {
418 final var parentNode = normalizedNode("container");
419 final var childNode = normalizedNode("child");
421 final var node1 = dataTreeCandidateNode(null, null, UNMODIFIED);
422 final var child1 = dataTreeCandidateNode(null, null, UNMODIFIED);
423 setChildNodes(node1, List.of(child1));
424 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
426 final var node2 = dataTreeCandidateNode(parentNode, parentNode, DISAPPEARED);
427 final var child2 = dataTreeCandidateNode(null, childNode, DELETE);
428 setChildNodes(node2, List.of(child2));
429 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
431 assertThrows(IllegalArgumentException.class,
432 () -> DataTreeCandidates.aggregate(List.of(candidate1, candidate2)));
436 void testUnmodifiedDisappear() {
437 final var parentNode1 = normalizedNode("container1");
438 final var childNode1 = normalizedNode("child1");
440 final var node1 = dataTreeCandidateNode(parentNode1, parentNode1, UNMODIFIED);
441 final var child1 = dataTreeCandidateNode(childNode1, childNode1, UNMODIFIED);
442 setChildNodes(node1, List.of(child1));
443 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
445 final var node2 = dataTreeCandidateNode(parentNode1, null, DISAPPEARED);
446 final var child2 = dataTreeCandidateNode(childNode1, null, DELETE);
447 setChildNodes(node2, List.of(child2));
448 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
450 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
452 assertEquals(DISAPPEARED, aggregationResult.getRootNode().modificationType());
456 void testDeleteUnmodified() {
457 final var parentNode = normalizedNode("container");
458 final var childNode = normalizedNode("child");
460 final var node1 = dataTreeCandidateNode(parentNode, null, DELETE);
461 final var child1 = dataTreeCandidateNode(childNode, null, DELETE);
462 setChildNodes(node1, List.of(child1));
463 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
465 final var node2 = dataTreeCandidateNode(null, null, UNMODIFIED);
466 final var child2 = dataTreeCandidateNode(null, null, UNMODIFIED);
467 setChildNodes(node2, List.of(child2));
468 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
470 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
472 assertEquals(DELETE, aggregationResult.getRootNode().modificationType());
476 void testDeleteWrite() {
477 final var parentNode1 = normalizedNode("container1");
478 final var parentNode2 = normalizedNode("container2");
479 final var childNode1 = normalizedNode("child1");
480 final var childNode2 = normalizedNode("child2");
482 final var node1 = dataTreeCandidateNode(parentNode1, null, DELETE);
483 final var child1 = dataTreeCandidateNode(childNode1, null, DELETE);
484 setChildNodes(node1, List.of(child1));
485 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
487 final var node2 = dataTreeCandidateNode(null, parentNode2, WRITE);
488 final var child2 = dataTreeCandidateNode(null, childNode2, WRITE);
489 setChildNodes(node2, List.of(child2));
490 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
492 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
494 assertEquals(WRITE, aggregationResult.getRootNode().modificationType());
498 void testDeleteAppear() {
499 final var parentNode1 = normalizedNode("container1");
500 final var parentNode2 = normalizedNode("container2");
501 final var childNode1 = normalizedNode("child1");
502 final var childNode2 = normalizedNode("child2");
504 final var node1 = dataTreeCandidateNode(parentNode1, null, DELETE);
505 final var child1 = dataTreeCandidateNode(childNode1, null, DELETE);
506 setChildNodes(node1, List.of(child1));
507 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
509 final var node2 = dataTreeCandidateNode(null, parentNode2, APPEARED);
510 final var child2 = dataTreeCandidateNode(null, childNode2, WRITE);
511 setChildNodes(node2, List.of(child2));
512 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
514 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
516 assertEquals(WRITE, aggregationResult.getRootNode().modificationType());
520 void testWriteUnmodified() {
521 final var parentNode = normalizedNode("container");
522 final var childNode = normalizedNode("child");
524 final var node1 = dataTreeCandidateNode(null, parentNode, WRITE);
525 final var child1 = dataTreeCandidateNode(null, childNode, WRITE);
526 setChildNodes(node1, List.of(child1));
527 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
529 final var node2 = dataTreeCandidateNode(parentNode, parentNode, UNMODIFIED);
530 final var child2 = dataTreeCandidateNode(childNode, childNode, UNMODIFIED);
531 setChildNodes(node2, List.of(child2));
532 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
534 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
536 assertEquals(WRITE, aggregationResult.getRootNode().modificationType());
540 void testWriteDeleteWithoutChanges() {
541 final var parentNode = normalizedNode("container");
542 final var childNode = normalizedNode("child");
544 final var node1 = dataTreeCandidateNode(null, parentNode, WRITE);
545 final var child1 = dataTreeCandidateNode(null, childNode, WRITE);
546 setChildNodes(node1, List.of(child1));
547 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
549 final var node2 = dataTreeCandidateNode(parentNode, null, DELETE);
550 final var child2 = dataTreeCandidateNode(childNode, null, DELETE);
551 setChildNodes(node2, List.of(child2));
552 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
554 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
556 assertEquals(UNMODIFIED, aggregationResult.getRootNode().modificationType());
560 void testWriteDelete() {
561 final var parentNode1 = normalizedNode("container1");
562 final var parentNode2 = normalizedNode("container2");
563 final var childNode1 = normalizedNode("child1");
564 final var childNode2 = normalizedNode("child2");
566 final var node1 = dataTreeCandidateNode(parentNode1, parentNode2, WRITE);
567 final var child1 = dataTreeCandidateNode(childNode1, childNode2, WRITE);
568 setChildNodes(node1, List.of(child1));
569 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
571 final var node2 = dataTreeCandidateNode(parentNode2, null, DELETE);
572 final var child2 = dataTreeCandidateNode(childNode2, null, DELETE);
573 setChildNodes(node2, List.of(child2));
574 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
576 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
578 assertEquals(DELETE, aggregationResult.getRootNode().modificationType());
582 void testWriteWrite() {
583 final var parentNode1 = normalizedNode("container1");
584 final var parentNode2 = normalizedNode("container2");
585 final var childNode1 = normalizedNode("child1");
586 final var childNode2 = normalizedNode("child2");
588 final var node1 = dataTreeCandidateNode(null, parentNode1, WRITE);
589 final var child1 = dataTreeCandidateNode(null, childNode1, WRITE);
590 setChildNodes(node1, List.of(child1));
591 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
593 final var node2 = dataTreeCandidateNode(parentNode1, parentNode2, WRITE);
594 final var child2 = dataTreeCandidateNode(childNode1, childNode2, WRITE);
595 setChildNodes(node2, List.of(child2));
596 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
598 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
600 assertEquals(WRITE, aggregationResult.getRootNode().modificationType());
604 void testWriteSubtreeModified() {
605 final var parentNode = normalizedNode("container");
606 final var parentNode1 = normalizedNode("container1");
607 final var parentNode2 = normalizedNode("container1");
608 final var childNode = normalizedNode("child");
609 final var childNode1 = normalizedNode("child1");
610 final var childNode2 = normalizedNode("child2");
612 final var node1 = dataTreeCandidateNode(parentNode, parentNode1, WRITE);
613 final var child1 = dataTreeCandidateNode(childNode, childNode1, WRITE);
614 setChildNodes(node1, List.of(child1));
615 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
617 final var node2 = dataTreeCandidateNode(parentNode1, parentNode2, SUBTREE_MODIFIED);
618 final var child2 = dataTreeCandidateNode(childNode1, childNode2, WRITE);
619 setChildNodes(node2, List.of(child2));
620 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
622 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
624 assertEquals(WRITE, aggregationResult.getRootNode().modificationType());
628 void testWriteAppear() {
629 final var parentNode1 = normalizedNode("container1");
630 final var parentNode2 = normalizedNode("container2");
631 final var childNode1 = normalizedNode("child1");
632 final var childNode2 = normalizedNode("child2");
633 final var childNode3 = normalizedNode("child3");
635 final var node1 = dataTreeCandidateNode(parentNode1, parentNode2, WRITE);
636 final var child1 = dataTreeCandidateNode(childNode1, childNode2, WRITE);
637 setChildNodes(node1, List.of(child1));
638 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
640 final var node2 = dataTreeCandidateNode(parentNode2, parentNode2, APPEARED);
641 final var child2 = dataTreeCandidateNode(childNode2, childNode3, WRITE);
642 setChildNodes(node2, List.of(child2));
643 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
645 assertThrows(IllegalArgumentException.class,
646 () -> DataTreeCandidates.aggregate(List.of(candidate1, candidate2)));
650 void testWriteDisappearWithoutChanges() {
651 final var parentNode = normalizedNode("container");
652 final var childNode = normalizedNode("child");
654 final var node1 = dataTreeCandidateNode(null, parentNode, WRITE);
655 final var child1 = dataTreeCandidateNode(null, childNode, WRITE);
656 setChildNodes(node1, List.of(child1));
657 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
659 final var node2 = dataTreeCandidateNode(parentNode, null, DISAPPEARED);
660 final var child2 = dataTreeCandidateNode(childNode, null, DELETE);
661 setChildNodes(node2, List.of(child2));
662 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
664 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
666 assertEquals(UNMODIFIED, aggregationResult.getRootNode().modificationType());
670 void testWriteDisappear() {
671 final var parentNode1 = normalizedNode("container1");
672 final var parentNode2 = normalizedNode("container2");
673 final var childNode1 = normalizedNode("child1");
674 final var childNode2 = normalizedNode("child2");
676 final var node1 = dataTreeCandidateNode(parentNode1, parentNode2, WRITE);
677 final var child1 = dataTreeCandidateNode(childNode1, childNode2, WRITE);
678 setChildNodes(node1, List.of(child1));
679 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
681 final var node2 = dataTreeCandidateNode(parentNode2, null, DISAPPEARED);
682 final var child2 = dataTreeCandidateNode(childNode2, null, DELETE);
683 setChildNodes(node2, List.of(child2));
684 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
686 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
688 assertEquals(DISAPPEARED, aggregationResult.getRootNode().modificationType());
692 void testSubtreeModifiedUnmodified() {
693 final var parentNode1 = normalizedNode("container1");
694 final var parentNode2 = normalizedNode("container1");
695 final var childNode1 = normalizedNode("child1");
696 final var childNode2 = normalizedNode("child2");
698 final var node1 = dataTreeCandidateNode(parentNode1, parentNode2, SUBTREE_MODIFIED);
699 final var child1 = dataTreeCandidateNode(childNode1, childNode2, WRITE);
700 setChildNodes(node1, List.of(child1));
701 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
703 final var node2 = dataTreeCandidateNode(parentNode2, parentNode2, UNMODIFIED);
704 final var child2 = dataTreeCandidateNode(childNode2, childNode2, UNMODIFIED);
705 setChildNodes(node2, List.of(child2));
706 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
708 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
710 assertEquals(SUBTREE_MODIFIED, aggregationResult.getRootNode().modificationType());
714 void testSubtreeModifiedDelete() {
715 final var parentNode1 = normalizedNode("container1");
716 final var parentNode2 = normalizedNode("container1");
717 final var childNode1 = normalizedNode("child1");
718 final var childNode2 = normalizedNode("child2");
720 final var node1 = dataTreeCandidateNode(parentNode1, parentNode2, SUBTREE_MODIFIED);
721 final var child1 = dataTreeCandidateNode(childNode1, childNode2, WRITE);
722 setChildNodes(node1, List.of(child1));
723 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
725 final var node2 = dataTreeCandidateNode(parentNode2, null, DELETE);
726 final var child2 = dataTreeCandidateNode(childNode2, null, DELETE);
727 setChildNodes(node2, List.of(child2));
728 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
730 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
732 assertEquals(DELETE, aggregationResult.getRootNode().modificationType());
736 void testSubtreeModifiedWrite() {
737 final var parentNode1 = normalizedNode("container");
738 final var parentNode2 = normalizedNode("value2");
739 final var childNode = normalizedNode("childNode");
740 final var childNode1 = normalizedNode("child1");
741 final var childNode2 = normalizedNode("child2");
743 final var node1 = dataTreeCandidateNode(parentNode1, parentNode1, SUBTREE_MODIFIED);
744 final var child1 = dataTreeCandidateNode(childNode, childNode1, WRITE);
745 setChildNodes(node1, List.of(child1));
746 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
748 final var node2 = dataTreeCandidateNode(parentNode1, parentNode2, WRITE);
749 final var child2 = dataTreeCandidateNode(childNode1, childNode2, WRITE);
750 setChildNodes(node2, List.of(child2));
751 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
753 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
755 assertEquals(WRITE, aggregationResult.getRootNode().modificationType());
759 void testSubtreeModifiedSubtreeModified() {
760 final var parentNode1 = normalizedNode("container");
761 final var childNode = normalizedNode("childNode");
762 final var childNode1 = normalizedNode("child1");
763 final var childNode2 = normalizedNode("child2");
765 final var node1 = dataTreeCandidateNode(parentNode1, parentNode1, SUBTREE_MODIFIED);
766 final var child1 = dataTreeCandidateNode(childNode, childNode1, WRITE);
767 setChildNodes(node1, List.of(child1));
768 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
770 final var node2 = dataTreeCandidateNode(parentNode1, parentNode1, SUBTREE_MODIFIED);
771 final var child2 = dataTreeCandidateNode(childNode1, childNode2, WRITE);
772 setChildNodes(node2, List.of(child2));
773 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
775 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
777 assertEquals(SUBTREE_MODIFIED, aggregationResult.getRootNode().modificationType());
781 void testSubtreeModifiedAppear() {
782 final var parentNode1 = normalizedNode("container");
783 final var parentNode2 = normalizedNode("value2");
784 final var childNode = normalizedNode("childNode");
785 final var childNode1 = normalizedNode("child1");
786 final var childNode2 = normalizedNode("child2");
788 final var node1 = dataTreeCandidateNode(parentNode1, parentNode1, SUBTREE_MODIFIED);
789 final var child1 = dataTreeCandidateNode(childNode, childNode1, WRITE);
790 setChildNodes(node1, List.of(child1));
791 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
793 final var node2 = dataTreeCandidateNode(null, parentNode2, APPEARED);
794 final var child2 = dataTreeCandidateNode(null, childNode2, WRITE);
795 setChildNodes(node2, List.of(child2));
796 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
798 assertThrows(IllegalArgumentException.class,
799 () -> DataTreeCandidates.aggregate(List.of(candidate1, candidate2)));
803 void testSubtreeModifiedDisappear() {
804 final var parentNode1 = normalizedNode("container");
805 final var childNode = normalizedNode("childNode");
806 final var childNode1 = normalizedNode("child1");
808 final var node1 = dataTreeCandidateNode(parentNode1, parentNode1, SUBTREE_MODIFIED);
809 final var child1 = dataTreeCandidateNode(childNode, childNode1, WRITE);
810 setChildNodes(node1, List.of(child1));
811 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
813 final var node2 = dataTreeCandidateNode(parentNode1, null, DISAPPEARED);
814 final var child2 = dataTreeCandidateNode(childNode1, null, DELETE);
815 setChildNodes(node2, List.of(child2));
816 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
818 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
820 assertEquals(DISAPPEARED, aggregationResult.getRootNode().modificationType());
824 void testAppearedUnmodified() {
825 final var parentNode1 = normalizedNode("container");
826 final var childNode1 = normalizedNode("child1");
828 final var node1 = dataTreeCandidateNode(null, parentNode1, APPEARED);
829 final var child1 = dataTreeCandidateNode(null, childNode1, WRITE);
830 setChildNodes(node1, List.of(child1));
831 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
833 final var node2 = dataTreeCandidateNode(parentNode1, parentNode1, UNMODIFIED);
834 final var child2 = dataTreeCandidateNode(childNode1, childNode1, UNMODIFIED);
835 setChildNodes(node2, List.of(child2));
836 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
838 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
840 assertEquals(APPEARED, aggregationResult.getRootNode().modificationType());
844 void testAppearedDelete() {
845 final var parentNode1 = normalizedNode("container");
846 final var childNode1 = normalizedNode("child1");
848 final var node1 = dataTreeCandidateNode(null, parentNode1, APPEARED);
849 final var child1 = dataTreeCandidateNode(null, childNode1, WRITE);
850 setChildNodes(node1, List.of(child1));
851 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
853 final var node2 = dataTreeCandidateNode(parentNode1, null, DELETE);
854 final var child2 = dataTreeCandidateNode(childNode1, null, DELETE);
855 setChildNodes(node2, List.of(child2));
856 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
858 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
860 assertEquals(UNMODIFIED, aggregationResult.getRootNode().modificationType());
864 void testAppearedWriteWithoutChanges() {
865 final var parentNode1 = normalizedNode("container");
866 final var parentNode2 = normalizedNode("value2");
867 final var childNode1 = normalizedNode("child1");
868 final var childNode2 = normalizedNode("child2");
870 final var node1 = dataTreeCandidateNode(null, parentNode1, APPEARED);
871 final var child1 = dataTreeCandidateNode(null, childNode1, WRITE);
872 setChildNodes(node1, List.of(child1));
873 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
875 final var node2 = dataTreeCandidateNode(parentNode1, parentNode2, WRITE);
876 final var child2 = dataTreeCandidateNode(childNode1, childNode2, WRITE);
877 setChildNodes(node2, List.of(child2));
878 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
880 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
882 assertEquals(WRITE, aggregationResult.getRootNode().modificationType());
886 void testAppearedSubtreeModified() {
887 final var parentNode1 = normalizedNode("container");
888 final var childNode1 = normalizedNode("child1");
889 final var childNode2 = normalizedNode("child2");
891 final var node1 = dataTreeCandidateNode(null, parentNode1, APPEARED);
892 final var child1 = dataTreeCandidateNode(null, childNode1, WRITE);
893 setChildNodes(node1, List.of(child1));
894 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
896 final var node2 = dataTreeCandidateNode(parentNode1, parentNode1, SUBTREE_MODIFIED);
897 final var child2 = dataTreeCandidateNode(childNode1, childNode2, WRITE);
898 setChildNodes(node2, List.of(child2));
899 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
901 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
903 assertEquals(APPEARED, aggregationResult.getRootNode().modificationType());
907 void testAppearedAppeared() {
908 final var parentNode1 = normalizedNode("container");
909 final var childNode1 = normalizedNode("child1");
911 final var node1 = dataTreeCandidateNode(null, parentNode1, APPEARED);
912 final var child1 = dataTreeCandidateNode(null, childNode1, WRITE);
913 setChildNodes(node1, List.of(child1));
914 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
916 final var node2 = dataTreeCandidateNode(null, parentNode1, APPEARED);
917 final var child2 = dataTreeCandidateNode(null, childNode1, WRITE);
918 setChildNodes(node2, List.of(child2));
919 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
921 assertThrows(IllegalArgumentException.class,
922 () -> DataTreeCandidates.aggregate(List.of(candidate1, candidate2)));
926 void testAppearedDisappeared() {
927 final var parentNode1 = normalizedNode("container");
928 final var childNode1 = normalizedNode("child1");
930 final var node1 = dataTreeCandidateNode(null, parentNode1, APPEARED);
931 final var child1 = dataTreeCandidateNode(null, childNode1, WRITE);
932 setChildNodes(node1, List.of(child1));
933 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
935 final var node2 = dataTreeCandidateNode(parentNode1, null, DISAPPEARED);
936 final var child2 = dataTreeCandidateNode(childNode1, null, DELETE);
937 setChildNodes(node2, List.of(child2));
938 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
940 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
942 assertEquals(UNMODIFIED, aggregationResult.getRootNode().modificationType());
946 void testDisappearedUnmodified() {
947 final var parentNode1 = normalizedNode("container");
948 final var childNode1 = normalizedNode("child1");
950 final var node1 = dataTreeCandidateNode(parentNode1, null, DISAPPEARED);
951 final var child1 = dataTreeCandidateNode(childNode1, null, DELETE);
952 setChildNodes(node1, List.of(child1));
953 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
955 final var node2 = dataTreeCandidateNode(null, null, UNMODIFIED);
956 final var child2 = dataTreeCandidateNode(null, null, UNMODIFIED);
957 setChildNodes(node2, List.of(child2));
958 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
960 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
962 assertEquals(DISAPPEARED, aggregationResult.getRootNode().modificationType());
966 void testDisappearedDelete() {
967 final var parentNode1 = normalizedNode("container");
968 final var childNode1 = normalizedNode("child1");
970 final var node1 = dataTreeCandidateNode(parentNode1, null, DISAPPEARED);
971 final var child1 = dataTreeCandidateNode(childNode1, null, DELETE);
972 setChildNodes(node1, List.of(child1));
973 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
975 final var node2 = dataTreeCandidateNode(null, null, DELETE);
976 final var child2 = dataTreeCandidateNode(null, null, DELETE);
977 setChildNodes(node2, List.of(child2));
978 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
980 assertThrows(IllegalArgumentException.class,
981 () -> DataTreeCandidates.aggregate(List.of(candidate1, candidate2)));
985 void testDisappearedWrite() {
986 final var parentNode1 = normalizedNode("container1");
987 final var parentNode2 = normalizedNode("container2");
988 final var childNode1 = normalizedNode("child1");
989 final var childNode2 = normalizedNode("child2");
991 final var node1 = dataTreeCandidateNode(parentNode1, null, DISAPPEARED);
992 final var child1 = dataTreeCandidateNode(childNode1, null, DELETE);
993 setChildNodes(node1, List.of(child1));
994 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
996 final var node2 = dataTreeCandidateNode(null, parentNode2, WRITE);
997 final var child2 = dataTreeCandidateNode(null, childNode2, WRITE);
998 setChildNodes(node2, List.of(child2));
999 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
1001 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
1003 assertEquals(WRITE, aggregationResult.getRootNode().modificationType());
1007 void testDisappearedSubtreeModified() {
1008 final var parentNode1 = normalizedNode("container");
1009 final var childNode1 = normalizedNode("child1");
1010 final var childNode2 = normalizedNode("child2");
1012 final var node1 = dataTreeCandidateNode(parentNode1, null, DISAPPEARED);
1013 final var child1 = dataTreeCandidateNode(childNode1, null, DELETE);
1014 setChildNodes(node1, List.of(child1));
1015 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
1017 final var node2 = dataTreeCandidateNode(null, null, SUBTREE_MODIFIED);
1018 final var child2 = dataTreeCandidateNode(null, childNode2, WRITE);
1019 setChildNodes(node2, List.of(child2));
1020 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
1022 assertThrows(IllegalArgumentException.class,
1023 () -> DataTreeCandidates.aggregate(List.of(candidate1, candidate2)));
1027 void testDisappearedAppeared() {
1028 final var parentNode1 = normalizedNode("container");
1029 final var parentNode2 = normalizedNode("container");
1030 final var childNode1 = normalizedNode("child1");
1031 final var childNode2 = normalizedNode("child2");
1033 final var node1 = dataTreeCandidateNode(parentNode1, null, DISAPPEARED);
1034 final var child1 = dataTreeCandidateNode(childNode1, null, DELETE);
1035 setChildNodes(node1, List.of(child1));
1036 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
1038 final var node2 = dataTreeCandidateNode(null, parentNode2, APPEARED);
1039 final var child2 = dataTreeCandidateNode(null, childNode2, WRITE);
1040 setChildNodes(node2, List.of(child2));
1041 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
1043 final var aggregationResult = DataTreeCandidates.aggregate(List.of(candidate1, candidate2));
1045 assertEquals(SUBTREE_MODIFIED, aggregationResult.getRootNode().modificationType());
1049 void testDisappearedDisappear() {
1050 final var parentNode1 = normalizedNode("container");
1051 final var childNode1 = normalizedNode("child1");
1053 final var node1 = dataTreeCandidateNode(parentNode1, null, DISAPPEARED);
1054 final var child1 = dataTreeCandidateNode(childNode1, null, DELETE);
1055 setChildNodes(node1, List.of(child1));
1056 final var candidate1 = new DefaultDataTreeCandidate(ROOT_PATH, node1);
1058 final var node2 = dataTreeCandidateNode(null, null, DISAPPEARED);
1059 final var child2 = dataTreeCandidateNode(null, null, DELETE);
1060 setChildNodes(node2, List.of(child2));
1061 final var candidate2 = new DefaultDataTreeCandidate(ROOT_PATH, node2);
1063 assertThrows(IllegalArgumentException.class,
1064 () -> DataTreeCandidates.aggregate(List.of(candidate1, candidate2)));
1067 private static LeafNode<String> normalizedNode(final String value) {
1068 final var node = mock(LeafNode.class);
1069 doReturn(value).when(node).body();
1073 private static TerminalDataTreeCandidateNode dataTreeCandidateNode(final NormalizedNode before,
1074 final NormalizedNode after,
1075 final ModificationType modification) {
1076 final var dataTreeCandidateNode = mock(TerminalDataTreeCandidateNode.class);
1077 doReturn(null).when(dataTreeCandidateNode).name();
1078 doReturn(before).when(dataTreeCandidateNode).dataBefore();
1079 doReturn(after).when(dataTreeCandidateNode).dataAfter();
1080 doReturn(modification).when(dataTreeCandidateNode).modificationType();
1081 return dataTreeCandidateNode;
1084 private static void setChildNodes(final TerminalDataTreeCandidateNode parentNode,
1085 final List<DataTreeCandidateNode> childNodes) {
1086 doReturn(null).when(parentNode).name();
1087 childNodes.forEach(child -> doReturn(CHILD_ID).when(child).name());
1088 doReturn(childNodes).when(parentNode).childNodes();