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