*/
package jalview.analysis;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
+import static org.testng.AssertJUnit.assertSame;
+import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.AssertJUnit.assertFalse;
+import static org.testng.AssertJUnit.assertTrue;
+import static org.testng.AssertJUnit.assertNull;
+import org.testng.annotations.Test;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.util.Set;
-import org.junit.Test;
-
import jalview.datamodel.AlignedCodonFrame;
import jalview.datamodel.Alignment;
import jalview.datamodel.AlignmentAnnotation;
"GGGTCAGGCAGT\n";
// @formatter:on
- public static Sequence ts=new Sequence("short","ASDASDASDASDASDASDASDASDASDASDASDASDASD");
+ // public static Sequence ts=new
+ // Sequence("short","ASDASDASDASDASDASDASDASDASDASDASDASDASD");
+ public static Sequence ts = new Sequence("short",
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklm");
@Test
- public void testExpandFlanks()
+ public void testExpandContext()
{
AlignmentI al = new Alignment(new Sequence[] {});
- for (int i=4;i<14;i+=3)
+ for (int i = 4; i < 14; i += 2)
{
SequenceI s1=ts.deriveSequence().getSubSequence(i, i+7);
al.addSequence(s1);
System.out.println(new AppletFormatAdapter().formatSequences("Clustal", al, true));
for (int flnk=-1;flnk<25; flnk++)
{
- AlignmentI exp;
- System.out.println("\nFlank size: "+flnk);
- System.out.println(new AppletFormatAdapter().formatSequences("Clustal", exp=AlignmentUtils.expandContext(al, flnk), true));
- if (flnk==-1) {
- for (SequenceI sq:exp.getSequences())
+ AlignmentI exp = AlignmentUtils.expandContext(al, flnk);
+ System.out.println("\nFlank size: " + flnk);
+ System.out.println(new AppletFormatAdapter().formatSequences(
+ "Clustal", exp, true));
+ if (flnk == -1)
{
+ /*
+ * Full expansion to complete sequences
+ */
+ for (SequenceI sq : exp.getSequences())
+ {
String ung = sq.getSequenceAsString().replaceAll("-+", "");
- assertTrue("Flanking sequence not the same as original dataset sequence.\n"+ung+"\n"+sq.getDatasetSequence().getSequenceAsString(),ung.equalsIgnoreCase(sq.getDatasetSequence().getSequenceAsString()));
+ final String errorMsg = "Flanking sequence not the same as original dataset sequence.\n"
+ + ung
+ + "\n"
+ + sq.getDatasetSequence().getSequenceAsString();
+ assertTrue(errorMsg, ung.equalsIgnoreCase(sq.getDatasetSequence()
+ .getSequenceAsString()));
+ }
}
+ else if (flnk == 24)
+ {
+ /*
+ * Last sequence is fully expanded, others have leading gaps to match
+ */
+ assertTrue(exp.getSequenceAt(4).getSequenceAsString()
+ .startsWith("abc"));
+ assertTrue(exp.getSequenceAt(3).getSequenceAsString()
+ .startsWith("--abc"));
+ assertTrue(exp.getSequenceAt(2).getSequenceAsString()
+ .startsWith("----abc"));
+ assertTrue(exp.getSequenceAt(1).getSequenceAsString()
+ .startsWith("------abc"));
+ assertTrue(exp.getSequenceAt(0).getSequenceAsString()
+ .startsWith("--------abc"));
}
}
- }
+ }
+
+ /**
+ * Test that annotations are correctly adjusted by expandContext
+ */
+ @Test
+ public void testExpandContext_annotation()
+ {
+ AlignmentI al = new Alignment(new Sequence[]
+ {});
+ SequenceI ds = new Sequence("Seq1", "ABCDEFGHI");
+ // subsequence DEF:
+ SequenceI seq1 = ds.deriveSequence().getSubSequence(3, 6);
+ al.addSequence(seq1);
+
+ /*
+ * Annotate DEF with 4/5/6 respectively
+ */
+ Annotation[] anns = new Annotation[]
+ { new Annotation(4), new Annotation(5), new Annotation(6) };
+ AlignmentAnnotation ann = new AlignmentAnnotation("SS",
+ "secondary structure", anns);
+ seq1.addAlignmentAnnotation(ann);
+
+ /*
+ * The annotations array should match aligned positions
+ */
+ assertEquals(3, ann.annotations.length);
+ assertEquals(4, ann.annotations[0].value, 0.001);
+ assertEquals(5, ann.annotations[1].value, 0.001);
+ assertEquals(6, ann.annotations[2].value, 0.001);
+
+ /*
+ * Check annotation to sequence position mappings before expanding the
+ * sequence; these are set up in Sequence.addAlignmentAnnotation ->
+ * Annotation.setSequenceRef -> createSequenceMappings
+ */
+ assertNull(ann.getAnnotationForPosition(1));
+ assertNull(ann.getAnnotationForPosition(2));
+ assertNull(ann.getAnnotationForPosition(3));
+ assertEquals(4, ann.getAnnotationForPosition(4).value, 0.001);
+ assertEquals(5, ann.getAnnotationForPosition(5).value, 0.001);
+ assertEquals(6, ann.getAnnotationForPosition(6).value, 0.001);
+ assertNull(ann.getAnnotationForPosition(7));
+ assertNull(ann.getAnnotationForPosition(8));
+ assertNull(ann.getAnnotationForPosition(9));
+
+ /*
+ * Expand the subsequence to the full sequence abcDEFghi
+ */
+ AlignmentI expanded = AlignmentUtils.expandContext(al, -1);
+ assertEquals("abcDEFghi", expanded.getSequenceAt(0)
+ .getSequenceAsString());
+
+ /*
+ * Confirm the alignment and sequence have the same SS annotation,
+ * referencing the expanded sequence
+ */
+ ann = expanded.getSequenceAt(0).getAnnotation()[0];
+ assertSame(ann, expanded.getAlignmentAnnotation()[0]);
+ assertSame(expanded.getSequenceAt(0), ann.sequenceRef);
+
+ /*
+ * The annotations array should have null values except for annotated
+ * positions
+ */
+ assertNull(ann.annotations[0]);
+ assertNull(ann.annotations[1]);
+ assertNull(ann.annotations[2]);
+ assertEquals(4, ann.annotations[3].value, 0.001);
+ assertEquals(5, ann.annotations[4].value, 0.001);
+ assertEquals(6, ann.annotations[5].value, 0.001);
+ assertNull(ann.annotations[6]);
+ assertNull(ann.annotations[7]);
+ assertNull(ann.annotations[8]);
+
+ /*
+ * sequence position mappings should be unchanged
+ */
+ assertNull(ann.getAnnotationForPosition(1));
+ assertNull(ann.getAnnotationForPosition(2));
+ assertNull(ann.getAnnotationForPosition(3));
+ assertEquals(4, ann.getAnnotationForPosition(4).value, 0.001);
+ assertEquals(5, ann.getAnnotationForPosition(5).value, 0.001);
+ assertEquals(6, ann.getAnnotationForPosition(6).value, 0.001);
+ assertNull(ann.getAnnotationForPosition(7));
+ assertNull(ann.getAnnotationForPosition(8));
+ assertNull(ann.getAnnotationForPosition(9));
+ }
/**
* Test method that returns a map of lists of sequences by sequence name.