/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.
 */

/**
 * @author Anatoly F. Bondarenko
 */

/**
 * Created on 21.02.2005
 */
package org.apache.harmony.jpda.tests.jdwp.ReferenceType;

import org.apache.harmony.jpda.tests.framework.jdwp.CommandPacket;
import org.apache.harmony.jpda.tests.framework.jdwp.JDWPCommands;
import org.apache.harmony.jpda.tests.framework.jdwp.JDWPConstants;
import org.apache.harmony.jpda.tests.framework.jdwp.ReplyPacket;
import org.apache.harmony.jpda.tests.jdwp.share.JDWPSyncTestCase;
import org.apache.harmony.jpda.tests.share.JPDADebuggeeSynchronizer;


/**
 * JDWP Unit test for ReferenceType.NestedTypes command.
 */
public class NestedTypesTest extends JDWPSyncTestCase {

    static final int testStatusPassed = 0;
    static final int testStatusFailed = -1;
    static final String thisCommandName = "ReferenceType.NestedTypes command";
    static final String debuggeeSignature = "Lorg/apache/harmony/jpda/tests/jdwp/ReferenceType/NestedTypesDebuggee;";

    protected String getDebuggeeClassName() {
        return "org.apache.harmony.jpda.tests.jdwp.ReferenceType.NestedTypesDebuggee";
    }

    /**
     * This testcase exercises ReferenceType.NestedTypes command.
     * The test starts NestedTypesDebuggee class, requests referenceTypeId
     * for this class by VirtualMachine.ClassesBySignature command, then
     * performs ReferenceType.NestedTypes command and checks that returned
     * list of nested classes corresponds to expected list.
     */
    public void testNestedTypes001() {
        String thisTestName = "testNestedTypes001";
        logWriter.println("==> " + thisTestName + " for " + thisCommandName + ": START...");
        String failMessage = "";
        synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);

        long refTypeID = getClassIDBySignature(debuggeeSignature);

        logWriter.println("=> Debuggee class = " + getDebuggeeClassName());
        logWriter.println("=> referenceTypeID for Debuggee class = " + refTypeID);
        logWriter.println("=> CHECK: send " + thisCommandName + " and check reply...");

        CommandPacket checkedCommand = new CommandPacket(
                JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
                JDWPCommands.ReferenceTypeCommandSet.NestedTypesCommand);
        checkedCommand.setNextValueAsReferenceTypeID(refTypeID);
        ReplyPacket checkedReply =
            debuggeeWrapper.vmMirror.performCommand(checkedCommand);
        checkedCommand = null;
        checkReplyPacket(checkedReply, thisCommandName);

        int returnedNestedTypesNumber = checkedReply.getNextValueAsInt();
        logWriter.println("=> Returned nested types number = " + returnedNestedTypesNumber);

        String nestedTypeSignatures[] = {
                "Lorg/apache/harmony/jpda/tests/jdwp/ReferenceType/NestedTypesDebuggee$StatInterf_1;",
                "Lorg/apache/harmony/jpda/tests/jdwp/ReferenceType/NestedTypesDebuggee$StatClass_1;",
                "Lorg/apache/harmony/jpda/tests/jdwp/ReferenceType/NestedTypesDebuggee$NonStatClass_1;",
        };

        byte nestedTypeTags[] = {
                JDWPConstants.TypeTag.INTERFACE,
                JDWPConstants.TypeTag.CLASS,
                JDWPConstants.TypeTag.CLASS,
        };

        boolean nestedTypeFound[] = {
                false,
                false,
                false,
        };

        int expectedNestedTypesNumber = nestedTypeSignatures.length;

        logWriter.println("=> CHECK for all returned NestedTypes...");
        for (int i = 0; i < returnedNestedTypesNumber; i++) {
            logWriter.println("\n=> Check for returned nested type[" + i + "] ...");
            byte returnedRefTypeTag = checkedReply.getNextValueAsByte();
            logWriter.println("=> RefTypeTag of nested type = " + returnedRefTypeTag + "("
                + JDWPConstants.TypeTag.getName(returnedRefTypeTag) + ")");
            long returnedRefTypeID = checkedReply.getNextValueAsReferenceTypeID();
            logWriter.println("=> RefTypeID of nested type = " + returnedRefTypeID);
            logWriter.println("=> Get signature for nested type...");
            CommandPacket signatureCommand = new CommandPacket(
            JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
            JDWPCommands.ReferenceTypeCommandSet.SignatureCommand);
            signatureCommand.setNextValueAsReferenceTypeID(returnedRefTypeID);
            ReplyPacket signatureReply =
                debuggeeWrapper.vmMirror.performCommand(signatureCommand);
            signatureCommand = null;
            checkReplyPacket(signatureReply, "ReferenceType::Signature command");

            String returnedSignature = signatureReply.getNextValueAsString();
            signatureReply = null;
            logWriter.println("=> Signature of nested type = " + returnedSignature);

            int k = 0;
            for (; k < expectedNestedTypesNumber; k++) {
                if ( ! nestedTypeSignatures[k].equals(returnedSignature)) {
                    continue;
                }
                if ( nestedTypeFound[k] ) {
                    logWriter.println("\n## FAILURE: This nested type is found out repeatedly in the list");
                    failMessage = failMessage +
                        "This nested type is found repeatedly in the list;\n";
                    break;
                }
                nestedTypeFound[k] = true;
                if ( nestedTypeTags[k] != returnedRefTypeTag ) {
                    logWriter.println("\n## FAILURE: Unexpected RefTypeTag is returned:");
                    logWriter.println("## Expected RefTypeTag = " + nestedTypeTags[k] + "("
                    + JDWPConstants.TypeTag.getName(nestedTypeTags[k]) + ")");
                    failMessage = failMessage +
                        "Unexpected RefTypeTag is returned:" +
                        returnedRefTypeTag + "(" +
                        JDWPConstants.TypeTag.getName(returnedRefTypeTag) + ")" +
                        ", Expected: " + nestedTypeTags[k] + "(" +
                        JDWPConstants.TypeTag.getName(nestedTypeTags[k]) + ");\n";
                }
                break;
            }
            if ( k == expectedNestedTypesNumber ) {
                // returned nested type is not found out in the list of expected nested types
                logWriter.println("\n## FAILURE: It is unexpected nested type");
                failMessage = failMessage +
                    "It is unexpected nested type;\n";
            }
        }

        for (int k=0; k < expectedNestedTypesNumber; k++) {
            if ( ! nestedTypeFound[k] ) {
                logWriter.println
                ("\n## FAILURE: Expected nested type is NOT found out in the returned list:");
                logWriter.println("=> Signature of nested type = " + nestedTypeSignatures[k]);
                failMessage = failMessage +
                    "Expected nested type is NOT found in the returned list: " + nestedTypeSignatures[k];
            }
        }

        finalSyncMessage = JPDADebuggeeSynchronizer.SGNL_CONTINUE;
        if (failMessage.length() > 0) {
            fail(failMessage);
        }
        assertAllDataRead(checkedReply);
        finalSyncMessage = null;

        logWriter.println
        ("\n=> CHECK PASSED: All expected nested types are found out and have expected attributes");

        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
        logWriter.println("\n==> " + thisTestName + " for " + thisCommandName + ": OK.");
    }
}
