package org.eclipse.debug.jdi.tests;

/**********************************************************************
Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
This file is made available under the terms of the Common Public License v1.0
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/cpl-v10.html
**********************************************************************/

import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import com.sun.jdi.AbsentInformationException;
import com.sun.jdi.ClassNotLoadedException;
import com.sun.jdi.InvalidTypeException;
import com.sun.jdi.LocalVariable;
import com.sun.jdi.ObjectReference;
import com.sun.jdi.ReferenceType;
import com.sun.jdi.StackFrame;
import com.sun.jdi.ThreadReference;

/**
 * Tests for JDI com.sun.jdi.StackFrame.
 */
public class StackFrameTest extends AbstractJDITest {

	private StackFrame fFrame;
	/**
	 * Creates a new test.
	 */
	public StackFrameTest() {
		super();
	}
	/**
	 * Init the fields that are used by this test only.
	 */
	public void localSetUp() {
		// Get the frame running MainClass.run()
		fFrame = getFrame(RUN_FRAME_OFFSET);

	}
	/**
	 * Run all tests and output to standard output.
	 */
	public static void main(java.lang.String[] args) {
		new StackFrameTest().runSuite(args);
	}
	/**
	 * Gets the name of the test case.
	 */
	public String getName() {
		return "com.sun.jdi.StackFrame";
	}
	/**
	 * Test JDI equals() and hashCode().
	 */
	public void testJDIEquality() {
		StackFrame sameFrame = getFrame(RUN_FRAME_OFFSET);
		StackFrame otherFrame = getFrame(0);

		// Not identical
		assertTrue("1", fFrame != sameFrame);
		// But equal
		assertTrue("2", fFrame.equals(sameFrame));
		assertTrue("3", fFrame.hashCode() == sameFrame.hashCode());

		assertTrue("4", fFrame.equals(fFrame));
		assertTrue("5", fFrame.hashCode() == fFrame.hashCode());

		assertTrue("6", !fFrame.equals(otherFrame));

		assertTrue("7", !fFrame.equals(new Object()));
		assertTrue("8", !fFrame.equals(null));
	}
	/**
	 * Test JDI location().
	 */
	public void testJDILocation() {
		assertNotNull("1", fFrame.location());
	}
	/**
	 * Test JDI setValue(LocalVariable, Value), getValue(LocalVariable) and
	 * getValues(List).
	 */
	public void testJDISetGetValue() {
		// setValue
		ThreadReference thread = (ThreadReference) fVM.allThreads().get(0);
		LocalVariable var = getLocalVariable();
		try {
			fFrame.setValue(var, thread);
		} catch (ClassNotLoadedException e) {
			assertTrue("1.1", false);
		} catch (InvalidTypeException e) {
			assertTrue("1.2", false);
		}

		// getValue(LocalVariable)
		ThreadReference value =
			(ThreadReference) fFrame.getValue(getLocalVariable());
		assertEquals("2", thread, value);

		// getValues(List)
		List vars = new LinkedList();
		vars.add(var);
		Map values = fFrame.getValues(vars);
		value = (ThreadReference) values.get(var);
		assertEquals("3", thread, value);

		// test null value
		var = getLocalVariable();
		try {
			fFrame.setValue(var, null);
		} catch (ClassNotLoadedException e) {
			assertTrue("4.1", false);
		} catch (InvalidTypeException e) {
			assertTrue("4.2", false);
		}

		value = (ThreadReference) fFrame.getValue(getLocalVariable());
		assertEquals("5", null, value);

	}
	/**
	 * Test JDI thisObject().
	 */
	public void testJDIThisObject() {
		ObjectReference object = fFrame.thisObject();
		ReferenceType expected = getMainClass();
		ReferenceType referenceType = object.referenceType();
		assertEquals("1", expected, referenceType);
	}
	/**
	 * Test JDI thread().
	 */
	public void testJDIThread() {
		assertEquals("1", getThread(), fFrame.thread());
	}
	/**
	 * Test JDI visibleVariableByName(String).
	 */
	public void testJDIVisibleVariableByName() {
		LocalVariable var = null;
		try {
			var = fFrame.visibleVariableByName("t");
		} catch (AbsentInformationException e) {
			assertTrue("1", false);
		}
		assertEquals("2", getLocalVariable(), var);
		try {
			var = fFrame.visibleVariableByName("bogus");
		} catch (AbsentInformationException e) {
			assertTrue("3", false);
		}
		assertTrue("4", null == var);
	}
	/**
	 * Test JDI visibleVariables().
	 */
	public void testJDIVisibleVariables() {
		List vars = null;
		try {
			vars = fFrame.visibleVariables();
		} catch (AbsentInformationException e) {
			assertTrue("1", false);
		}
		assertEquals("2", 2, vars.size());

		LocalVariable var;
		int i = 0;
		do {
			var = (LocalVariable) vars.get(i++);
		} while (!var.name().equals("t"));
		assertEquals("3", getLocalVariable(), var);
	}
}
