From 145992519b794fad4c0e01df7510f0425b8ecfd0 Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 10 Aug 2011 19:08:22 +0200 Subject: [PATCH] a test for typing during copy commit with a visible lookup present --- .../completion/JavaAutoPopupTest.groovy | 56 +++++++++++++++---- .../CompletionAutoPopupTestCase.groovy | 8 ++- .../CompletionProgressIndicator.java | 2 +- .../codeInsight/lookup/impl/LookupImpl.java | 4 +- 4 files changed, 53 insertions(+), 17 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy index 693f6b106dca..0b31df1b68f9 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy @@ -41,6 +41,7 @@ import com.intellij.openapi.fileEditor.FileEditor import com.intellij.openapi.fileEditor.FileEditorManager import com.intellij.openapi.progress.ProgressManager import com.intellij.psi.PsiFile +import com.intellij.util.Consumer /** * @author peter @@ -518,8 +519,17 @@ public interface Test { } } + static class LongContributor extends CompletionContributor { + + @Override + void fillCompletionVariants(CompletionParameters parameters, CompletionResultSet result) { + result.runRemainingContributors(parameters, { result.passResult(it) } as Consumer) + Thread.sleep 1000 + } + } + public void testDuringCompletionMustFinish() { - registerLongCompletionContributor() + registerContributor(LongReplacementOffsetContributor) edt { myFixture.addFileToProject 'directory/foo.txt', '' } myFixture.configureByText "a.java", 'public interface Test { RuntiExcexxx }' @@ -532,10 +542,10 @@ public interface Test { myFixture.checkResult 'public interface Test { RuntimeExceptionx }' } - private def registerLongCompletionContributor() { + private def registerContributor(final Class contributor, LoadingOrder order = LoadingOrder.LAST) { def ep = Extensions.rootArea.getExtensionPoint("com.intellij.completion.contributor") - def bean = new CompletionContributorEP(language: 'JAVA', implementationClass: LongReplacementOffsetContributor.name) - ep.registerExtension(bean, LoadingOrder.LAST) + def bean = new CompletionContributorEP(language: 'JAVA', implementationClass: contributor.name) + ep.registerExtension(bean, order) disposeOnTearDown({ ep.unregisterExtension(bean) } as Disposable) } @@ -685,7 +695,7 @@ class Foo { } public void testRestartAndTypingDuringCopyCommit() { - registerLongCompletionContributor() + registerContributor(LongReplacementOffsetContributor) myFixture.configureByText("a.java", """ class Foo { { int newa; } } """) myFixture.type 'n' @@ -701,7 +711,7 @@ class Foo { } public void testAutoRestartAndTypingDuringCopyCommit() { - registerLongCompletionContributor() + registerContributor(LongReplacementOffsetContributor) myFixture.configureByText("a.java", """ class Foo { { int iteraaa; } } """) type 'ite' @@ -717,7 +727,7 @@ class Foo { } public void _testChoosingItemDuringCopyCommit() { - registerLongCompletionContributor() + registerContributor(LongReplacementOffsetContributor) myFixture.configureByText("a.java", """ class Foo { { int iteraaa; } } """) type 'ite' @@ -730,19 +740,41 @@ class Foo { } public void testRestartWithInvisibleLookup() { - registerLongCompletionContributor() + registerContributor(LongReplacementOffsetContributor) myFixture.configureByText("a.java", """ class Foo { { int abcdef; } } """) myFixture.type 'a' joinAutopopup() assert lookup edt { myFixture.type 'bc' } - joinAlarm() - joinAlarm() - joinCompletion() + joinAutopopup() + joinAutopopup() joinCompletion() assert lookup - edt { assert lookup.shown } + assert lookup.shown + } + + public void testRestartWithVisibleLookup() { + registerContributor(LongContributor, LoadingOrder.FIRST) + + myFixture.configureByText("a.java", """ class Foo { { int abcdef; a } } """) + myFixture.completeBasic() + while (!lookup.shown) { + Thread.sleep(1) + } + def l = lookup + edt { + assert lookup.calculating + myFixture.type 'b' + } + joinCommit { + myFixture.type 'c' + } + joinAutopopup() + joinCompletion() + assert lookup == l + assert !lookup.calculating + assert lookup.shown } private void joinSomething(int degree) { diff --git a/java/testFramework/src/com/intellij/codeInsight/completion/CompletionAutoPopupTestCase.groovy b/java/testFramework/src/com/intellij/codeInsight/completion/CompletionAutoPopupTestCase.groovy index 34912ef0d2b3..b5e7db07b6db 100644 --- a/java/testFramework/src/com/intellij/codeInsight/completion/CompletionAutoPopupTestCase.groovy +++ b/java/testFramework/src/com/intellij/codeInsight/completion/CompletionAutoPopupTestCase.groovy @@ -24,7 +24,6 @@ import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.editor.ex.DocumentEx import com.intellij.psi.PsiDocumentManager import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase -import com.intellij.util.concurrency.Semaphore import com.intellij.util.ui.UIUtil import java.util.concurrent.atomic.AtomicBoolean @@ -88,11 +87,14 @@ abstract class CompletionAutoPopupTestCase extends LightCodeInsightFixtureTestCa fail("Too long completion") } - protected def joinCommit() { + protected def joinCommit(Closure cl = {}) { final AtomicBoolean committed = new AtomicBoolean() edt { PsiDocumentManager.getInstance(project).cancelAndRunWhenAllCommitted("wait for all comm") { - ApplicationManager.application.invokeLater { committed.set(true) } + ApplicationManager.application.invokeLater { + cl() + committed.set(true) + } } } def start = System.currentTimeMillis() diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java index d35f238a94ed..b87ac12fb412 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java @@ -134,6 +134,7 @@ public class CompletionProgressIndicator extends ProgressIndicatorBase implement myLookup.setCalculating(true); myQueue = new MergingUpdateQueue("completion lookup progress", 200, true, myEditor.getContentComponent()); + myQueue.setPassThrough(false); ApplicationManager.getApplication().assertIsDispatchThread(); registerItself(); @@ -386,7 +387,6 @@ public class CompletionProgressIndicator extends ProgressIndicatorBase implement myItemSorters.put(item.getLookupElement(), (CompletionSorterImpl) item.getSorter()); myLookup.addItem(item.getLookupElement(), item.getPrefixMatcher()); myCount++; - if (unitTestMode) return; if (myCount == 1) { ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java index 2f74928c860d..7317cb2334d9 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java @@ -796,7 +796,9 @@ public class LookupImpl extends LightweightHint implements LookupEx, Disposable } public boolean isShown() { - ApplicationManager.getApplication().assertIsDispatchThread(); + if (!ApplicationManager.getApplication().isUnitTestMode()) { + ApplicationManager.getApplication().assertIsDispatchThread(); + } return myShown; }