package somepackage;

import com.intellij.testFramework.IdeaTestCase;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;

import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.FileOutputStream;
import java.io.Writer;

/**
 * Verifies that the contents of a directory changes after a refresh.
 *
 * @author skybrian
 */
public class RefreshChildrenTest extends IdeaTestCase {
  private File testDir;

  @Override
  protected void setUp() throws Exception {

    // the superclass sets tmpdir on every run and cleans up, but we want to do it our way

    String baseTempDir = System.getProperty("java.io.tmpdir");
    testDir = new File(baseTempDir, "RefreshChildrenTest." + getName());
    if (testDir.exists()) {
      // remove directory that's left over from the previous run
      removeDir(testDir);
    }

    super.setUp();
  }

  public void testRefreshSeesLatestDirectoryContents() throws Exception {
    assertFalse(testDir.exists());
    testDir.mkdir();
    assertTrue(testDir.isDirectory());
    writeFile(testDir, "Foo.java", "");

    LocalFileSystem local = LocalFileSystem.getInstance();
    VirtualFile virtualDir = local.findFileByIoFile(testDir);
    virtualDir.refresh(false, true);

    checkChildCount(virtualDir, 1);

    writeFile(testDir, "Bar.java", "");
    virtualDir.refresh(false, true);

    checkChildCount(virtualDir, 2);
  }

  private void writeFile(File dir, String filename, String contents) throws IOException {
    Writer writer = new OutputStreamWriter(new FileOutputStream(new File(dir, filename)), "UTF-8");
    writer.write(contents);
    writer.close();
  }

  private void checkChildCount(VirtualFile virtualDir, int expectedCount) {
    VirtualFile[] children = virtualDir.getChildren();
    if (children.length != expectedCount) {
      System.err.println("children:");
      for (VirtualFile child : children) {
        System.err.println(child.getPath());
      }
    }
    assertEquals(expectedCount, children.length);
  }

  private void removeDir(File testDir) {
    File[] children = testDir.listFiles();
    for (File child : children) {
      child.delete();
    }
    testDir.delete();
  }
}
