package jetbrains.mps.traceInfo.test;
/*Generated by MPS */
import jetbrains.mps.PlatformMpsTest;
import jetbrains.mps.project.Project;
import jetbrains.mps.textgen.trace.TraceInfoProvider;
import org.junit.Before;
import jetbrains.mps.testbench.BaseMpsTest;
import java.io.File;
import jetbrains.mps.util.PathManager;
import jetbrains.mps.textgen.trace.DefaultTraceInfoProvider;
import org.junit.After;
import org.junit.Test;
import jetbrains.mps.baseLanguage.closures.runtime._FunctionTypes;
import junit.framework.Assert;
import jetbrains.mps.smodel.SNodePointer;
import jetbrains.mps.textgen.trace.TraceInfo;
import java.util.function.Predicate;
import org.jetbrains.mps.openapi.model.SModel;
import org.jetbrains.mps.openapi.model.SNode;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
import java.util.List;
import org.jetbrains.mps.openapi.model.SNodeReference;
import jetbrains.mps.internal.collections.runtime.Sequence;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations;
import jetbrains.mps.baseLanguage.behavior.Classifier__BehaviorDescriptor;
import jetbrains.mps.internal.collections.runtime.IWhereFilter;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SPropertyOperations;
import jetbrains.mps.debug.api.breakpoints.BreakpointLocation;
import jetbrains.mps.textgen.trace.DebugInfo;
import jetbrains.mps.textgen.trace.BaseLanguageNodeLookup;
public class TraceInfoTest extends PlatformMpsTest {
private Project myProject;
private TraceInfoProvider myTraceProvider;
public TraceInfoTest() {
}
@Before
public void setUp() {
myProject = BaseMpsTest.openProject(new File(PathManager.getHomePath() + "/languages/languageDesign/traceinfo"));
myTraceProvider = new DefaultTraceInfoProvider(myProject.getRepository());
}
@After
public void tearDown() {
cleanup(myProject);
myProject = null;
myTraceProvider = null;
}
@Test
public void precondition() {
invokeTestWithModelRead(new _FunctionTypes._void_P0_E0() {
public void invoke() {
Assert.assertNotNull(new SNodePointer("r:fc539459-610a-408b-8472-ac3a7316412f(jetbrains.mps.traceInfo.test@tests)", "8529179251482782650").resolve(myProject.getRepository()));
Assert.assertTrue(TraceInfo.hasTrace(new SNodePointer("r:fc539459-610a-408b-8472-ac3a7316412f(jetbrains.mps.traceInfo.test@tests)", "8529179251482782650").getModelReference().resolve(myProject.getRepository())));
Assert.assertTrue("Trace provider by model long name (no stereotype)", myTraceProvider.debugInfo(new SNodePointer("r:fc539459-610a-408b-8472-ac3a7316412f(jetbrains.mps.traceInfo.test@tests)", "8529179251482782650").getModelReference().getName().getLongName()).findAny().isPresent());
Assert.assertTrue("Trace provider by exact model name", myTraceProvider.debugInfo(new SNodePointer("r:fc539459-610a-408b-8472-ac3a7316412f(jetbrains.mps.traceInfo.test@tests)", "8529179251482782650").getModelReference().getName(), new Predicate<SModel>() {
public boolean test(SModel m) {
return true;
}
}).findAny().isPresent());
}
});
}
@Test
public void ifTest() {
invokeTestWithModelRead(new _FunctionTypes._void_P0_E0() {
public void invoke() {
SNode node = getErrorLocation(new _FunctionTypes._void_P0_E0() {
public void invoke() {
TestClass.ifTest();
}
});
Assert.assertTrue("Node " + node.getNodeId().toString() + " is of concept " + SNodeOperations.getConcept(node), SNodeOperations.isInstanceOf(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b217L, "jetbrains.mps.baseLanguage.structure.IfStatement")));
}
});
}
@Test
public void forTest() {
invokeTestWithModelRead(new _FunctionTypes._void_P0_E0() {
public void invoke() {
SNode node = getErrorLocation(new _FunctionTypes._void_P0_E0() {
public void invoke() {
TestClass.forTest();
}
});
Assert.assertTrue("Node " + node.getNodeId().toString() + " is of concept " + SNodeOperations.getConcept(node), SNodeOperations.isInstanceOf(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10a698082feL, "jetbrains.mps.baseLanguage.structure.ForStatement")));
}
});
}
@Test
public void blockStatementTest() {
invokeTestWithModelRead(new _FunctionTypes._void_P0_E0() {
public void invoke() {
SNode node = getErrorLocation(new _FunctionTypes._void_P0_E0() {
public void invoke() {
TestClass.blockStatementTest();
}
});
Assert.assertTrue("Node " + node.getNodeId().toString() + " is of concept " + SNodeOperations.getConcept(node), SNodeOperations.isInstanceOf(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10f3ee082d8L, "jetbrains.mps.baseLanguage.structure.ThrowStatement")));
}
});
}
@Test
public void foreachTest() {
invokeTestWithModelRead(new _FunctionTypes._void_P0_E0() {
public void invoke() {
try {
TestClass.foreachTest();
} catch (Throwable t) {
StackTraceElement stackTraceElement = t.getStackTrace()[0];
List<SNodeReference> variableNodesForPosition = myTraceProvider.debugInfo(getModelName(stackTraceElement)).findFirst().get().getVariableNodesForPosition(stackTraceElement.getFileName(), stackTraceElement.getLineNumber(), "it");
Assert.assertFalse(variableNodesForPosition.isEmpty());
SNode node = variableNodesForPosition.get(0).resolve(myProject.getRepository());
Assert.assertNotNull(node);
Assert.assertTrue("Node " + node + " for variable it.", SNodeOperations.isInstanceOf(node, MetaAdapterFactory.getConcept(0x8388864671ce4f1cL, 0x9c53c54016f6ad4fL, 0x10cac6f0962L, "jetbrains.mps.baseLanguage.collections.structure.ForEachVariable")));
}
}
});
}
@Test
public void generatedForeachTest() {
invokeTestWithModelRead(new _FunctionTypes._void_P0_E0() {
public void invoke() {
try {
TestClass.generatedForeachTest();
} catch (Throwable t) {
StackTraceElement stackTraceElement = t.getStackTrace()[0];
List<SNodeReference> variableNodesForPosition = myTraceProvider.debugInfo(getModelName(stackTraceElement)).findFirst().get().getVariableNodesForPosition(stackTraceElement.getFileName(), stackTraceElement.getLineNumber(), "it_gen");
Assert.assertFalse(variableNodesForPosition.isEmpty());
SNode node = variableNodesForPosition.get(0).resolve(myProject.getRepository());
Assert.assertNotNull(node);
Assert.assertTrue("Node " + node + " for variable it_gen.", SNodeOperations.isInstanceOf(node, MetaAdapterFactory.getConcept(0x8388864671ce4f1cL, 0x9c53c54016f6ad4fL, 0x10cac6f0962L, "jetbrains.mps.baseLanguage.collections.structure.ForEachVariable")));
}
}
});
}
private static String getModelName(StackTraceElement stackTraceElement) {
String className = stackTraceElement.getClassName();
return className.substring(0, className.lastIndexOf('.'));
}
@Test
public void internalClassTest() {
invokeTestWithModelRead(new _FunctionTypes._void_P0_E0() {
public void invoke() {
SNode testClass = SNodeOperations.cast(new SNodePointer("r:fc539459-610a-408b-8472-ac3a7316412f(jetbrains.mps.traceInfo.test@tests)", "8529179251482782650").resolve(myProject.getRepository()), MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c108ca66L, "jetbrains.mps.baseLanguage.structure.ClassConcept"));
SNode statement = Sequence.fromIterable(SLinkOperations.collectMany(SLinkOperations.collect(Sequence.fromIterable(Classifier__BehaviorDescriptor.methods_id4_LVZ3pBKCn.invoke(testClass)).where(new IWhereFilter<SNode>() {
public boolean accept(SNode it) {
return SPropertyOperations.getString(it, MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name")).equals("internalClassTest");
}
}), MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b1fcL, 0xf8cc56b1ffL, "body")), MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b200L, 0xf8cc6bf961L, "statement"))).first();
BreakpointLocation location = new BreakpointLocation(statement);
Assert.assertEquals("jetbrains.mps.traceInfo.test.TestClass", location.getTargetUnitName());
}
});
}
private void invokeTestWithModelRead(final _FunctionTypes._void_P0_E0 test) {
myProject.getRepository().getModelAccess().runReadAction(new Runnable() {
public void run() {
test.invoke();
}
});
}
private SNode getErrorLocation(_FunctionTypes._void_P0_E0 method) {
try {
method.invoke();
} catch (Throwable t) {
StackTraceElement stackTraceElement = t.getStackTrace()[0];
DebugInfo di = myTraceProvider.debugInfo(getModelName(stackTraceElement)).findFirst().get();
SNodeReference nodeRef = new BaseLanguageNodeLookup(di).getNodeAt(stackTraceElement.getFileName(), stackTraceElement.getLineNumber());
return (nodeRef == null ? null : nodeRef.resolve(myProject.getRepository()));
}
return null;
}
private void cleanup(final Project p) {
BaseMpsTest.getEnvironment().flushAllEvents();
}
}