Deprecate simple DataTreeFactory.create()
[yangtools.git] / parser / yang-parser-rfc7950 / src / test / java / org / opendaylight / yangtools / yang / stmt / DeviationStmtTest.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.stmt;
9
10 import static org.junit.jupiter.api.Assertions.assertEquals;
11 import static org.junit.jupiter.api.Assertions.assertFalse;
12 import static org.junit.jupiter.api.Assertions.assertInstanceOf;
13 import static org.junit.jupiter.api.Assertions.assertNotEquals;
14 import static org.junit.jupiter.api.Assertions.assertNotNull;
15 import static org.junit.jupiter.api.Assertions.assertTrue;
16 import static org.opendaylight.yangtools.yang.stmt.StmtTestUtils.sourceForResource;
17
18 import com.google.common.collect.Iterables;
19 import java.util.Optional;
20 import org.junit.jupiter.api.Test;
21 import org.opendaylight.yangtools.yang.common.Revision;
22 import org.opendaylight.yangtools.yang.model.api.DeviateKind;
23 import org.opendaylight.yangtools.yang.model.api.Deviation;
24 import org.opendaylight.yangtools.yang.model.api.stmt.UnrecognizedStatement;
25 import org.opendaylight.yangtools.yang.model.api.type.Uint32TypeDefinition;
26 import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.RFC7950Reactors;
27 import org.opendaylight.yangtools.yang.parser.rfc7950.repo.YangStatementStreamSource;
28
29 class DeviationStmtTest {
30     private static final YangStatementStreamSource FOO_MODULE = sourceForResource("/deviation-stmt-test/foo.yang");
31     private static final YangStatementStreamSource FOO_IMP_MODULE =
32         sourceForResource("/deviation-stmt-test/foo-imp.yang");
33     private static final YangStatementStreamSource BAR_MODULE = sourceForResource("/deviation-stmt-test/bar.yang");
34     private static final YangStatementStreamSource BAR_IMP_MODULE =
35         sourceForResource("/deviation-stmt-test/bar-imp.yang");
36
37     @Test
38     void testDeviationAndDeviate() throws Exception {
39         final var schemaContext = RFC7950Reactors.defaultReactor().newBuild()
40             .addSources(FOO_MODULE, FOO_IMP_MODULE, BAR_MODULE, BAR_IMP_MODULE)
41             .buildEffective();
42         assertNotNull(schemaContext);
43
44         var testModule = schemaContext.findModule("foo", Revision.of("2016-06-23")).orElseThrow();
45         var deviations = testModule.getDeviations();
46         assertEquals(4, deviations.size());
47
48         for (var deviation : deviations) {
49             final var deviates = deviation.getDeviates();
50
51             final String targetLocalName = Iterables.getLast(deviation.getTargetPath().getNodeIdentifiers())
52                 .getLocalName();
53             if ("test-leaf".equals(targetLocalName)) {
54                 assertEquals(Optional.of("test-leaf is not supported"), deviation.getDescription());
55                 assertEquals(1, deviates.size());
56                 assertEquals(DeviateKind.NOT_SUPPORTED, deviates.iterator().next().getDeviateType());
57             } else if ("test-leaf-2".equals(targetLocalName)) {
58                 assertEquals(1, deviates.size());
59                 assertEquals(DeviateKind.ADD, deviates.iterator().next().getDeviateType());
60                 assertEquals("added-def-val", deviates.iterator().next().getDeviatedDefault());
61                 assertFalse(deviates.iterator().next().getDeviatedConfig());
62                 assertTrue(deviates.iterator().next().getDeviatedMandatory());
63             } else if ("test-leaf-list".equals(targetLocalName)) {
64                 assertEquals(3, deviates.size());
65                 for (var deviate : deviates) {
66                     if (DeviateKind.ADD.equals(deviate.getDeviateType())) {
67                         assertEquals(12, deviate.getDeviatedMaxElements().intValue());
68                     } else if (DeviateKind.REPLACE.equals(deviate.getDeviateType())) {
69                         assertEquals(5, deviate.getDeviatedMinElements().intValue());
70                         assertInstanceOf(Uint32TypeDefinition.class, deviate.getDeviatedType());
71                     } else {
72                         assertEquals(2, deviate.getDeviatedMusts().size());
73                         assertEquals("minutes", deviate.getDeviatedUnits());
74                     }
75                 }
76             } else {
77                 assertEquals(1, deviation.getDeviates().size());
78                 assertEquals(DeviateKind.DELETE, deviates.iterator().next().getDeviateType());
79                 assertEquals(2, deviates.iterator().next().getDeviatedUniques().size());
80             }
81         }
82
83         testModule = schemaContext.findModule("bar", Revision.of("2016-09-22")).orElseThrow();
84         assertNotNull(testModule);
85
86         deviations = testModule.getDeviations();
87         assertEquals(7, deviations.size());
88
89         Deviation deviation1 = null;
90         Deviation deviation2 = null;
91         Deviation deviation3 = null;
92         Deviation deviation4 = null;
93         Deviation deviation5 = null;
94         Deviation deviation6 = null;
95         Deviation deviation7 = null;
96
97         for (var deviation : deviations) {
98             final var deviates = deviation.getDeviates();
99             final String targetLocalName = Iterables.getLast(deviation.getTargetPath().getNodeIdentifiers())
100                 .getLocalName();
101
102             if ("bar-container-1".equals(targetLocalName)) {
103                 deviation1 = deviation;
104             }
105
106             if ("bar-container-2".equals(targetLocalName)) {
107                 DeviateKind deviateKind = deviates.iterator().next().getDeviateType();
108                 if (deviateKind.equals(DeviateKind.DELETE)) {
109                     deviation2 = deviation;
110                 } else if (deviateKind.equals(DeviateKind.ADD)) {
111                     deviation3 = deviation;
112                 }
113             }
114
115             if ("bar-leaf-1".equals(targetLocalName)) {
116                 if (Optional.of("desc").equals(deviation.getDescription())) {
117                     deviation4 = deviation;
118                 } else {
119                     deviation5 = deviation;
120                 }
121             }
122
123             if ("bar-leaf-2".equals(targetLocalName)) {
124                 if (Optional.of("ref").equals(deviation.getReference())) {
125                     deviation6 = deviation;
126                 } else {
127                     deviation7 = deviation;
128                 }
129             }
130         }
131
132         assertEquals(0, deviation1.getUnknownSchemaNodes().size());
133         assertEquals(1,
134             deviation1.asEffectiveStatement().getDeclared().declaredSubstatements(UnrecognizedStatement.class).size());
135
136         assertEquals(deviation1, deviation1);
137         assertNotEquals(null, deviation1);
138         assertNotEquals("str", deviation1);
139
140         var deviate = deviation1.getDeviates().iterator().next();
141         assertEquals(deviate, deviate);
142         assertNotEquals(null, deviate);
143         assertNotEquals("str", deviate);
144
145         assertNotEquals(deviation1, deviation2);
146         assertNotEquals(deviation2, deviation3);
147         assertNotEquals(deviation4, deviation5);
148         assertNotEquals(deviation6, deviation7);
149     }
150 }