From 6fba2f70231ac0e761a25b491ac994f3d3d5ac9c Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Thu, 25 Oct 2018 17:03:00 +0300 Subject: [PATCH] move to the community project --- .../intellij/psi/PsiDocumentManager2Test.java | 130 ++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 java/java-tests/testSrc/com/intellij/psi/PsiDocumentManager2Test.java diff --git a/java/java-tests/testSrc/com/intellij/psi/PsiDocumentManager2Test.java b/java/java-tests/testSrc/com/intellij/psi/PsiDocumentManager2Test.java new file mode 100644 index 000000000000..0979ed123f4e --- /dev/null +++ b/java/java-tests/testSrc/com/intellij/psi/PsiDocumentManager2Test.java @@ -0,0 +1,130 @@ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.psi; + +import com.intellij.codeHighlighting.BackgroundEditorHighlighter; +import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer; +import com.intellij.ide.highlighter.XmlLikeFileType; +import com.intellij.lang.StdLanguages; +import com.intellij.lang.java.JavaLanguage; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.ReadAction; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.fileEditor.FileDocumentManager; +import com.intellij.openapi.fileEditor.FileEditor; +import com.intellij.openapi.fileEditor.TextEditor; +import com.intellij.openapi.fileEditor.impl.text.AsyncEditorLoader; +import com.intellij.openapi.fileEditor.impl.text.TextEditorProvider; +import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.impl.PsiManagerEx; +import com.intellij.testFramework.PlatformTestCase; +import com.intellij.testFramework.PsiTestCase; +import com.intellij.util.LocalTimeCounter; +import com.intellij.util.ObjectUtils; +import com.intellij.util.ui.UIUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Future; + +@PlatformTestCase.WrapInCommand +public class PsiDocumentManager2Test extends PsiTestCase { + public void testUnregisteredFileType() { + class MyFileType extends XmlLikeFileType { + private MyFileType() { + super(StdLanguages.XML); + } + + @Override + @NotNull + public String getName() { + return "MY"; + } + + @Override + @NotNull + public String getDefaultExtension() { + return "my"; + } + + @Override + @NotNull + public String getDescription() { + return "my own"; + } + + @Override + @Nullable + public Icon getIcon() { + return null; + } + } + PsiFile file = PsiFileFactory.getInstance(myProject).createFileFromText("DummyFile.my", new MyFileType(), "", LocalTimeCounter.currentTime(), true); + Document document = ObjectUtils.assertNotNull(PsiDocumentManager.getInstance(myProject).getDocument(file)); + + assertTrue(document.isWritable()); + assertTrue(file.getVirtualFile().getFileType() instanceof MyFileType); + assertTrue(DaemonCodeAnalyzer.getInstance(getProject()).isHighlightingAvailable(file)); + } + + public void testPsiToDocSyncInNonPhysicalFile() { + PsiJavaFile file = (PsiJavaFile)PsiFileFactory.getInstance(myProject).createFileFromText("a.java", JavaLanguage.INSTANCE, "class Foo {}", false, false); + + Document document = FileDocumentManager.getInstance().getDocument(file.getViewProvider().getVirtualFile()); + assertNotNull(document); + + file.getClasses()[0].getModifierList().setModifierProperty(PsiModifier.PUBLIC, true); + + assertEquals("public class Foo {}", document.getText()); + assertFalse(PsiDocumentManager.getInstance(myProject).isUncommited(document)); + } + + public void testDocumentCanSuddenlyBecomeUncommittedIfLightAndTextEditorBackgroundHighlighterDoesntFreakOutAtThatMoment() throws Exception { + ApplicationManager.getApplication().assertIsDispatchThread(); + assertEmpty(PsiDocumentManager.getInstance(getProject()).getUncommittedDocuments()); + PsiJavaCodeReferenceCodeFragment fragment = + JavaCodeFragmentFactory.getInstance(getProject()).createReferenceCodeFragment("xxx", null, false, true); + + VirtualFile file = fragment.getViewProvider().getVirtualFile(); + Document document = ObjectUtils.assertNotNull(FileDocumentManager.getInstance().getDocument(file)); + + assertNotNull(file); + FileViewProvider provider = fragment.getViewProvider(); + assertNotNull(provider.getPsi(fragment.getLanguage())); + assertNotNull(provider); + assertSame(provider, ((PsiManagerEx)getPsiManager()).getFileManager().findCachedViewProvider(file)); + + Future modification = ApplicationManager.getApplication().executeOnPooledThread(() -> ReadAction.compute(() -> { + document.insertString(0, "c"); + + Document uncommitted = assertOneElement(PsiDocumentManager.getInstance(getProject()).getUncommittedDocuments()); + assertSame(document, uncommitted); + + return document; + })); + PsiFile toHighlight = createFile("x.txt", "text"); + FileEditor fileEditor = TextEditorProvider.getInstance().createEditor(getProject(), toHighlight.getVirtualFile()); + Disposer.register(getTestRootDisposable(), fileEditor); + CompletableFuture passesCreated = new CompletableFuture<>(); + AsyncEditorLoader.performWhenLoaded(((TextEditor)fileEditor).getEditor(), () -> { + try { + BackgroundEditorHighlighter highlighter = fileEditor.getBackgroundHighlighter(); + highlighter.createPassesForEditor(); // check didn't crash in TextEditorBackgroundHighlighter.getPasses() isCommitted() check + passesCreated.complete(null); + } + catch (Throwable e) { + passesCreated.completeExceptionally(e); + } + }); + + long start = System.currentTimeMillis(); + while (!PsiDocumentManager.getInstance(getProject()).isCommitted(document) || !modification.isDone() || !passesCreated.isDone()) { + UIUtil.dispatchAllInvocationEvents(); + assertTrue(System.currentTimeMillis() < start + 100 * 1000); + } + modification.get(); + passesCreated.get(); + } +}