[ONOS-6677] Description in pattern statement

Change-Id: Iacdd3ac0cafe6b39eaa4ba463d5c25a72aa50549
diff --git a/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/Decimal64ListenerTest.java b/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/Decimal64ListenerTest.java
index 8a54a51..3498273 100644
--- a/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/Decimal64ListenerTest.java
+++ b/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/Decimal64ListenerTest.java
@@ -563,13 +563,15 @@
     public void processDecimal64MultiTypedefMultiInvalidRangeStatement() throws IOException, LinkerException {
         thrown.expect(LinkerException.class);
         thrown.expectMessage(
-                "Range interval doesn't fall within the referred restriction ranges" +
-                        " restriction ranges. in 0 at 0 in src/test/resources/decimal64/" +
-                        "Decimal64MultiTypedefMultiInvalidRangeStatement.yang\"type." +
-                        " in 19 at 12 in src/test/resources/decimal64/Decimal64MultiTypedef" +
-                        "MultiInvalidRangeStatement.yang");
+                "Range interval doesn't fall within the referred restriction" +
+                        " ranges restriction ranges. in 9 at 12 in src/test/" +
+                        "resources/decimal64/Decimal64MultiTypedefMultiInval" +
+                        "idRangeStatement.yang\"type. in 19 at 12 in src/tes" +
+                        "t/resources/decimal64/Decimal64MultiTypedefMultiInv" +
+                        "alidRangeStatement.yang");
 
-        manager.getDataModel("src/test/resources/decimal64/Decimal64MultiTypedefMultiInvalidRangeStatement.yang");
+        manager.getDataModel("src/test/resources/decimal64/Decimal64MultiTyp" +
+                                     "edefMultiInvalidRangeStatement.yang");
     }
 
     /**
diff --git a/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/LengthRestrictionListenerTest.java b/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/LengthRestrictionListenerTest.java
index af9572f..bae9399 100644
--- a/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/LengthRestrictionListenerTest.java
+++ b/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/LengthRestrictionListenerTest.java
@@ -27,8 +27,8 @@
 import org.onosproject.yang.compiler.datamodel.YangRangeInterval;
 import org.onosproject.yang.compiler.datamodel.YangRangeRestriction;
 import org.onosproject.yang.compiler.datamodel.YangStringRestriction;
+import org.onosproject.yang.compiler.datamodel.YangType;
 import org.onosproject.yang.compiler.datamodel.YangTypeDef;
-import org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes;
 import org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangUint64;
 import org.onosproject.yang.compiler.parser.exceptions.ParserException;
 import org.onosproject.yang.compiler.parser.impl.YangUtilsParserManager;
@@ -37,49 +37,55 @@
 import java.math.BigInteger;
 import java.util.ListIterator;
 
+import static java.math.BigInteger.valueOf;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.core.Is.is;
+import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.BINARY;
+import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.STRING;
 
 /**
  * Test cases for length restriction listener.
  */
 public class LengthRestrictionListenerTest {
 
+    private final YangUtilsParserManager manager = new YangUtilsParserManager();
     @Rule
     public ExpectedException thrown = ExpectedException.none();
 
-    private final YangUtilsParserManager manager = new YangUtilsParserManager();
-
     /**
      * Checks valid length statement as sub-statement of leaf statement.
      */
     @Test
     public void processValidLengthStatement() throws IOException, ParserException {
 
-        YangNode node = manager.getDataModel("src/test/resources/ValidLengthStatement.yang");
+        YangNode node = manager.getDataModel(
+                "src/test/resources/ValidLengthStatement.yang");
 
         assertThat((node instanceof YangModule), is(true));
         assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf> it = yangNode.getListOfLeaf().listIterator();
+        YangLeaf leaf = it.next();
+        YangType<?> type = leaf.getDataType();
 
-        assertThat(leafInfo.getName(), is("invalid-interval"));
-        assertThat(leafInfo.getDataType().getDataTypeName(), is("string"));
-        assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.STRING));
-        YangStringRestriction stringRestriction = (YangStringRestriction) leafInfo
-                .getDataType().getDataTypeExtendedInfo();
-        YangRangeRestriction lengthRestriction = stringRestriction.getLengthRestriction();
+        assertThat(leaf.getName(), is("invalid-interval"));
+        assertThat(type.getDataTypeName(), is("string"));
+        assertThat(type.getDataType(), is(STRING));
+        YangStringRestriction strRes = (YangStringRestriction) type
+                .getDataTypeExtendedInfo();
+        YangRangeRestriction lenRes = strRes.getLengthRestriction();
 
-        ListIterator<YangRangeInterval> lengthListIterator = lengthRestriction.getAscendingRangeIntervals()
-                .listIterator();
+        ListIterator<YangRangeInterval> lenIt = lenRes
+                .getAscendingRangeIntervals().listIterator();
 
-        YangRangeInterval rangeInterval = lengthListIterator.next();
+        YangRangeInterval range = lenIt.next();
 
