/******************************************************************************* * Copyright (c) 2000, 2009 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.ui.tests.packageview; import java.io.ByteArrayInputStream; import java.io.UnsupportedEncodingException; import java.util.Arrays; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.eclipse.jdt.testplugin.JavaProjectHelper; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceDescription; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.ui.PreferenceConstants; import org.eclipse.jdt.internal.ui.JavaPlugin; import org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart; import org.eclipse.jdt.internal.ui.util.CoreUtility; /** * Tests for the PackageExplorerContentProvider. Bugs: * <ul> * <li>66694 PackageExplorer shows elements twice</li> * <li>35851 Content of folders with illegal package name are no shown in package explorer</li> * <li>35851 Content of folders with illegal package name are no shown in package explorer</li> * <li>35851 Content of folders with illegal package name are no shown in package explorer</li> * </ul> * * @since 3.0+ */ public class ContentProviderTests5 extends TestCase{ private boolean fEnableAutoBuildAfterTesting; private ITreeContentProvider fProvider; private IJavaProject fJProject; private IFile fDotClasspath; private IFile fDotProject; private IPackageFragmentRoot jdk; public ContentProviderTests5(String name) { super(name); } public static Test suite() { return new TestSuite(ContentProviderTests5.class); } @Override protected void setUp() throws Exception { super.setUp(); IWorkspace workspace= ResourcesPlugin.getWorkspace(); assertNotNull(workspace); IWorkspaceDescription workspaceDesc= workspace.getDescription(); fEnableAutoBuildAfterTesting= workspaceDesc.isAutoBuilding(); if (fEnableAutoBuildAfterTesting) CoreUtility.setAutoBuilding(false); //create project fJProject= JavaProjectHelper.createJavaProject("TestProject", "bin"); assertNotNull(fJProject); Object[] resource = fJProject.getNonJavaResources(); for (int i = 0; i < resource.length; i++) { Object object = resource[i]; if (object instanceof IFile) { IFile file = (IFile) object; if (".classpath".equals(file.getName())) fDotClasspath = file; else if (".project".equals(file.getName())) fDotProject = file; } } assertNotNull(fDotClasspath); assertNotNull(fDotProject); //add rt.jar jdk= JavaProjectHelper.addVariableRTJar(fJProject, "JRE_LIB_TEST", null, null); assertTrue("jdk not found", jdk != null); setUpView(); } private void setUpView() throws PartInitException { IWorkbench workbench= PlatformUI.getWorkbench(); assertNotNull(workbench); IWorkbenchPage page= workbench.getActiveWorkbenchWindow().getActivePage(); assertNotNull(page); IViewPart myPart= page.showView("org.eclipse.jdt.ui.PackageExplorer"); if (myPart instanceof PackageExplorerPart) { PackageExplorerPart packageExplorerPart= (PackageExplorerPart) myPart; packageExplorerPart.setShowLibrariesNode(false); fProvider= (ITreeContentProvider) packageExplorerPart.getTreeViewer().getContentProvider(); setFolding(false); } else { assertTrue("Unable to get view", false); } assertNotNull(fProvider); } private void setFolding(boolean fold) { JavaPlugin.getDefault().getPreferenceStore().setValue(PreferenceConstants.APPEARANCE_FOLD_PACKAGES_IN_PACKAGE_EXPLORER, fold); } @Override protected void tearDown() throws Exception { super.tearDown(); JavaProjectHelper.delete(fJProject); if (fEnableAutoBuildAfterTesting) CoreUtility.setAutoBuilding(true); } private ByteArrayInputStream asInputStream(String string) throws UnsupportedEncodingException { return new ByteArrayInputStream(string.getBytes(ResourcesPlugin.getEncoding())); } public void testProjectSource1() throws Exception { //bug 35851, 66694 IPath[] inclusionFilters= {new Path("**"), new Path("excl/incl/")}; IPath[] exclusionFilters= {new Path("excl/*"), new Path("x/*.java"), new Path("y/")}; IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(fJProject, "", inclusionFilters, exclusionFilters); IPackageFragment defaultPackage= root.createPackageFragment("", true, null); IFolder ab= fJProject.getProject().getFolder("a-b"); CoreUtility.createFolder(ab, true, true, null); IFile description= ab.getFile("description.txt"); description.create(asInputStream("description"), true, null); IPackageFragment exclInclPackage= root.createPackageFragment("excl.incl", true, null); ICompilationUnit In= exclInclPackage.createCompilationUnit("In.java", "package excl.incl;\r\n" + "public class In {\r\n" + "}\r\n", true, null); IFolder excl= fJProject.getProject().getFolder("excl"); IFile Ex= excl.getFile("Ex.java"); Ex.create(asInputStream("package excl;\npublic class Ex{}"), false, null); IPackageFragment xPackage= root.createPackageFragment("x", true, null); IFolder x= fJProject.getProject().getFolder("x"); IFile xhidden= x.getFile(".hidden"); xhidden.create(asInputStream(""), true, null); IFile X= x.getFile("X.java"); X.create(asInputStream("package x;\r\npublic class X {\r\n\t\r\n}\r\n"), true, null); x.copy(new Path("y"), true, null); IFolder y= fJProject.getProject().getFolder("y"); IFile yX= y.getFile("X.java"); IFile yhidden= y.getFile(".hidden"); IPackageFragment zPackage= root.createPackageFragment("z", true, null); ICompilationUnit Z= zPackage.createCompilationUnit("Z.java", "package z;public class Z{}", true, null); assertEqualElements(new Object[] {defaultPackage, exclInclPackage, xPackage, zPackage, jdk, ab, excl, y, fDotClasspath, fDotProject}, fProvider.getChildren(fJProject)); assertEqualElements(new Object[0], fProvider.getChildren(defaultPackage)); assertEqualElements(new Object[] {In}, fProvider.getChildren(exclInclPackage)); assertEqualElements(new Object[] {Ex}, fProvider.getChildren(excl)); assertEqualElements(new Object[] {X, xhidden}, fProvider.getChildren(xPackage)); assertEquals(xPackage, fProvider.getParent(X)); assertEquals(xPackage, fProvider.getParent(xhidden)); assertEqualElements(new Object[] {Z}, fProvider.getChildren(zPackage)); assertEqualElements(new Object[] {description}, fProvider.getChildren(ab)); assertEqualElements(new Object[] {Ex}, fProvider.getChildren(excl)); assertEqualElements(new Object[] {yX, yhidden}, fProvider.getChildren(y)); } public void testNestedSource1() throws Exception { //bug 35851, 66694 // <classpathentry excluding="a-b/a/b/" kind="src" path="src"/> // <classpathentry kind="src" path="src/a-b/a/b"/> IPath[] inclusionFilters= {}; IPath[] exclusionFilters= {new Path("a-b/a/b/")}; IPackageFragmentRoot src= JavaProjectHelper.addSourceContainer(fJProject, "src", inclusionFilters, exclusionFilters); IPackageFragmentRoot srcabab= JavaProjectHelper.addSourceContainer(fJProject, "src/a-b/a/b", new IPath[0], new IPath[0]); IPackageFragment defaultSrc= src.createPackageFragment("", true, null); IPackageFragment p= src.createPackageFragment("p", true, null); IFile file= ((IFolder) p.getCorrespondingResource()).getFile("file.txt"); file.create(asInputStream("f"), true, null); IFolder ab= ((IFolder) src.getUnderlyingResource()).getFolder("a-b"); CoreUtility.createFolder(ab, true, true, null); IFolder aba= ab.getFolder("a"); CoreUtility.createFolder(aba, true, true, null); IFile abaTxt= aba.getFile("aba.txt"); abaTxt.create(asInputStream("x"), true, null); IPackageFragment defaultAbab= srcabab.createPackageFragment("", true, null); ICompilationUnit b= defaultAbab.createCompilationUnit("B.java", "public class B {}", true, null); assertEqualElements(new Object[] {src, srcabab, jdk, fDotClasspath, fDotProject}, fProvider.getChildren(fJProject)); assertEqualElements(new Object[] {defaultSrc, p, ab}, fProvider.getChildren(src)); assertEqualElements(new Object[] {}, fProvider.getChildren(defaultSrc)); assertEqualElements(new Object[] {file}, fProvider.getChildren(p)); assertEqualElements(new Object[] {aba}, fProvider.getChildren(ab)); assertEqualElements(new Object[] {abaTxt}, fProvider.getChildren(aba)); assertEqualElements(new Object[] {defaultAbab}, fProvider.getChildren(srcabab)); assertEqualElements(new Object[] {b}, fProvider.getChildren(defaultAbab)); } public void testInclExcl1() throws Exception { //bug 35851, 66694 // <classpathentry including="a/b/c/" excluding="a/b/c/d/" kind="src" path="src2"/> IPath[] inclusionFilters= {new Path("a/b/c/")}; IPath[] exclusionFilters= {new Path("a/b/c/d/")}; IPackageFragmentRoot src= JavaProjectHelper.addSourceContainer(fJProject, "src", inclusionFilters, exclusionFilters); IPackageFragment abc= src.createPackageFragment("a.b.c", true, null); ICompilationUnit x= abc.createCompilationUnit("X.java", "", true, null); IFolder d= ((IFolder) abc.getUnderlyingResource()).getFolder("d"); CoreUtility.createFolder(d, false, true, null); IFile dTxt= d.getFile("d.txt"); dTxt.create(asInputStream(""), true, null); IContainer b= d.getParent().getParent(); IContainer a= b.getParent(); assertEqualElements(new Object[] {src, jdk, fDotClasspath, fDotProject}, fProvider.getChildren(fJProject)); assertEqualElements(new Object[] {abc, a}, fProvider.getChildren(src)); assertEqualElements(new Object[] {x, d}, fProvider.getChildren(abc)); assertEqualElements(new Object[] {dTxt}, fProvider.getChildren(d)); assertEqualElements(new Object[] {b}, fProvider.getChildren(a)); } private void assertEqualElements(Object[] expected, Object[] actual) { assertEquals("array length", expected.length, actual.length); exp: for (int i= 0; i < expected.length; i++) { Object e= expected[i]; for (int j= 0; j < actual.length; j++) { Object a= actual[j]; if (e.equals(a)) continue exp; } fail("expected[" + i + "] not found in actual:" + Arrays.asList(actual).toString()); } } }