/*******************************************************************************
 * 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);
	}
}