-        assertThat(((YangUint64) rangeInterval.getStartValue()).getValue(), is(BigInteger.valueOf(0)));
-        assertThat(((YangUint64) rangeInterval.getEndValue()).getValue(), is(BigInteger.valueOf(100)));
+        assertThat(((YangUint64) range.getStartValue()).getValue(),
+                   is(valueOf(0)));
+        assertThat(((YangUint64) range.getEndValue()).getValue(),
+                   is(valueOf(100)));
     }
 
     /**
@@ -88,29 +94,33 @@
     @Test
     public void processLengthStatementInsideLeafList() throws IOException, ParserException {
 
-        YangNode node = manager.getDataModel("src/test/resources/LengthStatementInsideLeafList.yang");
+        YangNode node = manager.getDataModel(
+                "src/test/resources/LengthStatementInsideLeafList.yang");
 
         assertThat((node instanceof YangModule), is(true));
         assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeafList> leafListIterator = yangNode.getListOfLeafList().listIterator();
-        YangLeafList leafListInfo = leafListIterator.next();
-
-        assertThat(leafListInfo.getName(), is("invalid-interval"));
-        assertThat(leafListInfo.getDataType().getDataTypeName(), is("string"));
-        assertThat(leafListInfo.getDataType().getDataType(), is(YangDataTypes.STRING));
-        YangStringRestriction stringRestriction = (YangStringRestriction) leafListInfo
-                .getDataType().getDataTypeExtendedInfo();
-        YangRangeRestriction lengthRestriction = stringRestriction.getLengthRestriction();
-
-        ListIterator<YangRangeInterval> lengthListIterator = lengthRestriction.getAscendingRangeIntervals()
+        ListIterator<YangLeafList> it = yangNode.getListOfLeafList()
                 .listIterator();
+        YangLeafList ll = it.next();
+        YangType<?> type = ll.getDataType();
+        assertThat(ll.getName(), is("invalid-interval"));
+        assertThat(type.getDataTypeName(), is("string"));
+        assertThat(type.getDataType(), is(STRING));
+        YangStringRestriction strRes = (YangStringRestriction) type
+                .getDataTypeExtendedInfo();
+        YangRangeRestriction lenRes = strRes.getLengthRestriction();
 
-        YangRangeInterval rangeInterval = lengthListIterator.next();
-        assertThat(((YangUint64) rangeInterval.getStartValue()).getValue(), is(BigInteger.valueOf(1)));
-        assertThat(((YangUint64) rangeInterval.getEndValue()).getValue(), is(BigInteger.valueOf(100)));
+        ListIterator<YangRangeInterval> llIt = lenRes
+                .getAscendingRangeIntervals().listIterator();
+
+        YangRangeInterval range = llIt.next();
+        assertThat(((YangUint64) range.getStartValue()).getValue(),
+                   is(valueOf(1)));
+        assertThat(((YangUint64) range.getEndValue()).getValue(),
+                   is(valueOf(100)));
     }
 
     /**
@@ -119,7 +129,8 @@
     @Test
     public void processLengthStatementInsideTypeDef() throws IOException, ParserException {
 
-        YangNode node = manager.getDataModel("src/test/resources/LengthStatementInsideTypeDef.yang");
+        YangNode node = manager.getDataModel(
+                "src/test/resources/LengthStatementInsideTypeDef.yang");
 
         assertThat((node instanceof YangModule), is(true));
         assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
@@ -127,15 +138,20 @@
         assertThat(yangNode.getName(), is("Test"));
 
         YangTypeDef typedef = (YangTypeDef) yangNode.getChild();
-        YangStringRestriction stringRestriction = (YangStringRestriction) typedef.getTypeDefBaseType()
-                .getDataTypeExtendedInfo();
+        YangStringRestriction strRes = (YangStringRestriction) typedef
+                .getTypeDefBaseType().getDataTypeExtendedInfo();
 
-        YangRangeRestriction lengthRestriction = stringRestriction.getLengthRestriction();
-        ListIterator<YangRangeInterval> lengthListIterator = lengthRestriction.getAscendingRangeIntervals()
+        YangRangeRestriction lenRes = strRes.getLengthRestriction();
+        assertThat(lenRes.getDescription(),
+                   is("\"length-description typedef\""));
+        assertThat(lenRes.getReference(), is("\"reference typedef\""));
+        ListIterator<YangRangeInterval> it = lenRes.getAscendingRangeIntervals()
                 .listIterator();
-        YangRangeInterval rangeInterval = lengthListIterator.next();
-        assertThat(((YangUint64) rangeInterval.getStartValue()).getValue(), is(BigInteger.valueOf(1)));
-        assertThat(((YangUint64) rangeInterval.getEndValue()).getValue(), is(BigInteger.valueOf(100)));
+        YangRangeInterval rangeInterval = it.next();
+        assertThat(((YangUint64) rangeInterval.getStartValue()).getValue(),
+                   is(valueOf(1)));
+        assertThat(((YangUint64) rangeInterval.getEndValue()).getValue(),
+                   is(valueOf(100)));
     }
 
     /**
@@ -144,29 +160,36 @@
     @Test
     public void processValidBinaryLengthStatement() throws IOException, ParserException {
 
-        YangNode node = manager.getDataModel("src/test/resources/ValidBinaryLengthStatement.yang");
+        YangNode node = manager.getDataModel(
+                "src/test/resources/ValidBinaryLengthStatement.yang");
 
         assertThat((node instanceof YangModule), is(true));
         assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf> it = yangNode.getListOfLeaf().listIterator();
+        YangLeaf leaf = it.next();
+        YangType<?> type = leaf.getDataType();
 
-        assertThat(leafInfo.getName(), is("message"));
-        assertThat(leafInfo.getDataType().getDataTypeName(), is("binary"));
-        assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.BINARY));
-        YangRangeRestriction lengthRestriction = (YangRangeRestriction) leafInfo
-                                                  .getDataType().getDataTypeExtendedInfo();
+        assertThat(leaf.getName(), is("message"));
+        assertThat(type.getDataTypeName(), is("binary"));
+        assertThat(type.getDataType(), is(BINARY));
+        YangRangeRestriction lenRes = (YangRangeRestriction) type
+                .getDataTypeExtendedInfo();
 
-        ListIterator<YangRangeInterval> lengthListIterator = lengthRestriction.getAscendingRangeIntervals()
-                .listIterator();
+        assertThat(lenRes.getDescription(), is("\"binary description\""));
+        assertThat(lenRes.getReference(), is("\"binary reference\""));
 
-        YangRangeInterval rangeInterval = lengthListIterator.next();
+        ListIterator<YangRangeInterval> llIt = lenRes
+                .getAscendingRangeIntervals().listIterator();
 
-        assertThat(((YangUint64) rangeInterval.getStartValue()).getValue(), is(BigInteger.valueOf(4)));
-        assertThat(((YangUint64) rangeInterval.getEndValue()).getValue(), is(BigInteger.valueOf(4)));
+        YangRangeInterval range = llIt.next();
+
+        assertThat(((YangUint64) range.getStartValue()).getValue(),
+                   is(valueOf(4)));
+        assertThat(((YangUint64) range.getEndValue()).getValue(),
+                   is(valueOf(4)));
     }
 
     /**
@@ -175,9 +198,11 @@
     @Test
     public void processLengthWithInvalidType() throws IOException, ParserException {
         thrown.expect(ParserException.class);
-        thrown.expectMessage("YANG file error : length name \"1..100\" can be used to restrict the built-in type" +
-                " string/binary or types derived from string/binary.");
-        YangNode node = manager.getDataModel("src/test/resources/LengthWithInvalidType.yang");
+        thrown.expectMessage("YANG file error : Length can only be used to" +
+                                     " restrict the built-in type string/" +
+                                     "binary or types derived from string/" +
+                                     "binary");
+        manager.getDataModel("src/test/resources/LengthWithInvalidType.yang");
     }
 
     /**
@@ -187,29 +212,34 @@
     public void processLengthWithOneInterval() throws IOException, ParserException {
 
 
-        YangNode node = manager.getDataModel("src/test/resources/LengthWithOneInterval.yang");
+        YangNode node = manager.getDataModel(
+                "src/test/resources/LengthWithOneInterval.yang");
 
         assertThat((node instanceof YangModule), is(true));
         assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeafList> leafListIterator = yangNode.getListOfLeafList().listIterator();
-        YangLeafList leafListInfo = leafListIterator.next();
-
-        assertThat(leafListInfo.getName(), is("invalid-interval"));
-        assertThat(leafListInfo.getDataType().getDataTypeName(), is("string"));
-        assertThat(leafListInfo.getDataType().getDataType(), is(YangDataTypes.STRING));
-        YangStringRestriction stringRestriction = (YangStringRestriction) leafListInfo
-                .getDataType().getDataTypeExtendedInfo();
-        YangRangeRestriction lengthRestriction = stringRestriction.getLengthRestriction();
-
-        ListIterator<YangRangeInterval> lengthListIterator = lengthRestriction.getAscendingRangeIntervals()
+        ListIterator<YangLeafList> it = yangNode.getListOfLeafList()
                 .listIterator();
+        YangLeafList ll = it.next();
+        YangType<?> type = ll.getDataType();
 
-        YangRangeInterval rangeInterval = lengthListIterator.next();
-        assertThat(((YangUint64) rangeInterval.getStartValue()).getValue(), is(BigInteger.valueOf(1)));
-        assertThat(((YangUint64) rangeInterval.getEndValue()).getValue(), is(BigInteger.valueOf(1)));
+        assertThat(ll.getName(), is("invalid-interval"));
+        assertThat(type.getDataTypeName(), is("string"));
+        assertThat(type.getDataType(), is(STRING));
+        YangStringRestriction strRes = (YangStringRestriction) type
+                .getDataTypeExtendedInfo();
+        YangRangeRestriction lenRes = strRes.getLengthRestriction();
+
+        ListIterator<YangRangeInterval> llIt = lenRes
+                .getAscendingRangeIntervals().listIterator();
+
+        YangRangeInterval range = llIt.next();
+        assertThat(((YangUint64) range.getStartValue()).getValue(),
+                   is(valueOf(1)));
+        assertThat(((YangUint64) range.getEndValue()).getValue(),
+                   is(valueOf(1)));
     }
 
     /**
@@ -219,29 +249,34 @@
     public void processLengthWithMinMax() throws IOException, ParserException {
 
 
-        YangNode node = manager.getDataModel("src/test/resources/LengthWithMinMax.yang");
+        YangNode node = manager.getDataModel(
+                "src/test/resources/LengthWithMinMax.yang");
 
         assertThat((node instanceof YangModule), is(true));
         assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeafList> leafListIterator = yangNode.getListOfLeafList().listIterator();
-        YangLeafList leafListInfo = leafListIterator.next();
-
-        assertThat(leafListInfo.getName(), is("invalid-interval"));
-        assertThat(leafListInfo.getDataType().getDataTypeName(), is("string"));
-        assertThat(leafListInfo.getDataType().getDataType(), is(YangDataTypes.STRING));
-        YangStringRestriction stringRestriction = (YangStringRestriction) leafListInfo
-                .getDataType().getDataTypeExtendedInfo();
-        YangRangeRestriction lengthRestriction = stringRestriction.getLengthRestriction();
-
-        ListIterator<YangRangeInterval> lengthListIterator = lengthRestriction.getAscendingRangeIntervals()
+        ListIterator<YangLeafList> it = yangNode.getListOfLeafList()
                 .listIterator();
+        YangLeafList ll = it.next();
+        YangType<?> type = ll.getDataType();
 
-        YangRangeInterval rangeInterval = lengthListIterator.next();
-        assertThat(((YangUint64) rangeInterval.getStartValue()).getValue(), is(BigInteger.valueOf(0)));
-        assertThat(((YangUint64) rangeInterval.getEndValue()).getValue(), is(new BigInteger("18446744073709551615")));
+        assertThat(ll.getName(), is("invalid-interval"));
+        assertThat(type.getDataTypeName(), is("string"));
+        assertThat(type.getDataType(), is(STRING));
+        YangStringRestriction strRes = (YangStringRestriction) type
+                .getDataTypeExtendedInfo();
+        YangRangeRestriction lenRes = strRes.getLengthRestriction();
+
+        ListIterator<YangRangeInterval> llIt = lenRes
+                .getAscendingRangeIntervals().listIterator();
+
+        YangRangeInterval range = llIt.next();
+        assertThat(((YangUint64) range.getStartValue()).getValue(),
+                   is(valueOf(0)));
+        assertThat(((YangUint64) range.getEndValue()).getValue(),
+                   is(new BigInteger("18446744073709551615")));
     }
 
     /**
@@ -250,8 +285,10 @@
     @Test
     public void processLengthWithInvalidIntegerPattern() throws IOException, ParserException {
         thrown.expect(ParserException.class);
-        thrown.expectMessage("YANG file error : Input value \"a\" is not a valid uint64.");
-        YangNode node = manager.getDataModel("src/test/resources/LengthWithInvalidIntegerPattern.yang");
+        thrown.expectMessage("YANG file error : Input value \"a\" is not a" +
+                                     " valid uint64.");
+        manager.getDataModel("src/test/resources/LengthWithInvalidI" +
+                                     "ntegerPattern.yang");
     }
 
     /**
@@ -260,44 +297,50 @@
     @Test
     public void processLengthWithInvalidInterval() throws IOException, ParserException {
         thrown.expect(ParserException.class);
-        thrown.expectMessage("YANG file error : 18446744073709551617 is greater than maximum value" +
-                " 18446744073709551615.");
-        YangNode node = manager.getDataModel("src/test/resources/LengthWithInvalidInterval.yang");
+        thrown.expectMessage("YANG file error : 18446744073709551617 is gre" +
+                                     "ater than maximum value " +
+                                     "18446744073709551615.");
+        manager.getDataModel("src/test/resources/LengthWithInvalidInter" +
+                                     "val.yang");
     }
 
     /**
-     * Checks valid length substatements.
+     * Checks valid length sub-statements.
      */
     @Test
     public void processLengthSubStatements() throws IOException, ParserException {
 
-        YangNode node = manager.getDataModel("src/test/resources/LengthSubStatements.yang");
+        YangNode node = manager.getDataModel(
+                "src/test/resources/LengthSubStatements.yang");
 
         assertThat((node instanceof YangModule), is(true));
         assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf> it = yangNode.getListOfLeaf().listIterator();
+        YangLeaf leaf = it.next();
+        YangType<?> type = leaf.getDataType();
 
-        assertThat(leafInfo.getName(), is("invalid-interval"));
-        assertThat(leafInfo.getDataType().getDataTypeName(), is("string"));
-        assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.STRING));
-        YangStringRestriction stringRestriction = (YangStringRestriction) leafInfo
-                .getDataType().getDataTypeExtendedInfo();
-        YangRangeRestriction lengthRestriction = stringRestriction.getLengthRestriction();
+        assertThat(leaf.getName(), is("invalid-interval"));
+        assertThat(type.getDataTypeName(), is("string"));
+        assertThat(type.getDataType(), is(STRING));
+        YangStringRestriction strRes = (YangStringRestriction) type
+                .getDataTypeExtendedInfo();
+        YangRangeRestriction lenRes = strRes.getLengthRestriction();
 
