/*******************************************************************************
 * Copyright (c) 2000, 2012 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.ClassLoaderReference;
import com.sun.jdi.ReferenceType;

/**
 * Tests for JDI com.sun.jdi.ClassLoaderReference.
 */
public class ClassLoaderReferenceTest extends AbstractJDITest {

	private ClassLoaderReference fClassLoader;
	/**
	 * Creates a new test.
	 */
	public ClassLoaderReferenceTest() {
		super();
	}
	/**
	 * Init the fields that are used by this test only.
	 */
	@Override
	public void localSetUp() {
		// Get the class loader of org.eclipse.debug.jdi.tests.program.MainClass
		fClassLoader = getClassLoaderReference();
	}
	/**
	 * Run all tests and output to standard output.
	 * @param args
	 */
	public static void main(java.lang.String[] args) {
		new ClassLoaderReferenceTest().runSuite(args);
	}
	/**
	 * Gets the name of the test case.
	 * @see junit.framework.TestCase#getName()
	 */
	@Override
	public String getName() {
		return "com.sun.jdi.ClassLoaderReference";
	}
	/**
	 * Test JDI definedClasses().
	 */
	public void testJDIDefinedClasses() {
		Iterator<?> defined = fClassLoader.definedClasses().iterator();
		int i = 0;
		while (defined.hasNext())
			assertTrue(
				Integer.toString(i++),
				defined.next() instanceof ReferenceType);
	}
	/**
	 * Test JDI visibleClasses().
	 */
	public void testJDIVisibleClasses() {
		List<?> visible = fClassLoader.visibleClasses();
		Iterator<?> defined = fClassLoader.definedClasses().iterator();
		while (defined.hasNext()) {
			ReferenceType next = (ReferenceType) defined.next();
			assertTrue(next.name(), visible.contains(next));
		}
	}
}
