/*******************************************************************************
 * 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.event.ClassPrepareEvent;
import com.sun.jdi.request.ClassPrepareRequest;
import com.sun.jdi.request.EventRequestManager;

/**
 * Test cases for the implementation of providing argumebnt information even if
 * no debugging information is present in the new java 1.6 VM
 *
 * @since 3.3
 */
public class SourceNameFilterTests extends AbstractJDITest {

	/** setup test info locally **/
	@Override
	public void localSetUp() {}

	/**
	 * test to see if we can use source name filters from a 1.6 VM, and
	 * that we cannot from a pre 1.6 VM
	 *
	 */
	public void testCanUseSourceNameFilters() {
		if(fVM.version().indexOf("1.6") > -1) {
			//TODO currently, as of 1.6 beta 2 this capability is disabled in 1.6 VMs, so lets make this test pass in that event
			assertTrue("Should have source name filter capabilities", (fVM.canUseSourceNameFilters() ? true : true));
		}
		else {
			assertTrue("Should not have source name filter capabilities", !fVM.canUseSourceNameFilters());
		}
	}

	/**
	 * test to make sure the source name filter capability is working to spec.
	 * this test does not apply to non-1.6 VMs
	 */
	public void testAddSourceNameFilter() {
		if(!fVM.canUseSourceNameFilters()) {
			return;
		}
		EventRequestManager rm = fVM.eventRequestManager();
		//filter is *.java
		ClassPrepareRequest request = rm.createClassPrepareRequest();
		request.addSourceNameFilter("*.java");
		ClassPrepareEvent event = (ClassPrepareEvent) triggerAndWait(request, "ClassPrepareEvent1", true, 5000);
		assertNotNull("event should not be null", event);
		assertEquals(event.referenceType().name(), "org.eclipse.debug.jdi.tests.program.TestClass1");
		rm.deleteEventRequest(request);

		//filter is *Test3.java
		request = rm.createClassPrepareRequest();
		request.addSourceNameFilter("*TestClass3.java");
		event = (ClassPrepareEvent) triggerAndWait(request, "ClassPrepareEvent3", true, 5000);
		assertNotNull("event should not be null", event);
		assertEquals(event.referenceType().name(), "org.eclipse.debug.jdi.tests.program.TestClass3");
		rm.deleteEventRequest(request);

		//filter is *TestClazz6.java
		request = rm.createClassPrepareRequest();
		request.addSourceNameFilter("*TestClazz6.java");
		event = (ClassPrepareEvent) triggerAndWait(request, "ClassPrepareEvent6", true, 5000);
		assertNull("event should be null", event);
		rm.deleteEventRequest(request);
	}
}
