JAL-3746 apply copyright to tests
[jalview.git] / test / jalview / io / BackupFilesTest.java
index c1a8d4c..a356621 100644 (file)
@@ -1,26 +1,49 @@
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ * 
+ * This file is part of Jalview.
+ * 
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License 
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *  
+ * Jalview is distributed in the hope that it will be useful, but 
+ * WITHOUT ANY WARRANTY; without even the implied warranty 
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+ * PURPOSE.  See the GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
 package jalview.io;
 
-import jalview.bin.Cache;
-import jalview.datamodel.AlignmentI;
-import jalview.datamodel.Sequence;
-import jalview.datamodel.SequenceI;
-import jalview.gui.AlignFrame;
-import jalview.gui.JvOptionPane;
-
 import java.io.File;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.Arrays;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
 import java.util.List;
 import java.util.TreeMap;
 
-import org.junit.Assert;
+import org.testng.Assert;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
+import jalview.bin.Cache;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceI;
+import jalview.gui.AlignFrame;
+import jalview.gui.JvOptionPane;
+
 public class BackupFilesTest
 {
   @BeforeClass(alwaysRun = true)
@@ -31,15 +54,21 @@ public class BackupFilesTest
   }
 
   private static boolean actuallyDeleteTmpFiles = true;
-  private static String testDir = "examples";
 
-  private static String testFilename = "backupfilestest.fa";
+  private static String testDir = "test/jalview/io";
+
+  private static String testBasename = "backupfilestest";
+
+  private static String testExt = ".fa";
 
+  private static String testFilename = testBasename + testExt;
 
   private static String testFile = testDir + File.separatorChar
           + testFilename;
 
-  private static String newFilename = "backupfilestestTemp.fa";
+  private static String newBasename = testBasename + "Temp";
+
+  private static String newFilename = newBasename + testExt;
 
   private static String newFile = testDir + File.separatorChar
           + newFilename;
@@ -52,7 +81,7 @@ public class BackupFilesTest
 
   private static String suffix = "_BACKUPTEST-%n";
 
-  private static int digits = 8;
+  private static int digits = 6;
 
   private static int rollMax = 2;
 
@@ -67,7 +96,7 @@ public class BackupFilesTest
     setBackupFilesOptions(false, true, true);
 
     // init the newFile and backups (i.e. make sure newFile exists on its own
-    // and has no backups)
+    // and has no backups
     initNewFileForTesting();
 
     // now save again
@@ -78,6 +107,33 @@ public class BackupFilesTest
     Assert.assertTrue(backupFiles.length == 0);
   }
 
+  // save with no numbers in the backup file names
+  @Test(groups = { "Functional" })
+  public void backupsEnabledSingleFileBackupTest() throws Exception
+  {
+    // Enable BackupFiles and set noMax so all backupfiles get kept
+    String mysuffix = "~";
+    BackupFilesPresetEntry bfpe = new BackupFilesPresetEntry(mysuffix, 1,
+            false, true, 1, false);
+    setBackupFilesOptions(true, false, true,
+            "test/jalview/io/testProps_singlefilebackup.jvprops", bfpe);
+
+    // init the newFile and backups (i.e. make sure newFile exists on its own
+    // and has no backups)
+    initNewFileForTesting();
+    HashMap<Integer, String> correctindexmap = new HashMap<>();
+    correctindexmap.put(0, "backupfilestestTemp.fa~");
+
+    save();
+    Assert.assertTrue(checkBackupFiles(correctindexmap, newFile, "~", 1));
+
+    // and a second time -- see JAL-3628
+    save();
+    Assert.assertTrue(checkBackupFiles(correctindexmap, newFile, "~", 1));
+
+    cleanupTmpFiles(newFile, "~", 1);
+  }
+
   // save keeping all backup files
   @Test(groups = { "Functional" })
   public void backupsEnabledNoRollMaxTest() throws Exception
@@ -98,10 +154,32 @@ public class BackupFilesTest
     }
 
     // check 10 backup files
