/*******************************************************************************
 * Copyright (c) 2000, 2006 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 **/
	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);
	}
}
