/*
 * 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.Test;
import org.junit.rules.ExpectedException;
import org.onosproject.yangutils.datamodel.utils.builtindatatype.DataTypeException;
import org.onosproject.yms.app.ydt.exceptions.YdtException;

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.onosproject.yms.app.ydt.YdtTestConstants.E_LEAF;
import static org.onosproject.yms.app.ydt.YdtTestConstants.E_LIST;
import static org.onosproject.yms.app.ydt.YdtTestConstants.E_TOPARENT;
import static org.onosproject.yms.app.ydt.YdtTestConstants.INV;
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.YdtTestUtils.getTestYdtBuilder;
import static org.onosproject.yms.app.ydt.YdtTestUtils.getYdtBuilder;
import static org.onosproject.yms.app.ydt.YdtTestUtils.listWithContainer1Ydt;
import static org.onosproject.yms.app.ydt.YdtTestUtils.listWithContainer2Ydt;
import static org.onosproject.yms.app.ydt.YdtTestUtils.listWithContainerYdt;
import static org.onosproject.yms.app.ydt.YdtTestUtils.listWithoutContainerYdt;
import static org.onosproject.yms.app.ydt.YdtTestUtils.validateLeafContents;
import static org.onosproject.yms.app.ydt.YdtTestUtils.validateLeafListContents;
import static org.onosproject.yms.app.ydt.YdtTestUtils.validateNodeContents;
import static org.onosproject.yms.app.ydt.YdtTestUtils.walkINTree;
import static org.onosproject.yms.ydt.YdtContextOperationType.MERGE;

public class ListTest {

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

    private Set<String> valueSet = new HashSet();

    private static final String[] ERROR = {
            "rootlist is missing some of the keys of listwithcontainer.",
            "Duplicate entry with name invalid.",
            "Some of the key elements are not unique in listwithcontainer.",
            "Too few key parameters in listwithcontainer." +
                    " Expected 2; actual 1.",
            "Too many key parameters in listwithcontainer." +
                    " Expected 2; actual 3.",
            "Application with name \"" + "invalid\" doesn't exist.",
            "Too many instances of listwithcontainer. Expected maximum " +
                    "instances 3.",
            "Duplicate entry found under invalidinterval leaf-list node.",
            "YANG file error : Input value \"string\" is not a valid uint16."
    };

    private static final String[] EXPECTED = {
            "Entry Node is list.",
            "Entry Node is rootlist.",
            "Entry Node is listwithoutcontainer.",
            "Entry Node is invalidinterval.",
            "Exit Node is invalidinterval.",
            "Exit Node is listwithoutcontainer.",
            "Exit Node is rootlist.",
            "Exit Node is list."
    };

    List<String> keysValueList = new ArrayList<>();

    /**
     * Creates and validates rootlist module with listwithoutcontainer node.
     */
    @Test
    public void listwithoutcontainerTest() throws YdtException {
        YangRequestWorkBench ydtBuilder = listWithoutContainerYdt();
        validateTree(ydtBuilder);
        // walker test
        walkINTree(ydtBuilder, EXPECTED);
    }

    /**
     * Creates and validates rootlist module with listwithcontainer node
     * using addMultiInstanceChild interface for adding multi instance node.
     */
    @Test
    public void listwithcontainerTest() throws YdtException {
        YangRequestWorkBench ydtBuilder = listWithContainerYdt();
        validateListwithcontainerTree(ydtBuilder);
    }

    /**
     * Creates and validates rootlist module with listwithcontainer
     * node using addChild interface for adding multi instance node.
     */
    @Test
    public void listwithcontainer1Test() throws YdtException {
        YangRequestWorkBench ydtBuilder = listWithContainer1Ydt();
        validateListwithcontainerTree(ydtBuilder);
    }

    /**
     * Creates and validates rootlist module with multiple instances of
     * listwithcontainer node using addMultiInstanceChild interface for adding
     * multi instance node.
     */
    @Test
    public void listwithcontainer2Test() throws YdtException {
        YangRequestWorkBench ydtBuilder = listWithContainer2Ydt();
    }

    /**
     * Validates the given built ydt.
     */
    private void validateTree(YangRequestWorkBench ydtBuilder) {

        // assign root node to ydtNode for validating purpose.
        YdtNode ydtNode = (YdtNode) ydtBuilder.getRootNode();
        // Logical root node does not have operation type
        validateNodeContents(ydtNode, "list", null);

        ydtNode = ydtNode.getFirstChild();
        validateNodeContents(ydtNode, "rootlist", MERGE);
        ydtNode = ydtNode.getFirstChild();
        validateNodeContents(ydtNode, "listwithoutcontainer", MERGE);
        ydtNode = ydtNode.getFirstChild();
        validateLeafContents(ydtNode, INV, "12");
    }

    /**
     * Validates the given list with container built ydt.
     */
    private void validateListwithcontainerTree(
            YangRequestWorkBench ydtBuilder) {

        valueSet.add("1");
        valueSet.add("2");
        // assign root node to ydtNode for validating purpose.
        YdtNode ydtNode = (YdtNode) ydtBuilder.getRootNode();
        // Logical root node does not have operation type
        validateNodeContents(ydtNode, "list", null);

        ydtNode = ydtNode.getFirstChild();
        validateNodeContents(ydtNode, "rootlist", MERGE);
        ydtNode = ydtNode.getFirstChild();
        validateNodeContents(ydtNode, LWC, MERGE);
        ydtNode = ydtNode.getFirstChild();
        validateLeafContents(ydtNode, "invalid", "12");
        ydtNode = ydtNode.getNextSibling();
        validateLeafContents(ydtNode, "invalid1", "12");
        ydtNode = ydtNode.getNextSibling();
        validateLeafListContents(ydtNode, INV, valueSet);
        ydtNode = ydtNode.getNextSibling();
        validateNodeContents(ydtNode, "interface", MERGE);
        ydtNode = ydtNode.getFirstChild();
        validateLeafContents(ydtNode, INV, "12");
        ydtNode = ydtNode.getNextSibling();
        validateLeafContents(ydtNode, "invalid", "121");
    }

    /**
     * Tests the negative error scenario when application name for ydt is
     * invalid.
     */
    @Test
    public void negative1Test() {
        thrown.expect(YdtException.class);
        thrown.expectMessage(ERROR[5]);
        getYdtBuilder("list", "invalid", "ydt.invalid", MERGE);
    }

    /**
     * Tests the negative error scenario when list node is not having all
     * key elements.
     */
    @Test
    public void negative2Test() throws YdtException {

        YangRequestWorkBench ydtBuilder = getTestYdtBuilder(LISTNS);
        ydtBuilder.addChild(LWC, LISTNS);
        ydtBuilder.addLeaf("invalid", LISTNS, "12");
        ydtBuilder.traverseToParent();

        traversToParentErrorMsgValidator(ydtBuilder, ERROR[0]);
    }

    /**
     * Tests the negative error scenario when duplicate entry of list node
     * is created.
     */
    @Test
    public void negative3Test() throws YdtException {
        YangRequestWorkBench ydtBuilder = getTestYdtBuilder(LISTNS);
        ydtBuilder.addChild(LWC, LISTNS);
        ydtBuilder.addLeaf("invalid", LISTNS, "12");
        ydtBuilder.traverseToParent();
        leafErrorMsgValidator(ydtBuilder, "invalid", "12", ERROR[1]);
    }

    /**
     * Tests the negative error scenario when key elements of list node
     * are not unique.
     */
    @Test
    public void negative4Test() throws YdtException {
        YangRequestWorkBench ydtBuilder = getTestYdtBuilder(LISTNS);
        ydtBuilder.addChild(LWC, LISTNS);
        ydtBuilder.addLeaf("invalid", LISTNS, "12");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("invalid1", LISTNS, "12");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild(LWC, LISTNS);
        ydtBuilder.addLeaf("invalid", LISTNS, "12");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("invalid1", LISTNS, "12");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        traversToParentErrorMsgValidator(ydtBuilder, ERROR[2]);
    }

    /**
     * Tests the negative error scenario when all key elements of list node
     * are not supplied.
     */
    @Test
    public void negative5Test() throws YdtException {
        keysValueList.clear();
        keysValueList.add("1");
        keysValueList.add("2");
        keysValueList.add("2");
        YangRequestWorkBench ydtBuilder = getTestYdtBuilder(LISTNS);
        listNodeErrorMsgValidator(ydtBuilder, keysValueList, ERROR[4]);

        keysValueList.clear();
        keysValueList.add("1");
        ydtBuilder = getTestYdtBuilder(LISTNS);
        listNodeErrorMsgValidator(ydtBuilder, keysValueList, ERROR[3]);
    }

    /**
     * Tests the negative error scenario when instances of a list node are
     * created above the allowed limit.
     */
    @Test
    public void negative6Test() throws YdtException {
        keysValueList.clear();
        keysValueList.add("1");
        keysValueList.add("1");
        YangRequestWorkBench ydtBuilder = getTestYdtBuilder(LISTNS);
        ydtBuilder.addMultiInstanceChild(LWC, LISTNS, keysValueList, null);
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild(LWC, LISTNS);
        ydtBuilder.addLeaf("invalid", LISTNS, "12");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("invalid1", LISTNS, "121");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild(LWC, LISTNS);
        ydtBuilder.addLeaf("invalid", LISTNS, "12");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("invalid1", LISTNS, "1211");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();

        ydtBuilder.addChild(LWC, LISTNS);
        ydtBuilder.addLeaf("invalid", LISTNS, "12");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("invalid1", LISTNS, "21");
        ydtBuilder.traverseToParent();
        ydtBuilder.traverseToParent();
        traversToParentErrorMsgValidator(ydtBuilder, ERROR[6]);
    }

    /**
     * Tests the negative error scenario when list node is not having all
     * key elements.
     */
    @Test
    public void negative7Test() throws YdtException {
        YangRequestWorkBench ydtBuilder = getTestYdtBuilder(LISTNS);
        ydtBuilder.addChild(LWC, LISTNS);
        traversToParentErrorMsgValidator(ydtBuilder, ERROR[0]);
    }

    /**
     * Tests the negative error scenario when duplicate key entry is created
     * inside leaf-list node.
     */
    @Test
    public void negative8Test() throws YdtException {
        YangRequestWorkBench ydtBuilder = getTestYdtBuilder(LISTNS);
        ydtBuilder.addChild(LWC, LISTNS);
        ydtBuilder.addLeaf("invalid", LISTNS, "12");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("invalid1", LISTNS, "12");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf(INV, LISTNS, "12");
        ydtBuilder.traverseToParent();
        leafErrorMsgValidator(ydtBuilder, INV, "12", ERROR[7]);
    }

    /**
     * Tests the negative error scenario when string is passed for uint16 type
     * leaf node.
     */
    @Test
    public void negative9Test() throws YdtException {
        YangRequestWorkBench ydtBuilder = getTestYdtBuilder(LISTNS);
        ydtBuilder.addChild(LWC, LISTNS);
        ydtBuilder.addLeaf("invalid", LISTNS, "12");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("invalid1", LISTNS, "12");
        ydtBuilder.traverseToParent();
        leafErrorMsgValidator(ydtBuilder, INV, "string", ERROR[8]);
    }

    /**
     * Tests the negative error scenario when duplicate key entry created
     * inside a leaf-list node.
     */
    @Test
    public void negative10Test() throws YdtException {
        valueSet.clear();
        valueSet.add("1");
        valueSet.add("2");
        valueSet.add("12");
        YangRequestWorkBench ydtBuilder = getTestYdtBuilder(LISTNS);
        ydtBuilder.addChild(LWC, LISTNS);
        ydtBuilder.addLeaf("invalid", LISTNS, "12");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("invalid1", LISTNS, "12");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf(INV, LISTNS, "12");
        ydtBuilder.traverseToParent();
        thrown.expect(YdtException.class);
        thrown.expectMessage(ERROR[7]);
        ydtBuilder.addLeaf(INV, LISTNS, valueSet);
    }

    /**
     * Tests the negative error scenario when string is passed for uint16 type
     * key entry inside a leaf-list node.
     */
    @Test
    public void negative11Test() throws YdtException {
        valueSet.clear();
        valueSet.add("string");
        YangRequestWorkBench ydtBuilder = getTestYdtBuilder(LISTNS);
        ydtBuilder.addChild(LWC, LISTNS);
        ydtBuilder.addLeaf("invalid", LISTNS, "12");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf("invalid1", LISTNS, "12");
        ydtBuilder.traverseToParent();
        ydtBuilder.addLeaf(INV, LISTNS, "12");
        ydtBuilder.traverseToParent();
        thrown.expect(DataTypeException.class);
        thrown.expectMessage(ERROR[8]);
        ydtBuilder.addLeaf(INV, LISTNS, valueSet);
    }

    /**
     * Validate the error message obtained by adding multi instance node in
     * current context against the given error string.
     *
     * @param bldr  ydt builder
     * @param list  list of key values
     * @param error error string
     */
    private void listNodeErrorMsgValidator(YangRequestWorkBench bldr,
                                           List<String> list, String error) {
        /*
         * This try catch is explicitly written to use as utility in other
         * test cases.
         */
        boolean isExpOccurred = false;
        try {
            bldr.addMultiInstanceChild(LWC, LISTNS, list, null);
        } catch (YdtException e) {
            isExpOccurred = true;
            assertEquals(e.getMessage(), error);
        }
        assertEquals(E_LIST + LWC, isExpOccurred, true);
    }

    /**
     * Validate the error message obtained by traversing back to parent of
     * current context against the given error string.
     *
     * @param ydtBuilder ydt builder
     * @param error      error string
     */
    private void traversToParentErrorMsgValidator(
            YangRequestWorkBench ydtBuilder, String error) {
        /*
         * This try catch is explicitly written to use as utility in other
         * test cases.
         */
        boolean isExpOccurred = false;
        try {
            ydtBuilder.traverseToParent();
        } catch (YdtException e) {
            isExpOccurred = true;
            assertEquals(e.getMessage(), error);
        }
        assertEquals(E_TOPARENT, isExpOccurred, true);
    }

    /**
     * Validate the error message obtained by adding leaf node in
     * current context against the given error string.
     *
     * @param bldr  ydt builder
     * @param name  name of the leaf
     * @param val   leaf value
     * @param error error string
     */
    private void leafErrorMsgValidator(
            YangRequestWorkBench bldr, String name, String val, String error) {
        /*
         * This try catch is explicitly written to use as utility in other
         * test cases.
         */
        boolean isExpOccurred = false;
        try {
            bldr.addLeaf(name, LISTNS, val);
        } catch (YdtException e) {
            isExpOccurred = true;
            assertEquals(e.getMessage(), error);
        }
        assertEquals(E_LEAF + name, isExpOccurred, true);
    }
}
