/*******************************************************************************
 * Copyright (c) 2000, 2015 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.jdt.core.tests.builder;

import junit.framework.Test;

import org.eclipse.jdt.internal.compiler.util.SimpleLookupTable;
import org.eclipse.jdt.internal.core.JavaModelManager;
import org.eclipse.jdt.internal.core.builder.ReferenceCollection;
import org.eclipse.jdt.internal.core.builder.State;
import org.eclipse.jdt.internal.core.builder.StringSet;

@SuppressWarnings({"rawtypes", "unchecked"})
public class FriendDependencyTests extends BuilderTests {

	public FriendDependencyTests(String name) {
		super(name);
	}

	public static Test suite() {
		return buildTestSuite(FriendDependencyTests.class);
	}
// this is a compilation only test to verify that this method still exists since API Tooling is using it
public void testIncludes() {
	try {
		State state = (State) JavaModelManager.getJavaModelManager().getLastBuiltState(null, null);
		SimpleLookupTable references = state.getReferences();
		ReferenceCollection r = (ReferenceCollection) references.valueTable[0];
		char[][][] qualifiedNames = null;
		char[][] simpleNames = null;
		char[][] rootNames = null;
		r.includes(qualifiedNames, simpleNames, rootNames);
	} catch (NullPointerException e) {
		// expected
	}
}

// this is a compilation only test to verify that this method still exists since API Tooling is using it
public void testInternSimpleNames() {
	ReferenceCollection.internSimpleNames(new StringSet(1), true);

	try {
		String className = "org.eclipse.jdt.internal.core.builder.ReferenceCollection";
		Class clazz = Class.forName(className);
		//org.eclipse.jdt.internal.core.JavaModelManager.getLastBuiltState(IProject, IProgressMonitor)
		Class[] arguments = new Class[2];
		String argumentClassName = "org.eclipse.jdt.internal.core.builder.StringSet";
		arguments[0] = Class.forName(argumentClassName);
		arguments[1] = Boolean.TYPE;
		clazz.getDeclaredMethod("internSimpleNames", arguments);
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (SecurityException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (NoSuchMethodException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (IllegalArgumentException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	}
}

//this is a compilation only test to verify that this method still exists since API Tooling is using it
public void testInternQualifiedNames() {
	ReferenceCollection.internQualifiedNames(new StringSet(1));

	try {
		String className = "org.eclipse.jdt.internal.core.builder.ReferenceCollection";
		Class clazz = Class.forName(className);
		//org.eclipse.jdt.internal.core.JavaModelManager.getLastBuiltState(IProject, IProgressMonitor)
		Class[] arguments = new Class[1];
		String argumentClassName = "org.eclipse.jdt.internal.core.builder.StringSet";
		arguments[0] = Class.forName(argumentClassName);
		clazz.getDeclaredMethod("internQualifiedNames", arguments);
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (SecurityException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (NoSuchMethodException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (IllegalArgumentException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	}
}
//this is a compilation only test to verify that this method still exists since API Tooling is using it
public void testGetReferences() {
	try {
		State state = (State) JavaModelManager.getJavaModelManager().getLastBuiltState(null, null);
		state.getReferences();
	} catch (NullPointerException e) {
		// expected
	}
	try {
		String className = "org.eclipse.jdt.internal.core.builder.State";
		Class clazz = Class.forName(className);
		clazz.getDeclaredMethod("getReferences", new Class[0]);
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (SecurityException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (NoSuchMethodException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (IllegalArgumentException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	}
}
//this is a compilation only test to verify that this method still exists since API Tooling is using it
public void testStringSetAdd() {
	StringSet s = new StringSet(3);
	s.add("");

	try {
		String className = "org.eclipse.jdt.internal.core.builder.StringSet";
		Class clazz = Class.forName(className);
		Class[] arguments = new Class[1];
		String argumentClassName = "java.lang.String";
		arguments[0] = Class.forName(argumentClassName);
		clazz.getDeclaredMethod("add", arguments);
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (SecurityException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (NoSuchMethodException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (IllegalArgumentException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	}
}
//this is a compilation only test to verify that this method still exists since API Tooling is using it
public void testStringSetclear() {
	StringSet s = new StringSet(3);
	s.clear();

	try {
		String className = "org.eclipse.jdt.internal.core.builder.StringSet";
		Class clazz = Class.forName(className);
		clazz.getDeclaredMethod("clear", new Class[0]);
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (SecurityException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (NoSuchMethodException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (IllegalArgumentException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	}
}
//this is a compilation only test to verify that this method still exists since API Tooling is using it
public void testStringSetNew() {
	new StringSet(3);

	try {
		String className = "org.eclipse.jdt.internal.core.builder.StringSet";
		Class clazz = Class.forName(className);
		Class[] arguments = new Class[1];
		arguments[0] = Integer.TYPE;
		clazz.getDeclaredConstructor(arguments);
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (SecurityException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (NoSuchMethodException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (IllegalArgumentException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	}
}
//this is a compilation only test to verify that this field still exists since API Tooling is using it
public void testStringSetElementSize() {
	StringSet s = new StringSet(3);
	assertEquals("Not expected", 0, s.elementSize);

	try {
		String className = "org.eclipse.jdt.internal.core.builder.StringSet";
		Class clazz = Class.forName(className);
		clazz.getDeclaredField("elementSize");
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (SecurityException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (NoSuchFieldException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (IllegalArgumentException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	}
}
//this is a compilation only test to verify that this field still exists since API Tooling is using it
public void testSimpleLookupTableKeyTable() {
	SimpleLookupTable t = new SimpleLookupTable(3);
	assertNotNull("Null", t.keyTable);

	try {
		String className = "org.eclipse.jdt.internal.compiler.util.SimpleLookupTable";
		Class clazz = Class.forName(className);
		clazz.getDeclaredField("keyTable");
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (SecurityException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (NoSuchFieldException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (IllegalArgumentException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	}
}
//this is a compilation only test to verify that this field still exists since API Tooling is using it
public void testSimpleLookupTableValueTable() {
	SimpleLookupTable t = new SimpleLookupTable(3);
	assertNotNull("Null", t.valueTable);

	try {
		String className = "org.eclipse.jdt.internal.compiler.util.SimpleLookupTable";
		Class clazz = Class.forName(className);
		clazz.getDeclaredField("valueTable");
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (SecurityException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (NoSuchFieldException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (IllegalArgumentException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	}
}
//this is a compilation only test to verify that this method still exists since API Tooling is using it
public void testJavaModelManagerGetJavaModelManager() {
	JavaModelManager.getJavaModelManager();
	try {
		String className = "org.eclipse.jdt.internal.core.JavaModelManager";
		Class clazz = Class.forName(className);
		clazz.getDeclaredMethod("getJavaModelManager", new Class[0]);
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (SecurityException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (NoSuchMethodException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (IllegalArgumentException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	}
}
//this is a compilation only test to verify that this method still exists since API Tooling is using it
public void testJavaModelManagerGetLastBuiltState() {
	try {
		JavaModelManager.getJavaModelManager().getLastBuiltState(null, null);
	} catch (NullPointerException e) {
		// expected
	}
	try {
		String className = "org.eclipse.jdt.internal.core.JavaModelManager";
		Class clazz = Class.forName(className);
		//org.eclipse.jdt.internal.core.JavaModelManager.getLastBuiltState(IProject, IProgressMonitor)
		Class[] arguments = new Class[2];
		String argumentClassName = "org.eclipse.core.resources.IProject";
		String argumentClassName2 = "org.eclipse.core.runtime.IProgressMonitor";
		arguments[0] = Class.forName(argumentClassName);
		arguments[1] = Class.forName(argumentClassName2);
		clazz.getDeclaredMethod("getLastBuiltState", arguments);
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (SecurityException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (NoSuchMethodException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	} catch (IllegalArgumentException e) {
		e.printStackTrace();
		assertTrue("Should be there", false);
	}
}
}
