/*******************************************************************************
 * Copyright (c) 2000, 2011 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 com.sun.jdi.AbsentInformationException;
import com.sun.jdi.ClassNotLoadedException;
import com.sun.jdi.LocalVariable;

/**
 * Tests for JDI com.sun.jdi.LocalVariable.
 */
public class LocalVariableTest extends AbstractJDITest {

	private LocalVariable fVar;
	/**
	 * Creates a new test.
	 */
	public LocalVariableTest() {
		super();
	}
	/**
	 * Init the fields that are used by this test only.
	 */
	@Override
	public void localSetUp() {
		// Wait for the program to be ready
		waitUntilReady();

		// Get local variable "t" in the frame running MainClass.run()
		fVar = getLocalVariable();
	}
	/**
	 * Run all tests and output to standard output.
	 * @param args
	 */
	public static void main(java.lang.String[] args) {
		new LocalVariableTest().runSuite(args);
	}
	/**
	 * Gets the name of the test case.
	 * @see junit.framework.TestCase#getName()
	 */
	@Override
	public String getName() {
		return "com.sun.jdi.LocalVariable";
	}
	/**
	 * Test JDI equals() and hashCode().
	 */
	public void testJDIEquality() {
		assertTrue("1", fVar.equals(fVar));
		LocalVariable other = null;
		try {
			other = getFrame(RUN_FRAME_OFFSET).visibleVariableByName("o");
		} catch (AbsentInformationException e) {
			assertTrue("2", false);
		}
		assertTrue("3", !fVar.equals(other));
		assertTrue("4", !fVar.equals(new Object()));
		assertTrue("5", !fVar.equals(null));
		assertTrue("6", fVar.hashCode() != other.hashCode());
	}
	/**
	 * Test JDI isArgument().
	 */
	public void testJDIIsArgument() {
		assertTrue("1", !fVar.isArgument());
	}
	/**
	 * Test JDI isVisible(StackFrame).
	 */
	public void testJDIIsVisible() {
		assertTrue("1", fVar.isVisible(getFrame(RUN_FRAME_OFFSET)));

		boolean gotException = false;
		try {
			fVar.isVisible(getFrame(0));
		} catch (IllegalArgumentException e) {
			gotException = true;
		}
		assertTrue("2", gotException);
	}
	/**
	 * Test JDI name().
	 */
	public void testJDIName() {
		assertEquals("1", "t", fVar.name());
	}
	/**
	 * Test JDI signature().
	 */
	public void testJDISignature() {
		assertEquals("1", "Ljava/lang/Thread;", fVar.signature());
	}
	/**
	 * Test JDI type().
	 */
	public void testJDIType() {
		try {
			assertEquals(
				"1",
				fVM.classesByName("java.lang.Thread").get(0),
				fVar.type());
		} catch (ClassNotLoadedException e) {
			assertTrue("2", false);
		}
	}
	/**
	 * Test JDI typeName().
	 */
	public void testJDITypeName() {
		assertEquals("1", "java.lang.Thread", fVar.typeName());
	}
}
