/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.components.converger.execution;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import de.rcenvironment.components.converger.common.ConvergerComponentConstants;
import de.rcenvironment.core.component.api.ComponentException;
import de.rcenvironment.core.component.api.LoopComponentConstants;
import de.rcenvironment.core.component.execution.api.Component;
import de.rcenvironment.core.component.testutils.ComponentContextMock;
import de.rcenvironment.core.component.testutils.ComponentTestWrapper;
import de.rcenvironment.core.datamodel.api.DataType;
import de.rcenvironment.core.datamodel.api.EndpointCharacter;
import de.rcenvironment.core.datamodel.api.TypedDatum;
import de.rcenvironment.core.datamodel.api.TypedDatumFactory;
import de.rcenvironment.core.datamodel.api.TypedDatumService;
import de.rcenvironment.core.datamodel.types.api.BooleanTD;
import de.rcenvironment.core.datamodel.types.api.FloatTD;
import de.rcenvironment.core.datamodel.types.api.IntegerTD;
/**
* Integration test for {@link ConvergerComponent}.
*
* @author Robert Mischke
* @author Doreen Seider
*/
public class ConvergerComponentTest {
private static final String STRING_2 = "2";
private static final String STRING_1 = "1";
private static final String STRING_0 = "0";
private static final String X = "x";
private static final String Y = "y";
private static final String Z = "z";
private static final String N = "n";
private ComponentTestWrapper component;
private ConvergerComponentContextMock context;
private TypedDatumFactory typedDatumFactory;
/**
* Custom subclass of {@link ComponentContextMock} that adds common configuration and query methods.
*
* @author Robert Mischke
*/
private final class ConvergerComponentContextMock extends ComponentContextMock {
private static final long serialVersionUID = 1570441783510990090L;
public void configure(ComponentContextMock ctx, String epsA, String epsR, String itsToConsider, String maxChecks) {
configure(ctx, epsA, epsR, itsToConsider, maxChecks, DataType.Float);
}
public void configure(ComponentContextMock ctx, String epsA, String epsR, String itsToConsider, String maxChecks,
DataType dynamicEndpointType) {
context.setConfigurationValue(ConvergerComponentConstants.KEY_EPS_A, epsA);
context.setConfigurationValue(ConvergerComponentConstants.KEY_EPS_R, epsR);
context.setConfigurationValue(ConvergerComponentConstants.KEY_ITERATIONS_TO_CONSIDER, itsToConsider);
context.setConfigurationValue(ConvergerComponentConstants.KEY_MAX_CONV_CHECKS, maxChecks);
addSimulatedOutput(ConvergerComponentConstants.CONVERGED, null, DataType.Boolean, false,
null, EndpointCharacter.OUTER_LOOP);
addSimulatedOutput(X, ConvergerComponentConstants.ENDPOINT_ID_TO_CONVERGE, dynamicEndpointType, true, null);
addSimulatedOutput(X + ConvergerComponentConstants.IS_CONVERGED_OUTPUT_SUFFIX,
ConvergerComponentConstants.ENDPOINT_ID_AUXILIARY, DataType.Boolean, true, null);
addSimulatedOutput(X + ConvergerComponentConstants.CONVERGED_OUTPUT_SUFFIX, ConvergerComponentConstants.ENDPOINT_ID_TO_CONVERGE,
dynamicEndpointType, true, null, EndpointCharacter.OUTER_LOOP);
context.addSimulatedOutput(ConvergerComponentConstants.CONVERGED, "", DataType.Boolean, true, null,
EndpointCharacter.OUTER_LOOP);
context.addSimulatedOutput(ConvergerComponentConstants.CONVERGED_ABSOLUTE, "", DataType.Float, true, null,
EndpointCharacter.OUTER_LOOP);
context.addSimulatedOutput(ConvergerComponentConstants.CONVERGED_RELATIVE, "", DataType.Float, true, null,
EndpointCharacter.OUTER_LOOP);
addSimulatedOutput(LoopComponentConstants.ENDPOINT_NAME_LOOP_DONE, null, DataType.Boolean, false, null,
EndpointCharacter.OUTER_LOOP);
}
public void configure(ComponentContextMock ctx, String epsA, String epsR, String itsToConsider) {
configure(ctx, epsA, epsR, itsToConsider, null);
}
public void configure(ComponentContextMock ctx, String epsA, String epsR, String itsToConsider, boolean isNestedLoop) {
configure(ctx, epsA, epsR, itsToConsider, null);
context.setConfigurationValue(LoopComponentConstants.CONFIG_KEY_IS_NESTED_LOOP, String.valueOf(isNestedLoop));
}
public void configure(ComponentContextMock ctx, String epsA, String epsR, String itsToConsider, String maxChecks,
boolean isNestedLoop) {
configure(ctx, epsA, epsR, itsToConsider, maxChecks);
context.setConfigurationValue(LoopComponentConstants.CONFIG_KEY_IS_NESTED_LOOP, String.valueOf(isNestedLoop));
}
public void addSimulatedInput(String name, String endpointId, DataType dataType, boolean isDynamic, double startValue) {
Map<String, String> metaData = new HashMap<>();
metaData.put(ConvergerComponentConstants.META_HAS_STARTVALUE, String.valueOf(true));
metaData.put(ConvergerComponentConstants.META_STARTVALUE, String.valueOf(startValue));
super.addSimulatedInput(name, endpointId, dataType, isDynamic, metaData);
}
public void addSimulatedInput(String name, String endpointId, DataType dataType, boolean isDynamic) {
super.addSimulatedInput(name, endpointId, dataType, isDynamic, null);
}
// TODO without the "assert" method (which cannot be in non-test bundles), this could be
// moved to the base class
/**
* If a single output {@link TypedDatum} was generated on the given output, it is returned; if another number of outputs was
* generated, an assertion failure is thrown.
*
* @param name the name of the output
* @return the single {@link TypedDatum}, if present
*/
public TypedDatum expectSingleOutputDatum(String name) {
List<TypedDatum> outputDataConverged;
outputDataConverged = context.getCapturedOutput(name);
assertEquals(1, outputDataConverged.size());
TypedDatum typedDatum = outputDataConverged.get(0);
return typedDatum;
}
public void testForSingleBooleanOutput(String name, boolean value) {
TypedDatum typedDatum = expectSingleOutputDatum(name);
assertEquals(value, ((BooleanTD) typedDatum).getBooleanValue());
}
public void testForSingleValueOutput(String name, double value) {
TypedDatum typedDatum = expectSingleOutputDatum(name);
assertEquals(value, ((FloatTD) typedDatum).getFloatValue(), 0.0);
}
public void testForNoOutputValueSent(String name) {
assertTrue(context.getCapturedOutput(name).isEmpty());
}
public void testForClosedOutput(String name) {
assertTrue(getCapturedOutputClosings().contains(name));
}
public void testForResetOutput(String name) {
assertTrue(getCapturedOutputResets().contains(name));
}
}
/**
* Common setup.
*/
@Before
public void setUp() {
context = new ConvergerComponentContextMock();
component = new ComponentTestWrapper(new ConvergerComponent(), context);
typedDatumFactory = context.getService(TypedDatumService.class).getFactory();
}
/**
* Common cleanup.
*/
@After
public void tearDown() {
// TODO adapt if other end states are needed
component.tearDownAndDispose(Component.FinalComponentState.FINISHED);
}
/**
* Tests basic life-cycle with no attached inputs.
*
* @throws ComponentException on unexpected component failures
*/
@Test
public void testNoInputs() throws ComponentException {
context.configure(context, STRING_0, STRING_0, STRING_1);
component.start();
}
/**
* Tests that a forwarded value can not trigger convergence.
*
* @throws ComponentException on unexpected error
*/
@Test
public void testForwardedInputNotTriggerConvergence() throws ComponentException {
context.addSimulatedInput(X, LoopComponentConstants.ENDPOINT_ID_TO_FORWARD, DataType.Float, true);
context.configure(context, STRING_0, STRING_0, STRING_1);
component.start();
context.setInputValue(X, typedDatumFactory.createFloat(5.0));
component.processInputs();
context.testForSingleValueOutput(X, 5.0);
context.testForNoOutputValueSent(X + ConvergerComponentConstants.CONVERGED_OUTPUT_SUFFIX);
context.testForNoOutputValueSent(ConvergerComponentConstants.CONVERGED);
context.testForNoOutputValueSent(LoopComponentConstants.ENDPOINT_NAME_LOOP_DONE);
}
/**
* Tests basic behavior for values received on a single input.
*
* @throws ComponentException on unexpected component failures
*/
@Test
public void testSingleInput() throws ComponentException {
context.addSimulatedInput(X, ConvergerComponentConstants.ENDPOINT_ID_TO_CONVERGE, DataType.Float, true);
context.configure(context, STRING_0, STRING_0, STRING_1);
component.start();
expectProcessInputsWithoutConverging(X, X, 1.0);
expectNoneOutputIsClosed();
expectProcessInputsWithoutConverging(X, X, 2.0);
expectNoneOutputIsClosed();
expectProcessInputsWithoutConverging(X, X, 1.0);
expectNoneOutputIsClosed();
expectProcessInputsWithConverging(X, X, 1.0);
expectAllOutputsAreClosed(X);
}
/**
* Tests basic behavior for values received on multiple inputs with data type float.
*
* @throws ComponentException on unexpected component failures
*/
@Test
public void testConvergenceForMultipleInputsWithFloat() throws ComponentException {
addSimulatedEndpointsToConverge(X, DataType.Float);
addSimulatedEndpointsToConverge(Y, DataType.Float);
addSimulatedEndpointsToConverge(Z, DataType.Float);
addSimulatedEndpointsToForward(N, DataType.Integer);
context.configure(context, STRING_0, STRING_0, STRING_1);
component.start();
context.setInputValue(X, typedDatumFactory.createFloat(1.0));
context.setInputValue(Y, typedDatumFactory.createFloat(1.0));
context.setInputValue(Z, typedDatumFactory.createFloat(1.0));
component.processInputs();
context.testForNoOutputValueSent(ConvergerComponentConstants.CONVERGED);
context.setInputValue(X, typedDatumFactory.createFloat(2.0));
context.setInputValue(Y, typedDatumFactory.createFloat(3.0));
context.setInputValue(Z, typedDatumFactory.createFloat(4.0));
component.processInputs();
context.testForNoOutputValueSent(ConvergerComponentConstants.CONVERGED);
context.setInputValue(X, typedDatumFactory.createFloat(1.0));
context.setInputValue(Y, typedDatumFactory.createFloat(6.0));
context.setInputValue(Z, typedDatumFactory.createFloat(8.0));
component.processInputs();
context.testForNoOutputValueSent(ConvergerComponentConstants.CONVERGED);
context.setInputValue(X, typedDatumFactory.createFloat(1.0));
context.setInputValue(Y, typedDatumFactory.createFloat(8.0));
context.setInputValue(Z, typedDatumFactory.createFloat(9.0));
component.processInputs();
context.testForNoOutputValueSent(ConvergerComponentConstants.CONVERGED);
context.setInputValue(X, typedDatumFactory.createFloat(1.0));
context.setInputValue(Y, typedDatumFactory.createFloat(8.0));
context.setInputValue(Z, typedDatumFactory.createFloat(7.0));
component.processInputs();
context.testForNoOutputValueSent(ConvergerComponentConstants.CONVERGED);
context.setInputValue(X, typedDatumFactory.createFloat(1.0));
context.setInputValue(Y, typedDatumFactory.createFloat(8.0));
context.setInputValue(Z, typedDatumFactory.createFloat(7.0));
component.processInputs();
context.testForSingleBooleanOutput(ConvergerComponentConstants.CONVERGED, true);
context.testForClosedOutput(ConvergerComponentConstants.CONVERGED);
context.testForClosedOutput(ConvergerComponentConstants.CONVERGED);
}
/**
* Tests basic behavior for values received on multiple inputs with data type integer.
*
* @throws ComponentException on unexpected component failures
*/
@Test
public void testConvergenceForMultipleInputsWithInteger() throws ComponentException {
addSimulatedEndpointsToConverge(X, DataType.Integer);
addSimulatedEndpointsToConverge(Y, DataType.Integer);
addSimulatedEndpointsToConverge(Z, DataType.Integer);
addSimulatedEndpointsToForward(N, DataType.Integer);
context.configure(context, STRING_0, STRING_0, STRING_1, null, DataType.Integer);
component.start();
context.setInputValue(X, typedDatumFactory.createInteger(1L));
context.setInputValue(Y, typedDatumFactory.createInteger(1L));
context.setInputValue(Z, typedDatumFactory.createInteger(1L));
component.processInputs();
context.testForNoOutputValueSent(ConvergerComponentConstants.CONVERGED);
context.setInputValue(X, typedDatumFactory.createInteger(2L));
context.setInputValue(Y, typedDatumFactory.createInteger(3L));
context.setInputValue(Z, typedDatumFactory.createInteger(4L));
component.processInputs();
context.testForNoOutputValueSent(ConvergerComponentConstants.CONVERGED);
context.setInputValue(X, typedDatumFactory.createInteger(1L));
context.setInputValue(Y, typedDatumFactory.createInteger(6L));
context.setInputValue(Z, typedDatumFactory.createInteger(8L));
component.processInputs();
context.testForNoOutputValueSent(ConvergerComponentConstants.CONVERGED);
context.setInputValue(X, typedDatumFactory.createInteger(1L));
context.setInputValue(Y, typedDatumFactory.createInteger(8L));
context.setInputValue(Z, typedDatumFactory.createInteger(9L));
component.processInputs();
context.testForNoOutputValueSent(ConvergerComponentConstants.CONVERGED);
context.setInputValue(X, typedDatumFactory.createInteger(1L));
context.setInputValue(Y, typedDatumFactory.createInteger(8L));
context.setInputValue(Z, typedDatumFactory.createInteger(7L));
component.processInputs();
context.testForNoOutputValueSent(ConvergerComponentConstants.CONVERGED);
context.setInputValue(X, typedDatumFactory.createInteger(1L));
context.setInputValue(Y, typedDatumFactory.createInteger(8L));
context.setInputValue(Z, typedDatumFactory.createInteger(7L));
component.processInputs();
context.testForSingleBooleanOutput(ConvergerComponentConstants.CONVERGED, true);
context.testForClosedOutput(ConvergerComponentConstants.CONVERGED);
context.testForClosedOutput(ConvergerComponentConstants.CONVERGED);
}
/**
* Tests if 'maximum convergence check' constraint is considered properly.
*
* @throws ComponentException on unexpected component failures
*/
@Test
public void tesMaximumConvergenceCheckConstraint() throws ComponentException {
context.addSimulatedInput(X, ConvergerComponentConstants.ENDPOINT_ID_TO_CONVERGE, DataType.Float, true);
context.configure(context, STRING_0, STRING_0, STRING_1, STRING_2);
component.start();
expectProcessInputsWithoutConverging(X, X, 1.0);
expectProcessInputsWithoutConverging(X, X, 2.0);
expectProcessInputsWithoutConvergingButWithDone(X, X, 1.0);
expectAllOutputsAreClosed(X);
}
/**
* Tests if 'iterations to consider' constraint is considered properly.
*
* @throws ComponentException on unexpected component failures
*/
@Test
public void testIterationToConsiderConstraint() throws ComponentException {
context.addSimulatedInput(X, ConvergerComponentConstants.ENDPOINT_ID_TO_CONVERGE, DataType.Float, true);
context.configure(context, STRING_0, STRING_0, STRING_2);
component.start();
expectProcessInputsWithoutConverging(X, X, 1.0);
expectProcessInputsWithoutConverging(X, X, 2.0);
expectProcessInputsWithoutConverging(X, X, 1.0);
expectProcessInputsWithoutConverging(X, X, 1.0);
expectProcessInputsWithConverging(X, X, 1.0);
expectAllOutputsAreClosed(X);
}
/**
* Tests if 'maximum convergence check' constraint is considered properly if 'iterations to consider' constraint is applied as well.
*
* @throws ComponentException on unexpected component failures
*/
@Test
public void testMaximumConvergenceCheckAndIterationToConsiderConstraint() throws ComponentException {
context.addSimulatedInput(X, ConvergerComponentConstants.ENDPOINT_ID_TO_CONVERGE, DataType.Float, true);
context.configure(context, STRING_0, STRING_0, STRING_2, STRING_2);
component.start();
expectProcessInputsWithoutConverging(X, X, 1.0);
expectProcessInputsWithoutConverging(X, X, 2.0);
expectProcessInputsWithoutConverging(X, X, 3.0);
expectProcessInputsWithoutConvergingButWithDone(X, X, 4.0);
expectAllOutputsAreClosed(X);
}
/**
* Tests reset of the converger component if converged.
*
* @throws ComponentException on unexpected component failures
*/
@Test
public void testResetOnConverged() throws ComponentException {
context.addSimulatedInput(X, ConvergerComponentConstants.ENDPOINT_ID_TO_CONVERGE, DataType.Float, true);
context.addSimulatedInput(X + LoopComponentConstants.ENDPOINT_STARTVALUE_SUFFIX,
"startValues", DataType.Float, true, null, EndpointCharacter.OUTER_LOOP);
context.configure(context, STRING_0, STRING_0, STRING_1, true);
component.start();
expectProcessInputsWithoutConverging(X, X, 1.0);
expectProcessInputsWithoutConverging(X, X, 2.0);
expectProcessInputsWithConvergingOrDoneOnReset(X, X, 2.0);
context.testForResetOutput(X);
component.reset();
expectFinalValuesSentAfterResetIfConverged(X, X, 2.0);
}
/**
* Tests reset of the converger component if maximum convergence check is reached.
*
* @throws ComponentException on unexpected component failures
*/
@Test
public void testResetOnMaxConvChecksReached() throws ComponentException {
context.addSimulatedInput(X, ConvergerComponentConstants.ENDPOINT_ID_TO_CONVERGE, DataType.Float, true);
context.addSimulatedInput(X + LoopComponentConstants.ENDPOINT_STARTVALUE_SUFFIX, "startValues", DataType.Float, true, null,
EndpointCharacter.OUTER_LOOP);
context.configure(context, STRING_0, STRING_0, STRING_1, STRING_1, true);
component.start();
expectProcessInputsWithoutConverging(X, X, 1.0);
expectProcessInputsWithConvergingOrDoneOnReset(X, X, 2.0);
context.testForResetOutput(X);
component.reset();
expectFinalValuesSentAfterResetIfMaxConvChecksReached(X, X, 2.0);
}
/**
* Tests reset of the converger component if maximum convergence check is reached.
*
* @throws ComponentException on unexpected component failures
*/
@Test
public void testForwardingValue() throws ComponentException {
addSimulatedEndpointsToConverge(X, DataType.Float);
addSimulatedEndpointsToForward(N, DataType.Integer);
context.configure(context, STRING_0, STRING_0, STRING_1);
component.start();
context.setInputValue(X, typedDatumFactory.createFloat(1.0));
context.setInputValue(N, typedDatumFactory.createInteger(7));
component.processInputs();
assertEquals(1, context.getCapturedOutput(N).size());
assertEquals(0, context.getCapturedOutput(N + ConvergerComponentConstants.CONVERGED_OUTPUT_SUFFIX).size());
assertEquals(7, ((IntegerTD) context.getCapturedOutput(N).get(0)).getIntValue());
context.setInputValue(X, typedDatumFactory.createFloat(1.0));
context.setInputValue(N, typedDatumFactory.createInteger(9));
component.processInputs();
assertEquals(0, context.getCapturedOutput(N).size());
assertEquals(1, context.getCapturedOutput(N + ConvergerComponentConstants.CONVERGED_OUTPUT_SUFFIX).size());
assertEquals(9,
((IntegerTD) context.getCapturedOutput(N + ConvergerComponentConstants.CONVERGED_OUTPUT_SUFFIX).get(0)).getIntValue());
}
/**
* Tests reset of the converger component if maximum convergence check is reached.
*
* @throws ComponentException on unexpected component failures
*/
@Test
public void testForwardingWithStartValueInputs() throws ComponentException {
addSimulatedEndpointsToConverge(X, DataType.Float);
context.addSimulatedInput(X + LoopComponentConstants.ENDPOINT_STARTVALUE_SUFFIX,
ConvergerComponentConstants.ENDPOINT_ID_TO_CONVERGE, DataType.Float, true);
addSimulatedEndpointsToForward(N, DataType.Integer);
context.addSimulatedInput(N + LoopComponentConstants.ENDPOINT_STARTVALUE_SUFFIX,
LoopComponentConstants.ENDPOINT_ID_TO_FORWARD, DataType.Integer, true);
context.configure(context, STRING_0, STRING_0, STRING_1);
component.start();
context.setInputValue(X + LoopComponentConstants.ENDPOINT_STARTVALUE_SUFFIX, typedDatumFactory.createFloat(1.0));
context.setInputValue(N + LoopComponentConstants.ENDPOINT_STARTVALUE_SUFFIX, typedDatumFactory.createInteger(7));
component.processInputs();
assertEquals(1, context.getCapturedOutput(N).size());
assertEquals(1, context.getCapturedOutput(X).size());
assertEquals(7, ((IntegerTD) context.getCapturedOutput(N).get(0)).getIntValue());
assertEquals(1.0, ((FloatTD) context.getCapturedOutput(X).get(0)).getFloatValue(), 0);
assertEquals(0, context.getCapturedOutput(N + ConvergerComponentConstants.CONVERGED_OUTPUT_SUFFIX).size());
context.setInputValue(X, typedDatumFactory.createFloat(1.0));
context.setInputValue(N, typedDatumFactory.createInteger(9));
component.processInputs();
assertEquals(0, context.getCapturedOutput(N).size());
assertEquals(1, context.getCapturedOutput(N + ConvergerComponentConstants.CONVERGED_OUTPUT_SUFFIX).size());
assertEquals(0, context.getCapturedOutput(X).size());
assertEquals(1, context.getCapturedOutput(X + ConvergerComponentConstants.CONVERGED_OUTPUT_SUFFIX).size());
assertEquals(9,
((IntegerTD) context.getCapturedOutput(N + ConvergerComponentConstants.CONVERGED_OUTPUT_SUFFIX).get(0)).getIntValue());
assertEquals(1.0,
((FloatTD) context.getCapturedOutput(X + ConvergerComponentConstants.CONVERGED_OUTPUT_SUFFIX).get(0)).getFloatValue(), 0);
}
/**
* Tests reset of the converger component if maximum convergence check is reached.
*
* @throws ComponentException on unexpected component failures
*/
@Test
public void testWithStartValueInputsAndAsMetaData() throws ComponentException {
context.addSimulatedInput(X, ConvergerComponentConstants.ENDPOINT_ID_TO_CONVERGE, DataType.Float, true, 5.0);
context.addSimulatedOutput(X, ConvergerComponentConstants.ENDPOINT_ID_TO_CONVERGE, DataType.Float, true, null);
context.addSimulatedOutput(X + ConvergerComponentConstants.IS_CONVERGED_OUTPUT_SUFFIX,
ConvergerComponentConstants.ENDPOINT_ID_AUXILIARY, DataType.Boolean, true, null);
context.addSimulatedOutput(X + ConvergerComponentConstants.CONVERGED_OUTPUT_SUFFIX,
ConvergerComponentConstants.ENDPOINT_ID_TO_CONVERGE, DataType.Float, true, null, EndpointCharacter.OUTER_LOOP);
addSimulatedEndpointsToForward(N, DataType.Integer);
context.addSimulatedInput(N + LoopComponentConstants.ENDPOINT_STARTVALUE_SUFFIX,
LoopComponentConstants.ENDPOINT_ID_TO_FORWARD, DataType.Integer, true);
context.configure(context, STRING_0, STRING_0, STRING_1);
component.start();
assertEquals(0, context.getCapturedOutput(X).size());
context.setInputValue(N + LoopComponentConstants.ENDPOINT_STARTVALUE_SUFFIX, typedDatumFactory.createInteger(7));
component.processInputs();
assertEquals(1, context.getCapturedOutput(N).size());
assertEquals(0, context.getCapturedOutput(N + ConvergerComponentConstants.CONVERGED_OUTPUT_SUFFIX).size());
assertEquals(7, ((IntegerTD) context.getCapturedOutput(N).get(0)).getIntValue());
assertEquals(1, context.getCapturedOutput(X).size());
assertEquals(0, context.getCapturedOutput(X + ConvergerComponentConstants.CONVERGED_OUTPUT_SUFFIX).size());
assertEquals(5.0, ((FloatTD) context.getCapturedOutput(X).get(0)).getFloatValue(), 0);
context.setInputValue(X, typedDatumFactory.createFloat(5.0));
context.setInputValue(N, typedDatumFactory.createInteger(9));
component.processInputs();
assertEquals(0, context.getCapturedOutput(N).size());
assertEquals(1, context.getCapturedOutput(N + ConvergerComponentConstants.CONVERGED_OUTPUT_SUFFIX).size());
assertEquals(9,
((IntegerTD) context.getCapturedOutput(N + ConvergerComponentConstants.CONVERGED_OUTPUT_SUFFIX).get(0)).getIntValue());
assertEquals(0, context.getCapturedOutput(X).size());
assertEquals(1, context.getCapturedOutput(X + ConvergerComponentConstants.CONVERGED_OUTPUT_SUFFIX).size());
assertEquals(5.0,
((FloatTD) context.getCapturedOutput(X + ConvergerComponentConstants.CONVERGED_OUTPUT_SUFFIX).get(0)).getFloatValue(), 0);
}
private void expectProcessInputsWithoutConverging(String valueInput, String valueOutput, double value) throws ComponentException {
context.setInputValue(valueInput, typedDatumFactory.createFloat(value));
component.processInputs();
context.testForSingleValueOutput(valueOutput, value);
context.testForSingleBooleanOutput(valueOutput + ConvergerComponentConstants.IS_CONVERGED_OUTPUT_SUFFIX, false);
context.testForNoOutputValueSent(valueOutput + ConvergerComponentConstants.CONVERGED_OUTPUT_SUFFIX);
context.testForNoOutputValueSent(ConvergerComponentConstants.CONVERGED);
context.testForNoOutputValueSent(LoopComponentConstants.ENDPOINT_NAME_LOOP_DONE);
}
private void expectProcessInputsWithConverging(String valueInput, String valueOutput, double value) throws ComponentException {
context.setInputValue(valueInput, typedDatumFactory.createFloat(value));
component.processInputs();
context.testForNoOutputValueSent(valueOutput);
context.testForNoOutputValueSent(valueOutput + ConvergerComponentConstants.IS_CONVERGED_OUTPUT_SUFFIX);
context.testForSingleValueOutput(valueOutput + ConvergerComponentConstants.CONVERGED_OUTPUT_SUFFIX, value);
context.testForSingleBooleanOutput(ConvergerComponentConstants.CONVERGED, true);
context.testForSingleBooleanOutput(LoopComponentConstants.ENDPOINT_NAME_LOOP_DONE, true);
}
private void expectProcessInputsWithConvergingOrDoneOnReset(String valueInput, String valueOutput, double value)
throws ComponentException {
context.setInputValue(valueInput, typedDatumFactory.createFloat(value));
component.processInputs();
context.testForNoOutputValueSent(valueOutput);
context.testForNoOutputValueSent(valueOutput + ConvergerComponentConstants.IS_CONVERGED_OUTPUT_SUFFIX);
context.testForNoOutputValueSent(valueOutput + ConvergerComponentConstants.CONVERGED_OUTPUT_SUFFIX);
context.testForNoOutputValueSent(ConvergerComponentConstants.CONVERGED);
context.testForNoOutputValueSent(LoopComponentConstants.ENDPOINT_NAME_LOOP_DONE);
}
private void expectFinalValuesSentAfterResetIfConverged(String valueInput, String valueOutput, double value) throws ComponentException {
context.testForNoOutputValueSent(valueOutput);
context.testForNoOutputValueSent(valueOutput + ConvergerComponentConstants.IS_CONVERGED_OUTPUT_SUFFIX);
context.testForSingleValueOutput(valueOutput + ConvergerComponentConstants.CONVERGED_OUTPUT_SUFFIX, value);
context.testForSingleBooleanOutput(ConvergerComponentConstants.CONVERGED, true);
context.testForSingleBooleanOutput(LoopComponentConstants.ENDPOINT_NAME_LOOP_DONE, true);
}
private void expectFinalValuesSentAfterResetIfMaxConvChecksReached(String valueInput, String valueOutput, double value)
throws ComponentException {
context.testForNoOutputValueSent(valueOutput);
context.testForNoOutputValueSent(valueOutput + ConvergerComponentConstants.IS_CONVERGED_OUTPUT_SUFFIX);
context.testForSingleValueOutput(valueOutput + ConvergerComponentConstants.CONVERGED_OUTPUT_SUFFIX, value);
context.testForSingleBooleanOutput(ConvergerComponentConstants.CONVERGED, false);
context.testForSingleBooleanOutput(LoopComponentConstants.ENDPOINT_NAME_LOOP_DONE, true);
}
private void expectProcessInputsWithoutConvergingButWithDone(String valueInput, String valueOutput, double value)
throws ComponentException {
context.setInputValue(valueInput, typedDatumFactory.createFloat(value));
component.processInputs();
context.testForNoOutputValueSent(valueOutput);
context.testForNoOutputValueSent(valueOutput + ConvergerComponentConstants.IS_CONVERGED_OUTPUT_SUFFIX);
context.testForSingleValueOutput(valueOutput + ConvergerComponentConstants.CONVERGED_OUTPUT_SUFFIX, value);
context.testForSingleBooleanOutput(ConvergerComponentConstants.CONVERGED, false);
context.testForSingleBooleanOutput(LoopComponentConstants.ENDPOINT_NAME_LOOP_DONE, true);
}
private void expectNoneOutputIsClosed() {
assertEquals(0, context.getCapturedOutputClosings().size());
}
private void expectAllOutputsAreClosed(String valueOutput) {
context.testForClosedOutput(valueOutput);
context.testForClosedOutput(valueOutput + ConvergerComponentConstants.IS_CONVERGED_OUTPUT_SUFFIX);
context.testForClosedOutput(valueOutput + ConvergerComponentConstants.CONVERGED_OUTPUT_SUFFIX);
context.testForClosedOutput(ConvergerComponentConstants.CONVERGED);
context.testForClosedOutput(LoopComponentConstants.ENDPOINT_NAME_LOOP_DONE);
}
private void addSimulatedEndpointsToConverge(String name, DataType dataType) {
context.addSimulatedInput(name, ConvergerComponentConstants.ENDPOINT_ID_TO_CONVERGE, dataType, true);
context.addSimulatedOutput(name, ConvergerComponentConstants.ENDPOINT_ID_TO_CONVERGE, dataType, true, null);
context.addSimulatedOutput(name + ConvergerComponentConstants.IS_CONVERGED_OUTPUT_SUFFIX,
ConvergerComponentConstants.ENDPOINT_ID_AUXILIARY, DataType.Boolean, true, null);
context.addSimulatedOutput(name + ConvergerComponentConstants.CONVERGED_OUTPUT_SUFFIX,
ConvergerComponentConstants.ENDPOINT_ID_TO_CONVERGE, DataType.Float, true, null, EndpointCharacter.OUTER_LOOP);
}
private void addSimulatedEndpointsToForward(String name, DataType dataType) {
context.addSimulatedInput(name, LoopComponentConstants.ENDPOINT_ID_TO_FORWARD, dataType, true);
context.addSimulatedOutput(name, LoopComponentConstants.ENDPOINT_ID_TO_FORWARD, dataType, true, null);
context.addSimulatedOutput(name + ConvergerComponentConstants.CONVERGED_OUTPUT_SUFFIX,
LoopComponentConstants.ENDPOINT_ID_TO_FORWARD, dataType, true, null, EndpointCharacter.OUTER_LOOP);
}
}