/******************************************************************************* * Copyright (c) 2000, 2017 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 * *******************************************************************************/ package org.eclipse.dltk.ui.tests.navigator.scriptexplorer; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceDescription; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.dltk.core.ElementChangedEvent; import org.eclipse.dltk.core.IBuildpathEntry; import org.eclipse.dltk.core.IElementChangedListener; import org.eclipse.dltk.core.IModelElement; import org.eclipse.dltk.core.IModelElementDelta; import org.eclipse.dltk.core.IProjectFragment; import org.eclipse.dltk.core.IScriptFolder; import org.eclipse.dltk.core.IScriptProject; import org.eclipse.dltk.core.IScriptProjectFilenames; import org.eclipse.dltk.core.ISourceModule; import org.eclipse.dltk.internal.ui.wizards.buildpath.BPListElement; import org.eclipse.dltk.ui.tests.DLTKUITestsPlugin; import org.eclipse.dltk.ui.tests.ScriptProjectHelper; 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.PlatformUI; import org.junit.After; import org.junit.Before; import org.junit.Test; /** * Tests for the PackageExplorerContentProvider. * */ public class ContentProviderTests1 { private IScriptProject fJProject1; private IScriptProject fJProject2; private IProjectFragment fRoot1; private IScriptFolder fPack1; private IScriptFolder fPack2; private IScriptFolder fPack4; private IScriptFolder fPack3; private IWorkspace fWorkspace; private IWorkbench fWorkbench; private MockPluginView fMyPart; private ITreeContentProvider fProvider; private IProjectFragment fArchiveFragmentRoot; private IScriptFolder fPackJunit; private IScriptFolder fPackJunitSamples; private IScriptFolder fPackJunitSamplesMoney; private IScriptFolder fPack5; private IScriptFolder fPack6; private IFile fFile1; private IFile fFile2; private IResource fCUIMoney; private IResource fCUMoney; private IResource fCUMoneyBag; private IResource fCUMoneyTest; private ISourceModule fCU1; private ISourceModule fCU2; private IWorkbenchPage page; private ISourceModule fCUAllTests; private ISourceModule fCUVectorTest; private ISourceModule fCUSimpleTest; private boolean fEnableAutoBuildAfterTesting; private ISourceModule fCU3; // ---------Test for getChildren------------------- @Test public void testGetChildrenProjectWithSourceFolders() throws Exception { Object[] expectedChildren = new Object[] { fRoot1, fFile1, fFile2 }; Object[] children = fProvider.getChildren(fJProject2); assertTrue( "Wrong children found for project", compareArrays(children, expectedChildren));//$NON-NLS-1$ } @Test public void testGetChildrenMidLevelFragment() throws Exception { Object[] expectedChildren = new Object[] { fPack4, fPack5 }; Object[] children = fProvider.getChildren(fPack3); assertTrue( "Wrong children found for ScriptFolder", compareArrays(children, expectedChildren));//$NON-NLS-1$ } @Test public void testGetChildrenBottomLevelFragment() throws Exception { Object[] expectedChildren = new Object[] { fCU1 }; Object[] children = fProvider.getChildren(fPack2); assertTrue( "Wrong children found for ScriptFolder", compareArrays(children, expectedChildren));//$NON-NLS-1$ } @Test public void testGetChildrenMidLevelFragmentInArchive() throws Exception { Object[] expectedChildren = new Object[] { fPackJunitSamplesMoney, fCUAllTests, fCUSimpleTest, fCUVectorTest }; Object[] children = fProvider.getChildren(fPackJunitSamples); assertTrue( "wrong chidren found for mid level ScriptFolder in Archive", compareArrays(children, expectedChildren));//$NON-NLS-1$ } @Test public void testGetChildrenBottomLevelFragmentInArchive() throws Exception { Object[] expectedChildren = new Object[] { fCUIMoney, fCUMoney, fCUMoneyBag, fCUMoneyTest }; Object[] children = fProvider.getChildren(fPackJunitSamplesMoney); assertTrue( "wrong children found for a bottom ScriptFolder in ProjectFragment Archive", compareArrays(children, expectedChildren)); //$NON-NLS-1$ } @Test public void testGetChildrenSourceFolder() throws Exception { Object[] expectedChildren = new Object[] { fPack1, fPack2, fPack3 };//$NON-NLS-1$ Object[] children = fProvider.getChildren(fRoot1); assertTrue( "Wrong children found for ProjectFragment", compareArrays(children, expectedChildren));//$NON-NLS-1$ } @Test public void testGetChildrenArchive() { Object[] expectedChildren = new Object[] { fPackJunit };//$NON-NLS-1$ Object[] children = fProvider.getChildren(fArchiveFragmentRoot); assertTrue( "Wrong child found for ProjectFragment Archive", compareArrays(children, expectedChildren));//$NON-NLS-1$ } // ---------------Get Parent Tests----------------------------- @Test public void testGetParentArchive() throws Exception { Object parent = fProvider.getParent(fArchiveFragmentRoot); assertTrue( "Wrong parent found for ProjectFragment Archive", parent == fJProject1);//$NON-NLS-1$ } @Test public void testGetParentMidLevelFragmentInArchive() throws Exception { Object expectedParent = fPackJunitSamples; Object parent = fProvider.getParent(fPackJunitSamplesMoney); assertTrue( "Wrong parent found for a NON top level ScriptFolder in an Archive", expectedParent.equals(parent));//$NON-NLS-1$ } @Test public void testGetParentTopLevelFragmentInArchive() throws Exception { Object expectedParent = fPackJunit; Object parent = fProvider.getParent(fPackJunitSamples); assertTrue( "Wrong parent found for a top level ScriptFolder in an Archive", expectedParent.equals(parent)); //$NON-NLS-1$ } @Test public void testGetParentTopLevelFragment() throws Exception { Object expectedParent = fRoot1; Object parent = fProvider.getParent(fPack3); assertTrue( "Wrong parent found for a top level ScriptFolder", expectedParent.equals(parent));//$NON-NLS-1$ } @Test public void testGetParentMidLevelFragment() throws Exception { Object expectedParent = fPack3; Object parent = fProvider.getParent(fPack4); assertTrue( "Wrong parent found for a NON top level ScriptFolder", expectedParent.equals(parent));//$NON-NLS-1$ } @Test public void testDeleteBottomLevelFragment() throws Exception { // send a delta indicating fragment deleted IElementChangedListener listener = (IElementChangedListener) fProvider; IModelElementDelta delta = TestDelta.createDelta(fPack4, IModelElementDelta.REMOVED); listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE)); // force events from dispaly while (fMyPart.getTreeViewer().getControl().getDisplay() .readAndDispatch()) { } // assertTrue("Remove happened", fMyPart.hasRemoveHappened());//$NON-NLS-1$ // assertTrue( // "Correct Remove", fMyPart.getRemovedObject().contains(fPack4));//$NON-NLS-1$ // assertEquals("No refreshes", 0, fMyPart.getRefreshedObject().size());//$NON-NLS-1$ } @Test public void testAddBottomLevelFragment() throws Exception { IScriptFolder test = fRoot1.createScriptFolder("test", true, null);//$NON-NLS-1$ // send a delta indicating fragment deleted IElementChangedListener listener = (IElementChangedListener) fProvider; IModelElementDelta delta = TestDelta.createDelta(test, IModelElementDelta.ADDED); listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE)); // force events from dispaly while (fMyPart.getTreeViewer().getControl().getDisplay() .readAndDispatch()) { } assertTrue("Add happened", fMyPart.hasAddHappened()); //$NON-NLS-1$ assertTrue("Correct Add", test.equals(fMyPart.getAddedObject())); //$NON-NLS-1$ assertEquals("No refreshes", 0, fMyPart.getRefreshedObject().size()); //$NON-NLS-1$ } @Test public void testChangedTopLevelScriptFolder() throws Exception { // send a delta indicating fragment deleted IElementChangedListener listener = (IElementChangedListener) fProvider; IModelElementDelta delta = TestDelta.createDelta(fPack3, IModelElementDelta.CHANGED); listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE)); // force events from display while (fMyPart.getTreeViewer().getControl().getDisplay() .readAndDispatch()) { } assertEquals( "No refresh happened", 0, fMyPart.getRefreshedObject().size()); //$NON-NLS-1$ } @Test public void testChangeBottomLevelScriptFolder() throws Exception { // send a delta indicating fragment deleted fMyPart.fRefreshedObjects = new ArrayList(); IElementChangedListener listener = (IElementChangedListener) fProvider; IModelElementDelta delta = TestDelta.createDelta(fPack6, IModelElementDelta.CHANGED); listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE)); // force events from display while (fMyPart.getTreeViewer().getControl().getDisplay() .readAndDispatch()) { } assertEquals( "No refresh happened", 0, fMyPart.getRefreshedObject().size());//$NON-NLS-1$ } @Test public void testRemoveCUsFromScriptFolder() throws Exception { // send a delta indicating fragment deleted IElementChangedListener listener = (IElementChangedListener) fProvider; IModelElementDelta delta = TestDelta.createCUDelta(new ISourceModule[] { fCU2, fCU3 }, fPack6, IModelElementDelta.REMOVED); listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE)); // force events from display while (fMyPart.getTreeViewer().getControl().getDisplay() .readAndDispatch()) { } // removing more than one CU now results in a refresh. assertEquals("One refresh", 1, fMyPart.getRefreshedObject().size()); //$NON-NLS-1$ } @Test public void testRemoveCUFromScriptFolder() throws Exception { // send a delta indicating fragment deleted IElementChangedListener listener = (IElementChangedListener) fProvider; IModelElementDelta delta = TestDelta.createCUDelta( new ISourceModule[] { fCU2 }, fPack6, IModelElementDelta.REMOVED); listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE)); // force events from display while (fMyPart.getTreeViewer().getControl().getDisplay() .readAndDispatch()) { } assertTrue("Remove happened", fMyPart.hasRemoveHappened()); //$NON-NLS-1$ assertTrue("Correct refresh", fMyPart.getRemovedObject().contains(fCU2)); //$NON-NLS-1$ assertEquals("No refreshes", 0, fMyPart.getRefreshedObject().size()); //$NON-NLS-1$ } public void BUG_testBug65240() throws Exception { IBuildpathEntry[] rawBuildpath = fJProject2.getRawBuildpath(); IBuildpathEntry src1 = rawBuildpath[0]; BPListElement element = BPListElement.createFromExisting(src1, fJProject2); element.setAttribute(BPListElement.INCLUSION, new IPath[] { new Path( "pack3/pack5/") }); fJProject2.setRawBuildpath(new IBuildpathEntry[] { element .getBuildpathEntry() }, null); // TODO: right answer is Object[]{fPack4, fPack4.getResource(), fPack5} // but i don't know if fPack4 should be equal to fPack4.getResource() or // this is a bug Object[] expectedChildren = new Object[] { fPack4, fPack5 }; Object[] children = fProvider.getChildren(fPack3.getResource()); assertTrue( "Wrong children found for project", compareArrays(children, expectedChildren));//$NON-NLS-1$ } // public void testAddWorkingCopyCU() throws Exception { // //test for bug 106452: Paste of source into container doesn't refresh // package explorer // ISourceModule cu= fPack6.createSourceModule("New.txt","class New {}", // true, null);//$NON-NLS-1$//$NON-NLS-2$ // cu.becomeWorkingCopy(null, null); // // try { // fMyPart.getTreeViewer().setInput(fJProject1.getScriptModel()); // fMyPart.getTreeViewer().reveal(fCU2); // ((PackageExplorerContentProvider) // fMyPart.getTreeViewer().getContentProvider()).setProvideMembers(false); // // //force events from display // while // (fMyPart.getTreeViewer().getControl().getDisplay().readAndDispatch()) { // } // // IElementChangedListener listener= (IElementChangedListener) fProvider; // IModelElementDelta delta= TestDelta.createCUDelta(new ISourceModule[] { // cu }, fPack6, IModelElementDelta.ADDED); // listener.elementChanged(new ElementChangedEvent(delta, // ElementChangedEvent.POST_CHANGE)); // // //force events from display // while // (fMyPart.getTreeViewer().getControl().getDisplay().readAndDispatch()) { // } // // assertTrue("No add happened", ! fMyPart.hasAddHappened()); //$NON-NLS-1$ // assertTrue("Refresh happened", fMyPart.hasRefreshHappened()); // //$NON-NLS-1$ // if (fMyPart.getRefreshedObject().size() != 1) // fail("One refresh expected, was:\n" + fMyPart.getRefreshedObject()); // //$NON-NLS-1$ // assertEquals("Correct refresh", fPack6, // fMyPart.getRefreshedObject().get(0)); //$NON-NLS-1$ // // } finally { // cu.discardWorkingCopy(); // } // } @Before public void setUp() throws Exception { fWorkspace = ResourcesPlugin.getWorkspace(); assertNotNull(fWorkspace); IWorkspaceDescription workspaceDesc = fWorkspace.getDescription(); fEnableAutoBuildAfterTesting = workspaceDesc.isAutoBuilding(); if (fEnableAutoBuildAfterTesting) ScriptProjectHelper.setAutoBuilding(false); assertNotNull(fWorkspace); fJProject1 = ScriptProjectHelper.createScriptProject("TestProject1");//$NON-NLS-1$ fJProject2 = ScriptProjectHelper.createScriptProject("TestProject2");//$NON-NLS-1$ assertNotNull("project1 null", fJProject1);//$NON-NLS-1$ assertNotNull("project2 null", fJProject2);//$NON-NLS-1$ fJProject1.setRawBuildpath(new IBuildpathEntry[0], null); Object[] resource = fJProject2.getForeignResources(); for (int i = 0; i < resource.length; i++) { Object object = resource[i]; if (object instanceof IFile) { IFile file = (IFile) object; if (IScriptProjectFilenames.BUILDPATH_FILENAME.equals(file.getName()))//$NON-NLS-1$ fFile1 = file; else if (IScriptProjectFilenames.PROJECT_FILENAME.equals(file.getName()))//$NON-NLS-1$ fFile2 = file; } } assertNotNull(fFile1); assertNotNull(fFile2); java.io.File junitSrcArchive = DLTKUITestsPlugin.getDefault() .getFileInPlugin(ScriptProjectHelper.JUNIT_SRC_381); assertTrue( "junit src not found", junitSrcArchive != null && junitSrcArchive.exists());//$NON-NLS-1$ fArchiveFragmentRoot = ScriptProjectHelper .addSourceContainerWithImport( fJProject1, "src", junitSrcArchive, ScriptProjectHelper.JUNIT_SRC_ENCODING);//$NON-NLS-1$ assertTrue( "Unable to create zipfile archive", fArchiveFragmentRoot.exists());//$NON-NLS-1$ fPackJunit = fArchiveFragmentRoot.getScriptFolder("junit");//$NON-NLS-1$ fPackJunitSamples = fArchiveFragmentRoot .getScriptFolder("junit/samples");//$NON-NLS-1$ fPackJunitSamplesMoney = fArchiveFragmentRoot .getScriptFolder("junit/samples/money");//$NON-NLS-1$ assertNotNull("creating fPackJunit", fPackJunit);//$NON-NLS-1$ assertNotNull("creating fPackJunitSamples", fPackJunitSamples);//$NON-NLS-1$ assertNotNull("creating fPackJunitSamplesMoney", fPackJunitSamplesMoney);//$NON-NLS-1$ fCUIMoney = fPackJunitSamplesMoney .getSourceModule("IMoney.java").getResource();//$NON-NLS-1$ fCUMoney = fPackJunitSamplesMoney .getSourceModule("Money.java").getResource();//$NON-NLS-1$ fCUMoneyBag = fPackJunitSamplesMoney .getSourceModule("MoneyBag.java").getResource();//$NON-NLS-1$ fCUMoneyTest = fPackJunitSamplesMoney .getSourceModule("MoneyTest.java").getResource();//$NON-NLS-1$ fCUAllTests = fPackJunitSamples.getSourceModule("AllTests.txt");//$NON-NLS-1$ fCUVectorTest = fPackJunitSamples.getSourceModule("VectorTest.txt");//$NON-NLS-1$ fCUSimpleTest = fPackJunitSamples.getSourceModule("SimpleTest.txt");//$NON-NLS-1$ // set up project #2: file system structure with in a source folder // ScriptProjectHelper.addVariableEntry(fJProject2, new // Path("InterpreterEnvironment_LIB_TEST"), null, null); fRoot1 = ScriptProjectHelper.addSourceContainer(fJProject2, "src1");//$NON-NLS-1$ fPack1 = fRoot1.createScriptFolder("pack1", true, null);//$NON-NLS-1$ fPack2 = fRoot1.createScriptFolder("pack2", true, null);//$NON-NLS-1$ fPack3 = fRoot1.createScriptFolder("pack3", true, null);//$NON-NLS-1$ fPack4 = fRoot1.createScriptFolder("pack3/pack4", true, null);//$NON-NLS-1$ fPack5 = fRoot1.createScriptFolder("pack3/pack5", true, null);//$NON-NLS-1$ fPack6 = fRoot1.createScriptFolder("pack3/pack5/pack6", true, null);//$NON-NLS-1$ fCU1 = fPack2.createSourceModule("Object.txt", "", true, null);//$NON-NLS-1$//$NON-NLS-2$ fCU2 = fPack6.createSourceModule("Object.txt", "", true, null);//$NON-NLS-1$//$NON-NLS-2$ fCU3 = fPack6.createSourceModule("Jen.txt", "", true, null);//$NON-NLS-1$//$NON-NLS-2$ // set up the mock view setUpMockView(); } public void setUpMockView() throws Exception { fWorkbench = PlatformUI.getWorkbench(); assertNotNull(fWorkbench); page = fWorkbench.getActiveWorkbenchWindow().getActivePage(); assertNotNull(page); // just testing to make sure my part can be created IViewPart myPart = new MockPluginView(); assertNotNull(myPart); myPart = page .showView("org.eclipse.dltk.ui.tests.packageview.MockPluginView");//$NON-NLS-1$ if (myPart instanceof MockPluginView) { fMyPart = (MockPluginView) myPart; fMyPart.setFolding(false); // above call might cause a property change event being sent fMyPart.fRefreshedObjects.clear(); fProvider = (ITreeContentProvider) fMyPart.getTreeViewer() .getContentProvider(); } else assertTrue("Unable to get view", false);//$NON-NLS-1$ assertNotNull(fProvider); } @After public void tearDown() throws Exception { fArchiveFragmentRoot.close(); ScriptProjectHelper.delete(fJProject1); ScriptProjectHelper.delete(fJProject2); page.hideView(fMyPart); if (fEnableAutoBuildAfterTesting) ScriptProjectHelper.setAutoBuilding(true); } /** * Method compareArrays. Both arrays must be of IScriptFolders or compare * will fail. * * @param children * @param expectedChildren * @return boolean */ private boolean compareArrays(Object[] children, Object[] expectedChildren) { if (children.length != expectedChildren.length) return false; for (int i = 0; i < children.length; i++) { Object child = children[i]; if (child instanceof IModelElement) { IModelElement el = (IModelElement) child; if (!contains(el, expectedChildren)) return false; } else if (child instanceof IResource) { IResource res = (IResource) child; if (!contains(res, expectedChildren)) { return false; } } } return true; } /** * Method contains. * * @param res * @param expectedChildren * @return boolean */ private boolean contains(IResource res, Object[] expectedChildren) { for (int i = 0; i < expectedChildren.length; i++) { Object object = expectedChildren[i]; if (object instanceof IResource) { IResource expres = (IResource) object; if (expres.equals(res)) return true; } } return false; } /** * Method contains. * * @param fragment * @param expectedChildren * @return boolean */ private boolean contains(IModelElement fragment, Object[] expectedChildren) { for (int i = 0; i < expectedChildren.length; i++) { Object object = expectedChildren[i]; if (object instanceof IModelElement) { IModelElement expfrag = (IModelElement) object; if (expfrag.equals(fragment)) return true; } } return false; } }