Modernize DataTreeCandidateNode API
[yangtools.git] / data / yang-data-tree-spi / src / test / java / org / opendaylight / yangtools / yang / data / tree / spi / DataTreeCandidateNodesTest.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.yangtools.yang.data.tree.spi;
9
10 import static org.hamcrest.CoreMatchers.containsString;
11 import static org.hamcrest.MatcherAssert.assertThat;
12 import static org.junit.Assert.assertNotNull;
13 import static org.junit.Assert.assertThrows;
14 import static org.mockito.ArgumentMatchers.any;
15 import static org.mockito.ArgumentMatchers.isNull;
16 import static org.mockito.Mockito.doReturn;
17 import static org.mockito.Mockito.mock;
18 import static org.mockito.Mockito.times;
19 import static org.mockito.Mockito.verify;
20
21 import java.util.List;
22 import org.junit.Test;
23 import org.junit.runner.RunWith;
24 import org.mockito.junit.MockitoJUnitRunner;
25 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
26 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
27 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
28 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidateNode;
29 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeModificationCursor;
30 import org.opendaylight.yangtools.yang.data.tree.api.ModificationType;
31
32 @RunWith(MockitoJUnitRunner.StrictStubs.class)
33 public class DataTreeCandidateNodesTest {
34     @Test
35     public void testFromNormalizedNode() {
36         final NormalizedNode mockedNormalizedNode = mock(NormalizedNode.class);
37         final DataTreeCandidateNode dataTreeCandidateNode = DataTreeCandidateNodes.written(mockedNormalizedNode);
38         assertNotNull(dataTreeCandidateNode);
39     }
40
41     @Test
42     public void testApplyToCursorWithWriteModificationType() {
43         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
44         final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
45
46         doReturn(ModificationType.WRITE).when(mockedDataTreeCandidateNode).modificationType();
47         final NormalizedNode mockedNormalizedNode = mock(NormalizedNode.class);
48         doReturn(mockedNormalizedNode).when(mockedDataTreeCandidateNode).dataAfter();
49         DataTreeCandidateNodes.applyToCursor(mockedCursor, mockedDataTreeCandidateNode);
50         verify(mockedCursor, times(1)).write(isNull(), any(NormalizedNode.class));
51     }
52
53     @Test
54     public void testApplyToCursorWithDeleteModificationType() {
55         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
56         final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
57
58         doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).modificationType();
59         DataTreeCandidateNodes.applyToCursor(mockedCursor, mockedDataTreeCandidateNode);
60         verify(mockedCursor, times(1)).delete(isNull());
61     }
62
63     @Test
64     public void testApplyToCursorWithSubtreeModifiedModificationType() {
65         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
66         final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
67
68         doReturn(ModificationType.SUBTREE_MODIFIED).when(mockedDataTreeCandidateNode).modificationType();
69
70         final DataTreeCandidateNode mockedChildNode1 = mock(DataTreeCandidateNode.class);
71         doReturn(ModificationType.DELETE).when(mockedChildNode1).modificationType();
72
73         final DataTreeCandidateNode mockedChildNode2 = mock(DataTreeCandidateNode.class);
74         doReturn(ModificationType.WRITE).when(mockedChildNode2).modificationType();
75         final NormalizedNode mockedNormalizedNode = mock(NormalizedNode.class);
76         doReturn(mockedNormalizedNode).when(mockedChildNode2).dataAfter();
77
78         final DataTreeCandidateNode mockedChildNode3 = mock(DataTreeCandidateNode.class);
79         doReturn(ModificationType.SUBTREE_MODIFIED).when(mockedChildNode3).modificationType();
80         final DataTreeCandidateNode mockedChildNode3ChildNode = mock(DataTreeCandidateNode.class);
81         doReturn(ModificationType.DELETE).when(mockedChildNode3ChildNode).modificationType();
82         doReturn(List.of(mockedChildNode3ChildNode)).when(mockedChildNode3).childNodes();
83
84         doReturn(List.of(mockedChildNode1, mockedChildNode2, mockedChildNode3))
85             .when(mockedDataTreeCandidateNode).childNodes();
86
87         DataTreeCandidateNodes.applyToCursor(mockedCursor, mockedDataTreeCandidateNode);
88         verify(mockedCursor, times(2)).enter((PathArgument) isNull());
89         verify(mockedCursor, times(2)).delete(isNull());
90         verify(mockedCursor, times(1)).write(isNull(), any(NormalizedNode.class));
91     }
92
93     @Test
94     public void testApplyToCursorWithUnsupportedModificationType() {
95         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
96         final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
97
98         doReturn(ModificationType.APPEARED).when(mockedDataTreeCandidateNode).modificationType();
99         final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
100             () -> DataTreeCandidateNodes.applyToCursor(mockedCursor, mockedDataTreeCandidateNode));
101         assertThat(ex.getMessage(), containsString("Unsupported modification"));
102     }
103
104     @Test
105     public void testApplyRootedNodeToCursorWithWriteModificationType() {
106         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
107         final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
108
109         doReturn(ModificationType.WRITE).when(mockedDataTreeCandidateNode).modificationType();
110         final NormalizedNode mockedNormalizedNode = mock(NormalizedNode.class);
111         doReturn(mockedNormalizedNode).when(mockedDataTreeCandidateNode).dataAfter();
112         DataTreeCandidateNodes.applyRootedNodeToCursor(mockedCursor, YangInstanceIdentifier.of(),
113             mockedDataTreeCandidateNode);
114         verify(mockedCursor, times(1)).write(isNull(), any(NormalizedNode.class));
115     }
116
117     @Test
118     public void testApplyRootedNodeToCursorWithDeleteModificationType() {
119         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
120         final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
121
122         doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).modificationType();
123         DataTreeCandidateNodes.applyRootedNodeToCursor(mockedCursor, YangInstanceIdentifier.of(),
124             mockedDataTreeCandidateNode);
125         verify(mockedCursor, times(1)).delete(isNull());
126     }
127
128     @Test
129     public void testApplyRootedNodeToCursorWithSubtreeModifiedModificationType() {
130         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
131         final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
132
133         doReturn(ModificationType.SUBTREE_MODIFIED).when(mockedDataTreeCandidateNode).modificationType();
134
135         final DataTreeCandidateNode mockedChildNode1 = mock(DataTreeCandidateNode.class);
136         doReturn(ModificationType.DELETE).when(mockedChildNode1).modificationType();
137         doReturn(List.of(mockedChildNode1)).when(mockedDataTreeCandidateNode).childNodes();
138
139         DataTreeCandidateNodes.applyRootedNodeToCursor(mockedCursor, YangInstanceIdentifier.of(),
140             mockedDataTreeCandidateNode);
141         verify(mockedCursor, times(1)).enter((PathArgument) isNull());
142         verify(mockedCursor, times(1)).delete(isNull());
143     }
144
145     @Test
146     public void testApplyRootedNodeToCursorWithUnsupportedModificationType() {
147         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
148         final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
149
150         doReturn(ModificationType.APPEARED).when(mockedDataTreeCandidateNode).modificationType();
151         final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
152             () -> DataTreeCandidateNodes.applyRootedNodeToCursor(mockedCursor, YangInstanceIdentifier.of(),
153                 mockedDataTreeCandidateNode));
154         assertThat(ex.getMessage(), containsString("Unsupported modification"));
155     }
156
157     @Test
158     public void testApplyRootToCursorWithSubtreeModifiedModificationType() {
159         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
160         final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
161
162         doReturn(ModificationType.SUBTREE_MODIFIED).when(mockedDataTreeCandidateNode).modificationType();
163
164         final DataTreeCandidateNode mockedChildNode1 = mock(DataTreeCandidateNode.class);
165         doReturn(ModificationType.DELETE).when(mockedChildNode1).modificationType();
166         doReturn(List.of(mockedChildNode1)).when(mockedDataTreeCandidateNode).childNodes();
167
168         DataTreeCandidateNodes.applyRootToCursor(mockedCursor, mockedDataTreeCandidateNode);
169         verify(mockedCursor, times(1)).delete(isNull());
170     }
171
172     @Test
173     public void testApplyRootToCursorWithDeleteModificationType() {
174         final var mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
175         final var mockedCursor = mock(DataTreeModificationCursor.class);
176
177         doReturn(ModificationType.DELETE).when(mockedDataTreeCandidateNode).modificationType();
178         final var ex = assertThrows(IllegalArgumentException.class,
179             () -> DataTreeCandidateNodes.applyRootToCursor(mockedCursor, mockedDataTreeCandidateNode));
180         assertThat(ex.getMessage(), containsString("Can not delete root"));
181     }
182
183     @Test
184     public void testApplyRootToCursorWithUnsupportedModificationType() {
185         final DataTreeCandidateNode mockedDataTreeCandidateNode = mock(DataTreeCandidateNode.class);
186         final DataTreeModificationCursor mockedCursor = mock(DataTreeModificationCursor.class);
187
188         doReturn(ModificationType.APPEARED).when(mockedDataTreeCandidateNode).modificationType();
189         final IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
190             () -> DataTreeCandidateNodes.applyRootToCursor(mockedCursor, mockedDataTreeCandidateNode));
191         assertThat(ex.getMessage(), containsString("Unsupported modification"));
192     }
193 }