Merge "BUG-2022: String Type pattern parsing and resolving fix."
[yangtools.git] / yang / yang-parser-impl / src / test / java / org / opendaylight / yangtools / yang / parser / builder / impl / ModuleBuilderTest.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
3  * This program and the accompanying materials are made available under the
4  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
5  * and is available at http://www.eclipse.org/legal/epl-v10.html
6  */
7 package org.opendaylight.yangtools.yang.parser.builder.impl;
8
9 import static org.junit.Assert.*;
10
11 import java.net.URI;
12 import java.text.SimpleDateFormat;
13 import java.util.Date;
14 import java.util.List;
15 import org.junit.Before;
16 import org.junit.Test;
17 import org.opendaylight.yangtools.yang.common.QName;
18 import org.opendaylight.yangtools.yang.common.QNameModule;
19 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
20 import org.opendaylight.yangtools.yang.model.util.Uint16;
21 import org.opendaylight.yangtools.yang.parser.builder.api.Builder;
22 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
23 import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
24 import org.opendaylight.yangtools.yang.parser.builder.api.UnknownSchemaNodeBuilder;
25 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
26
27 /**
28  * Test suite for increasing of test coverage of ModuleBuilder implementation.
29  *
30  * @see org.opendaylight.yangtools.yang.parser.builder.impl.ModuleBuilder
31  *
32  * @author Lukas Sedlak <lsedlak@cisco.com>
33  */
34 public class ModuleBuilderTest {
35
36     private final static String TEST_MODULE_NAMESPACE = "urn:opendaylight.foo";
37     private final static String TEST_MODULE_REVISION = "2014-09-22";
38     private final static String MODULE_NAME = "TestModule";
39     private static final String TEST_MODULE_PATH = "/test/module/path";
40
41     private ModuleBuilder moduleBuilder;
42
43     @Before
44     public void setUp() throws Exception {
45         moduleBuilder = new ModuleBuilder(MODULE_NAME , TEST_MODULE_PATH);
46     }
47
48     @Test
49     public void testGetSetModuleBuilderMethods() throws Exception {
50         assertEquals("module", moduleBuilder.getStatementName());
51         assertEquals(TEST_MODULE_PATH, moduleBuilder.getModuleSourcePath());
52         assertNotNull(moduleBuilder.getAllLists());
53         final URI namespace = URI.create(TEST_MODULE_NAMESPACE + "?" + TEST_MODULE_REVISION);
54         moduleBuilder.setNamespace(namespace);
55         assertEquals(namespace, moduleBuilder.getNamespace());
56         moduleBuilder.setBelongsTo("TEST_SUBMODULE");
57         assertEquals("TEST_SUBMODULE", moduleBuilder.getBelongsTo());
58         final Date revision = new SimpleDateFormat("yyyy-dd-mm").parse(TEST_MODULE_REVISION);
59         moduleBuilder.setRevision(revision);
60         assertEquals(revision, moduleBuilder.getRevision());
61     }
62
63     @Test(expected = IllegalArgumentException.class)
64     public void testCheckPrefixFailOnPrefixNull() {
65         moduleBuilder.addModuleImport("TEST_MODULE", null, null);
66     }
67
68     @Test(expected = IllegalArgumentException.class)
69     public void testCheckPrefixFailOnPrefixStringIsEmpty() {
70         moduleBuilder.addModuleImport("TEST_MODULE", null, "");
71     }
72
73     @Test(expected = IllegalArgumentException.class)
74     public void testCheckPrefixFailOnPrefixEqualsModuleBuilderPrefix() {
75         moduleBuilder.setPrefix("prefix");
76         moduleBuilder.addModuleImport("TEST_MODULE", null, "prefix");
77     }
78
79     @Test
80     public void testGetActualNodeNullResult() {
81         moduleBuilder.exitNode();
82         assertNull(moduleBuilder.getActualNode());
83     }
84
85     @Test(expected = YangParseException.class)
86     public void testSetParent() throws Exception {
87         moduleBuilder.setParent(new Builder() {
88             @Override public String getModuleName() {
89                 return null;
90             }
91
92             @Override public void setModuleName(String moduleName) {
93
94             }
95
96             @Override public int getLine() {
97                 return 0;
98             }
99
100             @Override public Builder getParent() {
101                 return null;
102             }
103
104             @Override public void setParent(Builder parent) {
105
106             }
107
108             @Override public void addUnknownNodeBuilder(UnknownSchemaNodeBuilder unknownNode) {
109
110             }
111
112             @Override public List<UnknownSchemaNodeBuilder> getUnknownNodes() {
113                 return null;
114             }
115
116             @Override public Object build() {
117                 return null;
118             }
119         });
120     }
121
122     @Test(expected = YangParseException.class)
123     public void testAddExtensionWhereParentNodeIsNotModuleBuilder() throws Exception {
124         final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
125         SchemaPath containerPath = SchemaPath.create(true, containerQName);
126         moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
127         final QName extQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-ext");
128         SchemaPath extPath = SchemaPath.create(true, containerQName, extQName);
129         moduleBuilder.addExtension(extQName, 12, extPath);
130     }
131
132     @Test(expected = YangParseException.class)
133     public void testAddExtensionWhereNameOfExtensionCollides() throws Exception {
134         final QName extQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-ext");
135         SchemaPath extPath = SchemaPath.create(true, extQName);
136         moduleBuilder.addExtension(extQName, 12, extPath);
137
138         final QName extQName2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-ext");
139         moduleBuilder.addExtension(extQName2, 22, extPath);
140     }
141
142     @Test(expected = YangParseException.class)
143     public void testAddDuplicateGroupingIntoModule() {
144         final QName testGroup1 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-group");
145         final SchemaPath groupPath1 = SchemaPath.create(true, testGroup1);
146
147         final QName testGroup2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-group");
148         final SchemaPath groupPath2 = SchemaPath.create(true, testGroup2);
149
150         moduleBuilder.addGrouping(12, testGroup1, groupPath1);
151         moduleBuilder.addGrouping(12, testGroup2, groupPath2);
152     }
153
154     @Test(expected = YangParseException.class)
155     public void testAddDuplicateGroupingIntoDataNodeContainer() {
156         final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
157         SchemaPath containerPath = SchemaPath.create(true, containerQName);
158         moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
159         final QName testGroup1 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-group");
160         final SchemaPath groupPath1 = SchemaPath.create(true, containerQName, testGroup1);
161
162         final QName testGroup2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-group");
163         final SchemaPath groupPath2 = SchemaPath.create(true, containerQName, testGroup2);
164
165         moduleBuilder.addGrouping(12, testGroup1, groupPath1);
166         moduleBuilder.addGrouping(22, testGroup2, groupPath2);
167     }
168
169     @Test
170     public void testAddTwoGroupingIntoDataNodeContainer() {
171         final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
172         SchemaPath containerPath = SchemaPath.create(true, containerQName);
173         moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
174         final QName testGroup1 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-group");
175         final SchemaPath groupPath1 = SchemaPath.create(true, containerQName, testGroup1);
176
177         final QName testGroup2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-group2");
178         final SchemaPath groupPath2 = SchemaPath.create(true, containerQName, testGroup2);
179
180         GroupingBuilder grouping1 = moduleBuilder.addGrouping(12, testGroup1, groupPath1);
181         GroupingBuilder grouping2 = moduleBuilder.addGrouping(22, testGroup2, groupPath2);
182
183         assertNotNull(grouping1);
184         assertNotNull(grouping2);
185     }
186
187     @Test(expected = YangParseException.class)
188     public void testAddDuplicateGroupingIntoRpcDefinition() {
189         final QName rpcDefName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "rpc-definition");
190         SchemaPath rpcPath = SchemaPath.create(true, rpcDefName);
191         moduleBuilder.enterNode(new RpcDefinitionBuilder(MODULE_NAME, 10, rpcDefName, rpcPath));
192         final QName testGroup1 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-group");
193         final SchemaPath groupPath1 = SchemaPath.create(true, rpcDefName, testGroup1);
194
195         final QName testGroup2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-group");
196         final SchemaPath groupPath2 = SchemaPath.create(true, rpcDefName, testGroup2);
197
198         moduleBuilder.addGrouping(12, testGroup1, groupPath1);
199         moduleBuilder.addGrouping(22, testGroup2, groupPath2);
200     }
201
202     @Test
203     public void testAddTwoGroupingsIntoRpcDefinition() {
204         final QName rpcDefName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "rpc-definition");
205         SchemaPath rpcPath = SchemaPath.create(true, rpcDefName);
206         moduleBuilder.enterNode(new RpcDefinitionBuilder(MODULE_NAME, 10, rpcDefName, rpcPath));
207         final QName testGroup1 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-group");
208         final SchemaPath groupPath1 = SchemaPath.create(true, rpcDefName, testGroup1);
209
210         final QName testGroup2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-group2");
211         final SchemaPath groupPath2 = SchemaPath.create(true, rpcDefName, testGroup2);
212
213         GroupingBuilder grouping1 = moduleBuilder.addGrouping(12, testGroup1, groupPath1);
214         GroupingBuilder grouping2 = moduleBuilder.addGrouping(22, testGroup2, groupPath2);
215
216         assertNotNull(grouping1);
217         assertNotNull(grouping2);
218     }
219
220     @Test(expected = YangParseException.class)
221     public void testAddGroupingIntoNonValidStatementDefinition() {
222         final QName leafListDefName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-leaflist");
223         SchemaPath leaflistPath = SchemaPath.create(true, leafListDefName);
224         moduleBuilder.enterNode(new LeafListSchemaNodeBuilder(MODULE_NAME, 10, leafListDefName, leaflistPath));
225         final QName testGroup = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-group");
226         final SchemaPath groupPath = SchemaPath.create(true, leafListDefName, testGroup);
227
228         moduleBuilder.addGrouping(12, testGroup, groupPath);
229     }
230
231     @Test(expected = YangParseException.class)
232     public void testInvalidAugmentPathTargetString() {
233         final QName targetSchemaName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "fictive-target-container");
234         moduleBuilder.addAugment(12, "something/something", SchemaPath.create(true, targetSchemaName), 0);
235     }
236
237     @Test(expected = YangParseException.class)
238     public void testInvalidAugmentPathTargetStringInUsesNode() {
239         final QName usesNode = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "fictive-uses-node");
240         SchemaPath targetPath = SchemaPath.create(true, usesNode);
241         moduleBuilder.enterNode(new UsesNodeBuilderImpl(MODULE_NAME, 10, targetPath));
242         final QName targetSchemaName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "fictive-target-container");
243         moduleBuilder.addAugment(12, "/something/something", SchemaPath.create(true, targetSchemaName), 0);
244     }
245
246     @Test(expected = YangParseException.class)
247     public void testInvalidAugmentDefinition() {
248         final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
249         SchemaPath containerPath = SchemaPath.create(true, containerQName);
250         moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
251
252         final QName targetSchemaName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "fictive-target-container");
253         moduleBuilder.addAugment(12, "/something/something", SchemaPath.create(true, targetSchemaName), 0);
254     }
255
256     @Test(expected = YangParseException.class)
257     public void testInvalidUsesNodeUse() {
258         final QName leafListDefName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-leaflist");
259         SchemaPath leaflistPath = SchemaPath.create(true, leafListDefName);
260         moduleBuilder.enterNode(new LeafListSchemaNodeBuilder(MODULE_NAME, 10, leafListDefName, leaflistPath));
261
262         final QName testGroup = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-group");
263         final SchemaPath groupPath = SchemaPath.create(true, testGroup);
264
265         moduleBuilder.addUsesNode(17, groupPath);
266     }
267
268     @Test(expected = YangParseException.class)
269     public void testAddRefineToNonUsesNodeBuilder() throws Exception {
270         final QName leafListDefName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-leaflist");
271         SchemaPath leaflistPath = SchemaPath.create(true, leafListDefName);
272         moduleBuilder.enterNode(new LeafListSchemaNodeBuilder(MODULE_NAME, 10, leafListDefName, leaflistPath));
273
274         moduleBuilder.addRefine(new RefineHolderImpl(MODULE_NAME, 12, "testRefineName"));
275     }
276
277     @Test(expected = YangParseException.class)
278     public void testAddRpcToNonModuleBuilder() throws Exception {
279         final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
280         SchemaPath containerPath = SchemaPath.create(true, containerQName);
281         moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
282
283         final QName rpcDefName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "rpc-definition");
284         SchemaPath rpcPath = SchemaPath.create(true, rpcDefName);
285
286         moduleBuilder.addRpc(17, rpcDefName, rpcPath);
287     }
288
289     @Test(expected = YangParseException.class)
290     public void testAddRpcWithSameNameAsAlreadyExistingDataNodeContainer() throws Exception {
291         final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "element-foo");
292         SchemaPath containerPath = SchemaPath.create(true, containerQName);
293         moduleBuilder.addContainerNode(10, containerQName, containerPath);
294
295         final QName rpcDefName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "element-foo");
296         SchemaPath rpcPath = SchemaPath.create(true, rpcDefName);
297         moduleBuilder.addRpc(17, rpcDefName, rpcPath);
298     }
299
300     @Test(expected = YangParseException.class)
301     public void testAddDuplicateRpc() throws Exception {
302         final QName rpcDefName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "rpc-definition");
303         SchemaPath rpcPath = SchemaPath.create(true, rpcDefName);
304         moduleBuilder.addRpc(17, rpcDefName, rpcPath);
305
306         final QName rpcDefName2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "rpc-definition");
307         SchemaPath rpcPath2 = SchemaPath.create(true, rpcDefName2);
308         moduleBuilder.addRpc(23, rpcDefName2, rpcPath2);
309     }
310
311     @Test(expected = YangParseException.class)
312     public void testAddRpcWithSameNameAsAlreadyDefinedNotification() throws Exception {
313         final QName rpcDefName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "rpc-definition");
314         SchemaPath rpcPath = SchemaPath.create(true, rpcDefName);
315         moduleBuilder.addNotification(17, rpcDefName, rpcPath);
316
317         final QName rpcDefName2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "rpc-definition");
318         SchemaPath rpcPath2 = SchemaPath.create(true, rpcDefName2);
319         moduleBuilder.addRpc(23, rpcDefName2, rpcPath2);
320     }
321
322     @Test(expected = YangParseException.class)
323     public void testAddRpcInputForInvalidParent() throws Exception {
324         final QName rpcDefName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "rpc-definition");
325         final QName rpcInput = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "input");
326         SchemaPath rpcInputPath = SchemaPath.create(true, rpcDefName, rpcInput);
327
328         moduleBuilder.addRpcInput(23, rpcInput, rpcInputPath);
329     }
330
331     @Test(expected = YangParseException.class)
332     public void testAddRpcOutputForInvalidParent() throws Exception {
333         final QName rpcDefName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "rpc-definition");
334         final QName rpcOutput = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "output");
335         SchemaPath rpcOutputPath = SchemaPath.create(true, rpcDefName, rpcOutput);
336
337         moduleBuilder.addRpcOutput(rpcOutputPath, rpcOutput, 23);
338     }
339
340     @Test(expected = YangParseException.class)
341     public void testAddNotificationForInvalidParent() throws Exception {
342         final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
343         SchemaPath containerPath = SchemaPath.create(true, containerQName);
344         moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
345
346         final QName notificationName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "notify-this");
347         SchemaPath notificationPath = SchemaPath.create(true, notificationName);
348
349         moduleBuilder.addNotification(12, notificationName, notificationPath);
350     }
351
352     @Test(expected = YangParseException.class)
353     public void testAddNotificationWithSameNameAsAlreadyExistingDataNodeContainer() throws Exception {
354         final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "notify");
355         SchemaPath containerPath = SchemaPath.create(true, containerQName);
356         moduleBuilder.addContainerNode(10, containerQName, containerPath);
357
358         final QName notificationName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "notify");
359         SchemaPath notificationPath = SchemaPath.create(true, notificationName);
360
361         moduleBuilder.addNotification(12, notificationName, notificationPath);
362     }
363
364     @Test(expected = YangParseException.class)
365     public void testAddDuplicateNotification() throws Exception {
366         final QName notificationName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "notify-this");
367         SchemaPath notificationPath = SchemaPath.create(true, notificationName);
368
369         moduleBuilder.addNotification(12, notificationName, notificationPath);
370
371         final QName notificationName2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "notify-this");
372         SchemaPath notificationPath2 = SchemaPath.create(true, notificationName2);
373
374         moduleBuilder.addNotification(17, notificationName2, notificationPath2);
375     }
376
377     @Test(expected = YangParseException.class)
378     public void testAddNotificationWithSameNameAsAlreadyDefinedRpc() throws Exception {
379         final QName rpcDefName2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "notify-this");
380         SchemaPath rpcPath2 = SchemaPath.create(true, rpcDefName2);
381         moduleBuilder.addRpc(17, rpcDefName2, rpcPath2);
382
383         final QName rpcDefName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "notify-this");
384         SchemaPath rpcPath = SchemaPath.create(true, rpcDefName);
385         moduleBuilder.addNotification(23, rpcDefName, rpcPath);
386     }
387
388     @Test(expected = YangParseException.class)
389     public void testAddFeatureIntoNonModuleBuilder() throws Exception {
390         final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
391         SchemaPath containerPath = SchemaPath.create(true, containerQName);
392         moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
393
394         final QName testFeature = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-feature");
395         SchemaPath featurePath = SchemaPath.create(true, testFeature);
396
397         moduleBuilder.addFeature(23, testFeature, featurePath);
398     }
399
400     @Test(expected = YangParseException.class)
401     public void testAddDuplicateFeature() throws Exception {
402         final QName testFeature = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-feature");
403         SchemaPath featurePath = SchemaPath.create(true, testFeature);
404
405         moduleBuilder.addFeature(23, testFeature, featurePath);
406
407         final QName testFeature2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-feature");
408         SchemaPath featurePath2 = SchemaPath.create(true, testFeature2);
409
410         moduleBuilder.addFeature(23, testFeature2, featurePath2);
411     }
412
413     @Test
414     public void testAddTwoFeatures() throws Exception {
415         final QName testFeature = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-feature");
416         SchemaPath featurePath = SchemaPath.create(true, testFeature);
417
418         final FeatureBuilder feature1 = moduleBuilder.addFeature(23, testFeature, featurePath);
419
420         final QName testFeature2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-feature2");
421         SchemaPath featurePath2 = SchemaPath.create(true, testFeature2);
422
423         final FeatureBuilder feature2 = moduleBuilder.addFeature(23, testFeature2, featurePath2);
424
425         assertNotNull(feature1);
426         assertNotNull(feature2);
427     }
428
429     @Test(expected = YangParseException.class)
430     public void testAddCaseWhenParentIsNull() throws Exception {
431         moduleBuilder.exitNode();
432         addTestCase();
433     }
434
435     private void addTestCase() {
436         final QName testCase = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-case");
437         SchemaPath testCasePath = SchemaPath.create(true, testCase);
438
439         moduleBuilder.addCase(72, testCase, testCasePath);
440     }
441
442     @Test(expected = YangParseException.class)
443     public void testAddCaseWhenParentIsModule() throws Exception {
444         addTestCase();
445     }
446
447     @Test(expected = YangParseException.class)
448     public void testAddCaseWhenParentIsNotChoiceNorAugmentation() throws Exception {
449         final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
450         SchemaPath containerPath = SchemaPath.create(true, containerQName);
451         moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
452         addTestCase();
453     }
454
455     @Test(expected = YangParseException.class)
456     public void testAddDuplicateTypedefIntoContainer() throws Exception {
457         final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
458         SchemaPath containerPath = SchemaPath.create(true, containerQName);
459         moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
460
461         tryToAddDuplicateTypedef();
462     }
463
464     private void tryToAddDuplicateTypedef() {
465         final QName testTypedef1 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-type-definition");
466         SchemaPath testTypedefPath1 = SchemaPath.create(true, testTypedef1);
467
468         final QName testTypedef2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-type-definition");
469         SchemaPath testTypedefPath2 = SchemaPath.create(true, testTypedef2);
470
471         moduleBuilder.addTypedef(23, testTypedef1, testTypedefPath1);
472         moduleBuilder.addTypedef(44, testTypedef2, testTypedefPath2);
473     }
474
475     @Test(expected = YangParseException.class)
476     public void testAddDuplicateTypedefIntoRpcDefinition() throws Exception {
477         final QName rpcQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-rpc");
478         SchemaPath rpcPath = SchemaPath.create(true, rpcQName);
479         moduleBuilder.enterNode(new RpcDefinitionBuilder(MODULE_NAME, 10, rpcQName, rpcPath));
480
481         tryToAddDuplicateTypedef();
482     }
483
484     @Test(expected = YangParseException.class)
485     public void testAddTypedefIntoNonValidStatement() throws Exception {
486         final QName leafName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-leaf");
487         SchemaPath leafPath = SchemaPath.create(true, leafName);
488         moduleBuilder.enterNode(new LeafSchemaNodeBuilder(MODULE_NAME, 10, leafName, leafPath));
489
490         final QName testRpc = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-type-definition");
491         SchemaPath testRpcPath = SchemaPath.create(true, testRpc);
492
493         moduleBuilder.addTypedef(23, testRpc, testRpcPath);
494     }
495
496     @Test
497     public void testAddTwoTypedefsIntoContainer() throws Exception {
498         final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
499         SchemaPath containerPath = SchemaPath.create(true, containerQName);
500         moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
501
502         tryToAddTwoTypedefs();
503     }
504
505     private void tryToAddTwoTypedefs() {
506         final QName testTypedef1 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-type-definition");
507         SchemaPath testTypedefPath1 = SchemaPath.create(true, testTypedef1);
508
509         final QName testTypedef2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-type-definition2");
510         SchemaPath testTypedefPath2 = SchemaPath.create(true, testTypedef2);
511
512         final TypeDefinitionBuilderImpl typedef1 = moduleBuilder.addTypedef(23, testTypedef1, testTypedefPath1);
513         final TypeDefinitionBuilderImpl typedef2 = moduleBuilder.addTypedef(44, testTypedef2, testTypedefPath2);
514
515         assertNotNull(typedef1);
516         assertNotNull(typedef2);
517     }
518
519     @Test
520     public void testAddTwoTypedefsIntoRpcDefinition() throws Exception {
521         final QName rpcQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-rpc");
522         SchemaPath rpcPath = SchemaPath.create(true, rpcQName);
523         moduleBuilder.enterNode(new RpcDefinitionBuilder(MODULE_NAME, 10, rpcQName, rpcPath));
524
525         tryToAddTwoTypedefs();
526     }
527
528     @Test(expected = YangParseException.class)
529     public void testSetType() throws Exception {
530         final Uint16 uint = Uint16.getInstance();
531         moduleBuilder.setType(uint);
532     }
533
534     @Test(expected = YangParseException.class)
535     public void testAddUnionTypeWhenParentIsNull() throws Exception {
536         moduleBuilder.exitNode();
537
538         tryToAddUnionType();
539     }
540
541     private void tryToAddUnionType() {
542         final QName unionQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "union-type-def");
543         moduleBuilder.addUnionType(25, QNameModule.create(unionQName.getNamespace(), unionQName.getRevision()));
544     }
545
546     @Test(expected = YangParseException.class)
547     public void testAddUnionTypeWhenParentIsNotTypeAwareBuilder() throws Exception {
548         final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
549         SchemaPath containerPath = SchemaPath.create(true, containerQName);
550         moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
551
552         tryToAddUnionType();
553     }
554
555     @Test(expected = YangParseException.class)
556     public void addIdentityrefTypeWhenParentIsNull() throws Exception {
557         moduleBuilder.exitNode();
558         tryToAddIdentityrefType();
559     }
560
561     private void tryToAddIdentityrefType() {
562         final QName identityrefQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "identityref-type-def");
563         SchemaPath identityrefPath = SchemaPath.create(true, identityrefQName);
564         moduleBuilder.addIdentityrefType(25, identityrefPath, "simplebase");
565     }
566
567     @Test(expected = YangParseException.class)
568     public void addIdentityrefTypeWhenParentIsNotTypeAwareBuilder() throws Exception {
569         final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
570         SchemaPath containerPath = SchemaPath.create(true, containerQName);
571         moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
572
573         tryToAddIdentityrefType();
574     }
575
576     @Test(expected = YangParseException.class)
577     public void testAddDeviationWhereParentIsNotModule() throws Exception {
578         final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
579         SchemaPath containerPath = SchemaPath.create(true, containerQName);
580         moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
581
582         final QName deviationQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-deviation-name");
583         SchemaPath deviationPath = SchemaPath.create(true, deviationQName);
584
585         moduleBuilder.addDeviation(78, deviationPath);
586     }
587
588     @Test(expected = YangParseException.class)
589     public void testAddIdentityWhereParentIsNotModule() throws Exception {
590         final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
591         SchemaPath containerPath = SchemaPath.create(true, containerQName);
592         moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
593
594         tryToAddIdentity();
595     }
596
597     private void tryToAddIdentity() {
598         final QName identityQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "test-identity-name");
599         SchemaPath identityPath = SchemaPath.create(true, identityQName);
600
601         moduleBuilder.addIdentity(identityQName, 78, identityPath);
602     }
603
604     @Test(expected = YangParseException.class)
605     public void testAddDuplicateIdentity() throws Exception {
606         tryToAddIdentity();
607         tryToAddIdentity();
608     }
609
610     @Test
611     public void testAddUnknownSchemaNodeDirectlyToParent() throws Exception {
612         final QName unknownQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "my-extension-use");
613         SchemaPath unknownPath = SchemaPath.create(true, unknownQName);
614         assertTrue(moduleBuilder.getUnknownNodes().isEmpty());
615         moduleBuilder.addUnknownSchemaNode(72, unknownQName, unknownPath);
616         assertFalse(moduleBuilder.getUnknownNodes().isEmpty());
617     }
618
619     @Test
620     public void testAddUnknownSchemaNodeIntoDataNodeContainer() throws Exception {
621         final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
622         SchemaPath containerPath = SchemaPath.create(true, containerQName);
623         moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
624
625         final QName unknownQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "my-extension-use");
626         SchemaPath unknownPath = SchemaPath.create(true, unknownQName);
627         assertTrue(moduleBuilder.getAllUnknownNodes().isEmpty());
628         moduleBuilder.addUnknownSchemaNode(72, unknownQName, unknownPath);
629         assertFalse(moduleBuilder.getAllUnknownNodes().isEmpty());
630     }
631
632     @Test(expected = YangParseException.class)
633     public void testAddUnknownSchemaNodeIntoNonSchemaNode() throws Exception {
634         final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-non-schema-node");
635         SchemaPath containerPath = SchemaPath.create(true, containerQName);
636         moduleBuilder.enterNode(new NonSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
637
638         final QName unknownQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "my-extension-use");
639         SchemaPath unknownPath = SchemaPath.create(true, unknownQName);
640         assertTrue(moduleBuilder.getUnknownNodes().isEmpty());
641         moduleBuilder.addUnknownSchemaNode(72, unknownQName, unknownPath);
642         assertFalse(moduleBuilder.getUnknownNodes().isEmpty());
643     }
644
645     @Test(expected = YangParseException.class)
646     public void testAddContainerWithSameNameAsRpcDefintion() throws Exception {
647         final QName rpcDefName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "message");
648         SchemaPath rpcPath = SchemaPath.create(true, rpcDefName);
649         moduleBuilder.addRpc(70, rpcDefName, rpcPath);
650         tryToAddContainer();
651     }
652
653     private void tryToAddContainer() {
654         final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "message");
655         final SchemaPath containerPath = SchemaPath.create(true, containerQName);
656
657         moduleBuilder.addContainerNode(22, containerQName, containerPath);
658     }
659
660     @Test(expected = YangParseException.class)
661     public void testAddContainerWithSameNameAsNotificationDefintion() throws Exception {
662         final QName notificationName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "message");
663         SchemaPath notificationPath = SchemaPath.create(true, notificationName);
664         moduleBuilder.addNotification(70, notificationName, notificationPath);
665         tryToAddContainer();
666     }
667
668     @Test
669     public void testAddContainerWithAlreadyAddedRpcDefintion() throws Exception {
670         final QName rpcDefName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "send-message");
671         SchemaPath rpcPath = SchemaPath.create(true, rpcDefName);
672         moduleBuilder.addRpc(70, rpcDefName, rpcPath);
673         tryToAddContainer();
674
675         DataSchemaNodeBuilder addedContainer = moduleBuilder.getDataChildByName("message");
676         assertNotNull(addedContainer);
677     }
678
679     @Test
680     public void testAddContainerWithAlreadyAddedNotificationDefintion() throws Exception {
681         final QName notificationName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "notify-me");
682         SchemaPath notificationPath = SchemaPath.create(true, notificationName);
683         moduleBuilder.addNotification(70, notificationName, notificationPath);
684         tryToAddContainer();
685
686         DataSchemaNodeBuilder addedContainer = moduleBuilder.getDataChildByName("message");
687         assertNotNull(addedContainer);
688     }
689
690     @Test(expected = YangParseException.class)
691     public void testAddDuplicateSchemaNodeIntoSubnodeOfModule() throws Exception {
692         final QName containerQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
693         SchemaPath containerPath = SchemaPath.create(true, containerQName);
694         moduleBuilder.enterNode(new ContainerSchemaNodeBuilder(MODULE_NAME, 10, containerQName, containerPath));
695
696         final QName leafQName1 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "simple-leaf");
697         SchemaPath leafPath1 = SchemaPath.create(true, containerQName, leafQName1);
698
699         final QName leafQName2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "simple-leaf");
700         SchemaPath leafPath2 = SchemaPath.create(true, containerQName, leafQName2);
701
702         moduleBuilder.addLeafNode(12, leafQName1, leafPath1);
703         moduleBuilder.addLeafNode(20, leafQName2, leafPath2);
704     }
705
706     @Test(expected = YangParseException.class)
707     public void testAddDuplicateCaseIntoChoiceCaseNode() throws Exception {
708         //FIXME: move this into ChoiceBuilderTest !!!
709         final QName choiceQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "top-level-container");
710         SchemaPath choicePath = SchemaPath.create(true, choiceQName);
711
712         moduleBuilder.enterNode(new ChoiceBuilder(MODULE_NAME, 10, choiceQName, choicePath));
713
714         final QName caseQName1 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "simple-case");
715         SchemaPath casePath1 = SchemaPath.create(true, choiceQName, caseQName1);
716
717         final QName caseQName2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "simple-case");
718         SchemaPath casePath2 = SchemaPath.create(true, choiceQName, caseQName2);
719
720         moduleBuilder.addCase(12, caseQName1, casePath1);
721         moduleBuilder.addCase(20, caseQName2, casePath2);
722     }
723
724     @Test(expected = YangParseException.class)
725     public void testAddChoiceWithSameNameAsCase() throws Exception {
726         final QName choiceQName = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "my-choice");
727         SchemaPath choicePath = SchemaPath.create(true, choiceQName);
728
729         final ChoiceBuilder choiceBuilder = moduleBuilder.addChoice(8, choiceQName, choicePath);
730         moduleBuilder.enterNode(choiceBuilder);
731
732         final QName caseQName1 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "simple-case");
733         SchemaPath casePath1 = SchemaPath.create(true, choiceQName, caseQName1);
734
735         final QName caseQName2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "simple-case");
736         SchemaPath casePath2 = SchemaPath.create(true, choiceQName, caseQName2);
737
738         moduleBuilder.addCase(12, caseQName1, casePath1);
739         moduleBuilder.addChoice(20, caseQName2, casePath2);
740     }
741
742     @Test(expected = YangParseException.class)
743     public void testAddChildToSubnodeForNonDataNodeContainerAndNonChoiceNode() {
744         final QName leafQName1 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "simple-leaf");
745         SchemaPath leafPath1 = SchemaPath.create(true, leafQName1);
746
747         final LeafSchemaNodeBuilder leafBuilder = moduleBuilder.addLeafNode(10, leafQName1, leafPath1);
748         moduleBuilder.enterNode(leafBuilder);
749
750         final QName leafQName2 = QName.create(TEST_MODULE_NAMESPACE, TEST_MODULE_REVISION, "simple-leaf");
751         SchemaPath leafPath2 = SchemaPath.create(true, leafQName1, leafQName2);
752
753         moduleBuilder.addLeafNode(12, leafQName2, leafPath2);
754     }
755
756     private static class NonSchemaNodeBuilder implements Builder {
757
758         String moduleName;
759         final int line;
760         final QName name;
761         final SchemaPath path;
762
763         public NonSchemaNodeBuilder(final String moduleName, final int line, final QName name, final SchemaPath path) {
764             this.moduleName = moduleName;
765             this.line = line;
766             this.name = name;
767             this.path = path;
768         }
769
770         @Override public String getModuleName() {
771             return moduleName;
772         }
773
774         @Override public void setModuleName(String moduleName) {
775             this.moduleName = moduleName;
776         }
777
778         @Override public int getLine() {
779             return line;
780         }
781
782         @Override public Builder getParent() {
783             return null;
784         }
785
786         @Override public void setParent(Builder parent) {
787
788         }
789
790         @Override public void addUnknownNodeBuilder(UnknownSchemaNodeBuilder unknownNode) {
791
792         }
793
794         @Override public List<UnknownSchemaNodeBuilder> getUnknownNodes() {
795             return null;
796         }
797
798         @Override public Object build() {
799             return null;
800         }
801     }
802 }