Bug 4540: Yang parser exceptions should follow consistent path
[yangtools.git] / yang / yang-parser-impl / src / test / java / org / opendaylight / yangtools / yang / stmt / retest / YangModelValidationListTest.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
13 import org.junit.Before;
14 import org.junit.Test;
15 import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Default_stmtContext;
16 import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Key_stmtContext;
17 import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Leaf_stmtContext;
18 import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.List_stmtContext;
19 import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Mandatory_stmtContext;
20 import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Ordered_by_argContext;
21 import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Type_stmtContext;
22 import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Unique_stmtContext;
23 import org.opendaylight.yangtools.yang.parser.impl.YangModelBasicValidationListener;
24 import org.opendaylight.yangtools.yang.parser.util.YangValidationException;
25
26 public class YangModelValidationListTest {
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 testKeyValidationDuplicates() {
37
38         List_stmtContext list = YangModelValidationTest.mockStatement(
39                 List_stmtContext.class, "list");
40         Key_stmtContext key = YangModelValidationTest.mockStatement(
41                 Key_stmtContext.class, "leaf1 leaf2 leaf1 leaf1");
42         YangModelValidationTest.addChild(list, key);
43
44         try {
45             valid.enterKey_stmt(key);
46         } catch (YangValidationException e) {
47             assertThat(e.getMessage(),
48                     containsString("contains duplicates:[leaf1]"));
49             throw e;
50         }
51     }
52
53     @Test(expected = YangValidationException.class)
54     public void testUniqueValidationDuplicates() {
55         List_stmtContext list =YangModelValidationTest.mockStatement(
56                 List_stmtContext.class, "list");
57         Unique_stmtContext unique = YangModelValidationTest.mockStatement(
58                 Unique_stmtContext.class, "leaf1/a leaf2/n leaf1/a leaf1");
59         YangModelValidationTest.addChild(list, unique);
60
61         try {
62             valid.enterUnique_stmt(unique);
63         } catch (YangValidationException e) {
64             assertThat(e.getMessage(),
65                     containsString("contains duplicates:[leaf1/a]"));
66             throw e;
67         }
68     }
69
70     @Test(expected = YangValidationException.class)
71     public void testOrderBy() {
72         Ordered_by_argContext ctx = YangModelValidationTest.mockStatement(
73                 Ordered_by_argContext.class, "unknown");
74
75         try {
76             valid.enterOrdered_by_arg(ctx);
77         } catch (YangValidationException e) {
78             assertThat(
79                     e.getMessage(),
80                     containsString("Ordered-by:unknown, illegal value for Ordered-by statement, only permitted:"));
81             throw e;
82         }
83     }
84
85     @Test(expected = YangValidationException.class)
86     public void testLeaf() {
87         Leaf_stmtContext ctx = YangModelValidationTest.mockStatement(
88                 Leaf_stmtContext.class, "leaf1");
89         Default_stmtContext def = YangModelValidationTest.mockStatement(
90                 Default_stmtContext.class, "default");
91         YangModelValidationTest.addChild(ctx, def);
92         Type_stmtContext typ = YangModelValidationTest.mockStatement(
93                 Type_stmtContext.class, "type");
94         YangModelValidationTest.addChild(ctx, def);
95         YangModelValidationTest.addChild(ctx, typ);
96
97         Mandatory_stmtContext mand = YangModelValidationTest.mockStatement(
98                 Mandatory_stmtContext.class, null);
99         YangModelValidationTest.addChild(ctx, mand);
100
101         try {
102             valid.enterLeaf_stmt(ctx);
103         } catch (YangValidationException e) {
104             assertThat(
105                     e.getMessage(),
106                     containsString("Both Mandatory and Default statement present"));
107             throw e;
108         }
109     }
110
111 }