blob: 72407e5e55a445410da911894157cd951cf3699c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017, 2020 Simeon Andreev and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Simeon Andreev - Initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.ui.tests.refactoring;
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.eclipse.jdt.testplugin.JavaProjectHelper;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.internal.corext.refactoring.reorg.IsCompletelySelected;
import org.eclipse.jdt.ui.tests.core.rules.ProjectTestSetup;
/**
* Tests for {@link IsCompletelySelected}.
*
* Validates that given specific selected packages, the predicate correctly indicates which packages
* are fully selected.
*
* E.g. given the following package structure and selection
*
* <pre>
* package1 -- selected
* package1.sub1
* package1.sub2 -- selected
* package2 -- selected
* </pre>
*
* only {@code package1.sub2} and {@code package2} are fully selected. {@code package1} is not fully
* selected, since only one sub-package of {@code package1} is selected.
*
* @author Simeon Andreev
*/
public class IsCompletelySelectedTest {
private IJavaProject testProject;
private IPackageFragment package_a;
private IPackageFragment package_a_b;
private IPackageFragment package_a_b_c;
private IPackageFragment package_a_b_c_d1;
private IPackageFragment package_a_b_c_d2;
private IPackageFragment package_a_b_e;
@Rule
public ProjectTestSetup projectSetup = new ProjectTestSetup();
@Before
public void setUp() throws Exception {
IProgressMonitor monitor= new NullProgressMonitor();
String projectName= getClass().getSimpleName();
testProject= JavaProjectHelper.createJavaProject(projectName, "bin");
IPackageFragmentRoot src= JavaProjectHelper.addSourceContainer(testProject, "src");
boolean force= true;
package_a= src.createPackageFragment("a", force, monitor);
package_a_b= src.createPackageFragment("a.b", force, monitor);
package_a_b_c= src.createPackageFragment("a.b.c", force, monitor);
package_a_b_c_d1= src.createPackageFragment("a.b.c.d1", force, monitor);
package_a_b_c_d2= src.createPackageFragment("a.b.c.d2", force, monitor);
package_a_b_e= src.createPackageFragment("a.b.e", force, monitor);
}
@After
public void tearDown() throws Exception {
testProject.getProject().delete(true, false, new NullProgressMonitor());
}
@Test
public void testPartialSelection1() throws Exception {
IPackageFragment[] selectedPackages= { package_a, package_a_b_e };
IPackageFragment[] expectedCompletelySelected= { package_a_b_e };
assertCorrectCompleteSelection(selectedPackages, expectedCompletelySelected);
}
@Test
public void testPartialSelection2() throws Exception {
IPackageFragment[] selectedPackages= { package_a_b, package_a_b_c_d1 };
IPackageFragment[] expectedCompletelySelected= { package_a_b_c_d1 };
assertCorrectCompleteSelection(selectedPackages, expectedCompletelySelected);
}
@Test
public void testPartialSelection3() throws Exception {
IPackageFragment[] selectedPackages= { package_a, package_a_b_c };
IPackageFragment[] expectedCompletelySelected= {};
assertCorrectCompleteSelection(selectedPackages, expectedCompletelySelected);
}
@Test
public void testPartialSelection4() throws Exception {
IPackageFragment[] selectedPackages= { package_a_b_c, package_a_b_c_d1 };
IPackageFragment[] expectedCompletelySelected= { package_a_b_c_d1 };
assertCorrectCompleteSelection(selectedPackages, expectedCompletelySelected);
}
@Test
public void testCompleteSelection() throws Exception {
IPackageFragment[] selectedPackages= allPackages();
IPackageFragment[] expectedCompletelySelected= selectedPackages;
assertCorrectCompleteSelection(selectedPackages, expectedCompletelySelected);
}
@Test
public void testCompleteSelectionOfSubPackage1() throws Exception {
IPackageFragment[] selectedPackages= { package_a_b_c, package_a_b_c_d1, package_a_b_c_d2 };
IPackageFragment[] expectedCompletelySelected= selectedPackages;
assertCorrectCompleteSelection(selectedPackages, expectedCompletelySelected);
}
@Test
public void testCompleteSelectionOfSubPackage2() throws Exception {
IPackageFragment[] selectedPackages= { package_a_b_e, package_a_b_c_d1, package_a_b_c_d2 };
IPackageFragment[] expectedCompletelySelected= { package_a_b_e, package_a_b_c_d1, package_a_b_c_d2 };
assertCorrectCompleteSelection(selectedPackages, expectedCompletelySelected);
}
private void assertCorrectCompleteSelection(IPackageFragment[] selectedPackages, IPackageFragment[] expectedCompletelySelected) throws Exception {
IsCompletelySelected predicate= new IsCompletelySelected(Arrays.asList(selectedPackages));
assertMatchesOnly(predicate, expectedCompletelySelected);
}
private void assertMatchesOnly(IsCompletelySelected predicate, IPackageFragment... expectedCompletelySelectedPackages) {
List<IPackageFragment> allPackages= Arrays.asList(allPackages());
Set<IPackageFragment> actualCompletelySelectedPackages= new LinkedHashSet<>();
for (IPackageFragment packageFragment : allPackages) {
if (predicate.test(packageFragment)) {
actualCompletelySelectedPackages.add(packageFragment);
}
}
assertEquals("wrong set of completely selected packages",
new LinkedHashSet<>(Arrays.asList(expectedCompletelySelectedPackages)), actualCompletelySelectedPackages);
}
private IPackageFragment[] allPackages() {
IPackageFragment[] allPackages= {
package_a, package_a_b, package_a_b_c, package_a_b_c_d1, package_a_b_c_d2, package_a_b_e
};
return allPackages;
}
}