Package jetbrains.communicator.idea

Source Code of jetbrains.communicator.idea.VFSUtilTest$Updater

/*
* Copyright 2000-2006 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package jetbrains.communicator.idea;

import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ContentEntry;
import com.intellij.openapi.roots.ModifiableRootModel;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.testFramework.PlatformTestCase;
import jetbrains.communicator.core.vfs.VFile;
import junit.framework.AssertionFailedError;

import java.io.File;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

/**
* @author Kir
*/
public class VFSUtilTest extends PlatformTestCase {
  private VirtualFile myContentRoot;
  private VirtualFile mySourceRoot;
  private ContentEntry myContentEntry;
  private final Set<File> myFilesToDelete = new HashSet<File>();

  @Override
  protected void setUp() throws Exception {
    super.setUp();

    final File dir = createTempDirectory();
    updateRoots(new Updater() {
      @Override
      public void update(ModifiableRootModel modifiableModel) {
        myContentRoot = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(dir);
        try {
          VirtualFile src = myContentRoot.createChildDirectory(this, "src");
          myContentEntry = modifiableModel.addContentEntry(myContentRoot);
          myContentEntry.addSourceFolder(src, false);
        } catch (IOException e) {
          throw new RuntimeException(e);
        }
      }
    });

    ProjectRootManager rootManager = ProjectRootManager.getInstance(getProject());
    myContentRoot = rootManager.getContentRoots()[0];
    mySourceRoot = rootManager.getContentSourceRoots()[0];

    VFSUtil._setProject(getProject());
  }

  @Override
  protected void tearDown() throws Exception {
    try {
      for (File file : myFilesToDelete) {
        FileUtil.delete(file);
      }
    }
    finally {
      super.tearDown();
    }
  }

  @Override
  protected void runTest() throws Throwable {
    ApplicationManager.getApplication().runWriteAction(new Runnable() {
      @Override
      public void run() {
        try {
          VFSUtilTest.super.runTest();
        }
        catch (AssertionFailedError e) {
          throw e;
        }
        catch (Throwable throwable) {
          throw new RuntimeException(throwable);
        }
      }
    });
  }

  public void testNoContentRoot() throws Exception {
    File dir = createTempDirectory();
    VirtualFile someDir = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(dir);

    VirtualFile file = someDir.createChildData(this, "some.file");

    VFile vFile = VFSUtil.createFileFrom(file, null);

    assertNull("Wrong content path", vFile.getContentPath());
    assertEquals("Wrong full path", file.getPath(), vFile.getFullPath());
    assertNull("Should NOT restore Virtual File NOT FROM CONTENT ROOT: ", VFSUtil.getVirtualFile(vFile));
  }

  public void testInContentRoot() throws Exception {
    VirtualFile file = myContentRoot.createChildData(this, "some.file");

    checkVFile(file, getProject(), "/some.file", file.getPath());
    checkVFile(file, null, "/some.file", file.getPath());
  }

  public void testInSourceRoot() throws Exception {
    VirtualFile file = mySourceRoot.createChildData(this, "some.file");

    VFile vFile = checkVFile(file, getProject(), "/src/some.file", file.getPath());
    assertEquals("Wrong src path", "/some.file", vFile.getSourcePath());

    // Change our source path:
    final VirtualFile newSrc = myContentRoot.createChildDirectory(this, "new_src");
    updateRoots(new Updater() {
      @Override
      public void update(ModifiableRootModel modifiableModel) {
        myContentEntry = modifiableModel.getContentEntries()[0];
        myContentEntry.removeSourceFolder(myContentEntry.getSourceFolders()[0]);
        myContentEntry.addSourceFolder(newSrc, false);
      }
    });
    file.delete(this);
    VirtualFile childData = newSrc.createChildData(this, "some.file");
    VirtualFile virtualFile = VFSUtil.getVirtualFile(vFile);

    assertEquals("Should find source file basing on src path", childData, virtualFile);
  }

  private void updateRoots(final Updater updater) {
    ApplicationManager.getApplication().runWriteAction(new Runnable() {
      @Override
      public void run() {
        try {
          ModifiableRootModel modifiableModel = ModuleRootManager.getInstance(getModule()).getModifiableModel();
          updater.update(modifiableModel);
          modifiableModel.commit();
        }
        catch (Throwable e) {
          throw new RuntimeException(e);
        }
      }
    });
  }

  private interface Updater {
    void update(ModifiableRootModel modifiableModel);
  }

  private VFile checkVFile(VirtualFile file, Project project, String expectedPath, String expectedFullPath) {
    VFile vFile = VFSUtil.createFileFrom(file, project);

    if (project != null) {
      assertEquals("Wrong project", project.getName(), vFile.getProjectName());
    }
    else {
      assertNull("No project expected", vFile.getProjectName());
    }

    assertEquals("Wrong content path", expectedPath, vFile.getContentPath());
    assertEquals("Wrong full path", expectedFullPath, vFile.getFullPath());
    assertEquals("Should restore Virtual File from " + vFile,
        file, VFSUtil.getVirtualFile(vFile));

    return vFile;
  }
}
TOP

Related Classes of jetbrains.communicator.idea.VFSUtilTest$Updater

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.