-        assertThat(lengthRestriction.getDescription(), is("\"length description\""));
-        assertThat(lengthRestriction.getReference(), is("\"length reference\""));
+        assertThat(lenRes.getDescription(), is("\"length description\""));
+        assertThat(lenRes.getReference(), is("\"length reference\""));
 
-        ListIterator<YangRangeInterval> lengthListIterator = lengthRestriction.getAscendingRangeIntervals()
-                .listIterator();
+        ListIterator<YangRangeInterval> llIt = lenRes
+                .getAscendingRangeIntervals().listIterator();
 
-        YangRangeInterval rangeInterval = lengthListIterator.next();
+        YangRangeInterval range = llIt.next();
 
-        assertThat(((YangUint64) rangeInterval.getStartValue()).getValue(), is(BigInteger.valueOf(0)));
-        assertThat(((YangUint64) rangeInterval.getEndValue()).getValue(), is(BigInteger.valueOf(100)));
+        assertThat(((YangUint64) range.getStartValue()).getValue(),
+                   is(valueOf(0)));
+        assertThat(((YangUint64) range.getEndValue()).getValue(),
+                   is(valueOf(100)));
     }
 
     /**
@@ -306,29 +349,33 @@
     @Test
     public void processLengthStatementWithSpace() throws IOException, ParserException {
 
-        YangNode node = manager.getDataModel("src/test/resources/LengthStatementWithSpace.yang");
+        YangNode node = manager.getDataModel(
+                "src/test/resources/LengthStatementWithSpace.yang");
 
         assertThat((node instanceof YangModule), is(true));
         assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf> it = yangNode.getListOfLeaf().listIterator();
+        YangLeaf leaf = it.next();
+        YangType<?> type = leaf.getDataType();
 
-        assertThat(leafInfo.getName(), is("invalid-interval"));
-        assertThat(leafInfo.getDataType().getDataTypeName(), is("string"));
-        assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.STRING));
-        YangStringRestriction stringRestriction = (YangStringRestriction) leafInfo
-                .getDataType().getDataTypeExtendedInfo();
-        YangRangeRestriction lengthRestriction = stringRestriction.getLengthRestriction();
+        assertThat(leaf.getName(), is("invalid-interval"));
+        assertThat(type.getDataTypeName(), is("string"));
+        assertThat(type.getDataType(), is(STRING));
+        YangStringRestriction strRes = (YangStringRestriction) type
+                .getDataTypeExtendedInfo();
+        YangRangeRestriction lenRes = strRes.getLengthRestriction();
 
-        ListIterator<YangRangeInterval> lengthListIterator = lengthRestriction.getAscendingRangeIntervals()
-                .listIterator();
+        ListIterator<YangRangeInterval> llIt = lenRes
+                .getAscendingRangeIntervals().listIterator();
 
-        YangRangeInterval rangeInterval = lengthListIterator.next();
+        YangRangeInterval range = llIt.next();
 
-        assertThat(((YangUint64) rangeInterval.getStartValue()).getValue(), is(BigInteger.valueOf(0)));
-        assertThat(((YangUint64) rangeInterval.getEndValue()).getValue(), is(BigInteger.valueOf(100)));
+        assertThat(((YangUint64) range.getStartValue()).getValue(),
+                   is(valueOf(0)));
+        assertThat(((YangUint64) range.getEndValue()).getValue(),
+                   is(valueOf(100)));
     }
 }
diff --git a/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/PatternRestrictionListenerTest.java b/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/PatternRestrictionListenerTest.java
index ce63ef2..c0f0c5b 100644
--- a/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/PatternRestrictionListenerTest.java
+++ b/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/PatternRestrictionListenerTest.java
@@ -31,6 +31,7 @@
 import org.onosproject.yang.compiler.parser.impl.YangUtilsParserManager;
 
 import java.io.IOException;
+import java.util.List;
 import java.util.ListIterator;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -49,35 +50,35 @@
     @Test
     public void processValidPatternStatement() throws IOException, ParserException {
 
-        YangNode node = manager.getDataModel("src/test/resources/ValidPatternStatement.yang");
+        YangNode node = manager.getDataModel(
+                "src/test/resources/ValidPatternStatement.yang");
 
         assertThat((node instanceof YangModule), is(true));
         assertThat(node.getNodeType(), Is.is(YangNodeType.MODULE_NODE));
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf> it = yangNode.getListOfLeaf().listIterator();
+        YangLeaf leaf = it.next();
 
-        assertThat(leafInfo.getName(), is("invalid-interval"));
-        assertThat(leafInfo.getDataType().getDataTypeName(), is("string"));
-        assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.STRING));
-        YangStringRestriction stringRestriction = (YangStringRestriction) leafInfo
+        assertThat(leaf.getName(), is("invalid-interval"));
+        assertThat(leaf.getDataType().getDataTypeName(), is("string"));
+        assertThat(leaf.getDataType().getDataType(), is(YangDataTypes.STRING));
+        YangStringRestriction strRes = (YangStringRestriction) leaf
                 .getDataType().getDataTypeExtendedInfo();
-        ListIterator<String> patternListIterator = stringRestriction.getPatternRestriction()
-                .getPatternList().listIterator();
-        assertThat(patternListIterator.next(), is("[a-zA-Z]"));
+        ListIterator<YangPatternRestriction> patIt = strRes
+                .getPatternResList().listIterator();
+        assertThat(patIt.next().getPattern(), is("[a-zA-Z]"));
 
-        leafInfo = leafIterator.next();
+        leaf = it.next();
 
-        assertThat(leafInfo.getName(), is("ipv4-address"));
-        assertThat(leafInfo.getDataType().getDataTypeName(), is("string"));
-        assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.STRING));
-        stringRestriction = (YangStringRestriction) leafInfo
-                .getDataType().getDataTypeExtendedInfo();
-        patternListIterator = stringRestriction.getPatternRestriction()
-                .getPatternList().listIterator();
-        assertThat(patternListIterator.next(), is(
+        assertThat(leaf.getName(), is("ipv4-address"));
+        assertThat(leaf.getDataType().getDataTypeName(), is("string"));
+        assertThat(leaf.getDataType().getDataType(), is(YangDataTypes.STRING));
+        strRes = (YangStringRestriction) leaf.getDataType()
+                .getDataTypeExtendedInfo();
+        patIt = strRes.getPatternResList().listIterator();
+        assertThat(patIt.next().getPattern(), is(
                 "(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}" +
                         "([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])" +
                         "(%[\\p{N}\\p{L}]+)?"));
@@ -89,24 +90,26 @@
     @Test
     public void processPatternStatementInsideLeafList() throws IOException, ParserException {
 
-        YangNode node = manager.getDataModel("src/test/resources/PatternStatementInsideLeafList.yang");
+        YangNode node = manager.getDataModel(
+                "src/test/resources/PatternStatementInsideLeafList.yang");
 
         assertThat((node instanceof YangModule), is(true));
         assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeafList> leafListIterator = yangNode.getListOfLeafList().listIterator();
-        YangLeafList leafListInfo = leafListIterator.next();
+        ListIterator<YangLeafList> it = yangNode.getListOfLeafList()
+                .listIterator();
+        YangLeafList ll = it.next();
 
-        assertThat(leafListInfo.getName(), is("invalid-interval"));
-        assertThat(leafListInfo.getDataType().getDataTypeName(), is("string"));
-        assertThat(leafListInfo.getDataType().getDataType(), is(YangDataTypes.STRING));
-        YangStringRestriction stringRestriction = (YangStringRestriction) leafListInfo
+        assertThat(ll.getName(), is("invalid-interval"));
+        assertThat(ll.getDataType().getDataTypeName(), is("string"));
+        assertThat(ll.getDataType().getDataType(), is(YangDataTypes.STRING));
+        YangStringRestriction strRes = (YangStringRestriction) ll
                 .getDataType().getDataTypeExtendedInfo();
-        ListIterator<String> patternListIterator = stringRestriction.getPatternRestriction()
-                .getPatternList().listIterator();
-        assertThat(patternListIterator.next(), is("[a-zA-Z]"));
+        ListIterator<YangPatternRestriction> patIt = strRes.getPatternResList()
+                .listIterator();
+        assertThat(patIt.next().getPattern(), is("[a-zA-Z]"));
     }
 
     /**
@@ -115,7 +118,8 @@
     @Test
     public void processPatternStatementInsideTypeDef() throws IOException, ParserException {
 
-        YangNode node = manager.getDataModel("src/test/resources/PatternStatementInsideTypeDef.yang");
+        YangNode node = manager.getDataModel(
+                "src/test/resources/PatternStatementInsideTypeDef.yang");
 
         assertThat((node instanceof YangModule), is(true));
         assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
@@ -123,11 +127,11 @@
         assertThat(yangNode.getName(), is("Test"));
 
         YangTypeDef typedef = (YangTypeDef) yangNode.getChild();
-        YangStringRestriction stringRestriction = (YangStringRestriction) typedef.getTypeDefBaseType()
-                .getDataTypeExtendedInfo();
+        YangStringRestriction strRes = (YangStringRestriction) typedef
+                .getTypeDefBaseType().getDataTypeExtendedInfo();
 
-        YangPatternRestriction yangPatternRestriction = stringRestriction.getPatternRestriction();
-        assertThat(yangPatternRestriction.getPatternList().listIterator().next(), is("[a-zA-Z]"));
+        List<YangPatternRestriction> patRes = strRes.getPatternResList();
+        assertThat(patRes.listIterator().next().getPattern(), is("[a-zA-Z]"));
     }
 
     /**
@@ -136,24 +140,26 @@
     @Test
     public void processMultiplePatternStatement() throws IOException, ParserException {
 
-        YangNode node = manager.getDataModel("src/test/resources/MultiplePatternStatement.yang");
+        YangNode node = manager.getDataModel(
+                "src/test/resources/MultiplePatternStatement.yang");
 
         assertThat((node instanceof YangModule), is(true));
         assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeafList> leafListIterator = yangNode.getListOfLeafList().listIterator();
-        YangLeafList leafListInfo = leafListIterator.next();
+        ListIterator<YangLeafList> it = yangNode.getListOfLeafList()
+                .listIterator();
+        YangLeafList ll = it.next();
 
-        assertThat(leafListInfo.getName(), is("invalid-interval"));
-        assertThat(leafListInfo.getDataType().getDataTypeName(), is("string"));
-        assertThat(leafListInfo.getDataType().getDataType(), is(YangDataTypes.STRING));
-        YangStringRestriction stringRestriction = (YangStringRestriction) leafListInfo
-                .getDataType().getDataTypeExtendedInfo();
-        ListIterator<String> patternListIterator = stringRestriction.getPatternRestriction()
-                .getPatternList().listIterator();
-        assertThat(patternListIterator.next(), is("[a-zA-Z]"));
+        assertThat(ll.getName(), is("invalid-interval"));
+        assertThat(ll.getDataType().getDataTypeName(), is("string"));
+        assertThat(ll.getDataType().getDataType(), is(YangDataTypes.STRING));
+        YangStringRestriction strRes = (YangStringRestriction) ll.getDataType()
+                .getDataTypeExtendedInfo();
+        ListIterator<YangPatternRestriction> patIt = strRes.getPatternResList()
+                .listIterator();
+        assertThat(patIt.next().getPattern(), is("[a-zA-Z]"));
     }
 
     /**
@@ -162,23 +168,25 @@
     @Test
     public void processPatternStatementWithPlus() throws IOException, ParserException {
 
-        YangNode node = manager.getDataModel("src/test/resources/PatternStatementWithPlus.yang");
+        YangNode node = manager.getDataModel(
+                "src/test/resources/PatternStatementWithPlus.yang");
 
         assertThat((node instanceof YangModule), is(true));
         assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeafList> leafListIterator = yangNode.getListOfLeafList().listIterator();
-        YangLeafList leafListInfo = leafListIterator.next();
+        ListIterator<YangLeafList> it = yangNode.getListOfLeafList()
+                .listIterator();
+        YangLeafList ll = it.next();
 
-        assertThat(leafListInfo.getName(), is("invalid-interval"));
-        assertThat(leafListInfo.getDataType().getDataTypeName(), is("string"));
-        assertThat(leafListInfo.getDataType().getDataType(), is(YangDataTypes.STRING));
-        YangStringRestriction stringRestriction = (YangStringRestriction) leafListInfo
-                .getDataType().getDataTypeExtendedInfo();
-        ListIterator<String> patternListIterator = stringRestriction.getPatternRestriction()
-                .getPatternList().listIterator();
+        assertThat(ll.getName(), is("invalid-interval"));
+        assertThat(ll.getDataType().getDataTypeName(), is("string"));
+        assertThat(ll.getDataType().getDataType(), is(YangDataTypes.STRING));
+        YangStringRestriction strRes = (YangStringRestriction) ll.getDataType()
+                .getDataTypeExtendedInfo();
+        ListIterator<YangPatternRestriction> patIt = strRes.getPatternResList()
+                .listIterator();
         //FIXME: + should not be remove from the end.
         //assertThat(patternListIterator.next(), is("-[0-9]+|[0-9]+"));
     }
@@ -189,26 +197,28 @@
     @Test
     public void processPatternSubStatements() throws IOException, ParserException {
 
-        YangNode node = manager.getDataModel("src/test/resources/PatternSubStatements.yang");
+        YangNode node = manager.getDataModel(
+                "src/test/resources/PatternSubStatements.yang");
 
         assertThat((node instanceof YangModule), is(true));
         assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf> it = yangNode.getListOfLeaf().listIterator();
+        YangLeaf leaf = it.next();
 
-        assertThat(leafInfo.getName(), is("invalid-interval"));
-        assertThat(leafInfo.getDataType().getDataTypeName(), is("string"));
-        assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.STRING));
-        YangStringRestriction stringRestriction = (YangStringRestriction) leafInfo
+        assertThat(leaf.getName(), is("invalid-interval"));
+        assertThat(leaf.getDataType().getDataTypeName(), is("string"));
+        assertThat(leaf.getDataType().getDataType(), is(YangDataTypes.STRING));
+        YangStringRestriction strRes = (YangStringRestriction) leaf
                 .getDataType().getDataTypeExtendedInfo();
-        assertThat(stringRestriction.getDescription(), is("\"pattern description\""));
-        assertThat(stringRestriction.getReference(), is("\"pattern reference\""));
-        ListIterator<String> patternListIterator = stringRestriction.getPatternRestriction()
-                .getPatternList().listIterator();
-        assertThat(patternListIterator.next(), is("[a-zA-Z]"));
+        ListIterator<YangPatternRestriction> patIt = strRes.getPatternResList()
+                .listIterator();
+        YangPatternRestriction pat = patIt.next();
+        assertThat(pat.getDescription(), is("\"pattern description\""));
+        assertThat(pat.getReference(), is("\"pattern reference\""));
+        assertThat(pat.getPattern(), is("[a-zA-Z]"));
     }
 
     /**
@@ -216,6 +226,7 @@
      */
     @Test(expected = ParserException.class)
     public void processInvalidPatternSubStatements() throws IOException, ParserException {
-        YangNode node = manager.getDataModel("src/test/resources/InvalidPatternSubStatements.yang");
+        YangNode node = manager.getDataModel(
+                "src/test/resources/InvalidPatternSubStatements.yang");
     }
 }
