import java.io.*; import java.util.*; import junit.framework.*; import junit.extensions.converter.*; public class DirTest extends TestCase { public DirTest(String name) { super(name); } private List createFiles; protected void setUp() throws Exception { super.setUp(); createFiles = new ArrayList(); } protected void tearDown() throws Exception { for (int i = createFiles.size() - 1; 0 <= i; --i) { String fileName = (String)createFiles.get(i); new File(fileName).delete(); } super.tearDown(); } private void createFile(String fileName, String content) throws Exception { FileWriter writer = new FileWriter(fileName); writer.write(content); writer.close(); createFiles.add(fileName); } private void createDir(String dirName) throws Exception { new File(dirName).mkdir(); createFiles.add(dirName); } private void scenario() throws Exception { createDir("testdir"); createFile("testdir/A.txt", "This is A.txt"); createDir("testdir/subdir"); createDir("testdir/subdir.tmp"); createFile("testdir/subdir/B.txt", "This is B.txt"); createFile("testdir/subdir/C.txt", "This is C.txt"); createFile("testdir/subdir/C.tmp", "This is C.tmp"); } private static class DirConverter extends SpecificObjectConverter { public DirConverter(Converter converter) { super(converter); } protected boolean canConvertSelf(Object o) { if (!(o instanceof File)) return false; return ((File)o).isDirectory(); } protected Object convertSelf(Object o) { File[] files = ((File)o).listFiles(); Map map = new TreeMap(); for (int i = 0; i < files.length; ++i) { File file = files[i]; map.put(file.getName(), new Property(file.getName(), file)); } return map.values(); } } private static class FileConverter extends SpecificObjectConverter { public FileConverter(Converter converter) { super(converter); } protected boolean canConvertSelf(Object o) { if (!(o instanceof File)) return false; return !((File)o).isDirectory(); } protected Object convertSelf(Object o) { StringBuffer buf = new StringBuffer(); int c; try { Reader reader = new BufferedReader(new FileReader((File)o)); while((c = reader.read()) != -1) { buf.append((char)c); } reader.close(); } catch (IOException ex) { buf.append(ex.getMessage()); } return buf.toString(); } } private static class FilterOutTempFileConverter extends SpecificObjectConverter { public FilterOutTempFileConverter(Converter converter) { super(converter); } protected boolean canConvertSelf(Object o) { if (!(o instanceof File)) return false; return ((File)o).getName().endsWith(".tmp"); } protected Object convertSelf(Object o) { return Converter.INVISIBLE; } } public void test() throws Exception { Converter converter = new DefaultConverter(); converter = new DirConverter(converter); converter = new FileConverter(converter); converter = new FilterOutTempFileConverter(converter); scenario(); Object expected = new Object[] { "A.txt=This is A.txt", new Property("subdir", new Object[]{ "B.txt=This is B.txt", "C.txt=This is C.txt", }), }; converter.assertEquals(expected, new File("testdir"), 2); } }