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