diff --git a/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/RangeRestrictionListenerTest.java b/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/RangeRestrictionListenerTest.java
index ab3cc4c..370514d 100644
--- a/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/RangeRestrictionListenerTest.java
+++ b/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/RangeRestrictionListenerTest.java
@@ -19,6 +19,7 @@
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
+import org.onosproject.yang.compiler.datamodel.YangDerivedInfo;
 import org.onosproject.yang.compiler.datamodel.YangLeaf;
 import org.onosproject.yang.compiler.datamodel.YangLeafList;
 import org.onosproject.yang.compiler.datamodel.YangModule;
@@ -26,8 +27,10 @@
 import org.onosproject.yang.compiler.datamodel.YangNodeType;
 import org.onosproject.yang.compiler.datamodel.YangRangeInterval;
 import org.onosproject.yang.compiler.datamodel.YangRangeRestriction;
-import org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes;
+import org.onosproject.yang.compiler.datamodel.YangType;
+import org.onosproject.yang.compiler.datamodel.YangTypeDef;
 import org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangInt32;
+import org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangUint8;
 import org.onosproject.yang.compiler.parser.exceptions.ParserException;
 import org.onosproject.yang.compiler.parser.impl.YangUtilsParserManager;
 
@@ -36,44 +39,48 @@
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.core.Is.is;
+import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.DERIVED;
+import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.INT32;
 
 /**
  * Test cases for range restriction listener.
  */
 public class RangeRestrictionListenerTest {
 
+    private final YangUtilsParserManager manager = new YangUtilsParserManager();
     @Rule
     public ExpectedException thrown = ExpectedException.none();
 
-    private final YangUtilsParserManager manager = new YangUtilsParserManager();
-
     /**
      * Checks valid range statement as sub-statement of leaf statement.
      */
     @Test
     public void processValidRangeStatement() throws IOException, ParserException {
 
-        YangNode node = manager.getDataModel("src/test/resources/ValidRangeStatement.yang");
+        YangNode node = manager.getDataModel("src/test/resources/ValidRange" +
+                                                     "Statement.yang");
 
         assertThat((node instanceof YangModule), is(true));
         assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf> it = yangNode.getListOfLeaf().listIterator();
+        YangLeaf leaf = it.next();
 
-        assertThat(leafInfo.getName(), is("invalid-interval"));
-        assertThat(leafInfo.getDataType().getDataTypeName(), is("int32"));
-        assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.INT32));
-        YangRangeRestriction rangeRestriction = (YangRangeRestriction) leafInfo
-                .getDataType().getDataTypeExtendedInfo();
+        YangType<?> type = leaf.getDataType();
 
