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 com.sun.jdi.PrimitiveValue;

/**
 * Tests for JDI com.sun.jdi.PrimitiveValue.
 */
public class PrimitiveValueTest extends AbstractJDITest {

	private PrimitiveValue fBoolean,
		fByte,
		fChar,
		fDouble,
		fFloat,
		fInt,
		fLong,
		fShort;
	/**
	 * Creates a new test.
	 */
	public PrimitiveValueTest() {
		super();
	}
	/**
	 * Init the fields that are used by this test only.
	 */
	public void localSetUp() {
		// Get all kinds of prinitive values
		fBoolean = fVM.mirrorOf(true);
		fByte = fVM.mirrorOf((byte) 1);
		fChar = fVM.mirrorOf('a');
		fDouble = fVM.mirrorOf(12345.6789);
		fFloat = fVM.mirrorOf(12345.6789f);
		fInt = fVM.mirrorOf(12345);
		fLong = fVM.mirrorOf(123456789l);
		fShort = fVM.mirrorOf((short) 12345);
	}
	/**
	 * Run all tests and output to standard output.
	 */
	public static void main(java.lang.String[] args) {
		new PrimitiveValueTest().runSuite(args);
	}
	/**
	 * Gets the name of the test case.
	 */
	public String getName() {
		return "com.sun.jdi.PrimitiveValue";
	}
	/**
	 * Test JDI booleanValue().
	 */
	public void testJDIBooleanValue() {
		assertTrue("1", fBoolean.booleanValue());
		assertTrue("2", fByte.booleanValue());
		assertTrue("3", fChar.booleanValue());
		assertTrue("4", fDouble.booleanValue());
		assertTrue("5", fFloat.booleanValue());
		assertTrue("6", fInt.booleanValue());
		assertTrue("7", fLong.booleanValue());
		assertTrue("8", fShort.booleanValue());
	}
	/**
	 * Test JDI byteValue().
	 */
	public void testJDIByteValue() {
		assertEquals("1", (byte) 1, fBoolean.byteValue());
		assertEquals("2", (byte) 1, fByte.byteValue());
		assertEquals("3", (byte) 97, fChar.byteValue());
		assertEquals("4", (byte) 57, fDouble.byteValue());
		assertEquals("5", (byte) 57, fFloat.byteValue());
		assertEquals("6", (byte) 57, fInt.byteValue());
		assertEquals("7", (byte) 21, fLong.byteValue());
		assertEquals("8", (byte) 57, fShort.byteValue());
	}
	/**
	 * Test JDI charValue().
	 */
	public void testJDICharValue() {
		assertEquals("1", (char) 1, fBoolean.charValue());
		assertEquals("2", (char) 1, fByte.charValue());
		assertEquals("3", 'a', fChar.charValue());
		assertEquals("4", (char) 12345, fDouble.charValue());
		assertEquals("5", (char) 12345, fFloat.charValue());
		assertEquals("6", (char) 12345, fInt.charValue());
		assertEquals("7", (char) 52501, fLong.charValue());
		assertEquals("8", (char) 12345, fShort.charValue());
	}
	/**
	 * Test JDI doubleValue().
	 */
	public void testJDIDoubleValue() {
		assertEquals("1", 1, fBoolean.doubleValue(), 0);
		assertEquals("2", 1, fByte.doubleValue(), 0);
		assertEquals("3", 97, fChar.doubleValue(), 0);
		assertEquals("4", 12345.6789, fDouble.doubleValue(), 0);
		assertEquals("5", 12345.6789, fFloat.doubleValue(), 0.001);
		assertEquals("6", 12345, fInt.doubleValue(), 0);
		assertEquals("7", 123456789, fLong.doubleValue(), 0);
		assertEquals("8", 12345, fShort.doubleValue(), 0);
	}
	/**
	 * Test JDI floatValue().
	 */
	public void testJDIFloatValue() {
		assertEquals("1", 1, fBoolean.floatValue(), 0);
		assertEquals("2", 1, fByte.floatValue(), 0);
		assertEquals("3", 97, fChar.floatValue(), 0);
		assertEquals("4", 12345.6789f, fDouble.floatValue(), 0);
		assertEquals("5", 12345.6789f, fFloat.floatValue(), 0.001);
		assertEquals("6", 12345, fInt.floatValue(), 0);
		assertEquals("7", 123456789, fLong.floatValue(), 100);
		assertEquals("8", 12345, fShort.floatValue(), 0);
	}
	/**
	 * Test JDI intValue().
	 */
	public void testJDIIntValue() {
		assertEquals("1", 1, fBoolean.intValue());
		assertEquals("2", 1, fByte.intValue());
		assertEquals("3", 97, fChar.intValue());
		assertEquals("4", 12345, fDouble.intValue());
		assertEquals("5", 12345, fFloat.intValue());
		assertEquals("6", 12345, fInt.intValue());
		assertEquals("7", 123456789, fLong.intValue());
		assertEquals("8", 12345, fShort.intValue());
	}
	/**
	 * Test JDI longValue().
	 */
	public void testJDILongValue() {
		assertEquals("1", 1l, fBoolean.longValue());
		assertEquals("2", 1l, fByte.longValue());
		assertEquals("3", 97l, fChar.longValue());
		assertEquals("4", 12345l, fDouble.longValue());
		assertEquals("5", 12345l, fFloat.longValue());
		assertEquals("6", 12345l, fInt.longValue());
		assertEquals("7", 123456789l, fLong.longValue());
		assertEquals("8", 12345l, fShort.longValue());
	}
	/**
	 * Test JDI shortValue().
	 */
	public void testJDIShortValue() {
		assertEquals("1", 1, fBoolean.shortValue());
		assertEquals("2", 1, fByte.shortValue());
		assertEquals("3", 97, fChar.shortValue());
		assertEquals("4", 12345, fDouble.shortValue());
		assertEquals("5", 12345, fFloat.shortValue());
		assertEquals("6", 12345, fInt.shortValue());
		assertEquals("7", -13035, fLong.shortValue());
		assertEquals("8", 12345, fShort.shortValue());
	}
}
