/*
 * Copyright 2016-present Open Networking Laboratory
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.onosproject.yms.app.ydt;

import org.junit.Rule;
import org.junit.rules.ExpectedException;
import org.onosproject.yms.app.ydt.exceptions.YdtException;
import org.onosproject.yms.app.ysr.TestYangSchemaNodeProvider;
import org.onosproject.yms.app.ysr.YangSchemaRegistry;
import org.onosproject.yms.ydt.YdtContext;
import org.onosproject.yms.ydt.YdtContextOperationType;
import org.onosproject.yms.ydt.YdtListener;
import org.onosproject.yms.ydt.YdtType;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.onosproject.yms.app.ydt.YdtTestConstants.A1;
import static org.onosproject.yms.app.ydt.YdtTestConstants.A2;
import static org.onosproject.yms.app.ydt.YdtTestConstants.A2L;
import static org.onosproject.yms.app.ydt.YdtTestConstants.A3;
import static org.onosproject.yms.app.ydt.YdtTestConstants.A4;
import static org.onosproject.yms.app.ydt.YdtTestConstants.A5;
import static org.onosproject.yms.app.ydt.YdtTestConstants.A5L;
import static org.onosproject.yms.app.ydt.YdtTestConstants.A6;
import static org.onosproject.yms.app.ydt.YdtTestConstants.A6L;
import static org.onosproject.yms.app.ydt.YdtTestConstants.BACKSLASH;
import static org.onosproject.yms.app.ydt.YdtTestConstants.BIT;
import static org.onosproject.yms.app.ydt.YdtTestConstants.BITNS;
import static org.onosproject.yms.app.ydt.YdtTestConstants.BOOL;
import static org.onosproject.yms.app.ydt.YdtTestConstants.BOOLNS;
import static org.onosproject.yms.app.ydt.YdtTestConstants.CAPSINT16;
import static org.onosproject.yms.app.ydt.YdtTestConstants.CAPSINT32;
import static org.onosproject.yms.app.ydt.YdtTestConstants.CAPSINT64;
import static org.onosproject.yms.app.ydt.YdtTestConstants.CAPSINT8;
import static org.onosproject.yms.app.ydt.YdtTestConstants.CAPSUINT16;
import static org.onosproject.yms.app.ydt.YdtTestConstants.CAPSUINT32;
import static org.onosproject.yms.app.ydt.YdtTestConstants.CAPSUINT64;
import static org.onosproject.yms.app.ydt.YdtTestConstants.CAPSUINT8;
import static org.onosproject.yms.app.ydt.YdtTestConstants.COUSTOMNS;
import static org.onosproject.yms.app.ydt.YdtTestConstants.EMPNS;
import static org.onosproject.yms.app.ydt.YdtTestConstants.EMPTY;
import static org.onosproject.yms.app.ydt.YdtTestConstants.EMPTYNS;
import static org.onosproject.yms.app.ydt.YdtTestConstants.ENUM;
import static org.onosproject.yms.app.ydt.YdtTestConstants.ENUMNS;
import static org.onosproject.yms.app.ydt.YdtTestConstants.E_LEAF;
import static org.onosproject.yms.app.ydt.YdtTestConstants.IETF;
import static org.onosproject.yms.app.ydt.YdtTestConstants.IETFNS;
import static org.onosproject.yms.app.ydt.YdtTestConstants.INT16NS;
import static org.onosproject.yms.app.ydt.YdtTestConstants.INT32NS;
import static org.onosproject.yms.app.ydt.YdtTestConstants.INT64NS;
import static org.onosproject.yms.app.ydt.YdtTestConstants.INT8NS;
import static org.onosproject.yms.app.ydt.YdtTestConstants.INV;
import static org.onosproject.yms.app.ydt.YdtTestConstants.LIST;
import static org.onosproject.yms.app.ydt.YdtTestConstants.LISTNS;
import static org.onosproject.yms.app.ydt.YdtTestConstants.LWC;
import static org.onosproject.yms.app.ydt.YdtTestConstants.MATERIALNS;
import static org.onosproject.yms.app.ydt.YdtTestConstants.MAXUINT16;
import static org.onosproject.yms.app.ydt.YdtTestConstants.MAXUINT32;
import static org.onosproject.yms.app.ydt.YdtTestConstants.MAXUINT64;
import static org.onosproject.yms.app.ydt.YdtTestConstants.MAXUINT8;
import static org.onosproject.yms.app.ydt.YdtTestConstants.MERCHNS;
import static org.onosproject.yms.app.ydt.YdtTestConstants.MINVALUE;
import static org.onosproject.yms.app.ydt.YdtTestConstants.MRV;
import static org.onosproject.yms.app.ydt.YdtTestConstants.NIWMF;
import static org.onosproject.yms.app.ydt.YdtTestConstants.NWF;
import static org.onosproject.yms.app.ydt.YdtTestConstants.PERIOD;
import static org.onosproject.yms.app.ydt.YdtTestConstants.PIWMF;
import static org.onosproject.yms.app.ydt.YdtTestConstants.PURCHASNS;
import static org.onosproject.yms.app.ydt.YdtTestConstants.PWF;
import static org.onosproject.yms.app.ydt.YdtTestConstants.SINT16;
import static org.onosproject.yms.app.ydt.YdtTestConstants.SINT32;
import static org.onosproject.yms.app.ydt.YdtTestConstants.SLINK;
import static org.onosproject.yms.app.ydt.YdtTestConstants.SMALLINT64;
import static org.onosproject.yms.app.ydt.YdtTestConstants.SMALLINT8;
import static org.onosproject.yms.app.ydt.YdtTestConstants.SMALLUINT64;
import static org.onosproject.yms.app.ydt.YdtTestConstants.SMALLUINT8;
import static org.onosproject.yms.app.ydt.YdtTestConstants.STP;
import static org.onosproject.yms.app.ydt.YdtTestConstants.SUINT16;
import static org.onosproject.yms.app.ydt.YdtTestConstants.SUINT32;
import static org.onosproject.yms.app.ydt.YdtTestConstants.TOPONS;
import static org.onosproject.yms.app.ydt.YdtTestConstants.TRADNS;
import static org.onosproject.yms.app.ydt.YdtTestConstants.TYPE;
import static org.onosproject.yms.app.ydt.YdtTestConstants.WAREHNS;
import static org.onosproject.yms.ydt.YdtContextOperationType.DELETE;
import static org.onosproject.yms.ydt.YdtContextOperationType.MERGE;

public class YdtTestUtils implements YdtListener {

    private static List<String> kValList = new ArrayList<>();

    @Rule
    public ExpectedException thrown = ExpectedException.none();

    private static YangSchemaRegistry schemaRegistry;

    private static TestYangSchemaNodeProvider schemaProvider =
            new TestYangSchemaNodeProvider();

    // Logger list is used for walker testing.
    private static final List<String> LOGGER = new ArrayList<>();

    /**
     * Returns the LOGGER with log for testing the YDT walker.
     *
     * @return list of logs
     */
    public static List<String> getLogger() {
        return LOGGER;
    }

    /**
     * Clear the LOGGER array.
     */
    public static void resetLogger() {
        LOGGER.clear();
    }

    @Override
    public void enterYdtNode(YdtContext ydtContext) {
        LOGGER.add("Entry Node is " + ydtContext.getName() + PERIOD);
    }

    @Override
    public void exitYdtNode(YdtContext ydtContext) {
        LOGGER.add("Exit Node is " + ydtContext.getName() + PERIOD);
    }

    /**
     * Returns schema registry of YDT.
     *
     * @return schema registry
     */
    public static YangSchemaRegistry getSchemaRegistry() {
        return schemaRegistry;
    }

    /**
     * Sets the ydt schema registry.
     *
     * @param registry schema registry
     */
    public static void setSchemaRegistry(YangSchemaRegistry registry) {
        schemaRegistry = registry;
    }

    /**
     * Returns the ydt builder for food module.
     *
     * @return ydt builder
     */
    public static YangRequestWorkBench foodArenaYdt() {

        YangRequestWorkBench ydtBuilder;
        ydtBuilder = getYdtBuilder("foodarena", "food", "ydt.food", MERGE);
        ydtBuilder.addChild("food", "ydt.food");
//        ydtBuilder.addChild("snack", null, "ydt.food");
//        ydtBuilder.addChild("latenight", null, "ydt.food");
        ydtBuilder.addLeaf("chocolate", "ydt.food", "dark");

        return ydtBuilder;
    }

    /**
     * Returns the ydt builder for yms-ietf-network module.
     *
     * @return ydt builder
     */
    public static YangRequestWorkBench ietfNetwork1Ydt() {

        YangRequestWorkBench ydtBuilder;
        ydtBuilder = getYdtBuilder(IETF, IETF, IETFNS, MERGE);
        // Adding container
        ydtBuilder.addChild("networks", null);
        // Adding list inside container
        ydtBuilder.addChild("network", null);
        // Adding key element network Id
        ydtBuilder.addLeaf("network-id", null, "network1");
        ydtBuilder.traverseToParent();

        // Adding list inside list
        ydtBuilder.addChild("supporting-network", null);
        // Adding key element network-ref
        ydtBuilder.addLeaf("network-ref", null, "network2");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        // Adding list inside list
        ydtBuilder.addChild("node", null);
        // Adding key element node-id
        ydtBuilder.addLeaf("node-id", null, "node1");
        ydtBuilder.traverseToParent();

        // Adding list inside list
        ydtBuilder.addChild("supporting-node", null);
        // Adding key element network-ref
        ydtBuilder.addLeaf("network-ref", null, "network3");
        ydtBuilder.traverseToParent();

        // Adding key element node-ref
        ydtBuilder.addLeaf("node-ref", null, "network4");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        // Adding container
        ydtBuilder.addChild("networks-state", null);
        // Adding list inside container
        ydtBuilder.addChild("network", null);
        // Adding key element network-ref
        ydtBuilder.addLeaf("network-ref", null, "network5");
        ydtBuilder.traverseToParent();
        // Adding leaf server-provided
        ydtBuilder.addLeaf("server-provided", null, "true");

        return ydtBuilder;
    }

    /**
     * Returns the ydt builder for yms-ietf-network-topology module.
     *
     * @return ydt builder
     */
    public static YangRequestWorkBench ietfNetworkTopologyYdt() {

        YangRequestWorkBench ydtBuilder;
        ydtBuilder = getYdtBuilder(IETF, IETF, IETFNS, MERGE);
        // Adding container
        ydtBuilder.addChild("networks", IETFNS, MERGE);
        // Adding list inside container
        ydtBuilder.addChild("network", IETFNS, MERGE);

        // Adding key element network Id
        ydtBuilder.addLeaf("network-id", null, "network1");
        ydtBuilder.traverseToParent();

        kValList.clear();
        kValList.add("id1");
        // adding the augmented node
        ydtBuilder.addMultiInstanceChild("link", TOPONS, kValList, MERGE);
        // container source
        ydtBuilder.addChild("source", TOPONS, MERGE);
        ydtBuilder.addLeaf("source-node", null, "source1");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("source-tp", null, "source2");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        // container destination
        ydtBuilder.addChild("destination", TOPONS, MERGE);
        ydtBuilder.addLeaf("dest-node", null, "dest1");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("dest-tp", null, "dest2");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        kValList.clear();
        kValList.add("network1");
        kValList.add("id2");
        // adding the supporting-link list node
        ydtBuilder.addMultiInstanceChild(SLINK, TOPONS, kValList, MERGE);
        ydtBuilder.traverseToParent();

        kValList.clear();
        kValList.add("network2");
        kValList.add("id3");
        // adding the supporting-link list another instance
        ydtBuilder.addMultiInstanceChild(SLINK, TOPONS, kValList, MERGE);
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        // Adding list inside list
        ydtBuilder.addChild("supporting-network", null);
        // Adding key element network-ref
        ydtBuilder.addLeaf("network-ref", null, "network2");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        // Adding list inside list
        ydtBuilder.addChild("node", null);
        // Adding key element node-id
        ydtBuilder.addLeaf("node-id", null, "node1");
        ydtBuilder.traverseToParent();

        kValList.clear();
        kValList.add("tp_id1");
        //adding augmented termination-point list
        ydtBuilder.addMultiInstanceChild("t-point", TOPONS,
                                         kValList, MERGE);
        kValList.clear();
        kValList.add("network-ref");
        kValList.add("node-ref");
        kValList.add("tp-ref");
        //adding supporting-termination-point
        ydtBuilder.addMultiInstanceChild(STP, TOPONS, kValList, MERGE);
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        // Adding list inside list
        ydtBuilder.addChild("supporting-node", null);
        // Adding key element network-ref
        ydtBuilder.addLeaf("network-ref", null, "network3");
        ydtBuilder.traverseToParent();

        // Adding key element node-ref
        ydtBuilder.addLeaf("node-ref", null, "network4");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addLeaf("link-id", TOPONS, "id1");
        ydtBuilder.traverseToParent();

        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        // Adding container
        ydtBuilder.addChild("networks-state", null);
        // Adding list inside container
        ydtBuilder.addChild("network", null);
        // Adding key element network-ref
        ydtBuilder.addLeaf("network-ref", null, "network5");
        ydtBuilder.traverseToParent();
        // Adding leaf server-provided
        ydtBuilder.addLeaf("server-provided", null, "true");

        return ydtBuilder;
    }

    /**
     * Returns the ydt builder for augmented module.
     *
     * @return ydt builder
     */
    public static YangRequestWorkBench augmentNetworkYdt() {

        YangRequestWorkBench ydtBuilder;
        ydtBuilder = getYdtBuilder(IETF, IETF, IETFNS, MERGE);
        // Adding container
        ydtBuilder.addChild("networks", IETFNS, MERGE);
        // Adding list inside container
        ydtBuilder.addChild("network", IETFNS, MERGE);

        // Adding key element network Id
        ydtBuilder.addLeaf("network-id", null, "network1");
        ydtBuilder.traverseToParent();

        kValList.clear();
        kValList.add("id1");
        // adding the augmented node
        ydtBuilder.addMultiInstanceChild("link", TOPONS, kValList, MERGE);
        // container source
        ydtBuilder.addChild("source", TOPONS, MERGE);
        ydtBuilder.addLeaf("source-node", null, "source1");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("source-tp", null, "source2");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        // container destination
        ydtBuilder.addChild("destination", TOPONS, MERGE);
        ydtBuilder.addLeaf("dest-node", null, "dest1");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("dest-tp", null, "dest2");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        kValList.clear();
        kValList.add("network1");
        kValList.add("id2");
        // adding the supporting-link list node
        ydtBuilder.addMultiInstanceChild(SLINK, TOPONS, kValList, MERGE);
        ydtBuilder.traverseToParent();

        kValList.clear();
        kValList.add("network2");
        kValList.add("id3");
        // adding the supporting-link list another instance
        ydtBuilder.addMultiInstanceChild(SLINK, TOPONS, kValList, MERGE);
        ydtBuilder.traverseToParent();

        kValList.clear();
        kValList.add("1");
        ydtBuilder.addMultiInstanceChild("augment1", A1, kValList, MERGE);
        ydtBuilder.traverseToParent();

        kValList.clear();
        kValList.add("1");
        kValList.add("2");
        ydtBuilder.addMultiInstanceChild("augment2", A2, kValList, MERGE);

        ydtBuilder.addChild("augment5", A5, DELETE);

        ydtBuilder.addMultiInstanceChild(A6L, A6, kValList, DELETE);
        ydtBuilder.traverseToParent();

        ydtBuilder.addLeaf("value5", null, "5");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addMultiInstanceChild(A5L, A5, kValList, DELETE);
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild("augment3", A3, MERGE);

        ydtBuilder.addChild("augment4", A4, DELETE);
        ydtBuilder.addLeaf("value4", null, "4");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild("augment5", A5, MERGE);

        ydtBuilder.addLeaf("leaf6", A6, "6");
        ydtBuilder.traverseToParent();

        ydtBuilder.addLeaf("value5", null, "5");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild("augment6", A6, DELETE);
        ydtBuilder.addLeaf("value6", null, "6");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addLeaf("value3", null, "3");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addLeaf("augment3leaf", A3, "3");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addMultiInstanceChild(A2L, A2, kValList, MERGE);
        ydtBuilder.traverseToParent();

        ydtBuilder.traverseToParent();

        // Adding list inside list
        ydtBuilder.addChild("supporting-network", null);
        // Adding key element network-ref
        ydtBuilder.addLeaf("network-ref", null, "network2");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        // Adding list inside list
        ydtBuilder.addChild("node", null);
        // Adding key element node-id
        ydtBuilder.addLeaf("node-id", null, "node1");
        ydtBuilder.traverseToParent();

        kValList.clear();
        kValList.add("tp_id1");
        //adding augmented termination-point list
        ydtBuilder.addMultiInstanceChild("t-point", TOPONS,
                                         kValList, MERGE);
        kValList.clear();
        kValList.add("network-ref");
        kValList.add("node-ref");
        kValList.add("tp-ref");
        //adding supporting-termination-point
        ydtBuilder.addMultiInstanceChild(STP, TOPONS, kValList, MERGE);

        // Adding augmented container1 inside supporting-termination-point
        augmentTerminationPointYdt(ydtBuilder);

        return ydtBuilder;
    }

    /**
     * Adds augments inside supporting-termination-point in augmented module.
     *
     * @param ydtBuilder ydt builder which need to be updated
     */
    private static void augmentTerminationPointYdt(YangRequestWorkBench ydtBuilder) {

        ydtBuilder.addChild("augment1", A1);
        ydtBuilder.addLeaf("value1", null, "1");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("augment1-leaf", A1, "1");

        ydtBuilder.traverseToParent();

        ydtBuilder.addChild("augment2", A2, MERGE);

        ydtBuilder.addChild("augment3", A3, MERGE);
        ydtBuilder.addLeaf("value3", null, "3");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addLeaf("augment4leaf", A4, "4");
        ydtBuilder.traverseToParent();

        ydtBuilder.addLeaf("value2", null, "2");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        kValList.clear();
        kValList.add("1");
        kValList.add("2");
        ydtBuilder.addMultiInstanceChild(A2L, A2, kValList, MERGE);
        ydtBuilder.traverseToParent();

        ydtBuilder.addLeaf("augment2leaf", A2, "2");
        ydtBuilder.traverseToParent();

        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        // Adding list inside list
        ydtBuilder.addChild("supporting-node", null);
        // Adding key element network-ref
        ydtBuilder.addLeaf("network-ref", null, "network3");
        ydtBuilder.traverseToParent();

        // Adding key element node-ref
        ydtBuilder.addLeaf("node-ref", null, "network4");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addLeaf("link-id", TOPONS, "id1");
        ydtBuilder.traverseToParent();

        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        // Adding container
        ydtBuilder.addChild("networks-state", null);
        // Adding list inside container
        ydtBuilder.addChild("network", null);
        // Adding key element network-ref
        ydtBuilder.addLeaf("network-ref", null, "network5");
        ydtBuilder.traverseToParent();
        // Adding leaf server-provided
        ydtBuilder.addLeaf("server-provided", null, "true");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
    }

    /**
     * Returns the ydt builder for rootlist module with listwithcontainer node
     * using addMultiInstanceChild interface for adding multi instance node.
     *
     * @return ydt builder
     */
    public static YangRequestWorkBench listWithContainerYdt() {

        YangRequestWorkBench ydtBuilder;
        ydtBuilder = getYdtBuilder("list", "rootlist", "ydt.rootlist", MERGE);
        kValList.clear();
        kValList.add("12");
        kValList.add("12");
        ydtBuilder.addMultiInstanceChild(LWC, null, kValList, MERGE);
        ydtBuilder.addLeaf(INV, null, "1");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf(INV, null, "2");
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild("interface", null);
        ydtBuilder.addLeaf(INV, null, "12");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("invalid", null, "121");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        return ydtBuilder;
    }

    /**
     * Returns the ydt builder for rootlist module with listwithcontainer
     * node using addChild interface for adding multi instance node.
     *
     * @return ydt builder
     */
    public static YangRequestWorkBench listWithContainer1Ydt() {

        YangRequestWorkBench ydtBuilder;
        ydtBuilder = getYdtBuilder("list", "rootlist", "ydt.rootlist", MERGE);
        ydtBuilder.addChild(LWC, null);
        ydtBuilder.addLeaf("invalid", null, "12");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("invalid1", null, "12");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf(INV, null, "1");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf(INV, null, "2");
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild("interface", null);
        ydtBuilder.addLeaf(INV, null, "12");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("invalid", null, "121");
        ydtBuilder.traverseToParent();

        return ydtBuilder;
    }

    /**
     * Returns the ydt builder for rootlist module with multiple instances of
     * listwithcontainer node using addMultiInstanceChild interface for adding
     * multi instance node.
     *
     * @return ydt builder
     */
    public static YangRequestWorkBench listWithContainer2Ydt() {

        YangRequestWorkBench ydtBuilder;
        ydtBuilder = getYdtBuilder("list", "rootlist", "ydt.rootlist", MERGE);
        kValList.clear();
        kValList.add("1222");
        kValList.add("1212");
        ydtBuilder.addMultiInstanceChild(LWC, null, kValList, MERGE);

        kValList.clear();
        kValList.add("12");
        kValList.add("1");
        ydtBuilder.addMultiInstanceChild(INV, null, kValList, MERGE);
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf(INV, null, "122");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf(INV, null, "2222");
        ydtBuilder.traverseToParent();

        kValList.clear();
        kValList.add("1222");
        kValList.add("1212");
        ydtBuilder.addMultiInstanceChild(INV, null, kValList, MERGE);
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild("interface", null);
        ydtBuilder.addLeaf(INV, null, "12");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        return ydtBuilder;
    }

    /**
     * Returns the ydt builder for rootlist module with listwithoutcontainer
     * node.
     *
     * @return ydt builder
     */
    public static YangRequestWorkBench listWithoutContainerYdt() {

        YangRequestWorkBench ydtBuilder;
        ydtBuilder = getYdtBuilder("list", "rootlist", "ydt.rootlist", MERGE);
        ydtBuilder.addChild("listwithoutcontainer", null);
        ydtBuilder.addLeaf(INV, null, "12");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        return ydtBuilder;
    }

    /**
     * Returns the ydt builder for logisticsmanager module.
     *
     * @return ydt builder
     */
    public static YangRequestWorkBench logisticsManagerYdt() {

        Set<String> valueSet = new HashSet();
        valueSet.add("1");
        valueSet.add("2");
        valueSet.add("3");
        valueSet.add("4");
        valueSet.add("5");

        YangRequestWorkBench ydtBuilder;
        ydtBuilder = getYdtBuilder("logisticsmanager", "customssupervisor",
                                   null, MERGE);
        ydtBuilder.addLeaf("supervisor", COUSTOMNS, "abc");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild("merchandisersupervisor", MERCHNS, MERGE);
        ydtBuilder.addLeaf("supervisor", MERCHNS, "abc");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild("materialsupervisor", MATERIALNS, MERGE);
        ydtBuilder.addChild("supervisor", MATERIALNS);
        ydtBuilder.addLeaf("name", MATERIALNS, "abc");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("departmentId", MATERIALNS, "xyz");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild("supervisor", MATERIALNS);
        ydtBuilder.addLeaf("name", MATERIALNS, "ab");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("departmentId", MATERIALNS, "xy");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.traverseToParent();

        ydtBuilder.addChild("purchasingsupervisor", PURCHASNS, MERGE);
        ydtBuilder.addChild("supervisor", PURCHASNS);
        ydtBuilder.addLeaf("purchasing-specialist", PURCHASNS, "abc");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("support", "ydt.purchasing-supervisor", "xyz");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.traverseToParent();

        ydtBuilder.addChild("warehousesupervisor", WAREHNS, MERGE);
        ydtBuilder.addLeaf("supervisor", WAREHNS, valueSet);
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild("tradingsupervisor", TRADNS, MERGE);
        ydtBuilder.addLeaf("supervisor", TRADNS, "abc");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild("employeeid", EMPNS, MERGE);
        ydtBuilder.addLeaf("employeeid", EMPNS, valueSet);
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        return ydtBuilder;
    }

    /**
     * Returns the ydt builder for bit module.
     *
     * @return ydt builder
     */
    public static YangRequestWorkBench bitYdt() {
        YangRequestWorkBench ydtBuilder;
        ydtBuilder = getYdtBuilder("builtInType", "bit", "ydt.bit", MERGE);
        ydtBuilder.addChild("bitList", null);
        ydtBuilder.addLeaf("bit", null, "disable-nagle");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild("bitList", null);
        ydtBuilder.addLeaf("bit", null, "auto-sense-speed");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild("bitList", null);
        ydtBuilder.addLeaf("bit", null, "ten-Mb-only");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild("bitList", null);
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        return ydtBuilder;
    }

    /**
     * Returns the ydt builder for bool module.
     *
     * @return ydt builder
     */
    public static YangRequestWorkBench booleanYdt() {

        YangRequestWorkBench ydtBuilder;
        ydtBuilder = getYdtBuilder("builtInType", "bool", "ydt.boolean", MERGE);
        ydtBuilder.addChild("booleanList", null);
        ydtBuilder.addLeaf("boolean", null, "true");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild("booleanList", null);
        ydtBuilder.addLeaf("boolean", null, "false");
        ydtBuilder.traverseToParent();

        return ydtBuilder;
    }

    /**
     * Returns the ydt builder for emptydata module.
     *
     * @return ydt builder
     */
    public static YangRequestWorkBench emptyTypeYdt() {

        YangRequestWorkBench ydtBuilder;
        ydtBuilder = getYdtBuilder(
                "builtInType", "emptydata", "ydt.emptydata", MERGE);
        ydtBuilder.addChild("emptyList", null);
        ydtBuilder.addLeaf("empty", null, "");

        return ydtBuilder;
    }

    /**
     * Returns the ydt builder for enumtest module.
     *
     * @return ydt builder
     */
    public static YangRequestWorkBench enumYdt() {

        YangRequestWorkBench ydtBuilder;
        ydtBuilder = getYdtBuilder(
                "builtInType", "enumtest", "ydt.enumtest", MERGE);
        ydtBuilder.addChild("enumList", null);
        ydtBuilder.addLeaf("enumleaf", null, "ten");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild("enumList", null);
        ydtBuilder.addLeaf("enumleaf", null, "hundred");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild("enumList", null);
        ydtBuilder.addLeaf("enumleaf", null, "thousand");

        return ydtBuilder;
    }

    /**
     * Returns the ydt builder for builtin type integer8 module.
     *
     * @return ydt builder
     */
    public static YangRequestWorkBench integer8Ydt() {

        YangRequestWorkBench ydtBuilder;
        ydtBuilder = getYdtBuilder(
                "builtInType", "integer8", "ydt.integer8", MERGE);
        ydtBuilder.addLeaf("negInt", null, "-128");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("posInt", null, "127");
        ydtBuilder.traverseToParent();

        ydtBuilder.addLeaf("minUInt", null, "0");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("maxUInt", null, "255");
        ydtBuilder.traverseToParent();

        ydtBuilder.addLeaf("midIntWithRange", null, "11");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("minIntWithRange", null, "10");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("maxIntWithRange", null, "100");
        ydtBuilder.traverseToParent();

        ydtBuilder.addLeaf("midUIntWithRange", null, "11");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("minUIntWithRange", null, "10");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("maxUIntWithRange", null, "100");
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("integer", null, "11");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("integer", null, "10");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("integer", null, "40");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("integer", null, "50");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("integer", null, "55");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("integer", null, "100");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild(MRV, null);
        ydtBuilder.addLeaf("UnInteger", null, "11");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("UnInteger", null, "10");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("UnInteger", null, "40");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("UnInteger", null, "50");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("UnInteger", null, "55");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("UnInteger", null, "100");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild(MRV, null);
        ydtBuilder.addLeaf("revInteger", null, "-128");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revInteger", null, "1");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revInteger", null, "2");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revInteger", null, "10");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revInteger", null, "20");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revInteger", null, "100");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revInteger", null, "127");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revUnInteger", null, "0");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revUnInteger", null, "1");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revUnInteger", null, "2");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revUnInteger", null, "10");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revUnInteger", null, "20");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revUnInteger", null, "100");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revUnInteger", null, "255");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        return ydtBuilder;
    }

    /**
     * Returns the ydt builder for builtin type integer16 module.
     *
     * @return ydt builder
     */
    public static YangRequestWorkBench integer16Ydt() {

        YangRequestWorkBench ydtBuilder;
        ydtBuilder = getYdtBuilder(
                "builtInType", "integer16", "ydt.integer16", MERGE);
        ydtBuilder.addLeaf("negInt", null, "-32768");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("posInt", null, "32767");
        ydtBuilder.traverseToParent();

        ydtBuilder.addLeaf("minUInt", null, "0");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("maxUInt", null, "65535");
        ydtBuilder.traverseToParent();

        ydtBuilder.addLeaf("midIntWithRange", null, "11");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("minIntWithRange", null, "10");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("maxIntWithRange", null, "100");
        ydtBuilder.traverseToParent();

        ydtBuilder.addLeaf("midUIntWithRange", null, "11");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("minUIntWithRange", null, "10");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("maxUIntWithRange", null, "100");
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("integer", null, "11");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("integer", null, "10");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("integer", null, "40");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("integer", null, "50");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("integer", null, "55");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("integer", null, "100");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild(MRV, null);
        ydtBuilder.addLeaf("UnInteger", null, "11");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("UnInteger", null, "10");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("UnInteger", null, "40");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("UnInteger", null, "50");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("UnInteger", null, "55");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("UnInteger", null, "100");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild(MRV, null);
        ydtBuilder.addLeaf("revInteger", null, "-32768");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revInteger", null, "1");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revInteger", null, "2");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revInteger", null, "10");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revInteger", null, "20");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revInteger", null, "100");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revInteger", null, "32767");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revUnInteger", null, "0");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revUnInteger", null, "1");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revUnInteger", null, "2");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revUnInteger", null, "10");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revUnInteger", null, "20");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revUnInteger", null, "100");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revUnInteger", null, "65535");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        return ydtBuilder;
    }

    /**
     * Returns the ydt builder for builtin type integer32 module.
     *
     * @return ydt builder
     */
    public static YangRequestWorkBench integer32Ydt() {

        YangRequestWorkBench ydtBuilder;
        ydtBuilder = getYdtBuilder(
                "builtInType", "integer32", "ydt.integer32", MERGE);
        ydtBuilder.addLeaf("negInt", null, "-2147483648");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("posInt", null, "2147483647");
        ydtBuilder.traverseToParent();

        ydtBuilder.addLeaf("minUInt", null, "0");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("maxUInt", null, "4294967295");
        ydtBuilder.traverseToParent();

        ydtBuilder.addLeaf("midIntWithRange", null, "11");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("minIntWithRange", null, "10");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("maxIntWithRange", null, "100");
        ydtBuilder.traverseToParent();

        ydtBuilder.addLeaf("midUIntWithRange", null, "11");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("minUIntWithRange", null, "10");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("maxUIntWithRange", null, "100");
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("integer", null, "11");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("integer", null, "10");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("integer", null, "40");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("integer", null, "50");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("integer", null, "55");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("integer", null, "100");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild(MRV, null);
        ydtBuilder.addLeaf("UnInteger", null, "11");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("UnInteger", null, "10");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("UnInteger", null, "40");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("UnInteger", null, "50");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("UnInteger", null, "55");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("UnInteger", null, "100");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild(MRV, null);
        ydtBuilder.addLeaf("revInteger", null, "-2147483648");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revInteger", null, "1");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revInteger", null, "2");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revInteger", null, "10");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revInteger", null, "20");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revInteger", null, "100");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revInteger", null, "2147483647");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revUnInteger", null, "0");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revUnInteger", null, "1");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revUnInteger", null, "2");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revUnInteger", null, "10");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revUnInteger", null, "20");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revUnInteger", null, "100");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revUnInteger", null, "4294967295");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        return ydtBuilder;
    }

    /**
     * Returns the ydt builder for builtin type integer64 module.
     *
     * @return ydt builder
     */
    public static YangRequestWorkBench integer64Ydt() {

        YangRequestWorkBench ydtBuilder;
        ydtBuilder = getYdtBuilder(
                "builtInType", "integer64", "ydt.integer64", MERGE);
        ydtBuilder.addLeaf("negInt", null, "-9223372036854775808");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("posInt", null, "9223372036854775807");
        ydtBuilder.traverseToParent();

        ydtBuilder.addLeaf("minUInt", null, "0");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("maxUInt", null, "18446744073709551615");
        ydtBuilder.traverseToParent();

        ydtBuilder.addLeaf("midIntWithRange", null, "11");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("minIntWithRange", null, "10");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("maxIntWithRange", null, "100");
        ydtBuilder.traverseToParent();

        ydtBuilder.addLeaf("midUIntWithRange", null, "11");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("minUIntWithRange", null, "10");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("maxUIntWithRange", null, "100");
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("integer", null, "11");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("integer", null, "10");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("integer", null, "40");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("integer", null, "50");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("integer", null, "55");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("integer", null, "100");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild(MRV, null);
        ydtBuilder.addLeaf("UnInteger", null, "11");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("UnInteger", null, "10");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("UnInteger", null, "40");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("UnInteger", null, "50");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("UnInteger", null, "55");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("UnInteger", null, "100");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild(MRV, null);
        ydtBuilder.addLeaf("revInteger", null, "-9223372036854775808");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revInteger", null, "1");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revInteger", null, "2");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revInteger", null, "10");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revInteger", null, "20");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revInteger", null, "100");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revInteger", null, "9223372036854775807");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revUnInteger", null, "0");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revUnInteger", null, "1");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revUnInteger", null, "2");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revUnInteger", null, "10");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revUnInteger", null, "20");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revUnInteger", null, "100");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
        ydtBuilder.addLeaf("revUnInteger", null, "18446744073709551615");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        return ydtBuilder;
    }

    /**
     * Returns the ydt builder for builtin type decimal64 module.
     *
     * @return ydt builder
     */
    public static YangRequestWorkBench decimal64Ydt() {

        YangRequestWorkBench ydtBuilder;
        ydtBuilder = getYdtBuilder(
                "builtInType", "decimal64", "ydt.decimal64", MERGE);
        ydtBuilder.addLeaf("negInt", null, "-92233720368547758.08");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("posInt", null, "92233720368547758.07");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf(NIWMF, null, "-922337203685477580.8");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf(PIWMF, null, "922337203685477580.7");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf(NWF, null, "-9.223372036854775808");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf(PWF, null, "9.223372036854775807");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("midIntWithRange", null, "11");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("minIntWithRange", null, "10");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("maxIntWithRange", null, "100");
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild(MRV, null);
        ydtBuilder.addLeaf("decimal", null, "11");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null);
        ydtBuilder.addLeaf("decimal", null, "10");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null);
        ydtBuilder.addLeaf("decimal", null, "40");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null);
        ydtBuilder.addLeaf("decimal", null, "50");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null);
        ydtBuilder.addLeaf("decimal", null, "55");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null);
        ydtBuilder.addLeaf("decimal", null, "100");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null);
        ydtBuilder.addLeaf("revDecimal", null, "-92233720368547758.08");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null);
        ydtBuilder.addLeaf("revDecimal", null, "2.505");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null);
        ydtBuilder.addLeaf("revDecimal", null, "3.14");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null);
        ydtBuilder.addLeaf("revDecimal", null, "10");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null);
        ydtBuilder.addLeaf("revDecimal", null, "20");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null);
        ydtBuilder.addLeaf("revDecimal", null, "92233720368547757");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.addChild(MRV, null);
        ydtBuilder.addLeaf("revDecimal", null, "92233720368547758.07");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        return ydtBuilder;
    }

    /**
     * Returns the ydt builder with requested logical root name and module name.
     *
     * @param rootName   logical rootNode name
     * @param moduleName application(module) name
     * @param nameSpace  namespace of module
     * @param opType     operation type
     * @return ydt builder
     */
    public static YangRequestWorkBench getYdtBuilder(String rootName, String
            moduleName, String nameSpace, YdtContextOperationType opType) {
        setSchemaRegistry(schemaProvider.getDefaultYangSchemaRegistry());
        YangRequestWorkBench ydtBuilder;
        schemaProvider.processSchemaRegistry(null);
        ydtBuilder = new YangRequestWorkBench(
                rootName, null, null, schemaProvider
                .getDefaultYangSchemaRegistry(), true);
        ydtBuilder.addChild(moduleName, nameSpace, opType);
        return ydtBuilder;
    }

    /**
     * Compares the two value sets.
     */
    public static void compareValueSet(Set<String> valueSet,
                                       Set<String> userInputValueSet) {
        // Check the value against user input.
        assertTrue("Expected 'valueSet' and 'userInputValueSet' to be equal.",
                   valueSet.containsAll(userInputValueSet));
    }

    /**
     * Returns the ydt builder for Hello_ONOS module.
     *
     * @return ydt builder
     */
    public static YangRequestWorkBench helloOnos() {

        YangRequestWorkBench ydtBuilder;
        ydtBuilder = getYdtBuilder(
                "Hello-ONOS", "Hello_ONOS", "ydt:hello_onos", MERGE);
        ydtBuilder.addChild("hello-world", null);
        ydtBuilder.addChild("input", null);
        ydtBuilder.addLeaf("name", null, "onos");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("surName", null, "yang");
        ydtBuilder.traverseToParent();

        kValList.clear();
        kValList.add("ON");
        kValList.add("LAB");
        ydtBuilder.addMultiInstanceChild("stringList", null, kValList,
                                         MERGE);
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        return ydtBuilder;
    }

    /**
     * Returns the error message for requested node.
     *
     * @param value    value in string format
     * @param dataType requested data type
     * @return error string
     */
    static String getErrorString(String value, String dataType) {
        StringBuilder msg = new StringBuilder();
        switch (dataType) {
            case SINT16:
            case SINT32:
            case SMALLINT8:
            case SMALLINT64:
            case SMALLUINT8:
            case SMALLUINT64:
            case SUINT16:
            case SUINT32:
            case CAPSINT8:
            case CAPSINT16:
            case CAPSINT32:
            case CAPSINT64:
            case CAPSUINT8:
            case CAPSUINT16:
            case CAPSUINT32:
            case CAPSUINT64:
            case BIT:
            case BOOL:
            case ENUM:
                msg.append("YANG file error : Input value ").append(BACKSLASH)
                        .append(value).append(BACKSLASH)
                        .append(" is not a valid ").append(dataType);
                break;
            case EMPTY:
                msg.append("YANG file error : Input value ").append(BACKSLASH)
                        .append(value).append(BACKSLASH).append(
                        " is not allowed for a data type EMPTY");
                break;
            case MINVALUE:
                msg.append("YANG file error : ").append(value)
                        .append(" is lesser than minimum value ")
                        .append(MINVALUE).append(PERIOD);
                break;
            case MAXUINT8:
            case MAXUINT16:
            case MAXUINT32:
            case MAXUINT64:
                msg.append("YANG file error : ").append(value)
                        .append(" is greater than maximum value ")
                        .append(dataType).append(PERIOD);
                break;
            default:
                return null;
        }
        return msg.toString();
    }

    /**
     * Validates the error message which is obtained by checking the given
     * value against its data type restrictions.
     *
     * @param name      leaf name
     * @param nameSpace leaf namespace
     * @param val       leaf value
     * @param type      data type suffix string for exception message
     * @param childName child name
     */
    public static void validateErrMsg(String name, String nameSpace,
                                      String val, String type, String childName) {
        YangRequestWorkBench ydtBuilder = getTestYdtBuilder(nameSpace);
        boolean isExpOccurred = false;
        /*
         * If childName exist then leaf need to be added under the
         * child node with the given childName
         */
        if (childName != null) {
            ydtBuilder.addChild(childName, nameSpace);
        }
        /*
         * This try catch is explicitly written to use as utility in other
         * test cases.
         */
        try {
            ydtBuilder.addLeaf(name, nameSpace, val);
        } catch (YdtException e) {
            isExpOccurred = true;
            assertEquals(e.getMessage(), getErrorString(val, type));
        }
        assertEquals(E_LEAF + name, isExpOccurred, true);
    }

    /**
     * Returns ydt builder for requested namespace.
     *
     * @param namespace namespace of the requested yang data tree
     * @return ydt builder
     */
    public static YangRequestWorkBench getTestYdtBuilder(String namespace) {

        switch (namespace) {
            case INT8NS:
                return getYdtBuilder(TYPE, "integer8", INT8NS, MERGE);
            case INT16NS:
                return getYdtBuilder(TYPE, "integer16", INT16NS, MERGE);
            case INT32NS:
                return getYdtBuilder(TYPE, "integer32", INT32NS, MERGE);
            case INT64NS:
                return getYdtBuilder(TYPE, "integer64", INT64NS, MERGE);
            case BITNS:
                return getYdtBuilder(TYPE, "bit", BITNS, MERGE);
            case BOOLNS:
                return getYdtBuilder(TYPE, "bool", BOOLNS, MERGE);
            case EMPTYNS:
                return getYdtBuilder(TYPE, "emptydata", EMPTYNS, MERGE);
            case ENUMNS:
                return getYdtBuilder(TYPE, "enumtest", ENUMNS, MERGE);
            case LISTNS:
                return getYdtBuilder(LIST, "rootlist", LISTNS, MERGE);
            default:
                return null;
        }
    }

    /**
     * Validates the contents of node like name, namespace and operation type.
     *
     * @param ydtNode node need to be validate
     * @param name    name of the node
     * @param opType  operation type of the node
     */
    public static void validateNodeContents(YdtNode ydtNode, String name,
                                            YdtContextOperationType opType) {
        assertEquals(ydtNode.getName(), name);
        assertEquals(ydtNode.getYdtContextOperationType(), opType);
    }

    /**
     * Validates the contents of leaf node like name, namespace and operation
     * type.
     *
     * @param ydtNode node need to be validate
     * @param name    name of the node
     * @param value   value of the leaf node
     */
    public static void validateLeafContents(YdtNode ydtNode, String name,
                                            String value) {
        validateNodeContents(ydtNode, name, null);
        assertEquals(ydtNode.getValue(), value);
    }

    /**
     * Validates the contents of leaf-list node like name, namespace and
     * operation type.
     *
     * @param ydtNode  node need to be validate
     * @param name     name of the node
     * @param valueSet value of the leaf node
     */
    public static void validateLeafListContents(YdtNode ydtNode, String name,
                                                Set<String> valueSet) {
        validateNodeContents(ydtNode, name, null);
        compareValueSet(ydtNode.getValueSet(), valueSet);
    }

    /**
     * Validates the contents of ydt application logical node.
     *
     * @param ydtAppNode node need to be validate
     */
    public static void validateAppLogicalNodeContents(
            YdtAppContext ydtAppNode) {

        assertNull(ydtAppNode.getOperationType());
        assertNull(ydtAppNode.getParent());
        assertNull(ydtAppNode.getNextSibling());
        assertNull(ydtAppNode.getPreviousSibling());
        assertNotNull(ydtAppNode.getFirstChild());
        assertNotNull(ydtAppNode.getLastChild());
    }

    /**
     * Validates the contents of ydt application module node.
     *
     * @param ydtAppNode node need to be validate
     * @param name       name of the node
     * @param opType     operation type of the app node
     */
    public static void validateAppModuleNodeContents(
            YdtAppContext ydtAppNode, String name,
            YdtAppNodeOperationType opType) {

        assertEquals(ydtAppNode.getModuleContext().getName(), name);
        assertEquals(ydtAppNode.getOperationType(), opType);
    }

    /**
     * Validates the contents of ydt application node like name, namespace
     * and operation type.
     *
     * @param ydtAppNode node need to be validate
     * @param name       name of the schema node
     * @param ns         namespace of the schema node
     * @param opType     operation type of the app node
     */
    public static void validateAppNodeContents(
            YdtAppContext ydtAppNode, String name, String ns,
            YdtAppNodeOperationType opType) {
        assertEquals(ydtAppNode.getAugmentingSchemaNode().getName(), name);
        assertEquals(ydtAppNode.getAugmentingSchemaNode().getNameSpace(), ns);
        assertEquals(ydtAppNode.getOperationType(), opType);
    }

    /**
     * Walks in the given built ydt and validates it.
     */
    public static void walkINTree(YangRequestWorkBench ydtBuilder,
                                  String[] expected) {
        DefaultYdtWalker ydtWalker = new DefaultYdtWalker();
        resetLogger();

        YdtTestUtils utils = new YdtTestUtils();
        // Assign root node as starting node to walk the whole tree.
        ydtWalker.walk(utils, ydtBuilder.getRootNode());
        // Logger list is used for walker testing.
        List<String> logger = getLogger();

        for (int i = 0; i < expected.length; i++) {
            assertEquals(expected[i], logger.get(i));
        }
    }
}
