--- /dev/null
+package jalview.datamodel;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import jalview.util.MapList;
+
+import java.util.Arrays;
+
+import org.junit.Test;
+
+public class AlignedCodonFrameTest
+{
+
+ /**
+ * Test the method that locates the first aligned sequence that has a mapping.
+ */
+ @Test
+ public void testFindAlignedSequence()
+ {
+ AlignmentI cdna = new Alignment(new SequenceI[]
+ {});
+ final Sequence seq1 = new Sequence("Seq1", "C-G-TA-GC");
+ seq1.createDatasetSequence();
+ cdna.addSequence(seq1);
+ final Sequence seq2 = new Sequence("Seq2", "-TA-GG-GG");
+ seq2.createDatasetSequence();
+ cdna.addSequence(seq2);
+
+ AlignmentI aa = new Alignment(new SequenceI[]
+ {});
+ final Sequence aseq1 = new Sequence("Seq1", "-P-R");
+ aseq1.createDatasetSequence();
+ aa.addSequence(aseq1);
+ final Sequence aseq2 = new Sequence("Seq2", "-LY-");
+ aseq2.createDatasetSequence();
+ aa.addSequence(aseq2);
+
+ /*
+ * Mapping from first DNA sequence to second AA sequence.
+ */
+ AlignedCodonFrame acf = new AlignedCodonFrame();
+
+ assertNull(acf.findAlignedSequence(seq1, aa));
+
+ MapList map = new MapList(new int[]
+ { 1, 6 }, new int[]
+ { 1, 2 }, 3, 1);
+ acf.addMap(seq1.getDatasetSequence(), aseq2.getDatasetSequence(), map);
+
+ /*
+ * DNA seq1 maps to AA seq2
+ */
+ assertEquals(aa.getSequenceAt(1),
+ acf.findAlignedSequence(cdna
+ .getSequenceAt(0).getDatasetSequence(), aa));
+
+ assertEquals(cdna.getSequenceAt(0),
+ acf.findAlignedSequence(aa
+ .getSequenceAt(1).getDatasetSequence(), cdna));
+ }
+
+ /**
+ * Test the method that locates the mapped codon for a protein position.
+ */
+ @Test
+ public void testGetMappedRegion()
+ {
+ // introns lower case, exons upper case
+ final Sequence seq1 = new Sequence("Seq1", "c-G-TA-gC-gT-T");
+ seq1.createDatasetSequence();
+ final Sequence seq2 = new Sequence("Seq2", "-TA-gG-Gg-CG-a");
+ seq2.createDatasetSequence();
+
+ final Sequence aseq1 = new Sequence("Seq1", "-P-R");
+ aseq1.createDatasetSequence();
+ final Sequence aseq2 = new Sequence("Seq2", "-LY-");
+ aseq2.createDatasetSequence();
+
+ /*
+ * First with no mappings
+ */
+ AlignedCodonFrame acf = new AlignedCodonFrame();
+
+ assertNull(acf.getMappedRegion(seq1, aseq1, 1));
+
+ /*
+ * Set up the mappings for the exons (upper-case bases)
+ */
+ MapList map = new MapList(new int[]
+ { 2, 4, 6, 6, 8, 9 }, new int[]
+ { 1, 2 }, 3, 1);
+ acf.addMap(seq1.getDatasetSequence(), aseq1.getDatasetSequence(), map);
+ map = new MapList(new int[]
+ { 1, 2, 4, 5, 7, 8 }, new int[]
+ { 1, 2 }, 3, 1);
+ acf.addMap(seq2.getDatasetSequence(), aseq2.getDatasetSequence(), map);
+
+ assertEquals("[2, 4]",
+ Arrays.toString(acf.getMappedRegion(seq1, aseq1, 1)));
+ assertEquals("[6, 6, 8, 9]",
+ Arrays.toString(acf.getMappedRegion(seq1, aseq1, 2)));
+ assertEquals("[1, 2, 4, 4]",
+ Arrays.toString(acf.getMappedRegion(seq2, aseq2, 1)));
+ assertEquals("[5, 5, 7, 8]",
+ Arrays.toString(acf.getMappedRegion(seq2, aseq2, 2)));
+
+ /*
+ * No mapping from sequence 1 to sequence 2
+ */
+ assertNull(acf.getMappedRegion(seq1, aseq2, 1));
+ }
+
+ @Test
+ public void testGetMappedCodon()
+ {
+ final Sequence seq1 = new Sequence("Seq1", "c-G-TA-gC-gT-T");
+ seq1.createDatasetSequence();
+ final Sequence aseq1 = new Sequence("Seq1", "-P-R");
+ aseq1.createDatasetSequence();
+
+ /*
+ * First with no mappings
+ */
+ AlignedCodonFrame acf = new AlignedCodonFrame();
+
+ assertNull(acf.getMappedCodon(seq1.getDatasetSequence(), 0));
+
+ /*
+ * Set up the mappings for the exons (upper-case bases)
+ */
+ MapList map = new MapList(new int[]
+ { 2, 4, 6, 6, 8, 9 }, new int[]
+ { 1, 2 }, 3, 1);
+ acf.addMap(seq1.getDatasetSequence(), aseq1.getDatasetSequence(), map);
+
+ assertEquals("[G, T, A]", Arrays.toString(acf.getMappedCodon(
+ aseq1.getDatasetSequence(), 1)));
+ assertEquals("[C, T, T]", Arrays.toString(acf.getMappedCodon(
+ aseq1.getDatasetSequence(), 2)));
+ }
+}