/*******************************************************************************
 * 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.Type;

/**
 * Tests for JDI com.sun.jdi.Type.
 */
public class TypeTest extends AbstractJDITest {
	private Type
		fArrayType,
		fClassType,
		fInterfaceType,
		// primitive types
		fShortType,
		fByteType,
		fIntegerType,
		fLongType,
		fFloatType,
		fDoubleType,
		fCharType,
		fBooleanType,
		// One-dimensional primitive arrays
		fByteArrayType,
		fShortArrayType,
		fIntArrayType,
		fLongArrayType,
		fFloatArrayType,
		fDoubleArrayType,
		fCharArrayType,
		fBooleanArrayType,
		// Two-dimensional primitive arrays
		fByteDoubleArrayType,
		fShortDoubleArrayType,
		fIntDoubleArrayType,
		fLongDoubleArrayType,
		fFloatDoubleArrayType,
		fDoubleDoubleArrayType,
		fCharDoubleArrayType,
		fBooleanDoubleArrayType;

	/**
	 * Creates a new test.
	 */
	public TypeTest() {
		super();
	}
	/**
	 * Init the fields that are used by this test only.
	 */
	@Override
	public void localSetUp() {
		// Get reference types
		fArrayType = getArrayType();
		fClassType = getMainClass();
		fInterfaceType = getInterfaceType();
		// Get primitive types
		fBooleanType = (fVM.mirrorOf(true).type());
		fByteType = (fVM.mirrorOf((byte) 1).type());
		fCharType = (fVM.mirrorOf('a').type());
		fDoubleType = (fVM.mirrorOf(12345.6789).type());
		fFloatType = (fVM.mirrorOf(12345.6789f).type());
		fIntegerType = (fVM.mirrorOf(12345).type());
		fLongType = (fVM.mirrorOf(123456789l).type());
		fShortType = (fVM.mirrorOf((short) 12345).type());
		// Get one-dimensional primitive arrays
		fByteArrayType = getByteArrayType();
		fShortArrayType = getShortArrayType();
		fIntArrayType = getIntArrayType();
		fLongArrayType = getLongArrayType();
		fFloatArrayType = getFloatArrayType();
		fDoubleArrayType = getDoubleArrayType();
		fCharArrayType = getCharArrayType();
		fBooleanArrayType = getBooleanArrayType();
		//  Get two-dimensional primitive arrays
		fByteDoubleArrayType = getByteDoubleArrayType();
		fShortDoubleArrayType = getShortDoubleArrayType();
		fIntDoubleArrayType = getIntDoubleArrayType();
		fLongDoubleArrayType = getLongDoubleArrayType();
		fFloatDoubleArrayType = getFloatDoubleArrayType();
		fDoubleDoubleArrayType = getDoubleDoubleArrayType();
		fCharDoubleArrayType = getCharDoubleArrayType();
		fBooleanDoubleArrayType = getBooleanDoubleArrayType();

	}
	/**
	 * Run all tests and output to standard output.
	 * @param args
	 */
	public static void main(java.lang.String[] args) {
		new TypeTest().runSuite(args);
	}
	/**
	 * Gets the name of the test case.
	 * @see junit.framework.TestCase#getName()
	 */
	@Override
	public String getName() {
		return "com.sun.jdi.Type";
	}
	/**
	 * Test JDI signature().
	 */
	public void testJDISignature() {
		assertEquals("1", "[Ljava/lang/String;", fArrayType.signature());
		assertEquals("2", "Lorg/eclipse/debug/jdi/tests/program/MainClass;", fClassType.signature());
		assertEquals("3", "Lorg/eclipse/debug/jdi/tests/program/Printable;", fInterfaceType.signature());
		// Primitive types
		assertEquals("4", "S", fShortType.signature());
		assertEquals("5", "B", fByteType.signature());
		assertEquals("6", "I", fIntegerType.signature());
		assertEquals("7", "J", fLongType.signature());
		assertEquals("8", "F", fFloatType.signature());
		assertEquals("9", "D", fDoubleType.signature());
		assertEquals("10", "C", fCharType.signature());
		assertEquals("11", "Z", fBooleanType.signature());
		// One-dimensional primitive arrays
		assertEquals("12", "[B", fByteArrayType.signature());
		assertEquals("13", "[S", fShortArrayType.signature());
		assertEquals("14", "[I", fIntArrayType.signature());
		assertEquals("15", "[J", fLongArrayType.signature());
		assertEquals("16", "[F", fFloatArrayType.signature());
		assertEquals("17", "[D", fDoubleArrayType.signature());
		assertEquals("18", "[C", fCharArrayType.signature());
		assertEquals("19", "[Z", fBooleanArrayType.signature());
		// Two-dimensional primitive arrays
		assertEquals("20", "[[B", fByteDoubleArrayType.signature());
		assertEquals("21", "[[S", fShortDoubleArrayType.signature());
		assertEquals("22", "[[I", fIntDoubleArrayType.signature());
		assertEquals("23", "[[J", fLongDoubleArrayType.signature());
		assertEquals("24", "[[F", fFloatDoubleArrayType.signature());
		assertEquals("25", "[[D", fDoubleDoubleArrayType.signature());
		assertEquals("26", "[[C", fCharDoubleArrayType.signature());
		assertEquals("27", "[[Z", fBooleanDoubleArrayType.signature());
	}
	/**
	 * Test JDI typeName().
	 */
	public void testJDITypeName() {
		assertEquals("1", "java.lang.String[]", fArrayType.name());
		assertEquals("2", "org.eclipse.debug.jdi.tests.program.MainClass", fClassType.name());
		assertEquals("3", "org.eclipse.debug.jdi.tests.program.Printable", fInterfaceType.name());
		// Primitive types
		assertEquals("4", "byte", fByteType.name());
		assertEquals("5", "short", fShortType.name());
		assertEquals("6", "int", fIntegerType.name());
		assertEquals("7", "long", fLongType.name());
		assertEquals("8", "float", fFloatType.name());
		assertEquals("9", "double", fDoubleType.name());
		assertEquals("10", "char", fCharType.name());
		assertEquals("11", "boolean", fBooleanType.name());
		// One-dimensional primitive arrays
		assertEquals("12", "byte[]", fByteArrayType.name());
		assertEquals("13", "short[]", fShortArrayType.name());
		assertEquals("14", "int[]", fIntArrayType.name());
		assertEquals("15", "long[]", fLongArrayType.name());
		assertEquals("16", "float[]", fFloatArrayType.name());
		assertEquals("17", "double[]", fDoubleArrayType.name());
		assertEquals("18", "char[]", fCharArrayType.name());
		assertEquals("19", "boolean[]", fBooleanArrayType.name());
		// Two-dimensional primitive arrays
		assertEquals("20", "byte[][]", fByteDoubleArrayType.name());
		assertEquals("21", "short[][]", fShortDoubleArrayType.name());
		assertEquals("22", "int[][]", fIntDoubleArrayType.name());
		assertEquals("23", "long[][]", fLongDoubleArrayType.name());
		assertEquals("24", "float[][]", fFloatDoubleArrayType.name());
		assertEquals("25", "double[][]", fDoubleDoubleArrayType.name());
		assertEquals("26", "char[][]", fCharDoubleArrayType.name());
		assertEquals("27", "boolean[][]", fBooleanDoubleArrayType.name());
	}
}
