import com.intellij.execution.ExecutionException; import com.intellij.execution.ExecutionModes; import com.intellij.openapi.application.PathManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.ruby.ruby.run.RubyScriptRunner; import org.jetbrains.plugins.ruby.ruby.sdk.RubySdkType; import org.jetbrains.plugins.ruby.ruby.sdk.RubySdkUtil; import org.jetbrains.ruby.codeInsight.types.signature.RSignatureContract; import org.jetbrains.ruby.runtime.signature.server.SignatureServer; import org.junit.Assert; import java.util.Collections; import java.util.logging.Logger; public class CallStatCompletionTest extends LightPlatformCodeInsightFixtureTestCase { private static final Logger LOGGER = Logger.getLogger("CallStatCompletionTest"); @Override protected String getTestDataPath() { return "src/test/testData"; } public void testSimple() { doTest("sample_test", "foo", "test1", "test2"); } public void testKW() { doTest("sample_kw_test", "foo1", "test1", "test2"); } public void testMultipleExecution() { executeScript("multiple_execution_test1.rb"); RSignatureContract contract = doTestContract("multiple_execution_test2", "foo2"); Assert.assertEquals(contract.getLevels().size(), 2); Assert.assertEquals(contract.getLevels().get(1).size(), 1); } public void testRefLinks() { RSignatureContract contract = doTestContract("ref_links_test", "doo"); Assert.assertEquals(contract.getLevels().size(), 4); Assert.assertEquals(contract.getLevels().get(1).size(), 3); Assert.assertEquals(contract.getLevels().get(2).size(), 2); Assert.assertEquals(contract.getLevels().get(3).size(), 2); } public void testMerge() { RSignatureContract contract1 = doTestContract("merge_test1", "doo1"); RSignatureContract contract2 = doTestContract("merge_test2", "doo2"); contract1.merge(contract2); Assert.assertEquals(contract1.getLevels().size(), 3); Assert.assertEquals(contract1.getLevels().get(1).size(), 1); Assert.assertEquals(contract1.getLevels().get(2).size(), 1); Assert.assertEquals(contract1.getLevels().get(2).get(0).getTransitionKeys().size(), 2); } private void executeScript(@NotNull String runnableScriptName) { final String scriptPath = PathManager.getAbsolutePath(getTestDataPath() + "/" + runnableScriptName); final String versionName = "2.3.0"; final String sdkPath = "/home/viuginick/.rbenv/versions/2.3.0/bin/ruby"; final Sdk rubySdk = RubySdkUtil.findOrCreateMockSdk(RubySdkType.getInstance(), versionName, sdkPath, Collections.singletonList(sdkPath)); final Module module = myFixture.getModule(); try { RubyScriptRunner.runRubyScript(rubySdk, module, scriptPath, myFixture.getTestDataPath(), new ExecutionModes.SameThreadMode(30), null, null, ""); } catch (ExecutionException e) { LOGGER.severe(e.getMessage()); e.printStackTrace(); } } private RSignatureContract run(@NotNull String name, @NotNull String method_name) { final String scriptName = name + ".rb"; final String runnableScriptName = name + "_to_run.rb"; myFixture.configureByFiles(scriptName, runnableScriptName); executeScript(runnableScriptName); SignatureServer callStatServer = SignatureServer.getInstance(); RSignatureContract contract = null; int cnt = 0; while (contract == null && cnt < 10) { try { Thread.sleep(100); } catch (InterruptedException e) { LOGGER.severe(e.getMessage()); e.printStackTrace(); } RSignatureContract currContract = callStatServer.getContractByMethodName(method_name); if (currContract != null && !currContract.locked) contract = currContract; cnt++; } return contract; } private void doTest(@NotNull String name, @NotNull String method_name, String... items) { final String scriptName = name + ".rb"; run(name, method_name); myFixture.testCompletionVariants(scriptName, items); } private RSignatureContract doTestContract(@NotNull String name, @NotNull String method_name) { return run(name, method_name); } }