/*
 * Copyright 2016-present Open Networking Foundation
 *
 * 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.Test;
import org.onosproject.yms.app.ydt.exceptions.YdtException;

import static org.onosproject.yms.app.ydt.YdtTestConstants.MAXIWR;
import static org.onosproject.yms.app.ydt.YdtTestConstants.MAXUIWR;
import static org.onosproject.yms.app.ydt.YdtTestConstants.MIDIWR;
import static org.onosproject.yms.app.ydt.YdtTestConstants.MIDUIWR;
import static org.onosproject.yms.app.ydt.YdtTestConstants.MINIWR;
import static org.onosproject.yms.app.ydt.YdtTestConstants.MINUIWR;
import static org.onosproject.yms.app.ydt.YdtTestConstants.MRV;
import static org.onosproject.yms.app.ydt.YdtTestConstants.RUI;
import static org.onosproject.yms.app.ydt.YdtTestConstants.TYPE;
import static org.onosproject.yms.app.ydt.YdtTestUtils.integer16Ydt;
import static org.onosproject.yms.app.ydt.YdtTestUtils.validateLeafContents;
import static org.onosproject.yms.app.ydt.YdtTestUtils.validateNodeContents;
import static org.onosproject.yms.ydt.YdtContextOperationType.MERGE;

public class YdtInteger16Test {

    /*
    Positive scenario

    input at boundry for integer
        i. min value
        ii. max value

    input at boundry for uinteger
        i. min value
        ii. max value

    input with in range
        if range is 10 to 100 for integer
            i.1. input 11
            i.2. min value 10
            i.3. max value 100

        if range is 10 to 100 for uinteger
            i.1. input 11
            i.2. min value 10
            i.3. max value 100

    input with multi interval range
        if range is 10..40 | 50..100 for integer
            i.1. input 11
            i.2. input 10
            i.3. input 40
            i.4. input 50
            i.5. input 55
            i.6. input 100

        if range is 10..40 | 50..100 for uinteger
            i.1. input 11
            i.2. input 10
            i.3. input 40
            i.4. input 50
            i.5. input 55
            i.6. input 100

        if range is "min .. 2 | 10 | 20..max" for integer
            i.1. input -32768
            i.2. input 1
            i.3. input 2
            i.4. input 10
            i.5. input 20
            i.6. input 100
            i.7. input 32767

         if range is "min .. 2 | 10 | 20..max" for uInteger
            i.1. input 0
            i.2. input 1
            i.3. input 2
            i.4. input 10
            i.5. input 20
            i.6. input 100
            i.7. input 65535
    */

    /**
     * Creates and validates integer16 ydt covering different positive scenario.
     */
    @Test
    public void positiveTest() throws YdtException {
        YangRequestWorkBench ydtBuilder = integer16Ydt();
        validateTree(ydtBuilder);
    }

    /**
     * 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, TYPE, null);

        ydtNode = ydtNode.getFirstChild();
        validateNodeContents(ydtNode, "integer16", MERGE);
        ydtNode = ydtNode.getFirstChild();
        validateLeafContents(ydtNode, "negInt", "-32768");
        ydtNode = ydtNode.getNextSibling();
        validateLeafContents(ydtNode, "posInt", "32767");
        ydtNode = ydtNode.getNextSibling();
        validateLeafContents(ydtNode, "minUInt", "0");
        ydtNode = ydtNode.getNextSibling();
        validateLeafContents(ydtNode, "maxUInt", "65535");
        ydtNode = ydtNode.getNextSibling();
        validateLeafContents(ydtNode, MIDIWR, "11");
        ydtNode = ydtNode.getNextSibling();
        validateLeafContents(ydtNode, MINIWR, "10");
        ydtNode = ydtNode.getNextSibling();
        validateLeafContents(ydtNode, MAXIWR, "100");
        ydtNode = ydtNode.getNextSibling();
        validateLeafContents(ydtNode, MIDUIWR, "11");
        ydtNode = ydtNode.getNextSibling();
        validateLeafContents(ydtNode, MINUIWR, "10");
        ydtNode = ydtNode.getNextSibling();
        validateLeafContents(ydtNode, MAXUIWR, "100");
        ydtNode = ydtNode.getNextSibling();
        validateNodeContents(ydtNode, MRV, MERGE);
        ydtNode = ydtNode.getFirstChild();
        validateLeafContents(ydtNode, "integer", "11");
        ydtNode = ydtNode.getParent();
        ydtNode = ydtNode.getNextSibling();
        validateNodeContents(ydtNode, MRV, MERGE);
        ydtNode = ydtNode.getFirstChild();
        validateLeafContents(ydtNode, "integer", "10");
        ydtNode = ydtNode.getParent();
        ydtNode = ydtNode.getNextSibling();
        validateNodeContents(ydtNode, MRV, MERGE);
        ydtNode = ydtNode.getFirstChild();
        validateLeafContents(ydtNode, "integer", "40");
        ydtNode = ydtNode.getParent();
        ydtNode = ydtNode.getNextSibling();
        validateNodeContents(ydtNode, MRV, MERGE);
        ydtNode = ydtNode.getFirstChild();
        validateLeafContents(ydtNode, "integer", "50");
        ydtNode = ydtNode.getParent();
        ydtNode = ydtNode.getNextSibling();
        validateNodeContents(ydtNode, MRV, MERGE);
        ydtNode = ydtNode.getFirstChild();
        validateLeafContents(ydtNode, "integer", "55");
        ydtNode = ydtNode.getParent();
        ydtNode = ydtNode.getNextSibling();
        validateNodeContents(ydtNode, MRV, MERGE);
        ydtNode = ydtNode.getFirstChild();
        validateLeafContents(ydtNode, "integer", "100");
        ydtNode = ydtNode.getParent();
        ydtNode = ydtNode.getNextSibling();
        validateNodeContents(ydtNode, MRV, MERGE);
        ydtNode = ydtNode.getFirstChild();
        validateLeafContents(ydtNode, "UnInteger", "11");
        ydtNode = ydtNode.getParent();
        ydtNode = ydtNode.getNextSibling();
        validateNodeContents(ydtNode, MRV, MERGE);
        ydtNode = ydtNode.getFirstChild();
        validateLeafContents(ydtNode, "UnInteger", "10");
        ydtNode = ydtNode.getParent();
        ydtNode = ydtNode.getNextSibling();
        validateNodeContents(ydtNode, MRV, MERGE);
        ydtNode = ydtNode.getFirstChild();
        validateLeafContents(ydtNode, "UnInteger", "40");
        ydtNode = ydtNode.getParent();
        ydtNode = ydtNode.getNextSibling();
        validateNodeContents(ydtNode, MRV, MERGE);
        ydtNode = ydtNode.getFirstChild();
        validateLeafContents(ydtNode, "UnInteger", "50");
        ydtNode = ydtNode.getParent();
        ydtNode = ydtNode.getNextSibling();
        validateNodeContents(ydtNode, MRV, MERGE);
        ydtNode = ydtNode.getFirstChild();
        validateLeafContents(ydtNode, "UnInteger", "55");
        ydtNode = ydtNode.getParent();
        ydtNode = ydtNode.getNextSibling();
        validateNodeContents(ydtNode, MRV, MERGE);
        ydtNode = ydtNode.getFirstChild();
        validateLeafContents(ydtNode, "UnInteger", "100");

        ydtNode = ydtNode.getParent();
        ydtNode = ydtNode.getNextSibling();
        validateNodeContents(ydtNode, MRV, MERGE);
        ydtNode = ydtNode.getFirstChild();
        validateLeafContents(ydtNode, "revInteger", "-32768");
        ydtNode = ydtNode.getParent();
        ydtNode = ydtNode.getNextSibling();
        validateNodeContents(ydtNode, MRV, MERGE);
        ydtNode = ydtNode.getFirstChild();
        validateLeafContents(ydtNode, "revInteger", "1");
        ydtNode = ydtNode.getParent();
        ydtNode = ydtNode.getNextSibling();
        validateNodeContents(ydtNode, MRV, MERGE);

        validate1Tree(ydtNode);
    }

    /**
     * Validates the given built ydt.
     */
    private void validate1Tree(YdtNode ydtNode) {

        ydtNode = ydtNode.getFirstChild();
        validateLeafContents(ydtNode, "revInteger", "2");
        ydtNode = ydtNode.getParent();
        ydtNode = ydtNode.getNextSibling();
        validateNodeContents(ydtNode, MRV, MERGE);
        ydtNode = ydtNode.getFirstChild();
        validateLeafContents(ydtNode, "revInteger", "10");
        ydtNode = ydtNode.getParent();
        ydtNode = ydtNode.getNextSibling();
        validateNodeContents(ydtNode, MRV, MERGE);
        ydtNode = ydtNode.getFirstChild();
        validateLeafContents(ydtNode, "revInteger", "20");
        ydtNode = ydtNode.getParent();
        ydtNode = ydtNode.getNextSibling();
        validateNodeContents(ydtNode, MRV, MERGE);
        ydtNode = ydtNode.getFirstChild();
        validateLeafContents(ydtNode, "revInteger", "100");
        ydtNode = ydtNode.getParent();
        ydtNode = ydtNode.getNextSibling();
        validateNodeContents(ydtNode, MRV, MERGE);
        ydtNode = ydtNode.getFirstChild();
        validateLeafContents(ydtNode, "revInteger", "32767");

        ydtNode = ydtNode.getParent();
        ydtNode = ydtNode.getNextSibling();
        validateNodeContents(ydtNode, MRV, MERGE);
        ydtNode = ydtNode.getFirstChild();
        validateLeafContents(ydtNode, RUI, "0");
        ydtNode = ydtNode.getParent();
        ydtNode = ydtNode.getNextSibling();
        validateNodeContents(ydtNode, MRV, MERGE);
        ydtNode = ydtNode.getFirstChild();
        validateLeafContents(ydtNode, RUI, "1");
        ydtNode = ydtNode.getParent();
        ydtNode = ydtNode.getNextSibling();
        validateNodeContents(ydtNode, MRV, MERGE);
        ydtNode = ydtNode.getFirstChild();
        validateLeafContents(ydtNode, RUI, "2");
        ydtNode = ydtNode.getParent();
        ydtNode = ydtNode.getNextSibling();
        validateNodeContents(ydtNode, MRV, MERGE);
        ydtNode = ydtNode.getFirstChild();
        validateLeafContents(ydtNode, RUI, "10");
        ydtNode = ydtNode.getParent();
        ydtNode = ydtNode.getNextSibling();
        validateNodeContents(ydtNode, MRV, MERGE);
        ydtNode = ydtNode.getFirstChild();
        validateLeafContents(ydtNode, RUI, "20");
        ydtNode = ydtNode.getParent();
        ydtNode = ydtNode.getNextSibling();
        validateNodeContents(ydtNode, MRV, MERGE);
        ydtNode = ydtNode.getFirstChild();
        validateLeafContents(ydtNode, RUI, "100");
        ydtNode = ydtNode.getParent();
        ydtNode = ydtNode.getNextSibling();
        validateNodeContents(ydtNode, MRV, MERGE);
        ydtNode = ydtNode.getFirstChild();
        validateLeafContents(ydtNode, RUI, "65535");
    }

    //TODO negative scenario will be handled later
    /*
        Negative scenario

        wrong type input
            i. input string instead of integer
            ii. input string instead of uinteger

    input out of range
        i. input for int 8 range -32768 to 32767
        i.1. input -32769
        i.2. input 32768

        ii. input for uint 8 range 0 to 65535
        ii.1. input -32769
        ii.2. input 65536

        input out of range parameter
            if range is 10 to 100 for int
                i.1. input 9
                i.2. input 101

            if range is 10 to 100 for uInt
                i.1. input 9
                i.2. input 101

        input with multi interval range
        if range is 10..40 | 50..100 for integer
            i.1. input 9
            i.2. input 41
            i.3. input 49
            i.4. input 101

        if range is 10..40 | 50..100 for uinteger
            i.1. input 9
            i.2. input 41
            i.3. input 49
            i.4. input 101

        input with multi interval range
        if range is min ..  | 10 | 20..max for integer
            i.1. input -32769
            i.2. input 4
            i.3. input 9
            i.4. input 11
            i.5. input 19
            i.6. input 32768

        if range is min .. 3 | 10 | 20..max for uinteger
            i.1. input -32769
            i.2. input 4
            i.3. input 9
            i.4. input 11
            i.5. input 19
            i.6. input 65536

    */

    /**
     * Tests all the minimum and maximum value's negative scenario's for
     * signed integer16 data type.
     */
