BUG-4688: Rework SchemaContext module lookups
[yangtools.git] / yang / yang-parser-impl / src / test / java / org / opendaylight / yangtools / yang / stmt / EffectiveIdentityTest.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 com.google.common.collect.Iterables;
18 import java.net.URISyntaxException;
19 import java.util.Set;
20 import org.junit.Test;
21 import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil;
22 import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode;
23 import org.opendaylight.yangtools.yang.model.api.Module;
24 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
25 import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
26 import org.opendaylight.yangtools.yang.parser.spi.meta.SomeModifiersUnresolvedException;
27 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
28 import org.opendaylight.yangtools.yang.parser.spi.source.StatementStreamSource;
29 import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor;
30 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangInferencePipeline;
31
32 public class EffectiveIdentityTest {
33
34     private static final StatementStreamSource IDENTITY_TEST = sourceForResource(
35             "/stmt-test/identity/identity-test.yang");
36
37     private static final StatementStreamSource CYCLIC_IDENTITY_TEST = sourceForResource(
38             "/stmt-test/identity/cyclic-identity-test.yang");
39
40     @Test(expected = SomeModifiersUnresolvedException.class)
41     public void cyclicefineTest() throws SourceException, ReactorException,
42             URISyntaxException {
43
44         CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
45                 .newBuild();
46         reactor.addSources(CYCLIC_IDENTITY_TEST);
47         try {
48             reactor.buildEffective();
49         } catch (SomeModifiersUnresolvedException e) {
50             StmtTestUtils.log(e, "      ");
51             throw e;
52         }
53     }
54
55     @Test
56     public void identityTest() throws SourceException, ReactorException,
57             URISyntaxException {
58
59         CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR
60                 .newBuild();
61         reactor.addSources(IDENTITY_TEST);
62         SchemaContext result = reactor.buildEffective();
63
64         assertNotNull(result);
65
66         Module module = result.findModule("identity-test", SimpleDateFormatUtil.DEFAULT_DATE_REV).get();
67         Set<IdentitySchemaNode> identities = module.getIdentities();
68
69         assertNotNull(identities);
70         assertEquals(4, identities.size());
71
72         IdentitySchemaNode root = null;
73         IdentitySchemaNode child1 = null;
74         IdentitySchemaNode child2 = null;
75         IdentitySchemaNode child12 = null;
76         for (IdentitySchemaNode identitySchemaNode : identities) {
77             switch (identitySchemaNode.getQName().getLocalName()) {
78             case "root-identity":
79                 root = identitySchemaNode;
80                 break;
81             case "child-identity-1":
82                 child1 = identitySchemaNode;
83                 break;
84             case "child-identity-2":
85                 child2 = identitySchemaNode;
86                 break;
87             case "child-identity-1-2":
88                 child12 = identitySchemaNode;
89                 break;
90             default:
91                 break;
92             }
93         }
94
95         assertNotNull(root);
96         assertNotNull(child1);
97         assertNotNull(child2);
98         assertNotNull(child12);
99
100         assertTrue(root.getBaseIdentities().isEmpty());
101
102         Set<IdentitySchemaNode> rootDerivedIdentities = root
103                 .getDerivedIdentities();
104         assertEquals(2, rootDerivedIdentities.size());
105
106         assertTrue(rootDerivedIdentities.contains(child1));
107         assertTrue(rootDerivedIdentities.contains(child2));
108         assertFalse(rootDerivedIdentities.contains(child12));
109         assertFalse(child1.equals(child2));
110
111         assertTrue(root == Iterables.getOnlyElement(child1.getBaseIdentities()));
112         assertTrue(root == Iterables.getOnlyElement(child2.getBaseIdentities()));
113
114         assertTrue(child2.getDerivedIdentities().isEmpty());
115
116         Set<IdentitySchemaNode> child1DerivedIdentities = child1
117                 .getDerivedIdentities();
118         assertEquals(1, child1DerivedIdentities.size());
119         assertTrue(child1DerivedIdentities.contains(child12));
120         assertFalse(child1DerivedIdentities.contains(child1));
121
122         assertTrue(child1 == Iterables.getOnlyElement(child12.getBaseIdentities()));
123         assertTrue(child12 == child1DerivedIdentities.iterator().next());
124     }
125 }