/*******************************************************************************
 * Copyright (c) 2000, 2005 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.Iterator;
import java.util.List;

import com.sun.jdi.ClassType;
import com.sun.jdi.InterfaceType;
import com.sun.jdi.Method;

/**
 * Tests for JDI com.sun.jdi.InterfaceType
 * and JDWP Interface command set.
 */
public class InterfaceTypeTest extends AbstractJDITest {

	private InterfaceType fType;
	/**
	 * Creates a new test.
	 */
	public InterfaceTypeTest() {
		super();
	}
	/**
	 * Init the fields that are used by this test only.
	 */
	public void localSetUp() {
		// Get interface type "org.eclipse.debug.jdi.tests.program.Printable"
		fType = getInterfaceType();
	}
	/**
	 * Run all tests and output to standard output.
	 * @param args
	 */
	public static void main(java.lang.String[] args) {
		new InterfaceTypeTest().runSuite(args);
	}
	/**
	 * Gets the name of the test case.
	 * @see junit.framework.TestCase#getName()
	 */
	public String getName() {
		return "com.sun.jdi.InterfaceType";
	}
	/**
	 * Test JDI allFields().
	 */
	public void testJDIAllFields() {
		assertEquals("1", 1, fType.allFields().size());
	}
	/**
	 * Test JDI allMethods().
	 */
	public void testJDIAllMethods() {
		boolean found = false;
		Iterator it = fType.allMethods().iterator();
		while (it.hasNext()) {
			Method mth = (Method) it.next();
			if (mth.name().equals("print")) {
				found = true;
			}
		}
		assertTrue("1", fType.allMethods().size() == 1);
		assertTrue("2", found);
	}
	/**
	 * Test JDI implementors().
	 */
	public void testJDIImplementors() {
		List implementors = fType.implementors();
		assertEquals("1", 1, implementors.size());
		ClassType implementor = (ClassType) implementors.get(0);
		assertEquals("2", getMainClass(), implementor);
	}
	/**
	 * Test JDI subinterfaces().
	 */
	public void testJDISubinterfaces() {
		List subinterfaces = fType.subinterfaces();
		assertEquals("1", 0, subinterfaces.size());
	}
	/**
	 * Test JDI superinterfaces().
	 */
	public void testJDISuperinterfaces() {
		List superinterfaces = fType.superinterfaces();
		assertEquals("1", 1, superinterfaces.size());
		InterfaceType superinterface = (InterfaceType) superinterfaces.get(0);
		InterfaceType expected =
			(InterfaceType) fVM.classesByName("java.lang.Cloneable").get(0);
		assertEquals("2", expected, superinterface);
	}
}
