--- /dev/null
+package jalview.datamodel;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.fail;
+import jalview.util.MapList;
+
+import java.util.Iterator;
+
+import org.junit.Test;
+
+/**
+ * Unit tests for Mapping$AlignedCodonIterator
+ *
+ * @author gmcarstairs
+ *
+ */
+public class AlignedCodonIteratorTest
+{
+ /**
+ * Test normal case for iterating over aligned codons.
+ */
+ @Test
+ public void testNext()
+ {
+ SequenceI from = new Sequence("Seq1", "-CgC-C-cCtAG-AtG-Gc");
+ from.createDatasetSequence();
+ SequenceI to = new Sequence("Seq1", "-PQ-R-");
+ to.createDatasetSequence();
+ MapList map = new MapList(new int[]
+ { 1, 1, 3, 4, 6, 6, 8, 10, 12, 13 }, new int[]
+ { 1, 3 }, 3, 1);
+ Mapping m = new Mapping(to.getDatasetSequence(), map);
+
+ Iterator<AlignedCodon> codons = m.getCodonIterator(from, '-');
+ AlignedCodon codon = codons.next();
+ assertEquals("[1, 3, 5]", codon.toString());
+ assertEquals("P", codon.product);
+ codon = codons.next();
+ assertEquals("[8, 10, 11]", codon.toString());
+ assertEquals("Q", codon.product);
+ codon = codons.next();
+ assertEquals("[13, 15, 17]", codon.toString());
+ assertEquals("R", codon.product);
+ assertFalse(codons.hasNext());
+ }
+
+ /**
+ * Test weird case where the mapping skips over a peptide.
+ */
+ @Test
+ public void testNext_unmappedPeptide()
+ {
+ SequenceI from = new Sequence("Seq1", "-CgC-C-cCtAG-AtG-Gc");
+ from.createDatasetSequence();
+ SequenceI to = new Sequence("Seq1", "-PQ-TR-");
+ to.createDatasetSequence();
+ MapList map = new MapList(new int[]
+ { 1, 1, 3, 4, 6, 6, 8, 10, 12, 13 }, new int[]
+ { 1, 2, 4, 4 }, 3, 1);
+ Mapping m = new Mapping(to.getDatasetSequence(), map);
+
+ Iterator<AlignedCodon> codons = m.getCodonIterator(from, '-');
+ AlignedCodon codon = codons.next();
+ assertEquals("[1, 3, 5]", codon.toString());
+ assertEquals("P", codon.product);
+ codon = codons.next();
+ assertEquals("[8, 10, 11]", codon.toString());
+ assertEquals("Q", codon.product);
+ codon = codons.next();
+ assertEquals("[13, 15, 17]", codon.toString());
+ assertEquals("R", codon.product);
+ assertFalse(codons.hasNext());
+ }
+
+ /**
+ * Test for exception thrown for an incomplete codon.
+ */
+ @Test
+ public void testNext_incompleteCodon()
+ {
+ SequenceI from = new Sequence("Seq1", "-CgC-C-cCgTt");
+ from.createDatasetSequence();
+ SequenceI to = new Sequence("Seq1", "-PQ-R-");
+ to.createDatasetSequence();
+ MapList map = new MapList(new int[]
+ { 1, 1, 3, 4, 6, 6, 8, 8 }, new int[]
+ { 1, 3 }, 3, 1);
+ Mapping m = new Mapping(to.getDatasetSequence(), map);
+
+ Iterator<AlignedCodon> codons = m.getCodonIterator(from, '-');
+ AlignedCodon codon = codons.next();
+ assertEquals("[1, 3, 5]", codon.toString());
+ assertEquals("P", codon.product);
+ try
+ {
+ codon = codons.next();
+ fail("expected exception");
+ } catch (IncompleteCodonException e)
+ {
+ // expected
+ }
+ }
+
+ /**
+ * Test normal case for iterating over aligned codons.
+ */
+ @Test
+ public void testAnother()
+ {
+ SequenceI from = new Sequence("Seq1", "TGCCATTACCAG-");
+ from.createDatasetSequence();
+ SequenceI to = new Sequence("Seq1", "CHYQ");
+ to.createDatasetSequence();
+ MapList map = new MapList(new int[]
+ { 1, 12 }, new int[]
+ { 1, 4 }, 3, 1);
+ Mapping m = new Mapping(to.getDatasetSequence(), map);
+
+ Iterator<AlignedCodon> codons = m.getCodonIterator(from, '-');
+ AlignedCodon codon = codons.next();
+ assertEquals("[0, 1, 2]", codon.toString());
+ assertEquals("C", codon.product);
+ codon = codons.next();
+ assertEquals("[3, 4, 5]", codon.toString());
+ assertEquals("H", codon.product);
+ codon = codons.next();
+ assertEquals("[6, 7, 8]", codon.toString());
+ assertEquals("Y", codon.product);
+ codon = codons.next();
+ assertEquals("[9, 10, 11]", codon.toString());
+ assertEquals("Q", codon.product);
+ assertFalse(codons.hasNext());
+ }
+}