2 * Copyright (c) 2016 Cisco Systems, Inc. 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
9 package org.opendaylight.yangtools.yang.stmt;
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;
17 import java.text.ParseException;
18 import java.util.Date;
19 import java.util.List;
21 import org.junit.Test;
22 import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil;
23 import org.opendaylight.yangtools.yang.model.api.DeviateDefinition;
24 import org.opendaylight.yangtools.yang.model.api.DeviateKind;
25 import org.opendaylight.yangtools.yang.model.api.Deviation;
26 import org.opendaylight.yangtools.yang.model.api.Module;
27 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
28 import org.opendaylight.yangtools.yang.model.api.type.UnsignedIntegerTypeDefinition;
29 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
30 import org.opendaylight.yangtools.yang.parser.spi.source.StatementStreamSource;
31 import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor;
32 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangInferencePipeline;
34 public class DeviationStmtTest {
36 private static final StatementStreamSource FOO_MODULE = sourceForResource("/deviation-stmt-test/foo.yang");
37 private static final StatementStreamSource FOO_IMP_MODULE = sourceForResource("/deviation-stmt-test/foo-imp.yang");
38 private static final StatementStreamSource BAR_MODULE = sourceForResource("/deviation-stmt-test/bar.yang");
39 private static final StatementStreamSource BAR_IMP_MODULE = sourceForResource("/deviation-stmt-test/bar-imp.yang");
42 public void testDeviationAndDeviate() throws ReactorException, ParseException {
43 final CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR.newBuild();
44 reactor.addSources(FOO_MODULE, FOO_IMP_MODULE, BAR_MODULE, BAR_IMP_MODULE);
46 final SchemaContext schemaContext = reactor.buildEffective();
47 assertNotNull(schemaContext);
49 Date revision = SimpleDateFormatUtil.getRevisionFormat().parse("2016-06-23");
51 Module testModule = schemaContext.findModuleByName("foo", revision);
52 assertNotNull(testModule);
54 Set<Deviation> deviations = testModule.getDeviations();
55 assertEquals(4, deviations.size());
57 for (Deviation deviation : deviations) {
58 final List<DeviateDefinition> deviates = deviation.getDeviates();
59 final String targetLocalName = deviation.getTargetPath().getLastComponent().getLocalName();
60 if ("test-leaf".equals(targetLocalName)) {
61 assertEquals("test-leaf is not supported", deviation.getDescription());
62 assertEquals(1, deviates.size());
63 assertEquals(DeviateKind.NOT_SUPPORTED, deviates.iterator().next().getDeviateType());
64 } else if ("test-leaf-2".equals(targetLocalName)) {
65 assertEquals(1, deviates.size());
66 assertEquals(DeviateKind.ADD, deviates.iterator().next().getDeviateType());
67 assertEquals("added-def-val", deviates.iterator().next().getDeviatedDefault());
68 assertFalse(deviates.iterator().next().getDeviatedConfig());
69 assertTrue(deviates.iterator().next().getDeviatedMandatory());
70 } else if ("test-leaf-list".equals(targetLocalName)) {
71 assertEquals(3, deviates.size());
72 for (DeviateDefinition deviate : deviates) {
73 if (DeviateKind.ADD.equals(deviate.getDeviateType())) {
74 assertEquals(12, deviate.getDeviatedMaxElements().intValue());
75 } else if (DeviateKind.REPLACE.equals(deviate.getDeviateType())) {
76 assertEquals(5, deviate.getDeviatedMinElements().intValue());
77 assertTrue(deviate.getDeviatedType() instanceof UnsignedIntegerTypeDefinition);
79 assertEquals(2, deviate.getDeviatedMusts().size());
80 assertEquals("minutes", deviate.getDeviatedUnits());
84 assertEquals(1, deviation.getDeviates().size());
85 assertEquals(DeviateKind.DELETE, deviates.iterator().next().getDeviateType());
86 assertEquals(2, deviates.iterator().next().getDeviatedUniques().size());
90 revision = SimpleDateFormatUtil.getRevisionFormat().parse("2016-09-22");
91 testModule = schemaContext.findModuleByName("bar", revision);
92 assertNotNull(testModule);
94 deviations = testModule.getDeviations();
95 assertEquals(7, deviations.size());
97 Deviation deviation1 = null;
98 Deviation deviation2 = null;
99 Deviation deviation3 = null;
100 Deviation deviation4 = null;
101 Deviation deviation5 = null;
102 Deviation deviation6 = null;
103 Deviation deviation7 = null;
105 for (Deviation deviation : deviations) {
106 final List<DeviateDefinition> deviates = deviation.getDeviates();
107 final String targetLocalName = deviation.getTargetPath().getLastComponent().getLocalName();
109 if ("bar-container-1".equals(targetLocalName)) {
110 deviation1 = deviation;
113 if ("bar-container-2".equals(targetLocalName)) {
114 DeviateKind deviateKind = deviates.iterator().next().getDeviateType();
115 if (deviateKind.equals(DeviateKind.DELETE)) {
116 deviation2 = deviation;
117 } else if (deviateKind.equals(DeviateKind.ADD)) {
118 deviation3 = deviation;
122 if ("bar-leaf-1".equals(targetLocalName)) {
123 if ("desc".equals(deviation.getDescription())) {
124 deviation4 = deviation;
126 deviation5 = deviation;
130 if ("bar-leaf-2".equals(targetLocalName)) {
131 if ("ref".equals(deviation.getReference())) {
132 deviation6 = deviation;
134 deviation7 = deviation;
139 assertEquals(1, deviation1.getUnknownSchemaNodes().size());
140 assertTrue(deviation1.equals(deviation1));
141 assertFalse(deviation1.equals(null));
142 assertFalse(deviation1.equals("str"));
144 DeviateDefinition deviate = deviation1.getDeviates().iterator().next();
145 assertTrue(deviate.equals(deviate));
146 assertFalse(deviate.equals(null));
147 assertFalse(deviate.equals("str"));
149 assertFalse(deviation1.equals(deviation2));
150 assertFalse(deviation2.equals(deviation3));
151 assertFalse(deviation4.equals(deviation5));
152 assertFalse(deviation6.equals(deviation7));