/*******************************************************************************
 * Copyright (c) 2000, 2015 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.debug.jdi.tests;

import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;

import com.sun.jdi.Mirror;
import com.sun.jdi.request.AccessWatchpointRequest;
import com.sun.jdi.request.BreakpointRequest;
import com.sun.jdi.request.ModificationWatchpointRequest;

/**
 * Tests for JDI com.sun.jdi.Mirror.
 */
public class MirrorTest extends AbstractJDITest {
	List<Mirror> fMirrors = new LinkedList<>();
	/**
	 * Creates a new test.
	 */
	public MirrorTest() {
		super();
	}
	/**
	 * Init the fields that are used by this test only.
	 */
	@Override
	public void localSetUp() {
		// Get all kinds of concrete mirror that can be found in the VM
		// in alphabetical order.

		//TO DO: Add events too

		fMirrors = new LinkedList<>();

		if (fVM.canWatchFieldAccess())
			fMirrors.add(getAccessWatchpointRequest());
		// AccessWatchpointRequest

		fMirrors.add(getObjectArrayReference()); // ArrayReference
		fMirrors.add(getArrayType()); // ArrayType
		fMirrors.add(fVM.mirrorOf(true)); // BooleanValue
		fMirrors.add(getBreakpointRequest()); // BreakpointRequest
		fMirrors.add(fVM.mirrorOf((byte) 1)); // ByteValue
		fMirrors.add(fVM.mirrorOf('1')); // CharValue
		fMirrors.add(getClassLoaderReference()); // ClassLoaderReference
		fMirrors.add(getMainClass()); // ClassType
		fMirrors.add(fVM.mirrorOf(12345.6789)); // DoubleValue
		fMirrors.add(fVM.eventRequestManager()); // EventRequestManager
		fMirrors.add(fVM.eventQueue()); // EventQueue
		fMirrors.add(getField()); // Field
		fMirrors.add(fVM.mirrorOf(123.45f)); // FieldValue
		fMirrors.add(fVM.mirrorOf(12345)); // IntegerValue
		fMirrors.add(getInterfaceType()); // InterfaceType
		fMirrors.add(getLocalVariable()); // LocalVariable
		fMirrors.add(getLocation()); // Location
		fMirrors.add(fVM.mirrorOf(123456789l)); // LongValue
		fMirrors.add(getMethod()); // Method

		if (fVM.canWatchFieldModification())
			fMirrors.add(getModificationWatchpointRequest());
		// ModificationWatchpointRequest

		fMirrors.add(getObjectReference()); // ObjectReference
		fMirrors.add(fVM.mirrorOf((short) 12345)); // ShortValue
		fMirrors.add(getFrame(RUN_FRAME_OFFSET)); // StackFrame
		fMirrors.add(getStringReference()); // StringReference
		fMirrors.add(getThread().threadGroup()); // ThreadGroupReference
		fMirrors.add(getThread()); // ThreadReference
		fMirrors.add(fVM); // VirtualMachine
	}
	/**
	 * Make sure the test leaves the VM in the same state it found it.
	 */
	@Override
	public void localTearDown() {
		ListIterator<Mirror> iterator = fMirrors.listIterator();
		while (iterator.hasNext()) {
			Object mirror = iterator.next();

			// Delete the access watchpoint request we created in this test
			if (mirror instanceof AccessWatchpointRequest)
				fVM.eventRequestManager().deleteEventRequest(
					(AccessWatchpointRequest) mirror);

			// Delete the breakpoint request we created in this test
			if (mirror instanceof BreakpointRequest)
				fVM.eventRequestManager().deleteEventRequest(
					(BreakpointRequest) mirror);

			// Delete the modification watchpoint request we created in this test
			if (mirror instanceof ModificationWatchpointRequest)
				fVM.eventRequestManager().deleteEventRequest(
					(ModificationWatchpointRequest) mirror);
		}
	}
	/**
	 * Run all tests and output to standard output.
	 * @param args
	 */
	public static void main(java.lang.String[] args) {
		new MirrorTest().runSuite(args);
	}
	/**
	 * Gets the name of the test case.
	 * @see junit.framework.TestCase#getName()
	 */
	@Override
	public String getName() {
		return "com.sun.jdi.Mirror";
	}
	/**
	 * Test JDI toString().
	 */
	public void testJDIToString() {
		for (int i = 0; i < fMirrors.size(); i++) {
			Mirror mirror = fMirrors.get(i);
			assertNotNull(Integer.toString(i), mirror.toString());
		}
	}
	/**
	 * Test JDI virtualMachine().
	 */
	public void testJDIVirtualMachine() {
		for (int i = 0; i < fMirrors.size(); i++) {
			Mirror mirror = fMirrors.get(i);
			assertEquals(Integer.toString(i), fVM, mirror.virtualMachine());
		}
	}
}
