]> source.dussan.org Git - poi.git/commitdiff
Recursive delete unit test based on users@ query - working fine already
authorNick Burch <nick@apache.org>
Tue, 6 Dec 2016 13:52:46 +0000 (13:52 +0000)
committerNick Burch <nick@apache.org>
Tue, 6 Dec 2016 13:52:46 +0000 (13:52 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1772894 13f79535-47bb-0310-9956-ffa450edef68

src/testcases/org/apache/poi/poifs/filesystem/TestNPOIFSFileSystem.java

index f4a18a03d28194004f584502d5583d705c2cb4f9..c600c3212097ed015604390380ff8c596ed8c0ae 100644 (file)
@@ -34,6 +34,7 @@ import org.apache.poi.hpsf.PropertySet;
 import org.apache.poi.hpsf.PropertySetFactory;
 import org.apache.poi.hpsf.SummaryInformation;
 import org.apache.poi.poifs.common.POIFSConstants;
+import org.apache.poi.poifs.property.DirectoryProperty;
 import org.apache.poi.poifs.property.NPropertyTable;
 import org.apache.poi.poifs.property.Property;
 import org.apache.poi.poifs.property.RootProperty;
@@ -1483,4 +1484,58 @@ public final class TestNPOIFSFileSystem {
        
        assertThat(wbDataExp, equalTo(wbDataAct));
    }
+   
+   /**
+    * Ensure that you can recursively delete directories and their
+    *  contents
+    */
+   @Test
+   public void RecursiveDelete() throws Exception {
+       File testFile = POIDataSamples.getSpreadSheetInstance().getFile("SimpleMacro.xls");
+       NPOIFSFileSystem src = new NPOIFSFileSystem(testFile);
+
+       // Starts out with 5 entries:
+       //  _VBA_PROJECT_CUR
+       //  SummaryInformation <(0x05)SummaryInformation>
+       //  DocumentSummaryInformation <(0x05)DocumentSummaryInformation>
+       //  Workbook
+       //  CompObj <(0x01)CompObj>
+       assertEquals(5, _countChildren(src._get_property_table().getRoot()));
+       assertEquals(5, src.getRoot().getEntryCount());
+       
+       // Grab the VBA project root
+       DirectoryEntry vbaProj = (DirectoryEntry)src.getRoot().getEntry("_VBA_PROJECT_CUR");
+       assertEquals(3, vbaProj.getEntryCount());
+       // Can't delete yet, has stuff
+       assertEquals(false, vbaProj.delete());
+       // Recursively delete
+       _recursiveDeletee(vbaProj);
+       
+       // Entries gone
+       assertEquals(4, _countChildren(src._get_property_table().getRoot()));
+       assertEquals(4, src.getRoot().getEntryCount());
+       
+       // Done
+       src.close();
+   }
+   private void _recursiveDeletee(Entry entry) throws IOException {
+       if (entry.isDocumentEntry()) {
+           assertEquals(true, entry.delete());
+           return;
+       }
+       
+       DirectoryEntry dir = (DirectoryEntry)entry;
+       String[] names = dir.getEntryNames().toArray(new String[dir.getEntryCount()]);
+       for (String name : names) {
+           Entry ce = dir.getEntry(name);
+           _recursiveDeletee(ce);
+       }
+       assertEquals(true, dir.delete());
+   }
+   @SuppressWarnings("unused")
+   private int _countChildren(DirectoryProperty p) {
+       int count = 0;
+       for (Property cp : p) { count++; }
+       return count;
+   }
 }