-        ListIterator<YangRangeInterval> rangeListIterator = rangeRestriction.getAscendingRangeIntervals()
-                .listIterator();
-        YangRangeInterval rangeInterval = rangeListIterator.next();
-        assertThat(((YangInt32) rangeInterval.getStartValue()).getValue(), is(1));
-        assertThat(((YangInt32) rangeInterval.getEndValue()).getValue(), is(4));
+        assertThat(leaf.getName(), is("invalid-interval"));
+        assertThat(type.getDataTypeName(), is("int32"));
+        assertThat(type.getDataType(), is(INT32));
+        YangRangeRestriction ranRes = (YangRangeRestriction) type
+                .getDataTypeExtendedInfo();
+
+        ListIterator<YangRangeInterval> rlIt = ranRes
+                .getAscendingRangeIntervals().listIterator();
+        YangRangeInterval range = rlIt.next();
+        assertThat(((YangInt32) range.getStartValue()).getValue(), is(1));
+        assertThat(((YangInt32) range.getEndValue()).getValue(), is(4));
     }
 
     /**
@@ -82,28 +89,32 @@
     @Test
     public void processRangeStatementInsideLeafList() throws IOException, ParserException {
 
-        YangNode node = manager.getDataModel("src/test/resources/RangeStatementInsideLeafList.yang");
+        YangNode node = manager.getDataModel(
+                "src/test/resources/RangeStatementInsideLeafList.yang");
 
         assertThat((node instanceof YangModule), is(true));
         assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeafList> leafListIterator = yangNode.getListOfLeafList().listIterator();
-        YangLeafList leafListInfo = leafListIterator.next();
-
-        assertThat(leafListInfo.getName(), is("invalid-interval"));
-        assertThat(leafListInfo.getDataType().getDataTypeName(), is("int32"));
-        assertThat(leafListInfo.getDataType().getDataType(), is(YangDataTypes.INT32));
-        YangRangeRestriction rangeRestriction = (YangRangeRestriction) leafListInfo
-                .getDataType().getDataTypeExtendedInfo();
-
-        ListIterator<YangRangeInterval> rangeListIterator = rangeRestriction.getAscendingRangeIntervals()
+        ListIterator<YangLeafList> it = yangNode.getListOfLeafList()
                 .listIterator();
-        YangRangeInterval rangeInterval = rangeListIterator.next();
+        YangLeafList ll = it.next();
 
-        assertThat(((YangInt32) rangeInterval.getStartValue()).getValue(), is(1));
-        assertThat(((YangInt32) rangeInterval.getEndValue()).getValue(), is(4));
+        YangType<?> type = ll.getDataType();
+
+        assertThat(ll.getName(), is("invalid-interval"));
+        assertThat(type.getDataTypeName(), is("int32"));
+        assertThat(type.getDataType(), is(INT32));
+        YangRangeRestriction ranRes = (YangRangeRestriction) type
+                .getDataTypeExtendedInfo();
+
+        ListIterator<YangRangeInterval> rlIt = ranRes
+                .getAscendingRangeIntervals().listIterator();
+        YangRangeInterval range = rlIt.next();
+
+        assertThat(((YangInt32) range.getStartValue()).getValue(), is(1));
+        assertThat(((YangInt32) range.getEndValue()).getValue(), is(4));
     }
 
     /**
@@ -112,28 +123,32 @@
     @Test
     public void processRangeWithOneInterval() throws IOException, ParserException {
 
-        YangNode node = manager.getDataModel("src/test/resources/RangeWithOneInterval.yang");
+        YangNode node = manager.getDataModel(
+                "src/test/resources/RangeWithOneInterval.yang");
 
         assertThat((node instanceof YangModule), is(true));
         assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeafList> leafListIterator = yangNode.getListOfLeafList().listIterator();
-        YangLeafList leafListInfo = leafListIterator.next();
-
-        assertThat(leafListInfo.getName(), is("invalid-interval"));
-        assertThat(leafListInfo.getDataType().getDataTypeName(), is("int32"));
-        assertThat(leafListInfo.getDataType().getDataType(), is(YangDataTypes.INT32));
-        YangRangeRestriction rangeRestriction = (YangRangeRestriction) leafListInfo
-                .getDataType().getDataTypeExtendedInfo();
-
-        ListIterator<YangRangeInterval> rangeListIterator = rangeRestriction.getAscendingRangeIntervals()
+        ListIterator<YangLeafList> it = yangNode.getListOfLeafList()
                 .listIterator();
-        YangRangeInterval rangeInterval = rangeListIterator.next();
+        YangLeafList ll = it.next();
 
-        assertThat(((YangInt32) rangeInterval.getStartValue()).getValue(), is(1));
-        assertThat(((YangInt32) rangeInterval.getEndValue()).getValue(), is(1));
+        YangType<?> type = ll.getDataType();
+
+        assertThat(ll.getName(), is("invalid-interval"));
+        assertThat(type.getDataTypeName(), is("int32"));
+        assertThat(type.getDataType(), is(INT32));
+        YangRangeRestriction ranRes = (YangRangeRestriction) type
+                .getDataTypeExtendedInfo();
+
+        ListIterator<YangRangeInterval> rlIt = ranRes
+                .getAscendingRangeIntervals().listIterator();
+        YangRangeInterval range = rlIt.next();
+
+        assertThat(((YangInt32) range.getStartValue()).getValue(), is(1));
+        assertThat(((YangInt32) range.getEndValue()).getValue(), is(1));
     }
 
     /**
@@ -142,28 +157,34 @@
     @Test
     public void processRangeWithMinMax() throws IOException, ParserException {
 
-        YangNode node = manager.getDataModel("src/test/resources/RangeWithMinMax.yang");
+        YangNode node = manager.getDataModel("src/test/resources/RangeWithM" +
+                                                     "inMax.yang");
 
         assertThat((node instanceof YangModule), is(true));
         assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeafList> leafListIterator = yangNode.getListOfLeafList().listIterator();
-        YangLeafList leafListInfo = leafListIterator.next();
-
-        assertThat(leafListInfo.getName(), is("invalid-interval"));
-        assertThat(leafListInfo.getDataType().getDataTypeName(), is("int32"));
-        assertThat(leafListInfo.getDataType().getDataType(), is(YangDataTypes.INT32));
-        YangRangeRestriction rangeRestriction = (YangRangeRestriction) leafListInfo
-                .getDataType().getDataTypeExtendedInfo();
-
-        ListIterator<YangRangeInterval> rangeListIterator = rangeRestriction.getAscendingRangeIntervals()
+        ListIterator<YangLeafList> it = yangNode.getListOfLeafList()
                 .listIterator();
-        YangRangeInterval rangeInterval = rangeListIterator.next();
+        YangLeafList ll = it.next();
 
-        assertThat(((YangInt32) rangeInterval.getStartValue()).getValue(), is(-2147483648));
-        assertThat(((YangInt32) rangeInterval.getEndValue()).getValue(), is(2147483647));
+        YangType<?> type = ll.getDataType();
+
+        assertThat(ll.getName(), is("invalid-interval"));
+        assertThat(type.getDataTypeName(), is("int32"));
+        assertThat(type.getDataType(), is(INT32));
+        YangRangeRestriction ranRes = (YangRangeRestriction) type
+                .getDataTypeExtendedInfo();
+
+        ListIterator<YangRangeInterval> rlIt = ranRes
+                .getAscendingRangeIntervals().listIterator();
+        YangRangeInterval range = rlIt.next();
+
+        assertThat(((YangInt32) range.getStartValue()).getValue(),
+                   is(-2147483648));
+        assertThat(((YangInt32) range.getEndValue()).getValue(),
+                   is(2147483647));
     }
 
     /**
@@ -172,8 +193,10 @@
     @Test
     public void processRangeWithInvalidIntegerPattern() throws IOException, ParserException {
         thrown.expect(ParserException.class);
-        thrown.expectMessage("YANG file error : Input value \"a\" is not a valid int32.");
-        YangNode node = manager.getDataModel("src/test/resources/RangeWithInvalidIntegerPattern.yang");
+        thrown.expectMessage("YANG file error : Input value \"a\" is not " +
+                                     "a valid int32.");
+        manager.getDataModel("src/test/resources/RangeWithInval" +
+                                     "idIntegerPattern.yang");
     }
 
     /**
@@ -182,31 +205,34 @@
     @Test
     public void processRangeSubStatements() throws IOException, ParserException {
 
-        YangNode node = manager.getDataModel("src/test/resources/RangeSubStatements.yang");
+        YangNode node = manager.getDataModel("src/test/resources/" +
+                                                     "RangeSubStatements.yang");
 
         assertThat((node instanceof YangModule), is(true));
         assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf> it = yangNode.getListOfLeaf().listIterator();
+        YangLeaf leaf = it.next();
 
-        assertThat(leafInfo.getName(), is("invalid-interval"));
-        assertThat(leafInfo.getDataType().getDataTypeName(), is("int32"));
-        assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.INT32));
-        YangRangeRestriction rangeRestriction = (YangRangeRestriction) leafInfo
-                .getDataType().getDataTypeExtendedInfo();
+        YangType<?> type = leaf.getDataType();
 
-        assertThat(rangeRestriction.getDescription(), is("\"range description\""));
-        assertThat(rangeRestriction.getReference(), is("\"range reference\""));
+        assertThat(leaf.getName(), is("invalid-interval"));
+        assertThat(type.getDataTypeName(), is("int32"));
+        assertThat(type.getDataType(), is(INT32));
+        YangRangeRestriction ranRes = (YangRangeRestriction) type
+                .getDataTypeExtendedInfo();
 
-        ListIterator<YangRangeInterval> rangeListIterator = rangeRestriction.getAscendingRangeIntervals()
-                .listIterator();
-        YangRangeInterval rangeInterval = rangeListIterator.next();
-        assertThat(((YangInt32) rangeInterval.getStartValue()).getValue(), is(1));
-        assertThat(((YangInt32) rangeInterval.getEndValue()).getValue(), is(4));
-        assertThat(((YangInt32) rangeInterval.getEndValue()).getValue(), is(4));
+        assertThat(ranRes.getDescription(), is("\"range description\""));
+        assertThat(ranRes.getReference(), is("\"range reference\""));
+
+        ListIterator<YangRangeInterval> rlIt = ranRes
+                .getAscendingRangeIntervals().listIterator();
+        YangRangeInterval range = rlIt.next();
+        assertThat(((YangInt32) range.getStartValue()).getValue(), is(1));
+        assertThat(((YangInt32) range.getEndValue()).getValue(), is(4));
+        assertThat(((YangInt32) range.getEndValue()).getValue(), is(4));
     }
 
     /**
@@ -215,26 +241,84 @@
     @Test
     public void processRangeStatementWithSpace() throws IOException, ParserException {
 
-        YangNode node = manager.getDataModel("src/test/resources/RangeStatementWithSpace.yang");
+        YangNode node = manager.getDataModel("src/test/resources/RangeSta" +
+                                                     "tementWithSpace.yang");
 
         assertThat((node instanceof YangModule), is(true));
         assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf> it = yangNode.getListOfLeaf().listIterator();
+        YangLeaf leaf = it.next();
 
-        assertThat(leafInfo.getName(), is("invalid-interval"));
-        assertThat(leafInfo.getDataType().getDataTypeName(), is("int32"));
-        assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.INT32));
-        YangRangeRestriction rangeRestriction = (YangRangeRestriction) leafInfo
-                .getDataType().getDataTypeExtendedInfo();
+        YangType<?> type = leaf.getDataType();
 
-        ListIterator<YangRangeInterval> rangeListIterator = rangeRestriction.getAscendingRangeIntervals()
-                .listIterator();
-        YangRangeInterval rangeInterval = rangeListIterator.next();
-        assertThat(((YangInt32) rangeInterval.getStartValue()).getValue(), is(1));
-        assertThat(((YangInt32) rangeInterval.getEndValue()).getValue(), is(4));
+        assertThat(leaf.getName(), is("invalid-interval"));
+        assertThat(type.getDataTypeName(), is("int32"));
+        assertThat(type.getDataType(), is(INT32));
+        YangRangeRestriction ranRes = (YangRangeRestriction) type
+                .getDataTypeExtendedInfo();
+
+        ListIterator<YangRangeInterval> rlIt = ranRes
+                .getAscendingRangeIntervals().listIterator();
+        YangRangeInterval range = rlIt.next();
+        assertThat(((YangInt32) range.getStartValue()).getValue(), is(1));
+        assertThat(((YangInt32) range.getEndValue()).getValue(), is(4));
     }
+
+    /**
+     * Checks range statement in typedef with description and reference.
+     *
+     * @throws IOException     when IO operation fails
+     * @throws ParserException when parsing fails
+     */
+    @Test
+    public void processRangeStatementInTypeDef() throws IOException, ParserException {
+        YangNode node = manager.getDataModel("src/test/resources/Range" +
+                                                     "WithTypedef.yang");
+        assertThat((node instanceof YangModule), is(true));
+        assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
+        YangModule yangNode = (YangModule) node;
+        assertThat(yangNode.getName(), is("Test"));
+
+        ListIterator<YangLeaf> it = yangNode.getListOfLeaf().listIterator();
+        YangLeaf leaf = it.next();
+
+        YangType<?> type = leaf.getDataType();
+
+        assertThat(leaf.getName(), is("invalid-interval"));
+        assertThat(type.getDataType(), is(DERIVED));
+        YangDerivedInfo info = (YangDerivedInfo) type
+                .getDataTypeExtendedInfo();
+
+        YangRangeRestriction ranRes1 = info.getRangeRes();
+
+        assertThat(ranRes1.getDescription(), is("\"range description\""));
+        assertThat(ranRes1.getReference(), is("\"range reference\""));
+
+        ListIterator<YangRangeInterval> rlIt1 = ranRes1
+                .getAscendingRangeIntervals().listIterator();
+        YangRangeInterval range1 = rlIt1.next();
+        assertThat(((YangUint8) range1.getStartValue()).getValue(),
+                   is((short) 2));
+        assertThat(((YangUint8) range1.getEndValue()).getValue(),
+                   is((short) 100));
+
+        YangTypeDef typeDef = (YangTypeDef) yangNode.getChild();
+        YangRangeRestriction ranRes = (YangRangeRestriction) typeDef
+                .getTypeDefBaseType().getDataTypeExtendedInfo();
+        assertThat(ranRes.getDescription(),
+                   is("\"typedef description\""));
+        assertThat(ranRes.getReference(), is("\"typedef reference\""));
+
+        ListIterator<YangRangeInterval> rlIt2 = ranRes
+                .getAscendingRangeIntervals().listIterator();
+        YangRangeInterval range2 = rlIt2.next();
+        assertThat(((YangUint8) range2.getStartValue()).getValue(),
+                   is((short) 1));
+        assertThat(((YangUint8) range2.getEndValue()).getValue(),
+                   is((short) (100)));
+    }
+
 }
