package de.osmembrane.model;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.awt.geom.Point2D;
import java.awt.image.BufferedImage;
import java.lang.reflect.Method;
import java.util.Observable;
import java.util.Observer;
import java.util.Random;
import de.osmembrane.model.pipeline.AbstractConnector;
import de.osmembrane.model.pipeline.AbstractFunction;
import de.osmembrane.model.pipeline.AbstractFunctionGroup;
import de.osmembrane.model.pipeline.AbstractPipeline;
import de.osmembrane.model.pipeline.AbstractTask;
import de.osmembrane.model.pipeline.ConnectorException;
import de.osmembrane.model.pipeline.CopyType;
import de.osmembrane.model.pipeline.Pipeline;
import de.osmembrane.model.pipeline.PipelineObserverObject;
/**
* Intelligent, well behaving and upright Function descendant.
*
* ******* FOR TESTING PURPOSES ONLY. WARRANTY VOID. *******
*
* @author tobias_kuhn
*
*/
public class TestFunction extends AbstractFunction {
private static final long serialVersionUID = -5397137995807781016L;
/**
* RNG for this class
*/
private static final Random rng = new Random();
/**
* unique ID for this test function
*/
private final long uniqueID;
/**
* the actual function contained
*/
private AbstractFunction contained;
/**
*
* @param contained
*/
public TestFunction(AbstractFunction contained) {
this.uniqueID = rng.nextLong();
this.contained = contained;
assertNotNull(contained);
}
/**
* Looks out for itself on the pipeline, if it finds itself, it
* automatically assigns its values to those from the pipeline.
*
* @param pl
* @return true if found and assigned values, false otherwise
*/
public boolean findOnPipeline(AbstractPipeline pl) {
for (AbstractFunction af : pl.getFunctions()) {
if (af instanceof TestFunction) {
TestFunction tf = (TestFunction) af;
if (tf.uniqueID == this.uniqueID) {
this.contained = tf.contained;
return true;
}
}
}
return false;
}
/**
* Asserts this function has task taskname set
*
* @param taskName
*/
public void assertTaskName(String taskName) {
assertEquals(taskName, this.getActiveTask().getName());
}
/**
* Asserts the param param is value.
*
* @param param
* @param value
*/
public void assertParameter(int param, String value) {
assertEquals(value, getActiveTask().getParameters()[param].getValue());
}
/**
* Asserts this function is at loc
*
* @param loc
*/
public void assertLocation(Point2D loc) {
assertEquals(loc, this.getUnrasteredCoordinate());
}
/**
* Asserts there are exactly desiredCount connections to inTarget.
*
* @param inTarget
* @param desiredCount
*/
public void assertConnectionCountTo(TestFunction inTarget, int desiredCount) {
int outCount = 0;
int inCount = 0;
for (AbstractConnector ac : this.getOutConnectors()) {
for (AbstractConnector to : ac.getConnections()) {
if (to.getParent().equals(inTarget.contained)) {
outCount++;
}
}
}
for (AbstractConnector ac : inTarget.getInConnectors()) {
for (AbstractConnector from : ac.getConnections()) {
if (from.getParent().equals(this.contained)) {
inCount++;
}
}
}
assertEquals(desiredCount, outCount);
assertEquals(desiredCount, inCount);
}
@Override
public void update(Observable o, Object arg) {
contained.update(o, arg);
}
@Override
public AbstractFunctionGroup getParent() {
return contained.getParent();
}
@Override
protected void setPipeline(Pipeline pipeline) {
try {
// contained.setPipeline(pipeline);
Method m = contained.getClass().getDeclaredMethod("setPipeline",
Pipeline.class);
m.setAccessible(true);
m.invoke(contained, pipeline);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public AbstractPipeline getPipeline() {
return contained.getPipeline();
}
@Override
public String getId() {
return contained.getId();
}
@Override
public String getFriendlyName() {
return contained.getFriendlyName();
}
@Override
public String getDescription() {
return contained.getDescription();
}
@Override
public BufferedImage getIcon() {
return contained.getIcon();
}
@Override
public AbstractTask[] getAvailableTasks() {
return contained.getAvailableTasks();
}
@Override
public AbstractTask getActiveTask() {
return contained.getActiveTask();
}
@Override
public void setActiveTask(AbstractTask task) {
contained.setActiveTask(task);
}
@Override
public Point2D getCoordinate() {
return contained.getCoordinate();
}
@Override
public void setCoordinate(Point2D coordinate) {
contained.setCoordinate(coordinate);
}
@Override
public AbstractConnector[] getInConnectors() {
return contained.getInConnectors();
}
@Override
public AbstractConnector[] getOutConnectors() {
return contained.getOutConnectors();
}
@Override
public void addConnectionTo(AbstractFunction function)
throws ConnectorException {
contained.addConnectionTo(function);
}
@Override
public boolean removeConnectionTo(AbstractFunction function) {
return contained.removeConnectionTo(function);
}
@Override
protected void unlinkConnectors() {
try {
// contained.unlinkConnectors();
Method m = contained.getClass().getDeclaredMethod(
"unlinkConnectors");
m.setAccessible(true);
m.invoke(contained);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void changedNotifyObservers(PipelineObserverObject poo) {
try {
// contained.changedNotifyObservers(poo);
Method m = contained.getClass().getDeclaredMethod(
"changedNotifyObservers");
m.setAccessible(true);
m.invoke(contained, poo);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public AbstractFunction copy(CopyType type) {
return contained.copy(type);
}
@Override
public synchronized void addObserver(Observer o) {
contained.addObserver(o);
}
@Override
public Point2D getUnrasteredCoordinate() {
return contained.getUnrasteredCoordinate();
}
@Override
public boolean isComplete() {
return contained.isComplete();
}
}