Bug 2366 - Effective statments impl merge, retest & bugfix
[yangtools.git] / yang / yang-parser-impl / src / test / java / org / opendaylight / yangtools / yang / stmt / retest / YangModelValidationModuleTest.java
1 /*
2  * Copyright (c) 2013 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.retest;
9
10 import static org.hamcrest.CoreMatchers.containsString;
11 import static org.junit.Assert.assertThat;
12 import static org.mockito.Mockito.doReturn;
13 import static org.mockito.Mockito.mock;
14
15 import org.junit.Before;
16 import org.junit.Test;
17 import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Module_header_stmtsContext;
18 import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Module_stmtContext;
19 import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Namespace_stmtContext;
20 import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Revision_stmtContext;
21 import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Revision_stmtsContext;
22 import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Yang_version_stmtContext;
23 import org.opendaylight.yangtools.yang.parser.impl.YangModelBasicValidationListener;
24 import org.opendaylight.yangtools.yang.parser.util.YangValidationException;
25
26 public class YangModelValidationModuleTest {
27
28     private YangModelBasicValidationListener valid;
29
30     @Before
31     public void setUp() {
32         valid = new YangModelBasicValidationListener();
33     }
34
35     @Test(expected = YangValidationException.class)
36     public void testRevisionInvalidDateFormat() {
37         Revision_stmtContext mockedRev = mockModuleWithRevision("badFormat",
38                 "module1");
39
40         try {
41             valid.enterRevision_stmt(mockedRev);
42         } catch (YangValidationException e) {
43             assertThat(
44                     e.getMessage(),
45                     containsString("Revision:badFormat, invalid date format expected date format is:"));
46             throw e;
47         }
48     }
49
50     @Test
51     public void testRevisionValidDateFormat() {
52         Revision_stmtContext mockedRev = mockModuleWithRevision(
53                 YangModelValidationTest.getFormattedDate(), "module1");
54
55         valid.enterRevision_stmt(mockedRev);
56     }
57
58     @Test(expected = YangValidationException.class)
59     public void testNoHeaderStmts() {
60         Revision_stmtContext rev = mockModuleWithRevision("1999-4-5", "module1");
61
62         try {
63             valid.enterModule_stmt((Module_stmtContext) rev.getParent()
64                     .getParent());
65         } catch (YangValidationException e) {
66             assertThat(
67                     e.getMessage(),
68                     containsString("Missing Module-header statement in Module:module1"));
69             throw e;
70         }
71     }
72
73     @Test(expected = YangValidationException.class)
74     public void testMultipleModulesPerSession() {
75         Module_stmtContext module1 = (Module_stmtContext) mockModuleWithRevision(
76                 "1999-09-10", "m1").getParent().getParent();
77         YangModelValidationTest.addChild(module1, YangModelValidationTest
78                 .mockStatement(Namespace_stmtContext.class, ""));
79
80         Module_stmtContext module2 = (Module_stmtContext) mockModuleWithRevision(
81                 "1999-09-10", "m2").getParent().getParent();
82         YangModelValidationTest.addChild(module1, YangModelValidationTest
83                 .mockStatement(Namespace_stmtContext.class, ""));
84         valid.enterModule_stmt(module1);
85
86         try {
87             valid.enterModule_stmt(module2);
88         } catch (YangValidationException e) {
89             assertThat(e.getMessage(),
90                     containsString("Multiple (sub)modules per file"));
91             throw e;
92         }
93     }
94
95     @Test(expected = YangValidationException.class)
96     public void testNoNamespace() {
97         Module_header_stmtsContext header = YangModelValidationTest
98                 .mockStatement(Module_header_stmtsContext.class, null);
99         Module_stmtContext mod = YangModelValidationTest.mockStatement(
100                 Module_stmtContext.class, "module1");
101         YangModelValidationTest.addChild(mod, header);
102
103         try {
104             valid.enterModule_header_stmts(header);
105         } catch (YangValidationException e) {
106             assertThat(
107                     e.getMessage(),
108                     containsString("Missing Namespace statement in Module-header:"));
109             throw e;
110         }
111     }
112
113     @Test(expected = YangValidationException.class)
114     public void testNoPrefix() {
115         Module_header_stmtsContext header = YangModelValidationTest
116                 .mockStatement(Module_header_stmtsContext.class, null);
117         Namespace_stmtContext nmspc = YangModelValidationTest.mockStatement(
118                 Namespace_stmtContext.class, "http://test");
119         Module_stmtContext mod = YangModelValidationTest.mockStatement(
120                 Module_stmtContext.class, "module1");
121         YangModelValidationTest.addChild(mod, header);
122         YangModelValidationTest.addChild(header, nmspc);
123
124         try {
125             valid.enterModule_header_stmts(header);
126         } catch (YangValidationException e) {
127             assertThat(
128                     e.getMessage(),
129                     containsString("Missing Prefix statement in Module-header:"));
130             throw e;
131         }
132     }
133
134 //    @Test(expected = YangValidationException.class)
135 //    public void testInvalidYangVersion() {
136 //
137 //        Yang_version_stmtContext yangVersion = YangModelValidationTest
138 //                .mockStatement(Yang_version_stmtContext.class, "55Unsup");
139 //
140 //        Module_stmtContext mod = YangModelValidationTest.mockStatement(
141 //                Module_stmtContext.class, "module1");
142 //        YangModelValidationTest.addChild(mod, yangVersion);
143 //
144 //        try {
145 //            valid.enterYang_version_stmt(yangVersion);
146 //        } catch (YangValidationException e) {
147 //            assertThat(
148 //                    e.getMessage(),
149 //                    containsString("Unsupported yang version:55Unsup, supported version:"
150 //                            + BasicValidations.SUPPORTED_YANG_VERSION));
151 //            throw e;
152 //        }
153 //    }
154
155     @Test
156     public void testValidYangVersion() {
157
158         Yang_version_stmtContext ctx = mock(Yang_version_stmtContext.class);
159         doReturn(1).when(ctx).getChildCount();
160         YangModelValidationTest.mockName(ctx, "1");
161
162         valid.enterYang_version_stmt(ctx);
163     }
164
165     private static Revision_stmtContext mockModuleWithRevision(final String date,
166             final String moduleName) {
167         Revision_stmtContext mockedRev = YangModelValidationTest.mockStatement(
168                 Revision_stmtContext.class, date);
169         Revision_stmtsContext revs = YangModelValidationTest.mockStatement(
170                 Revision_stmtsContext.class, null);
171         Module_stmtContext mod = YangModelValidationTest.mockStatement(
172                 Module_stmtContext.class, moduleName);
173
174         YangModelValidationTest.addChild(revs, mockedRev);
175         YangModelValidationTest.addChild(mod, revs);
176         return mockedRev;
177     }
178 }