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