package tests;
import org.junit.Test;
import algorithms.TypeInference;
import models.algebra.Expression;
import models.algebra.InvalidMessage;
import models.algebra.ParameterizedIdentifierIsFutureWork;
import models.algebra.UnificationFailed;
import models.algebra.ValueUndefined;
import models.dataConstraintModel.ChannelMember;
import models.dataConstraintModel.ResourcePath;
import models.dataFlowModel.DataTransferChannel;
import models.dataFlowModel.DataTransferModel;
import models.dataFlowModel.ResolvingMultipleDefinitionIsFutureWork;
import parser.Parser;
import parser.Parser.TokenStream;
import parser.exceptions.ExpectedColon;
import parser.exceptions.ExpectedDoubleQuotation;
import parser.exceptions.ExpectedRightBracket;
import parser.exceptions.WrongJsonExpression;
import simulator.Event;
import simulator.Resource;
import simulator.Simulator;
import simulator.SystemState;
import simulator.interfaces.INativeReceiver;
import simulator.interfaces.NativeSender;
public class NativeAccessTest {
@Test
public void test() {
try {
TokenStream stream = new Parser.TokenStream();
Parser parser = new Parser(stream);
// Construct a data transfer architecture model.
DataTransferModel model = new DataTransferModel();
ResourcePath sampleText = new ResourcePath("sampleText");
model.addResourcePath(sampleText);
DataTransferChannel nativeInputEventChannel = new DataTransferChannel("NativeInput");
nativeInputEventChannel.setNative(true);
ChannelMember textIn = new ChannelMember(sampleText);
stream.addLine("curText:Str");
Expression curStateIn = parser.parseTerm(stream, model);
stream.addLine("input(nextText)");
Expression messageIn = parser.parseTerm(stream, model);
stream.addLine("nextText");
Expression nextStateIn = parser.parseTerm(stream, model);
textIn.getStateTransition().setCurStateExpression(curStateIn);
textIn.getStateTransition().setMessageExpression(messageIn);
textIn.getStateTransition().setNextStateExpression(nextStateIn);
nativeInputEventChannel.addChannelMemberAsOutput(textIn);
model.addInputChannel(nativeInputEventChannel);
DataTransferChannel nativeOutputEventChannel = new DataTransferChannel("NativeOutput");
nativeOutputEventChannel.setNative(true);
ChannelMember textOut = new ChannelMember(sampleText);
stream.addLine("curText:Str");
Expression curStateOut = parser.parseTerm(stream, model);
stream.addLine("output(nextText)");
Expression messageOut = parser.parseTerm(stream, model);
stream.addLine("nextText");
Expression nextStateOut = parser.parseTerm(stream, model);
textOut.getStateTransition().setCurStateExpression(curStateOut);
textOut.getStateTransition().setMessageExpression(messageOut);
textOut.getStateTransition().setNextStateExpression(nextStateOut);
nativeOutputEventChannel.addChannelMemberAsInput(textOut);
model.addChannel(nativeOutputEventChannel);
TypeInference.infer(model);
// Create simulator
Simulator simulator = new Simulator(model);
// Initial state
SystemState initialState = simulator.init();
Resource ioResource = initialState.getResource("sampleText");
// Connect the simulator and native code
NativeSender textSender = new NativeSender(simulator, nativeInputEventChannel, sampleText, ioResource) { // Native code => model
};
INativeReceiver textReceiver = new INativeReceiver() { // Model to native code
@Override
public void onReceiveFromModel(Event event, SystemState nextSystemState) { // Receive a message from the model
Expression message = event.getMessage();
System.out.println(message);
}
};
simulator.addNativeReceiver(textReceiver, nativeOutputEventChannel);
stream.addLine("input(\"HelloWorld\")");
Expression sendMessage = parser.parseTerm(stream, model);
textSender.sendToModel(sendMessage); // Send a message to the model
} catch (ExpectedRightBracket | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) {
e.printStackTrace();
}
}
}