package jalview.datamodel; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import java.util.List; import org.junit.Before; import org.junit.Test; public class SequenceTest { Sequence seq; @Before public void setUp() { seq = new Sequence("FER1", "AKPNGVL"); } @Test public void testGetAnnotation() { // initial state returns null not an empty array assertNull(seq.getAnnotation()); AlignmentAnnotation ann = addAnnotation("label1", "desc1", "calcId1", 1f); AlignmentAnnotation[] anns = seq.getAnnotation(); assertEquals(1, anns.length); assertSame(ann, anns[0]); // removing all annotations reverts array to null seq.removeAlignmentAnnotation(ann); assertNull(seq.getAnnotation()); } @Test public void testGetAnnotation_forLabel() { AlignmentAnnotation ann1 = addAnnotation("label1", "desc1", "calcId1", 1f); AlignmentAnnotation ann2 = addAnnotation("label2", "desc2", "calcId2", 1f); AlignmentAnnotation ann3 = addAnnotation("label1", "desc3", "calcId3", 1f); AlignmentAnnotation[] anns = seq.getAnnotation("label1"); assertEquals(2, anns.length); assertSame(ann1, anns[0]); assertSame(ann3, anns[1]); } private AlignmentAnnotation addAnnotation(String label, String description, String calcId, float value) { final AlignmentAnnotation annotation = new AlignmentAnnotation(label, description, value); annotation.setCalcId(calcId); seq.addAlignmentAnnotation(annotation); return annotation; } @Test public void testGetAlignmentAnnotations_forCalcIdAndLabel() { AlignmentAnnotation ann1 = addAnnotation("label1", "desc1", "calcId1", 1f); AlignmentAnnotation ann2 = addAnnotation("label2", "desc2", "calcId2", 1f); AlignmentAnnotation ann3 = addAnnotation("label2", "desc3", "calcId3", 1f); AlignmentAnnotation ann4 = addAnnotation("label2", "desc3", "calcId2", 1f); AlignmentAnnotation ann5 = addAnnotation("label5", "desc3", null, 1f); AlignmentAnnotation ann6 = addAnnotation(null, "desc3", "calcId3", 1f); List anns = seq.getAlignmentAnnotations("calcId2", "label2"); assertEquals(2, anns.size()); assertSame(ann2, anns.get(0)); assertSame(ann4, anns.get(1)); assertTrue(seq.getAlignmentAnnotations("calcId2", "label3").isEmpty()); assertTrue(seq.getAlignmentAnnotations("calcId3", "label5").isEmpty()); assertTrue(seq.getAlignmentAnnotations("calcId2", null).isEmpty()); assertTrue(seq.getAlignmentAnnotations(null, "label3").isEmpty()); assertTrue(seq.getAlignmentAnnotations(null, null).isEmpty()); } /** * Tests for addAlignmentAnnotation. Note this method has the side-effect of * setting the sequenceRef on the annotation. Adding the same annotation twice * should be ignored. */ @Test public void testAddAlignmentAnnotation() { assertNull(seq.annotation); final AlignmentAnnotation annotation = new AlignmentAnnotation("a", "b", 2d); assertNull(annotation.sequenceRef); seq.addAlignmentAnnotation(annotation); assertSame(seq, annotation.sequenceRef); AlignmentAnnotation[] anns = seq.getAnnotation(); assertEquals(1, anns.length); assertSame(annotation, anns[0]); // re-adding does nothing seq.addAlignmentAnnotation(annotation); anns = seq.getAnnotation(); assertEquals(1, anns.length); assertSame(annotation, anns[0]); // an identical but different annotation can be added final AlignmentAnnotation annotation2 = new AlignmentAnnotation("a", "b", 2d); seq.addAlignmentAnnotation(annotation2); anns = seq.getAnnotation(); assertEquals(2, anns.length); assertSame(annotation, anns[0]); assertSame(annotation2, anns[1]); } @Test public void testGetStartGetEnd() { SequenceI seq = new Sequence("test", "ABCDEF"); assertEquals(1, seq.getStart()); assertEquals(6, seq.getEnd()); seq = new Sequence("test", "--AB-C-DEF--"); assertEquals(1, seq.getStart()); assertEquals(6, seq.getEnd()); seq = new Sequence("test", "----"); assertEquals(1, seq.getStart()); assertEquals(0, seq.getEnd()); // ?? } @Test public void testFindPosition() { SequenceI seq = new Sequence("test", "ABCDEF"); assertEquals(1, seq.findPosition(0)); assertEquals(6, seq.findPosition(5)); // assertEquals(-1, seq.findPosition(6)); // fails seq = new Sequence("test", "AB-C-D--"); assertEquals(1, seq.findPosition(0)); assertEquals(2, seq.findPosition(1)); // gap position 'finds' residue to the right (not the left as per javadoc) assertEquals(3, seq.findPosition(2)); assertEquals(3, seq.findPosition(3)); assertEquals(4, seq.findPosition(4)); assertEquals(4, seq.findPosition(5)); // returns 1 more than sequence length if off the end ?!? assertEquals(5, seq.findPosition(6)); assertEquals(5, seq.findPosition(7)); seq = new Sequence("test", "--AB-C-DEF--"); assertEquals(1, seq.findPosition(0)); assertEquals(1, seq.findPosition(1)); assertEquals(1, seq.findPosition(2)); assertEquals(2, seq.findPosition(3)); assertEquals(3, seq.findPosition(4)); assertEquals(3, seq.findPosition(5)); assertEquals(4, seq.findPosition(6)); assertEquals(4, seq.findPosition(7)); assertEquals(5, seq.findPosition(8)); assertEquals(6, seq.findPosition(9)); assertEquals(7, seq.findPosition(10)); assertEquals(7, seq.findPosition(11)); } @Test public void testDeleteChars() { SequenceI seq = new Sequence("test", "ABCDEF"); assertEquals(1, seq.getStart()); assertEquals(6, seq.getEnd()); seq.deleteChars(2, 3); assertEquals("ABDEF", seq.getSequenceAsString()); assertEquals(1, seq.getStart()); assertEquals(5, seq.getEnd()); seq = new Sequence("test", "ABCDEF"); seq.deleteChars(0, 2); assertEquals("CDEF", seq.getSequenceAsString()); assertEquals(3, seq.getStart()); assertEquals(6, seq.getEnd()); } @Test public void testInsertCharAt() { // non-static methods: SequenceI seq = new Sequence("test", "ABCDEF"); seq.insertCharAt(0, 'z'); assertEquals("zABCDEF", seq.getSequenceAsString()); seq.insertCharAt(2, 2, 'x'); assertEquals("zAxxBCDEF", seq.getSequenceAsString()); // for static method see StringUtilsTest } }