-    int[] indexes1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
+    HashMap<Integer, String> correctindexmap = new HashMap<>();
+    correctindexmap.put(1, "backupfilestestTemp.fa_BACKUPTEST-000001");
+    correctindexmap.put(2, "backupfilestestTemp.fa_BACKUPTEST-000002");
+    correctindexmap.put(3, "backupfilestestTemp.fa_BACKUPTEST-000003");
+    correctindexmap.put(4, "backupfilestestTemp.fa_BACKUPTEST-000004");
+    correctindexmap.put(5, "backupfilestestTemp.fa_BACKUPTEST-000005");
+    correctindexmap.put(6, "backupfilestestTemp.fa_BACKUPTEST-000006");
+    correctindexmap.put(7, "backupfilestestTemp.fa_BACKUPTEST-000007");
+    correctindexmap.put(8, "backupfilestestTemp.fa_BACKUPTEST-000008");
+    correctindexmap.put(9, "backupfilestestTemp.fa_BACKUPTEST-000009");
+    correctindexmap.put(10, "backupfilestestTemp.fa_BACKUPTEST-000010");
+    HashMap<Integer, String> wrongindexmap = new HashMap<>();
+    wrongindexmap.put(1, "backupfilestestTemp.fa_BACKUPTEST-1");
+    wrongindexmap.put(2, "backupfilestestTemp.fa_BACKUPTEST-000002");
+    wrongindexmap.put(3, "backupfilestestTemp.fa_BACKUPTEST-000003");
+    wrongindexmap.put(4, "backupfilestestTemp.fa_BACKUPTEST-000004");
+    wrongindexmap.put(5, "backupfilestestTemp.fa_BACKUPTEST-000005");
+    wrongindexmap.put(6, "backupfilestestTemp.fa_BACKUPTEST-000006");
+    wrongindexmap.put(7, "backupfilestestTemp.fa_BACKUPTEST-000007");
+    wrongindexmap.put(8, "backupfilestestTemp.fa_BACKUPTEST-000008");
+    wrongindexmap.put(9, "backupfilestestTemp.fa_BACKUPTEST-000009");
+    wrongindexmap.put(10, "backupfilestestTemp.fa_BACKUPTEST-000010");
     int[] indexes2 = { 3, 4, 5, 6, 7, 8, 9, 10 };
     int[] indexes3 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
-    Assert.assertTrue(checkBackupFiles(indexes1));
+    Assert.assertTrue(checkBackupFiles(correctindexmap));
+    Assert.assertFalse(checkBackupFiles(wrongindexmap));
     Assert.assertFalse(checkBackupFiles(indexes2));
     Assert.assertFalse(checkBackupFiles(indexes3));
   }
@@ -127,10 +205,12 @@ public class BackupFilesTest
 
     // check there are "rollMax" backup files and they are all saved correctly
     // check 10 backup files
-    int[] indexes1 = { 9, 10 };
+    HashMap<Integer, String> correctindexmap = new HashMap<>();
+    correctindexmap.put(9, "backupfilestestTemp.fa_BACKUPTEST-000009");
+    correctindexmap.put(10, "backupfilestestTemp.fa_BACKUPTEST-000010");
     int[] indexes2 = { 10 };
     int[] indexes3 = { 8, 9, 10 };
-    Assert.assertTrue(checkBackupFiles(indexes1));
+    Assert.assertTrue(checkBackupFiles(correctindexmap));
     Assert.assertFalse(checkBackupFiles(indexes2));
     Assert.assertFalse(checkBackupFiles(indexes3));
   }
@@ -156,10 +236,12 @@ public class BackupFilesTest
 
     // check there are "rollMax" backup files and they are all saved correctly
     // check 10 backup files
-    int[] indexes1 = { 1, 2 };
+    HashMap<Integer, String> correctindexmap = new HashMap<>();
+    correctindexmap.put(1, "backupfilestestTemp.fa_BACKUPTEST-000001");
+    correctindexmap.put(2, "backupfilestestTemp.fa_BACKUPTEST-000002");
     int[] indexes2 = { 1 };
     int[] indexes3 = { 1, 2, 3 };
-    Assert.assertTrue(checkBackupFiles(indexes1));
+    Assert.assertTrue(checkBackupFiles(correctindexmap));
     Assert.assertFalse(checkBackupFiles(indexes2));
     Assert.assertFalse(checkBackupFiles(indexes3));
   }
@@ -172,8 +254,22 @@ public class BackupFilesTest
   private void setBackupFilesOptions(boolean enabled, boolean reverse,
           boolean noMax)
   {
-    Cache.loadProperties("test/jalview/io/testProps.jvprops");
+    BackupFilesPresetEntry bfpe = new BackupFilesPresetEntry(suffix, digits,
+            reverse, noMax, rollMax, false);
+    setBackupFilesOptions(enabled, reverse, noMax,
+            "test/jalview/io/testProps.jvprops", bfpe);
+  }
 
+  private void setBackupFilesOptions(boolean enabled, boolean reverse,
+          boolean noMax, String propsFile, BackupFilesPresetEntry bfpe)
+  {
+    Cache.loadProperties(propsFile);
+
+    Cache.applicationProperties.setProperty(BackupFiles.ENABLED,
+            Boolean.toString(enabled));
+    Cache.applicationProperties.setProperty(
+            BackupFilesPresetEntry.SAVEDCONFIG, bfpe.toString());
+    /*
     Cache.applicationProperties.setProperty(BackupFiles.ENABLED,
             Boolean.toString(enabled));
     Cache.applicationProperties.setProperty(BackupFiles.SUFFIX, suffix);
@@ -187,13 +283,14 @@ public class BackupFilesTest
             Integer.toString(rollMax));
     Cache.applicationProperties.setProperty(BackupFiles.CONFIRM_DELETE_OLD,
             "false");
+            */
   }
 
   private void save()
   {
     if (af != null)
     {
-    af.saveAlignment(newFile, jalview.io.FileFormat.Fasta);
+      af.saveAlignment(newFile, jalview.io.FileFormat.Fasta);
     }
   }
 
