package org.marketcetera.util.file;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.Vector;
import org.apache.commons.lang.ArrayUtils;
import org.junit.Test;
import org.marketcetera.util.misc.OperatingSystem;
import org.marketcetera.util.test.TestCaseBase;
import static org.junit.Assert.*;
import static org.junit.Assume.*;
import static org.marketcetera.util.test.CollectionAssert.*;
/**
* @author tlerios@marketcetera.com
* @since 0.5.0
* @version $Id: SmartLinksDirectoryWalkerTest.java 16154 2012-07-14 16:34:05Z colin $
*/
/* $License$ */
public class SmartLinksDirectoryWalkerTest
extends TestCaseBase
{
private static final String TEST_ROOT=
DIR_ROOT+File.separator+"directory_walker"+File.separator;
private static final String TEST_DIR_WIN32=
"win32";
private static final String TEST_DIR_UNIX=
"unix";
private static final String TEST_ROOT_WIN32=
TEST_ROOT+TEST_DIR_WIN32+File.separator;
private static final String TEST_ROOT_UNIX=
TEST_ROOT+TEST_DIR_UNIX+File.separator;
private static final String TEST_NONEXISTENT_FILE=
TEST_ROOT+"nonexistent";
private static final String TEST_FILE=
"a.txt";
private static final String TEST_LINK_NAME=
"e";
private static final String TEST_LINK_PATH=
"a"+File.separator+TEST_LINK_NAME;
private static final String TEST_LINK_CONTENTS=
"e.txt";
private static final String[] TEST_FILE_LIST=new String[] {
"a.txt", "b.txt","c.txt","d.txt",TEST_LINK_CONTENTS};
private static final String[] TEST_DIR_LIST=new String[] {
"a","b","c","d"};
public static final class ListWalker
extends SmartLinksDirectoryWalker
{
private Vector<String> mFiles=new Vector<String>();
private Vector<String> mDirectories=new Vector<String>();
private int mMaxDepth=-1;
public ListWalker
(boolean followLinks)
{
super(followLinks);
}
public String[] getFiles()
{
return mFiles.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
}
public String[] getDirectories()
{
return mDirectories.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
}
public int getMaxDepth()
{
return mMaxDepth;
}
@SuppressWarnings("unchecked")
@Override
protected boolean handleDirectory
(File directory,
int depth,
Collection results)
throws IOException
{
return (super.handleDirectory(directory,depth,results) &&
!".svn".equals(directory.getName()));
}
@SuppressWarnings("unchecked")
@Override
protected void handleDirectoryStart
(File directory,
int depth,
Collection results)
{
mDirectories.add(directory.getName());
if (results!=null) {
results.add(directory.getName());
}
if (depth>mMaxDepth) {
mMaxDepth=depth;
}
}
@SuppressWarnings("unchecked")
@Override
protected void handleFile
(File file,
int depth,
Collection results)
{
mFiles.add(file.getName());
if (results!=null) {
results.add(file.getName());
}
if (depth>mMaxDepth) {
mMaxDepth=depth;
}
}
}
@Test
public void singleFile()
throws Exception
{
ListWalker walker=new ListWalker(false);
walker.apply(TEST_ROOT+TEST_FILE);
assertArrayPermutation
(new String[] {TEST_FILE},walker.getFiles());
assertArrayPermutation
(ArrayUtils.EMPTY_STRING_ARRAY,walker.getDirectories());
assertEquals(0,walker.getMaxDepth());
Vector<String> results=new Vector<String>();
walker=new ListWalker(false);
walker.apply(TEST_ROOT+TEST_FILE,results);
assertArrayPermutation
(new String[] {TEST_FILE},walker.getFiles());
assertArrayPermutation
(ArrayUtils.EMPTY_STRING_ARRAY,walker.getDirectories());
assertArrayPermutation
(new String[] {TEST_FILE},results.toArray
(ArrayUtils.EMPTY_STRING_ARRAY));
assertEquals(0,walker.getMaxDepth());
walker=new ListWalker(true);
walker.apply(TEST_ROOT+TEST_FILE);
assertArrayPermutation
(new String[] {TEST_FILE},walker.getFiles());
assertArrayPermutation
(ArrayUtils.EMPTY_STRING_ARRAY,walker.getDirectories());
assertEquals(0,walker.getMaxDepth());
results=new Vector<String>();
walker=new ListWalker(true);
walker.apply(TEST_ROOT+TEST_FILE,results);
assertArrayPermutation
(new String[] {TEST_FILE},walker.getFiles());
assertArrayPermutation
(ArrayUtils.EMPTY_STRING_ARRAY,walker.getDirectories());
assertArrayPermutation
(new String[] {TEST_FILE},
results.toArray(ArrayUtils.EMPTY_STRING_ARRAY));
assertEquals(0,walker.getMaxDepth());
}
@Test
public void singleLink()
throws Exception
{
assumeTrue(OperatingSystem.LOCAL.isUnix());
ListWalker walker=new ListWalker(false);
walker.apply(TEST_ROOT_UNIX+TEST_LINK_PATH);
assertArrayPermutation
(new String[] {TEST_LINK_NAME},walker.getFiles());
assertArrayPermutation
(ArrayUtils.EMPTY_STRING_ARRAY,walker.getDirectories());
assertEquals(0,walker.getMaxDepth());
Vector<String> results=new Vector<String>();
walker=new ListWalker(false);
walker.apply(TEST_ROOT_UNIX+TEST_LINK_PATH,results);
assertArrayPermutation
(new String[] {TEST_LINK_NAME},walker.getFiles());
assertArrayPermutation
(ArrayUtils.EMPTY_STRING_ARRAY,walker.getDirectories());
assertArrayPermutation
(new String[] {TEST_LINK_NAME},
results.toArray(ArrayUtils.EMPTY_STRING_ARRAY));
assertEquals(0,walker.getMaxDepth());
walker=new ListWalker(true);
walker.apply(TEST_ROOT_UNIX+TEST_LINK_PATH);
assertArrayPermutation
(new String[] {TEST_LINK_CONTENTS},walker.getFiles());
assertArrayPermutation
(new String[] {TEST_LINK_NAME},walker.getDirectories());
assertEquals(1,walker.getMaxDepth());
results=new Vector<String>();
walker=new ListWalker(true);
walker.apply(TEST_ROOT_UNIX+TEST_LINK_PATH,results);
assertArrayPermutation
(new String[] {TEST_LINK_CONTENTS},walker.getFiles());
assertArrayPermutation
(new String[] {TEST_LINK_NAME},walker.getDirectories());
assertArrayPermutation
(new String[] {TEST_LINK_NAME,TEST_LINK_CONTENTS},
results.toArray(ArrayUtils.EMPTY_STRING_ARRAY));
assertEquals(1,walker.getMaxDepth());
}
@Test
public void nonexistentFiles()
throws Exception
{
ListWalker walker=new ListWalker(false);
walker.apply(TEST_NONEXISTENT_FILE);
assertArrayPermutation
(ArrayUtils.EMPTY_STRING_ARRAY,walker.getFiles());
assertArrayPermutation
(ArrayUtils.EMPTY_STRING_ARRAY,walker.getDirectories());
assertEquals(-1,walker.getMaxDepth());
Vector<String> results=new Vector<String>();
walker=new ListWalker(true);
walker.apply(TEST_NONEXISTENT_FILE,results);
assertArrayPermutation
(ArrayUtils.EMPTY_STRING_ARRAY,walker.getFiles());
assertArrayPermutation
(ArrayUtils.EMPTY_STRING_ARRAY,walker.getDirectories());
assertArrayPermutation
(ArrayUtils.EMPTY_STRING_ARRAY,
results.toArray(ArrayUtils.EMPTY_STRING_ARRAY));
assertEquals(-1,walker.getMaxDepth());
}
@Test
public void walk()
throws Exception
{
String root;
String dir;
String[] files=TEST_FILE_LIST;
if (OperatingSystem.LOCAL.isUnix()) {
dir=TEST_DIR_UNIX;
root=TEST_ROOT_UNIX;
files=(String[])ArrayUtils.add(files,TEST_LINK_NAME);
} else if (OperatingSystem.LOCAL.isWin32()) {
dir=TEST_DIR_WIN32;
root=TEST_ROOT_WIN32;
} else {
throw new AssertionError("Unknown platform");
}
String[] dirs=(String[])ArrayUtils.add(TEST_DIR_LIST,dir);
ListWalker walker=new ListWalker(false);
walker.apply(root);
assertArrayPermutation(files,walker.getFiles());
assertArrayPermutation(dirs,walker.getDirectories());
assertEquals(3,walker.getMaxDepth());
Vector<String> results=new Vector<String>();
walker=new ListWalker(false);
walker.apply(root,results);
assertArrayPermutation(files,walker.getFiles());
assertArrayPermutation(dirs,walker.getDirectories());
assertArrayPermutation
(ArrayUtils.addAll(files,dirs),
results.toArray(ArrayUtils.EMPTY_STRING_ARRAY));
assertEquals(3,walker.getMaxDepth());
files=TEST_FILE_LIST;
dirs=(String[])ArrayUtils.add(TEST_DIR_LIST,dir);
if (OperatingSystem.LOCAL.isUnix()) {
files=(String[])ArrayUtils.add(files,TEST_LINK_CONTENTS);
dirs=(String[])ArrayUtils.add(dirs,TEST_LINK_NAME);
}
walker=new ListWalker(true);
walker.apply(root);
assertArrayPermutation(files,walker.getFiles());
assertArrayPermutation(dirs,walker.getDirectories());
assertEquals(3,walker.getMaxDepth());
results=new Vector<String>();
walker=new ListWalker(true);
walker.apply(root,results);
assertArrayPermutation(files,walker.getFiles());
assertArrayPermutation(dirs,walker.getDirectories());
assertArrayPermutation
(ArrayUtils.addAll(files,dirs),
results.toArray(ArrayUtils.EMPTY_STRING_ARRAY));
assertEquals(3,walker.getMaxDepth());
}
}