1 /*******************************************************************************
2  * Copyright (c) 2000, 2020 IBM Corporation and others.
3  *
4  * This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License 2.0
6  * which accompanies this distribution, and is available at
7  * https://www.eclipse.org/legal/epl-2.0/
8  *
9  * SPDX-License-Identifier: EPL-2.0
10  *
11  * Contributors:
12  *     IBM Corporation - initial API and implementation
13  *******************************************************************************/
14 package org.eclipse.jdt.ui.tests.packageview;
15 
16 import static org.junit.Assert.assertEquals;
17 import static org.junit.Assert.assertNotNull;
18 import static org.junit.Assert.assertSame;
19 import static org.junit.Assert.assertTrue;
20 import static org.junit.Assert.fail;
21 
22 import java.io.File;
23 
24 import org.junit.After;
25 import org.junit.Before;
26 import org.junit.Test;
27 import org.junit.runner.RunWith;
28 import org.junit.runners.JUnit4;
29 
30 import org.eclipse.jdt.testplugin.JavaProjectHelper;
31 import org.eclipse.jdt.testplugin.JavaTestPlugin;
32 
33 import org.eclipse.core.runtime.Path;
34 
35 import org.eclipse.core.resources.IFile;
36 import org.eclipse.core.resources.IResource;
37 import org.eclipse.core.resources.IWorkspace;
38 import org.eclipse.core.resources.IWorkspaceDescription;
39 import org.eclipse.core.resources.ResourcesPlugin;
40 
41 import org.eclipse.jface.viewers.ITreeContentProvider;
42 
43 import org.eclipse.ui.IViewPart;
44 import org.eclipse.ui.IWorkbench;
45 import org.eclipse.ui.IWorkbenchPage;
46 import org.eclipse.ui.PlatformUI;
47 
48 import org.eclipse.jdt.core.IClassFile;
49 import org.eclipse.jdt.core.ICompilationUnit;
50 import org.eclipse.jdt.core.IJavaElement;
51 import org.eclipse.jdt.core.IJavaProject;
52 import org.eclipse.jdt.core.IPackageFragment;
53 import org.eclipse.jdt.core.IPackageFragmentRoot;
54 
55 import org.eclipse.jdt.internal.ui.util.CoreUtility;
56 
57 
58 /**
59  * Tests for the PackageExplorerContentProvider.
60  *
61  * @since 2.1
62  */
63 @RunWith(JUnit4.class)
64 public class ContentProviderTests4{
65 
66 	private IPackageFragmentRoot fRoot1;
67 	private IPackageFragment fPack1;
68 	private IPackageFragment fPack2;
69 	private IPackageFragment fPack4;
70 	private IPackageFragment fPack3;
71 	private IWorkspace fWorkspace;
72 	private IWorkbench fWorkbench;
73 	private MockPluginView fMyPart;
74 
75 	private ITreeContentProvider fProvider;
76 
77 	private IPackageFragment fPack5;
78 	private IJavaProject fJProject3;
79 	private IPackageFragment fPack6;
80 	private IPackageFragmentRoot fInternalRoot1;
81 	private IPackageFragment fA;
82 	private IPackageFragment fX;
83 	private IPackageFragment fC;
84 	private IPackageFragment fD;
85 	private IPackageFragment fY;
86 	private IPackageFragment fDefaultPackage;
87 	private ICompilationUnit fCU1;
88 	private ICompilationUnit fCU2;
89 	private IClassFile fYClassFile;
90 
91 	private IPackageFragmentRoot jdk;
92 	private IFile fFile1;
93 	private IFile fFile2;
94 	private IClassFile fAClassFile;
95 
96 	private IWorkbenchPage page;
97 	private ICompilationUnit fCUinDefault;
98 	private File myInternalLibJar;
99 	private boolean fEnableAutoBuildAfterTesting;
100 
101 	@Test
testGetChildrenProject()102 	public void testGetChildrenProject() throws Exception{
103 		Object[] expectedChildren= new Object[]{fPack1, fPack2, fPack3, fDefaultPackage, fFile1, fFile2,fInternalRoot1,jdk};
104 		Object[] children= fProvider.getChildren(fJProject3);
105 		assertTrue("Wrong children found for project with folding", compareArrays(children, expectedChildren)); //$NON-NLS-1$
106 	}
107 
108 	@Test
testGetChildrenDefaultProject()109 	public void testGetChildrenDefaultProject(){
110 		Object[] expectedChildren= new Object[]{fCUinDefault};
111 		Object[] children= fProvider.getChildren(fDefaultPackage);
112 		assertTrue("Wrong children found for default package with folding", compareArrays(children, expectedChildren));	 //$NON-NLS-1$
113 	}
114 
115 	@Test
testGetChildrentMidLevelFragment()116 	public void testGetChildrentMidLevelFragment() throws Exception{
117 		Object[] expectedChildren= new Object[]{fPack4, fPack6};
118 		Object[] children= fProvider.getChildren(fPack3);
119 		assertTrue("Wrong children found for PackageFragment with folding",compareArrays(children, expectedChildren)); //$NON-NLS-1$
120 	}
121 
122 	@Test
testGetChildrenBottomLevelFragment()123 	public void testGetChildrenBottomLevelFragment() throws Exception{
124 		Object[] expectedChildren= new Object[]{};
125 		Object[] children= fProvider.getChildren(fPack1);
126 		assertTrue("Wrong children found for PackageFragment with folding",compareArrays(children, expectedChildren)); //$NON-NLS-1$
127 	}
128 
129 	@Test
testGetChildrenBottomLevelFragmentWithCU()130 	public void testGetChildrenBottomLevelFragmentWithCU() throws Exception{
131 		Object[] expectedChildren= new Object[]{fCU1};
132 		Object[] children= fProvider.getChildren(fPack2);
133 		assertTrue("Wrong children found for PackageFragment with folding",compareArrays(children, expectedChildren)); //$NON-NLS-1$
134 	}
135 
136 	@Test
testGetChildrenBottomLevelFragmenWithCU2()137 	public void testGetChildrenBottomLevelFragmenWithCU2() throws Exception{
138 		Object[] expectedChildren= new Object[]{fCU2};
139 		Object[] children= fProvider.getChildren(fPack6);
140 		assertTrue("Wrong children found for PackageFragment with folding",compareArrays(children, expectedChildren)); //$NON-NLS-1$
141 	}
142 
143 	@Test
testGetChildrenMidLevelFragmentInInternalArchive()144 	public void testGetChildrenMidLevelFragmentInInternalArchive() throws Exception{
145 		Object[] expectedChildren= new Object[]{fC, fD, fAClassFile};
146 		Object[] children= fProvider.getChildren(fA);
147 		assertTrue("wrong children found for a NON bottom PackageFragment in PackageFragmentRoot Internal Archive with folding", compareArrays(children, expectedChildren)); //$NON-NLS-1$
148 	}
149 
150 	@Test
testGetChildrenBottomLevelFragmentInInternalArchive()151 	public void testGetChildrenBottomLevelFragmentInInternalArchive() throws Exception{
152 		Object[] expectedChildren= new Object[]{fYClassFile};
153 		Object[] children= fProvider.getChildren(fY);
154 		assertTrue("wrong children found for a bottom PackageFragment in PackageFragmentRoot Internal Archive with folding", compareArrays(children, expectedChildren));	 //$NON-NLS-1$
155 	}
156 
getChildrenInternalArchive()157 	public void getChildrenInternalArchive() throws Exception{
158 		Object[] expectedChildren= new Object[]{fX,fA, fInternalRoot1.getPackageFragment("")}; //$NON-NLS-1$
159 		Object[] children= fProvider.getChildren(fInternalRoot1);
160 		assertTrue("Wrong child found for PackageFragmentRoot Internal Archive with folding", compareArrays(children,expectedChildren)); //$NON-NLS-1$
161 	}
162 
163 	//---------------Get Parent Tests-----------------------------
164 
165 	@Test
testGetParentArchive()166 	public void testGetParentArchive() throws Exception{
167 		Object parent= fProvider.getParent(fInternalRoot1);
168 		assertSame("Wrong parent found for PackageFragmentRoot Archive with folding", parent, fJProject3);//$NON-NLS-1$
169 	}
170 
171 	@Test
testGetParentMidLevelFragmentInArchive()172 	public void testGetParentMidLevelFragmentInArchive() throws Exception{
173 		Object expectedParent= fA;
174 		Object parent= fProvider.getParent(fC);
175 		assertEquals("Wrong parent found for a NON top level PackageFragment in an Archive with folding", expectedParent, parent);//$NON-NLS-1$
176 	}
177 
178 	@Test
testGetParentTopLevelFragmentInArchive()179 	public void testGetParentTopLevelFragmentInArchive() throws Exception{
180 		Object expectedParent= fInternalRoot1;
181 		Object parent= fProvider.getParent(fA);
182 		assertEquals("Wrong parent found for a top level PackageFragment in an Archive with folding", expectedParent, parent);	//$NON-NLS-1$
183 	}
184 
185 	@Test
testGetParentTopLevelFragment()186 	public void testGetParentTopLevelFragment() throws Exception{
187 		Object expectedParent= fJProject3;
188 		Object parent= fProvider.getParent(fPack3);
189 		assertEquals("Wrong parent found for a top level PackageFragment with folding", expectedParent, parent);//$NON-NLS-1$
190 	}
191 
192 	@Test
testGetParentMidLevelFragment()193 	public void testGetParentMidLevelFragment() throws Exception{
194 		Object expectedParent= fPack3;
195 		Object parent= fProvider.getParent(fPack6);
196 		assertEquals("Wrong parent found for a NON top level PackageFragment with folding", expectedParent, parent);//$NON-NLS-1$
197 	}
198 
199 	@Test
testGetParentMidLevelFragment2()200 	public void testGetParentMidLevelFragment2() throws Exception{
201 		Object expectedParent= fPack3;
202 		Object parent= fProvider.getParent(fPack5);
203 		assertEquals("Wrong parent found for a NON top level PackageFragment with folding", expectedParent, parent);//$NON-NLS-1$
204 	}
205 
206 
207 	//-------------------Set up methods--------------------------------
208 	@Before
setUp()209 	public void setUp() throws Exception {
210 		fWorkspace= ResourcesPlugin.getWorkspace();
211 		assertNotNull(fWorkspace);
212 		IWorkspaceDescription workspaceDesc= fWorkspace.getDescription();
213 		fEnableAutoBuildAfterTesting= workspaceDesc.isAutoBuilding();
214 		if (fEnableAutoBuildAfterTesting)
215 			CoreUtility.setAutoBuilding(false);
216 
217 		//create project
218 		fJProject3 = JavaProjectHelper.createJavaProject("TestProject3", "bin");//$NON-NLS-1$//$NON-NLS-2$
219 		assertNotNull("project3 null", fJProject3);//$NON-NLS-1$
220 
221 		for (Object object : fJProject3.getNonJavaResources()) {
222 			if (object instanceof IFile) {
223 				IFile file = (IFile) object;
224 				if (".classpath".equals(file.getName()))//$NON-NLS-1$
225 					fFile1 = file;
226 				else if (".project".equals(file.getName()))//$NON-NLS-1$
227 					fFile2 = file;
228 			}
229 		}
230 		assertNotNull(fFile1);
231 		assertNotNull(fFile2);
232 
233 		//add rt.jar
234 		jdk= JavaProjectHelper.addVariableRTJar(fJProject3, "JRE_LIB_TEST", null, null);//$NON-NLS-1$
235 		assertNotNull("jdk not found", jdk);//$NON-NLS-1$
236 
237 		//create the PackageFragmentRoot that represents the project as source folder
238 		fRoot1= JavaProjectHelper.addSourceContainer(fJProject3, "");//$NON-NLS-1$
239 		assertNotNull("getting default package", fRoot1);//$NON-NLS-1$
240 
241 		fDefaultPackage= fRoot1.createPackageFragment("",true,null);//$NON-NLS-1$
242 		fCUinDefault= fDefaultPackage.createCompilationUnit("Object.java","",true, null);//$NON-NLS-1$//$NON-NLS-2$
243 
244 		//set up project #3: file system structure with project as source folder
245 		//add an internal jar
246 		myInternalLibJar = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/myinternallib.jar"));//$NON-NLS-1$
247 		assertNotNull("lib not found", myInternalLibJar); //$NON-NLS-1$
248 		assertTrue("lib not found", myInternalLibJar.exists()); //$NON-NLS-1$
249 		fInternalRoot1= JavaProjectHelper.addLibraryWithImport(fJProject3, Path.fromOSString(myInternalLibJar.getPath()), null, null);
250 
251 		//create internal PackageFragments
252 		fA= fInternalRoot1.getPackageFragment("a");//$NON-NLS-1$
253 		fX= fInternalRoot1.getPackageFragment("x");//$NON-NLS-1$
254 		fInternalRoot1.getPackageFragment("a.b");//$NON-NLS-1$
255 		fC= fInternalRoot1.getPackageFragment("a.b.c");//$NON-NLS-1$
256 		fD= fInternalRoot1.getPackageFragment("a.d");//$NON-NLS-1$
257 		fY= fInternalRoot1.getPackageFragment("x.y");//$NON-NLS-1$
258 
259 		fYClassFile= fY.getClassFile("Y.class");//$NON-NLS-1$
260 		fAClassFile= fA.getClassFile("A.class");//$NON-NLS-1$
261 
262 		//create PackageFragments
263 		fPack1= fRoot1.createPackageFragment("pack1", true, null);//$NON-NLS-1$
264 		fPack2= fRoot1.createPackageFragment("pack2", true, null);//$NON-NLS-1$
265 		fPack3= fRoot1.createPackageFragment("pack3",true,null);//$NON-NLS-1$
266 		fPack4= fRoot1.createPackageFragment("pack3.pack4", true,null);//$NON-NLS-1$
267 		fPack5= fRoot1.createPackageFragment("pack3.pack5",true,null);//$NON-NLS-1$
268 		fPack6= fRoot1.createPackageFragment("pack3.pack5.pack6", true, null);//$NON-NLS-1$
269 
270 		fCU1= fPack2.createCompilationUnit("Object.java", "", true, null);//$NON-NLS-1$//$NON-NLS-2$
271 		fCU2= fPack6.createCompilationUnit("Object.java","", true, null);//$NON-NLS-1$//$NON-NLS-2$
272 
273 		//set up the mock view
274 		setUpMockView();
275 	}
276 
setUpMockView()277 	public void setUpMockView() throws Exception {
278 //		fWorkspace = ResourcesPlugin.getWorkspace();
279 //		assertNotNull(fWorkspace);
280 
281 		fWorkbench = PlatformUI.getWorkbench();
282 		assertNotNull(fWorkbench);
283 
284 		page = fWorkbench.getActiveWorkbenchWindow().getActivePage();
285 		assertNotNull(page);
286 
287 		//just testing to make sure my part can be created
288 		IViewPart myPart = new MockPluginView();
289 		assertNotNull(myPart);
290 
291 		myPart = page.showView("org.eclipse.jdt.ui.tests.packageview.MockPluginView");//$NON-NLS-1$
292 		if (myPart instanceof MockPluginView) {
293 			fMyPart = (MockPluginView) myPart;
294 			fMyPart.setFolding(true);
295 			fMyPart.setFlatLayout(false);
296 			// above call might cause a property change event being sent
297 			fMyPart.clear();
298 			fProvider = (ITreeContentProvider) fMyPart.getTreeViewer().getContentProvider();
299 		} else
300 			fail("Unable to get view");//$NON-NLS-1$
301 
302 		assertNotNull(fProvider);
303 	}
304 
305 	@After
tearDown()306 	public void tearDown() throws Exception {
307 
308 		fInternalRoot1.close();
309 		JavaProjectHelper.delete(fJProject3);
310 		page.hideView(fMyPart);
311 
312 		if (fEnableAutoBuildAfterTesting)
313 			CoreUtility.setAutoBuilding(true);
314 
315 	}
316 
317 	/**
318 	 * Method compareArrays. Both arrays must be of IPackageFragments or compare will fail.
319 	 * @param children
320 	 * @param expectedChildren
321 	 * @return boolean
322 	 */
compareArrays(Object[] children, Object[] expectedChildren)323 	private boolean compareArrays(Object[] children, Object[] expectedChildren) {
324 		if(children.length!=expectedChildren.length)
325 			return false;
326 		for (Object child : children) {
327 			if (child instanceof IJavaElement) {
328 				IJavaElement el= (IJavaElement) child;
329 				if(!contains(el, expectedChildren))
330 					return false;
331 			} else if(child instanceof IResource){
332 				IResource res = (IResource) child;
333 				if(!contains(res, expectedChildren)){
334 					return false;
335 				}
336 			}
337 		}
338 		return true;
339 	}
340 	/**
341 	 * Method contains.
342 	 * @param res
343 	 * @param expectedChildren
344 	 * @return boolean
345 	 */
contains(IResource res, Object[] expectedChildren)346 	private boolean contains(IResource res, Object[] expectedChildren) {
347 		for (Object object : expectedChildren) {
348 			if (object instanceof IResource) {
349 				IResource expres= (IResource) object;
350 				if(expres.equals(res))
351 					return true;
352 			}
353 		}
354 		return false;
355 	}
356 
357 	/**
358 	 * Method contains.
359 	 * @param fragment
360 	 * @param expectedChildren
361 	 * @return boolean
362 	 */
contains(IJavaElement fragment, Object[] expectedChildren)363 	private boolean contains(IJavaElement fragment, Object[] expectedChildren) {
364 		for (Object object : expectedChildren) {
365 			if (object instanceof IJavaElement) {
366 				IJavaElement expfrag= (IJavaElement) object;
367 				if(expfrag.equals(fragment))
368 					return true;
369 			}
370 		}
371 		return false;
372 	}
373 }
374