summaryrefslogtreecommitdiff
path: root/platform/platform-tests/testSrc/com/intellij/psi/impl/PsiDocumentManagerImplTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/platform-tests/testSrc/com/intellij/psi/impl/PsiDocumentManagerImplTest.java')
-rw-r--r--platform/platform-tests/testSrc/com/intellij/psi/impl/PsiDocumentManagerImplTest.java68
1 files changed, 65 insertions, 3 deletions
diff --git a/platform/platform-tests/testSrc/com/intellij/psi/impl/PsiDocumentManagerImplTest.java b/platform/platform-tests/testSrc/com/intellij/psi/impl/PsiDocumentManagerImplTest.java
index b1ab5117dba9..693c23766d62 100644
--- a/platform/platform-tests/testSrc/com/intellij/psi/impl/PsiDocumentManagerImplTest.java
+++ b/platform/platform-tests/testSrc/com/intellij/psi/impl/PsiDocumentManagerImplTest.java
@@ -25,11 +25,13 @@ import com.intellij.openapi.editor.impl.event.DocumentEventImpl;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ex.ProjectManagerEx;
+import com.intellij.openapi.util.ThrowableComputable;
+import com.intellij.openapi.util.io.FileUtil;
+import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
+import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.psi.PsiDocumentManager;
-import com.intellij.psi.PsiFile;
-import com.intellij.psi.PsiManager;
+import com.intellij.psi.*;
import com.intellij.psi.impl.source.PsiFileImpl;
import com.intellij.testFramework.LeakHunter;
import com.intellij.testFramework.LightVirtualFile;
@@ -40,6 +42,7 @@ import com.intellij.util.concurrency.Semaphore;
import com.intellij.util.ui.UIUtil;
import java.io.File;
+import java.io.IOException;
import java.util.concurrent.atomic.AtomicInteger;
public class PsiDocumentManagerImplTest extends PlatformLangTestCase {
@@ -394,4 +397,63 @@ public class PsiDocumentManagerImplTest extends PlatformLangTestCase {
});
assertTrue(commitThread.isEnabled());
}
+
+ public void testFileChangesToText() throws IOException {
+ VirtualFile vFile = getVirtualFile(createTempFile("a.txt", "abc"));
+ PsiFile psiFile = getPsiManager().findFile(vFile);
+ Document document = getPsiDocumentManager().getDocument(psiFile);
+
+ rename(vFile, "a.xml");
+ assertFalse(psiFile.isValid());
+ assertNotSame(psiFile, getPsiManager().findFile(vFile));
+ psiFile = getPsiManager().findFile(vFile);
+
+ assertSame(document, FileDocumentManager.getInstance().getDocument(vFile));
+ assertSame(document, getPsiDocumentManager().getDocument(psiFile));
+ }
+
+ public void testFileChangesToBinary() throws IOException {
+ VirtualFile vFile = getVirtualFile(createTempFile("a.txt", "abc"));
+ PsiFile psiFile = getPsiManager().findFile(vFile);
+ Document document = getPsiDocumentManager().getDocument(psiFile);
+
+ rename(vFile, "a.zip");
+ assertFalse(psiFile.isValid());
+ psiFile = getPsiManager().findFile(vFile);
+ assertInstanceOf(psiFile, PsiBinaryFile.class);
+
+ assertNoFileDocumentMapping(vFile, psiFile, document);
+ assertEquals("abc", document.getText());
+ }
+
+ public void testFileBecomesTooLarge() throws Exception {
+ VirtualFile vFile = getVirtualFile(createTempFile("a.txt", "abc"));
+ PsiFile psiFile = getPsiManager().findFile(vFile);
+ Document document = getPsiDocumentManager().getDocument(psiFile);
+
+ makeFileTooLarge(vFile);
+ assertFalse(psiFile.isValid());
+ psiFile = getPsiManager().findFile(vFile);
+ assertInstanceOf(psiFile, PsiLargeFile.class);
+
+ assertNoFileDocumentMapping(vFile, psiFile, document);
+ assertEquals("abc", document.getText());
+ }
+
+ private void assertNoFileDocumentMapping(VirtualFile vFile, PsiFile psiFile, Document document) {
+ assertNull(FileDocumentManager.getInstance().getDocument(vFile));
+ assertNull(FileDocumentManager.getInstance().getFile(document));
+ assertNull(getPsiDocumentManager().getPsiFile(document));
+ assertNull(getPsiDocumentManager().getDocument(psiFile));
+ }
+
+ private void makeFileTooLarge(final VirtualFile vFile) throws Exception {
+ WriteCommandAction.runWriteCommandAction(myProject, new ThrowableComputable<Object, Exception>() {
+ @Override
+ public Object compute() throws Exception {
+ VfsUtil.saveText(vFile, StringUtil.repeat("a", FileUtil.LARGE_FOR_CONTENT_LOADING + 1));
+ return null;
+ }
+ });
+ }
}