diff --git a/compiler/base/parser/src/test/resources/LengthStatementInsideTypeDef.yang b/compiler/base/parser/src/test/resources/LengthStatementInsideTypeDef.yang
index c1195dc..ad59080 100644
--- a/compiler/base/parser/src/test/resources/LengthStatementInsideTypeDef.yang
+++ b/compiler/base/parser/src/test/resources/LengthStatementInsideTypeDef.yang
@@ -4,12 +4,18 @@
     prefix Ant;
     typedef invalid-interval {
         type string {
-            length "1..100";
+            length "1..100" {
+                description "length-description typedef";
+                reference "reference typedef";
+            }
          }
     }
     leaf xyz {
        type invalid-interval {
-           length "2..100";
+           length "2..100"{
+                description "length-description type";
+                reference "reference type";
+            }
        }
     }
 }
diff --git a/compiler/base/parser/src/test/resources/RangeWithTypedef.yang b/compiler/base/parser/src/test/resources/RangeWithTypedef.yang
new file mode 100644
index 0000000..d885d8c
--- /dev/null
+++ b/compiler/base/parser/src/test/resources/RangeWithTypedef.yang
@@ -0,0 +1,22 @@
+module Test {
+    yang-version 1;
+    namespace http://huawei.com;
+    prefix Ant;
+
+    typedef value {
+        type uint8 {
+            range "1..100" {
+                description "typedef description";
+                reference "typedef reference";
+            }
+        }
+    }
+    leaf invalid-interval {
+        type value {
+            range "2..100" {
+                description "range description";
+                reference "range reference";
+            }
+         }
+    }
+}
diff --git a/compiler/base/parser/src/test/resources/ValidBinaryLengthStatement.yang b/compiler/base/parser/src/test/resources/ValidBinaryLengthStatement.yang
index 7182eb3..349181a 100644
--- a/compiler/base/parser/src/test/resources/ValidBinaryLengthStatement.yang
+++ b/compiler/base/parser/src/test/resources/ValidBinaryLengthStatement.yang
@@ -4,7 +4,10 @@
     prefix Ant;
     leaf message {
         type binary {
-            length "4";
+            length "4" {
+                description "binary description";
+                reference "binary reference";
+            }
         }
     }
 }