JAL-1152 with sticky annotation sort order that updates as sequences are
[jalview.git] / test / jalview / analysis / AnnotationSorterTest.java
index 879aa9b..97dabbc 100644 (file)
@@ -2,6 +2,7 @@ package jalview.analysis;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
+import jalview.analysis.AnnotationSorter.SortOrder;
 import jalview.datamodel.Alignment;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.Sequence;
@@ -97,7 +98,7 @@ public class AnnotationSorterTest
     // @formatter:on
 
     AnnotationSorter testee = new AnnotationSorter(al);
-    testee.sortBySequenceAndType(anns);
+    testee.sort(anns, SortOrder.SEQUENCE_AND_TYPE);
     assertEquals("label5", anns[0].label); // for sequence 0
     assertEquals("label0", anns[1].label); // for sequence 1
     assertEquals("iron", anns[2].label); // sequence 3 /iron
@@ -133,7 +134,7 @@ public class AnnotationSorterTest
     // @formatter:on
 
     AnnotationSorter testee = new AnnotationSorter(al);
-    testee.sortByTypeAndSequence(anns);
+    testee.sort(anns, SortOrder.TYPE_AND_SEQUENCE);
     assertEquals("IRON", anns[0].label); // IRON / sequence 0
     assertEquals("iron", anns[1].label); // iron / sequence 3
     assertEquals("label0", anns[2].label); // label0 / sequence 1
@@ -144,16 +145,16 @@ public class AnnotationSorterTest
   }
 
   @Test
-  public void testSortBySequenceAndType_timing()
+  public void testSort_timingPresorted()
   {
-    final long targetTime = 300;        // ms
+    final long targetTime = 100; // ms
     final int numSeqs = 10000;
     final int numAnns = 20000;
     al = buildAlignment(numSeqs);
     anns = buildAnnotations(numAnns);
 
     /*
-     * Set the annotations in random order with respect to the sequences
+     * Set the annotations presorted by label
      */
     Random r = new Random();
     final SequenceI[] sequences = al.getSequencesArray();
@@ -161,15 +162,102 @@ public class AnnotationSorterTest
     {
       SequenceI randomSequenceRef = sequences[r.nextInt(sequences.length)];
       anns[i].sequenceRef = randomSequenceRef;
+      anns[i].label = "label" + i;
     }
     long startTime = System.currentTimeMillis();
     AnnotationSorter testee = new AnnotationSorter(al);
-    testee.sortByTypeAndSequence(anns);
+    testee.sort(anns, SortOrder.TYPE_AND_SEQUENCE);
     long endTime = System.currentTimeMillis();
     final long elapsed = endTime - startTime;
-    System.out.println("Timing test for " + numSeqs + " sequences and "
+    System.out.println("Timing test for presorted " + numSeqs
+            + " sequences and "
             + numAnns + " annotations took " + elapsed + "ms");
     assertTrue("Sort took more than " + targetTime + "ms",
             elapsed <= targetTime);
   }
+
+  /**
+   * Timing test for sorting randomly sorted annotations
+   */
+  @Test
+  public void testSort_timingUnsorted()
+  {
+    final int numSeqs = 2000;
+    final int numAnns = 4000;
+    al = buildAlignment(numSeqs);
+    anns = buildAnnotations(numAnns);
+
+    /*
+     * Set the annotations in random order with respect to the sequences
+     */
+    Random r = new Random();
+    final SequenceI[] sequences = al.getSequencesArray();
+    for (int i = 0; i < anns.length; i++)
+    {
+      SequenceI randomSequenceRef = sequences[r.nextInt(sequences.length)];
+      anns[i].sequenceRef = randomSequenceRef;
+      anns[i].label = "label" + i;
+    }
+    long startTime = System.currentTimeMillis();
+    AnnotationSorter testee = new AnnotationSorter(al);
+    testee.sort(anns, SortOrder.SEQUENCE_AND_TYPE);
+    long endTime = System.currentTimeMillis();
+    final long elapsed = endTime - startTime;
+    System.out.println("Timing test for unsorted " + numSeqs
+            + " sequences and "
+            + numAnns + " annotations took " + elapsed + "ms");
+  }
+
+  /**
+   * Timing test for sorting annotations with a limited range of types (labels).
+   */
+  @Test
+  public void testSort_timingSemisorted()
+  {
+    final int numSeqs = 2000;
+    final int numAnns = 4000;
+    al = buildAlignment(numSeqs);
+    anns = buildAnnotations(numAnns);
+
+    String[] labels = new String[]
+    { "label1", "label2", "label3", "label4", "label5", "label6" };
+
+    /*
+     * Set the annotations in sequence order with randomly assigned labels.
+     */
+    Random r = new Random();
+    final SequenceI[] sequences = al.getSequencesArray();
+    for (int i = 0; i < anns.length; i++)
+    {
+      SequenceI sequenceRef = sequences[i % sequences.length];
+      anns[i].sequenceRef = sequenceRef;
+      anns[i].label = labels[r.nextInt(labels.length)];
+    }
+    long startTime = System.currentTimeMillis();
+    AnnotationSorter testee = new AnnotationSorter(al);
+    testee.sort(anns, SortOrder.TYPE_AND_SEQUENCE);
+    long endTime = System.currentTimeMillis();
+    long elapsed = endTime - startTime;
+    System.out.println("Sort by type for semisorted " + numSeqs
+            + " sequences and "
+            + numAnns + " annotations took " + elapsed + "ms");
+
+    // now resort by sequence
+    startTime = System.currentTimeMillis();
+    testee.sort(anns, SortOrder.SEQUENCE_AND_TYPE);
+    endTime = System.currentTimeMillis();
+    elapsed = endTime - startTime;
+    System.out.println("Resort by sequence for semisorted " + numSeqs
+            + " sequences and " + numAnns + " annotations took " + elapsed
+            + "ms");
+
+    // now resort by type
+    startTime = System.currentTimeMillis();
+    testee.sort(anns, SortOrder.TYPE_AND_SEQUENCE);
+    endTime = System.currentTimeMillis();
+    elapsed = endTime - startTime;
+    System.out.println("Resort by type for semisorted " + numSeqs
+            + " sequences and " + numAnns + " annotations took " + elapsed
+            + "ms");
+  }
 }