package org.bundlemaker.core.internal.resource;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.stub;
import java.io.IOException;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.bundlemaker.core.jtype.IType;
import org.bundlemaker.core.jtype.ITypeResource;
import org.bundlemaker.core.jtype.TypeEnum;
import org.bundlemaker.core.jtype.internal.JTypeMovableUnitCreator;
import org.bundlemaker.core.jtype.internal.ModelExtension;
import org.bundlemaker.core.jtype.internal.Type;
import org.bundlemaker.core.jtype.internal.TypeResource;
import org.bundlemaker.core.project.IProjectContentEntry;
import org.bundlemaker.core.project.IProjectContentResource;
import org.bundlemaker.core.resource.IModularizedSystem;
import org.bundlemaker.core.resource.IModuleResource;
import org.bundlemaker.core.resource.IMovableUnit;
import org.eclipse.core.runtime.CoreException;
import org.junit.Before;
import org.junit.Test;
public class MovableUnitTest {
/** - */
private IProjectContentEntry _projectContentEntry;
private IModularizedSystem _modularizedSystem;
private Map<String, IModuleResource> _binaries;
private Map<String, IModuleResource> _sources;
/**
* <p>
* </p>
*
* @throws CoreException
*/
@Before
public void setup() throws CoreException {
new ModelExtension().initializeModelExtension();
//
Set<IProjectContentResource> binaryResources = new HashSet<IProjectContentResource>();
Set<IProjectContentResource> sourceResources = new HashSet<IProjectContentResource>();
//
Type typeBlubb = new Type("de.test.Blubb", TypeEnum.INTERFACE, "1", false);
Set<IType> typeSetBlubb = new HashSet<IType>();
typeSetBlubb.add(typeBlubb);
//
Type typeBlubb1 = new Type("de.test.Blubb$1", TypeEnum.INTERFACE, "1", false);
Set<IType> typeSetBlubb1 = new HashSet<IType>();
typeSetBlubb1.add(typeBlubb1);
//
binaryResources.add(new Resource("1", "root", "de/test/NurBinary.txt"));
//
binaryResources.add(new Resource("1", "root", "de/test/Bla.test"));
//
Resource binaryResource = new Resource("1", "root", "de/test/Blubb.class");
TypeResource typeResource = (TypeResource) binaryResource.adaptAs(ITypeResource.class);
typeResource.getModifiableContainedTypes().add(typeBlubb);
typeBlubb.setBinaryResource(binaryResource);
binaryResources.add(binaryResource);
//
binaryResource = new Resource("1", "root", "de/test/InnerBlubbWithoutType.class");
typeResource = (TypeResource) binaryResource.adaptAs(ITypeResource.class);
typeResource.setSourceName("Blubb.java");
binaryResources.add(binaryResource);
//
binaryResource = new Resource("1", "root", "de/test/Blubb$1.class");
typeResource = (TypeResource) binaryResource.adaptAs(ITypeResource.class);
typeResource.getModifiableContainedTypes().add(typeBlubb1);
typeBlubb1.setBinaryResource(binaryResource);
binaryResources.add(binaryResource);
//
sourceResources.add(new Resource("1", "root", "de/test/NurSource.txt"));
//
sourceResources.add(new Resource("1", "root", "de/test/Bla.test"));
//
Resource sourceResource = new Resource("1", "root", "de/test/Blubb.java");
sourceResources.add(sourceResource);
typeResource = (TypeResource) binaryResource.adaptAs(ITypeResource.class);
typeResource.getModifiableContainedTypes().add(typeBlubb);
typeBlubb.setSourceResource(sourceResource);
sourceResources.add(sourceResource);
//
_projectContentEntry = mock(IProjectContentEntry.class);
stub(_projectContentEntry.getBinaryResources()).toReturn((Set) binaryResources);
stub(_projectContentEntry.getSourceResources()).toReturn((Set) sourceResources);
//
_modularizedSystem = mock(IModularizedSystem.class);
//
assertThat(_projectContentEntry.getBinaryResources().size(), is(5));
assertThat(_projectContentEntry.getSourceResources().size(), is(3));
//
_binaries = new HashMap<String, IModuleResource>();
for (IProjectContentResource resource : _projectContentEntry.getBinaryResources()) {
if (resource instanceof IModuleResource) {
_binaries.put(resource.getPath(), (IModuleResource) resource);
}
}
//
_sources = new HashMap<String, IModuleResource>();
for (IProjectContentResource resource : _projectContentEntry.getSourceResources()) {
if (resource instanceof IModuleResource) {
_sources.put(resource.getPath(), (IModuleResource) resource);
}
}
}
/**
* <p>
* </p>
*
* @throws IOException
*/
@Test
public void testDefaultMovableUnitCreator() throws IOException {
//
DefaultMovableUnitCreator creator = new DefaultMovableUnitCreator();
Set<IMovableUnit> movableUnits = creator.assignMovableUnits(_binaries, _sources);
assertThat(movableUnits.size(), is(1));
assertEquals("de/test/Bla.test", ((IMovableUnit) movableUnits.toArray()[0]).getAssociatedSourceResource().getPath());
}
/**
* <p>
* </p>
*
* @throws IOException
*/
@Test
public void testTypeMovableUnitCreator() throws IOException {
//
JTypeMovableUnitCreator creator = new JTypeMovableUnitCreator();
Set<IMovableUnit> movableUnits = creator.assignMovableUnits(_binaries, _sources);
assertThat(movableUnits.size(), is(1));
assertEquals("de/test/Blubb.java", ((IMovableUnit) movableUnits.toArray()[0]).getAssociatedSourceResource()
.getPath());
List<? extends IModuleResource> binaries = ((IMovableUnit) movableUnits.toArray()[0])
.getAssociatedBinaryResources();
Collections.sort(binaries, new Comparator<IModuleResource>() {
@Override
public int compare(IModuleResource o1, IModuleResource o2) {
return o1.getPath().compareTo(o2.getPath());
}
});
assertEquals(3, binaries.size());
assertEquals("de/test/Blubb$1.class", binaries.get(0).getPath());
assertEquals("de/test/Blubb.class", binaries.get(1).getPath());
assertEquals("de/test/InnerBlubbWithoutType.class", binaries.get(2).getPath());
}
@Test
public void testDispatchingMovableUnitCreator() throws IOException {
//
DispatchingMovableUnitCreator creator = new DispatchingMovableUnitCreator();
Set<IMovableUnit> movableUnits = creator.assignMovableUnits(_binaries, _sources);
assertThat(movableUnits.size(), is(4));
//
List<? extends IMovableUnit> sortedUnits = sortMovableUnit(movableUnits);
//
assertEquals("de/test/Bla.test", sortedUnits.get(0).getAssociatedSourceResource().getPath());
assertEquals("de/test/Blubb.java", sortedUnits.get(1).getAssociatedSourceResource().getPath());
assertNull(sortedUnits.get(2).getAssociatedSourceResource());
assertEquals("de/test/NurSource.txt", sortedUnits.get(3).getAssociatedSourceResource().getPath());
List<? extends IModuleResource> binaries = sortBinaries(sortedUnits.get(0));
assertEquals(1, binaries.size());
assertEquals("de/test/Bla.test", binaries.get(0).getPath());
binaries = sortBinaries(sortedUnits.get(1));
assertEquals(3, binaries.size());
assertEquals("de/test/Blubb$1.class", binaries.get(0).getPath());
assertEquals("de/test/Blubb.class", binaries.get(1).getPath());
assertEquals("de/test/InnerBlubbWithoutType.class", binaries.get(2).getPath());
binaries = sortBinaries(sortedUnits.get(2));
assertEquals(1, binaries.size());
assertEquals("de/test/NurBinary.txt", binaries.get(0).getPath());
binaries = sortBinaries(sortedUnits.get(3));
assertEquals(0, binaries.size());
}
private List<? extends IMovableUnit> sortMovableUnit(Set<? extends IMovableUnit> units) {
//
List<? extends IMovableUnit> result = new LinkedList<IMovableUnit>(units);
//
Collections.sort(result, new Comparator<IMovableUnit>() {
@Override
public int compare(IMovableUnit o1, IMovableUnit o2) {
//
if (o1.hasAssociatedBinaryResources() && o2.hasAssociatedBinaryResources()) {
return o1.getAssociatedBinaryResources().get(0).getPath()
.compareTo(o2.getAssociatedBinaryResources().get(0).getPath());
}
//
if (o1.hasAssociatedSourceResource() && o2.hasAssociatedSourceResource()) {
return o1.getAssociatedSourceResource().getPath().compareTo(o2.getAssociatedSourceResource().getPath());
}
//
if (o1.hasAssociatedSourceResource() && o2.hasAssociatedBinaryResources()) {
return o1.getAssociatedSourceResource().getPath()
.compareTo(o2.getAssociatedBinaryResources().get(0).getPath());
}
//
return o1.getAssociatedBinaryResources().get(0).getPath().compareTo(o2.getAssociatedSourceResource().getPath());
}
});
//
return result;
}
/**
* <p>
* </p>
*
* @param movableUnits
* @return
*/
private List<? extends IModuleResource> sortBinaries(IMovableUnit movableUnit) {
//
List<? extends IModuleResource> result = movableUnit.getAssociatedBinaryResources();
//
Collections.sort(result, new Comparator<IModuleResource>() {
@Override
public int compare(IModuleResource o1, IModuleResource o2) {
return o1.getPath().compareTo(o2.getPath());
}
});
//
return result;
}
}