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(); } }