package org.jboss.windup.graph.iterable;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.forge.arquillian.AddonDependencies;
import org.jboss.forge.arquillian.AddonDependency;
import org.jboss.forge.arquillian.archive.AddonArchive;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.windup.graph.GraphContext;
import org.jboss.windup.graph.GraphContextFactory;
import org.jboss.windup.graph.duplicate.typevalue.TestSimpleModel;
import org.jboss.windup.graph.iterables.FramesSetIterable;
import org.jboss.windup.graph.model.WindupVertexFrame;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import javax.inject.Inject;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Testing the FramesIterableSet
*/
@RunWith(Arquillian.class)
public class FramesIterableSetTest
{
@Deployment
@AddonDependencies({
@AddonDependency(name = "org.jboss.windup.graph:windup-graph"),
@AddonDependency(name = "org.jboss.forge.furnace.container:cdi")
})
public static AddonArchive getDeployment()
{
final AddonArchive archive = ShrinkWrap.create(AddonArchive.class)
.addBeansXML()
.addClasses(TestSimpleModel.class);
return archive;
}
@Inject
private GraphContextFactory factory;
@Test
public void testIterableSetEmpty() throws IOException
{
try (GraphContext context = factory.create())
{
List<WindupVertexFrame> models = fillInTestDataAndReturn(context);
FramesSetIterable iterable = new FramesSetIterable(new ArrayList<>());
checkForDuplicates(iterable);
Assert.assertEquals(0,getIterableSize(iterable));
}
}
@Test
public void testIterableSetWithoutDuplicates() throws IOException
{
try (GraphContext context = factory.create())
{
List<WindupVertexFrame> models = fillInTestDataAndReturn(context);
FramesSetIterable iterable = new FramesSetIterable(models);
checkForDuplicates(iterable);
Assert.assertEquals(4,getIterableSize(iterable));
}
}
@Test
public void testIterableSetWithDuplicates() throws IOException
{
try (GraphContext context = factory.create())
{
List<WindupVertexFrame> models = fillInTestDataAndReturn(context);
models.add(models.get(0));
models.add(models.get(0));
models.add(models.get(1));
models.add(models.get(2));
FramesSetIterable<WindupVertexFrame> iterable = new FramesSetIterable(models);
checkForDuplicates(iterable);
Assert.assertEquals(4,getIterableSize(iterable));
}
}
private void checkForDuplicates(FramesSetIterable<WindupVertexFrame> iterable) {
Set<String> ids = new HashSet<>();
for(WindupVertexFrame frame : iterable) {
String frameId = frame.asVertex().getId().toString();
if(ids.contains(frameId)){
Assert.fail("FramesSetIterable should not return multiple vertices with same ID. However, it contained twice ID " + frameId);
}
}
}
private int getIterableSize(Iterable<WindupVertexFrame> iterable) {
int size = 0;
for(WindupVertexFrame frame : iterable) {
size++;
}
return size;
}
private List<WindupVertexFrame> fillInTestDataAndReturn(GraphContext context) {
WindupVertexFrame model1= context.getFramed().addVertex(null, TestSimpleModel.class);
WindupVertexFrame model2= context.getFramed().addVertex(null, TestSimpleModel.class);
WindupVertexFrame model3= context.getFramed().addVertex(null, TestSimpleModel.class);
WindupVertexFrame model4= context.getFramed().addVertex(null, TestSimpleModel.class);
List<WindupVertexFrame> models = new ArrayList<>();
models.add(model1);
models.add(model2);
models.add(model3);
models.add(model4);
return models;
}
}