@@ -232,12 +329,18 @@ public class BackupFilesTest
   @AfterClass(alwaysRun = true)
   private void cleanupTmpFiles()
   {
-    File newfile = new File(newFile);
+    cleanupTmpFiles(newFile, suffix, digits);
+  }
+
+  protected static void cleanupTmpFiles(String file, String mysuffix,
+          int mydigits)
+  {
+    File newfile = new File(file);
     if (newfile.exists())
     {
       newfile.delete();
     }
-    File[] tmpFiles = BackupFiles.lsBackupFiles(newFile, suffix, digits);
+    File[] tmpFiles = getBackupFiles(file, mysuffix, mydigits);
     for (int i = 0; i < tmpFiles.length; i++)
     {
       if (actuallyDeleteTmpFiles)
@@ -251,15 +354,69 @@ public class BackupFilesTest
     }
   }
 
+  private static File[] getBackupFiles(String f, String s, int i)
+  {
+    TreeMap<Integer, File> bfTreeMap = BackupFiles
+            .getBackupFilesAsTreeMap(f, s, i);
+    File[] backupFiles = new File[bfTreeMap.size()];
+    bfTreeMap.values().toArray(backupFiles);
+    return backupFiles;
+  }
+
   private static File[] getBackupFiles()
   {
-    return BackupFiles.lsBackupFiles(newFile, suffix, digits);
+    return getBackupFiles(newFile, suffix, digits);
+  }
+
+  private static boolean checkBackupFiles(HashMap<Integer, String> indexmap)
+          throws IOException
+  {
+    return checkBackupFiles(indexmap, newFile, suffix, digits);
+  }
+
+  private static boolean checkBackupFiles(HashMap<Integer, String> indexmap,
+          String file, String mysuffix, int mydigits) throws IOException
+  {
+    TreeMap<Integer, File> map = BackupFiles.getBackupFilesAsTreeMap(file,
+            mysuffix, mydigits);
+    Enumeration<Integer> indexesenum = Collections
+            .enumeration(indexmap.keySet());
+    while (indexesenum.hasMoreElements())
+    {
+      int i = indexesenum.nextElement();
+      String indexfilename = indexmap.get(i);
+      if (!map.containsKey(i))
+      {
+        return false;
+      }
+      File f = map.get(i);
+      if (!filesContentEqual(newFile, f.getPath()))
+      {
+        return false;
+      }
+      map.remove(i);
+      if (f == null)
+      {
+        return false;
+      }
+      if (!f.getName().equals(indexfilename))
+      {
+        return false;
+      }
+    }
+    // should be nothing left in map
+    if (map.size() > 0)
+    {
+      return false;
+    }
+
+    return true;
   }
 
   private static boolean checkBackupFiles(int[] indexes) throws IOException
   {
-    TreeMap<Integer, File> map = BackupFiles.lsBackupFilesAsTreeMap(newFile,
-            suffix, digits);
+    TreeMap<Integer, File> map = BackupFiles
+            .getBackupFilesAsTreeMap(newFile, suffix, digits);
     for (int m = 0; m < indexes.length; m++)
     {
       int i = indexes[m];
@@ -277,6 +434,16 @@ public class BackupFilesTest
       {
         return false;
       }
+      // check the filename -- although this uses the same code to forumulate
+      // the filename so not much of a test!
+      String filename = BackupFilenameParts.getBackupFilename(i,
+              newBasename + testExt, suffix, digits);
+      if (!filename.equals(f.getName()))
+      {
+        System.out.println("Supposed filename '" + filename
+                + "' not equal to actual filename '" + f.getName() + "'");
+        return false;
+      }
     }
     // should be nothing left in map
     if (map.size() > 0)
@@ -289,7 +456,7 @@ public class BackupFilesTest
 
   private static String[] getBackupFilesAsStrings()
   {
-    File[] files = BackupFiles.lsBackupFiles(newFile, suffix, digits);
+    File[] files = getBackupFiles(newFile, suffix, digits);
     String[] filenames = new String[files.length];
     for (int i = 0; i < files.length; i++)
     {
@@ -298,10 +465,14 @@ public class BackupFilesTest
     return filenames;
   }
 
-  public static boolean sequencesEqual(SequenceI s1, SequenceI s2) {
-    if (s1 == null && s2 == null) {
+  public static boolean sequencesEqual(SequenceI s1, SequenceI s2)
+  {
+    if (s1 == null && s2 == null)
+    {
       return true;
-    } else if (s1 == null || s2 == null) {
+    }
+    else if (s1 == null || s2 == null)
+    {
       return false;
     }
     return (s1.getName().equals(s2.getName())