/*
 * Copyright (C) 2017 The Guava Authors
 *
 * 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 com.google.common.io;

import static com.google.common.truth.Truth.assertThat;

import com.google.common.collect.Iterables;
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import java.io.IOException;
import java.nio.file.Path;
import junit.framework.TestCase;

/**
 * Tests for {@link MoreFiles#fileTraverser()}.
 *
 * @author Jens Nyman
 */

public class MoreFilesFileTraverserTest extends TestCase {

  private Path rootDir;

  @Override
  public void setUp() throws IOException {
    rootDir = Files.createTempDir().toPath();
  }

  @Override
  public void tearDown() throws IOException {
    MoreFiles.deleteRecursively(rootDir);
  }

  public void testFileTraverser_emptyDirectory() throws Exception {
    assertThat(MoreFiles.fileTraverser().breadthFirst(rootDir)).containsExactly(rootDir);
  }

  public void testFileTraverser_nonExistingFile() throws Exception {
    Path file = rootDir.resolve("file-that-doesnt-exist");

    assertThat(MoreFiles.fileTraverser().breadthFirst(file)).containsExactly(file);
  }

  public void testFileTraverser_file() throws Exception {
    Path file = newFile("some-file");

    assertThat(MoreFiles.fileTraverser().breadthFirst(file)).containsExactly(file);
  }

  public void testFileTraverser_singleFile() throws Exception {
    Path file = newFile("some-file");

    assertThat(MoreFiles.fileTraverser().breadthFirst(rootDir)).containsExactly(rootDir, file);
  }

  public void testFileTraverser_singleDirectory() throws Exception {
    Path file = newDir("some-dir");

    assertThat(MoreFiles.fileTraverser().breadthFirst(rootDir)).containsExactly(rootDir, file);
  }

  public void testFileTraverser_multipleFilesAndDirectories() throws Exception {
    Path fileA = newFile("file-a");
    Path fileB = newFile("file-b");
    Path dir1 = newDir("dir-1");
    Path dir2 = newDir("dir-2");

    assertThat(MoreFiles.fileTraverser().breadthFirst(rootDir))
        .containsExactly(rootDir, fileA, fileB, dir1, dir2);
  }

  public void testFileTraverser_multipleDirectoryLayers_breadthFirstStartsWithTopLayer()
      throws Exception {
    Path fileA = newFile("file-a");
    Path dir1 = newDir("dir-1");
    newFile("dir-1/file-b");
    newFile("dir-1/dir-2");

    assertThat(Iterables.limit(MoreFiles.fileTraverser().breadthFirst(rootDir), 3))
        .containsExactly(rootDir, fileA, dir1);
  }

  public void testFileTraverser_multipleDirectoryLayers_traversalReturnsAll() throws Exception {
    Path fileA = newFile("file-a");
    Path dir1 = newDir("dir-1");
    Path fileB = newFile("dir-1/file-b");
    Path dir2 = newFile("dir-1/dir-2");

    assertThat(MoreFiles.fileTraverser().breadthFirst(rootDir))
        .containsExactly(rootDir, fileA, fileB, dir1, dir2);
  }

  @CanIgnoreReturnValue
  private Path newDir(String name) {
    Path dir = rootDir.resolve(name);
    dir.toFile().mkdir();
    return dir;
  }

  @CanIgnoreReturnValue
  private Path newFile(String name) throws IOException {
    Path file = rootDir.resolve(name);
    file.toFile().createNewFile();
    return file;
  }
}

@@ -727,16 +727,100 @@
 rables;%0A
+import com.google.common.jimfs.Configuration;%0Aimport com.google.common.jimfs.Jimfs;%0A
 import c
@@ -898,24 +898,52 @@
 OException;%0A
+import java.nio.file.Files;%0A
 import java.
@@ -1231,37 +1231,100 @@
 r = 
-Files.createTempDir().toPath(
+Jimfs.newFileSystem(Configuration.unix()).getPath(%22/tmp%22);%0A    Files.createDirectory(rootDir
 );%0A 
@@ -1393,43 +1393,38 @@
     
-MoreFiles.deleteRecursively(rootDir
+rootDir.getFileSystem().close(
 );%0A 
@@ -3570,16 +3570,35 @@
 ng name)
+ throws IOException
  %7B%0A    P
@@ -3638,27 +3638,33 @@
     
-dir.toFile().mk
+Files.createDirectory(
 dir
-(
 );%0A 
@@ -3811,36 +3811,28 @@
     
-file.toFile().createNewF
+MoreFiles.touch(f
 ile
-(
 );%0A 

Fix tests that failed if we couldn't recursively delete securely by using Jimfs and just getting rid of the whole file system each time.