JAL-1705 refine feature copying to including 5' and 3' overlaps
[jalview.git] / test / jalview / analysis / AlignmentUtilsTests.java
index 09bd64e..a82a881 100644 (file)
@@ -1342,6 +1342,9 @@ public class AlignmentUtilsTests
             "AAA---CCCTTT---");
   }
 
+  /**
+   * Tests for transferring features between mapped sequences
+   */
   @Test(groups = { "Functional" })
   public void testTransferFeatures()
   {
@@ -1380,34 +1383,111 @@ public class AlignmentUtilsTests
             new int[] { 1, 6 }, 1, 1);
 
     /*
-     * behaviour of transferFeatures depends on MapList.locateInTo()
-     * if start and end positions are mapped, returns the mapped region
-     * if either is not mapped, does _not_ search for overlapped region 
+     * transferFeatures() will build 'partial overlap' for regions
+     * that partially overlap 5' or 3' (start or end) of target sequence
      */
-    AlignmentUtils.transferFeatures(dna, cds, map);
+    AlignmentUtils.transferFeatures(dna, cds, map, null);
     SequenceFeature[] sfs = cds.getSequenceFeatures();
-    assertEquals(4, sfs.length);
+    assertEquals(6, sfs.length);
 
     SequenceFeature sf = sfs[0];
+    assertEquals("type2", sf.getType());
+    assertEquals("desc2", sf.getDescription());
+    assertEquals(2f, sf.getScore());
+    assertEquals(1, sf.getBegin());
+    assertEquals(1, sf.getEnd());
+
+    sf = sfs[1];
     assertEquals("type3", sf.getType());
     assertEquals("desc3", sf.getDescription());
     assertEquals(3f, sf.getScore());
     assertEquals(1, sf.getBegin());
     assertEquals(3, sf.getEnd());
 
-    sf = sfs[1];
+    sf = sfs[2];
     assertEquals("type4", sf.getType());
     assertEquals(2, sf.getBegin());
     assertEquals(5, sf.getEnd());
 
-    sf = sfs[2];
+    sf = sfs[3];
     assertEquals("type5", sf.getType());
     assertEquals(1, sf.getBegin());
     assertEquals(6, sf.getEnd());
 
-    sf = sfs[3];
+    sf = sfs[4];
     assertEquals("type8", sf.getType());
     assertEquals(6, sf.getBegin());
     assertEquals(6, sf.getEnd());
+
+    sf = sfs[5];
+    assertEquals("type9", sf.getType());
+    assertEquals(6, sf.getBegin());
+    assertEquals(6, sf.getEnd());
+  }
+
+  /**
+   * Tests for transferring features between mapped sequences
+   */
+  @Test(groups = { "Functional" })
+  public void testTransferFeatures_withOmit()
+  {
+    SequenceI dna = new Sequence("dna/20-34", "acgTAGcaaGCCcgt");
+    SequenceI cds = new Sequence("cds/10-15", "TAGGCC");
+
+    MapList map = new MapList(new int[] { 4, 6, 10, 12 },
+            new int[] { 1, 6 }, 1, 1);
+  
+    // [5, 11] maps to [2, 5]
+    dna.addSequenceFeature(new SequenceFeature("type4", "desc4", 5, 11, 4f,
+            null));
+    // [4, 12] maps to [1, 6]
+    dna.addSequenceFeature(new SequenceFeature("type5", "desc5", 4, 12, 5f,
+            null));
+    // [12, 12] maps to [6, 6]
+    dna.addSequenceFeature(new SequenceFeature("type8", "desc8", 12, 12,
+            8f, null));
+  
+    // desc4 and desc8 are the 'omit these' varargs
+    AlignmentUtils.transferFeatures(dna, cds, map, null, "type4", "type8");
+    SequenceFeature[] sfs = cds.getSequenceFeatures();
+    assertEquals(1, sfs.length);
+  
+    SequenceFeature sf = sfs[0];
+    assertEquals("type5", sf.getType());
+    assertEquals(1, sf.getBegin());
+    assertEquals(6, sf.getEnd());
+  }
+
+  /**
+   * Tests for transferring features between mapped sequences
+   */
+  @Test(groups = { "Functional" })
+  public void testTransferFeatures_withSelect()
+  {
+    SequenceI dna = new Sequence("dna/20-34", "acgTAGcaaGCCcgt");
+    SequenceI cds = new Sequence("cds/10-15", "TAGGCC");
+  
+    MapList map = new MapList(new int[] { 4, 6, 10, 12 },
+            new int[] { 1, 6 }, 1, 1);
+  
+    // [5, 11] maps to [2, 5]
+    dna.addSequenceFeature(new SequenceFeature("type4", "desc4", 5, 11, 4f,
+            null));
+    // [4, 12] maps to [1, 6]
+    dna.addSequenceFeature(new SequenceFeature("type5", "desc5", 4, 12, 5f,
+            null));
+    // [12, 12] maps to [6, 6]
+    dna.addSequenceFeature(new SequenceFeature("type8", "desc8", 12, 12,
+            8f, null));
+  
+    // "type5" is the 'select this type' argument
+    AlignmentUtils.transferFeatures(dna, cds, map, "type5");
+    SequenceFeature[] sfs = cds.getSequenceFeatures();
+    assertEquals(1, sfs.length);
+  
+    SequenceFeature sf = sfs[0];
+    assertEquals("type5", sf.getType());
+    assertEquals(1, sf.getBegin());
+    assertEquals(6, sf.getEnd());
   }
 }