//    @Test
//    public void negative1Test() throws YdtException {
//        validateErrMsg("posInt", INT16NS, "integer", SINT16, null);
//        validateErrMsg("posInt", INT16NS, "127.0", SINT16, null);
//        validateErrMsg("negInt", INT16NS, "-32769", SINT16, null);
//        validateErrMsg("posInt", INT16NS, "32768", SINT16, null);
//        validateErrMsg(MINIWR, INT16NS, "9", CAPSINT16, null);
//        validateErrMsg(MAXIWR, INT16NS, "101", CAPSINT16, null);
//    }
//
//    /**
//     * Tests all the minimum and maximum value's negative scenario's for
//     * unsigned integer16 data type.
//     */
//    @Test
//    public void negative2Test() throws YdtException {
//        validateErrMsg("maxUInt", INT16NS, "integer", SUINT16, null);
//        validateErrMsg("maxUInt", INT16NS, "127.0", SUINT16, null);
//        validateErrMsg("minUInt", INT16NS, "-32769", MINVALUE, null);
//        validateErrMsg("maxUInt", INT16NS, "65536", MAXUINT16, null);
//        validateErrMsg(MINUIWR, INT16NS, "9", CAPSUINT16, null);
//        validateErrMsg(MAXUIWR, INT16NS, "101", CAPSUINT16, null);
//    }
//
//    /**
//     * Tests all possible negative scenario's for signed integer16 data type
//     * with range "10..40 | 50..100".
//     */
//    @Test
//    public void negative3Test() throws YdtException {
//        validateErrMsg("integer", INT16NS, "9", CAPSINT16, MRV);
//        validateErrMsg("integer", INT16NS, "41", CAPSINT16, MRV);
//        validateErrMsg("integer", INT16NS, "49", CAPSINT16, MRV);
//        validateErrMsg("integer", INT16NS, "101", CAPSINT16, MRV);
//    }
//
//    /**
//     * Tests all possible negative scenario's for unsigned integer16 data type
//     * with range "10..40 | 50..100".
//     */
//    @Test
//    public void negative4Test() throws YdtException {
//        validateErrMsg("UnInteger", INT16NS, "9", CAPSUINT16, MRV);
//        validateErrMsg("UnInteger", INT16NS, "41", CAPSUINT16, MRV);
//        validateErrMsg("UnInteger", INT16NS, "49", CAPSUINT16, MRV);
//        validateErrMsg("UnInteger", INT16NS, "101", CAPSUINT16, MRV);
//    }
//
//    /**
//     * Tests all possible negative scenario's for signed integer16 data type
//     * with range "min .. 2 | 10 | 20..max".
//     */
//    @Test
//    public void negative5Test() throws YdtException {
//        // multi range validation
//        validateErrMsg("revInteger", INT16NS, "-32769", SINT16, MRV);
//        validateErrMsg("revInteger", INT16NS, "19", CAPSINT16, MRV);
//        validateErrMsg("revInteger", INT16NS, "4", CAPSINT16, MRV);
//        validateErrMsg("revInteger", INT16NS, "32768", SINT16, MRV);
//        validateErrMsg("revInteger", INT16NS, "9", CAPSINT16, MRV);
//        validateErrMsg("revInteger", INT16NS, "11", CAPSINT16, MRV);
//    }
//
//    /**
//     * Tests all possible negative scenario's for unsigned integer16 data type
//     * with range "min .. 2 | 10 | 20..max".
//     */
//    @Test
//    public void negative6Test() throws YdtException {
//        // multi range validation
//        validateErrMsg(RUI, INT16NS, "-32769", MINVALUE, MRV);
//        validateErrMsg(RUI, INT16NS, "4", CAPSUINT16, MRV);
//        validateErrMsg(RUI, INT16NS, "9", CAPSUINT16, MRV);
//        validateErrMsg(RUI, INT16NS, "11", CAPSUINT16, MRV);
//        validateErrMsg(RUI, INT16NS, "19", CAPSUINT16, MRV);
//        validateErrMsg(RUI, INT16NS, "65536", MAXUINT16, MRV);
//    }
}
