package org.nextprot.api.core.utils.seqmap; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.log4j.ConsoleAppender; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.log4j.PatternLayout; import org.junit.Assert; import org.junit.Test; import org.nextprot.api.commons.utils.NucleotidePositionRange; import java.util.ArrayList; import java.util.List; import static org.junit.Assert.assertEquals; public class SequencePositionMapperTest { static { Logger rootLogger = Logger.getRootLogger(); rootLogger.setLevel(Level.DEBUG); rootLogger.addAppender(new ConsoleAppender( new PatternLayout("\n%-6r [%p] %c - %m%n"))); } private final static Log logger = LogFactory.getLog(SequencePositionMapperTest.class); @Test public void testCheckSequencePositions() { Assert.assertTrue(SequencePositionMapper.checkSequencePosition("AKT", 1, false)); Assert.assertTrue(SequencePositionMapper.checkSequencePosition("AKT", 2, false)); Assert.assertTrue(SequencePositionMapper.checkSequencePosition("AKT", 3, false)); Assert.assertFalse(SequencePositionMapper.checkSequencePosition("AKT", 4, false)); } @Test public void testCheckSequencePositionInsertion() { Assert.assertTrue(SequencePositionMapper.checkSequencePosition("AKT", 4, true)); } @Test(expected = IllegalArgumentException.class) public void firstPositionShouldNotBeZero() { SequencePositionMapper.checkSequencePosition("AKTKLI", 0, false); } @Test(expected = IllegalArgumentException.class) public void shouldThrowExceptionWhenNegativePosition() { SequencePositionMapper.checkSequencePosition("AKTKLI", -1, false); } @Test public void aminoAcidPosTest() { Assert.assertTrue(SequencePositionMapper.checkAminoAcidsFromPosition("AKTKLI", 1, "A")); Assert.assertTrue(SequencePositionMapper.checkAminoAcidsFromPosition("AKTKLI", 3, "T")); Assert.assertTrue(SequencePositionMapper.checkAminoAcidsFromPosition("AKTKLI", 6, "I")); Assert.assertFalse(SequencePositionMapper.checkAminoAcidsFromPosition("AKTKLI", 7, "T")); // wrong => false Assert.assertFalse(SequencePositionMapper.checkAminoAcidsFromPosition("AKTKLI", 1, "B")); Assert.assertFalse(SequencePositionMapper.checkAminoAcidsFromPosition("AKTKLI", 3, "B")); Assert.assertFalse(SequencePositionMapper.checkAminoAcidsFromPosition("AKTKLI", 6, "B")); // special case with N aas Assert.assertTrue(SequencePositionMapper.checkAminoAcidsFromPosition("AKTKLI", 1, "AK")); Assert.assertTrue(SequencePositionMapper.checkAminoAcidsFromPosition("AKTKLI", 3, "TK")); Assert.assertTrue(SequencePositionMapper.checkAminoAcidsFromPosition("AKTKLI", 5, "LI")); Assert.assertFalse(SequencePositionMapper.checkAminoAcidsFromPosition("AKTKLI", 5, "LIT")); Assert.assertFalse(SequencePositionMapper.checkAminoAcidsFromPosition("AKTKLI", 6, "IY")); } @Test public void testCheckInsertionPos() { // special case with 0 aa (null or length == 0) that is insertion Assert.assertTrue(SequencePositionMapper.checkAminoAcidsFromPosition("AKTKLI", 1, null)); Assert.assertTrue(SequencePositionMapper.checkAminoAcidsFromPosition("AKTKLI", 3, null)); Assert.assertTrue(SequencePositionMapper.checkAminoAcidsFromPosition("AKTKLI", 6, null)); // insertion just after the last amino-acid is valid Assert.assertTrue(SequencePositionMapper.checkAminoAcidsFromPosition("AKTKLI", 7, null)); // insertion n position after the last amino-acid is not valid Assert.assertFalse(SequencePositionMapper.checkAminoAcidsFromPosition("AKTKLI", 8, null)); } @Test(expected = NullPointerException.class) public void shouldThrowNPEWhenSequenceIsNull() { SequencePositionMapper.checkAminoAcidsFromPosition(null, 1, "A"); } @Test public void geneIsoformPosTestNotInFrameCrossExon() { // represent two coding regions of DNA mapped to an isoform sequence List<NucleotidePositionRange> genePosRanges = new ArrayList<NucleotidePositionRange>(); genePosRanges.add(new NucleotidePositionRange(100,104)); genePosRanges.add(new NucleotidePositionRange(201,204)); /* * nuNum 0 1 2 3 4 5 6 7 8 * exons |---- exon1 ------| |-- exon 2 ---| * nuPos 100 101 102 103 104 201 202 203 204 * codons |--codon1--|-------codon2-------|--codon3--| */ CodonNucleotideIndices result; GeneMasterCodonPosition codonNuPos = new GeneMasterCodonPosition(); // get isoform position of aa corresponding to codon with nucleotides at position 103 104 201 codonNuPos.clear(); codonNuPos.addNucleotidePosition(103); codonNuPos.addNucleotidePosition(104); codonNuPos.addNucleotidePosition(201); result = SequencePositionMapper.getCodonNucleotideIndices(codonNuPos, genePosRanges); logger.debug(result); assertEquals(true, result.areInFrame()); assertEquals(new Integer(2), result.getAminoAcidPosition()); } @Test public void geneIsoformPosTest() { // represent two coding regions of DNA mapped to an isoform sequence List<NucleotidePositionRange> genePosRanges = new ArrayList<NucleotidePositionRange>(); genePosRanges.add(new NucleotidePositionRange(100,104)); genePosRanges.add(new NucleotidePositionRange(201,204)); /* * nuNum 0 1 2 3 4 5 6 7 8 * exons |---- exon1 ------| |-- exon 2 ---| * nuPos 100 101 102 103 104 201 202 203 204 * codons |--codon1--|-------codon2-------|--codon3--| */ CodonNucleotideIndices result; GeneMasterCodonPosition codonNuPos = new GeneMasterCodonPosition(); // get isoform pos of aa corresponding to codon with nu at pos 202 203 204 codonNuPos.clear(); codonNuPos.addNucleotidePosition(202); codonNuPos.addNucleotidePosition(203); codonNuPos.addNucleotidePosition(204); result = SequencePositionMapper.getCodonNucleotideIndices(codonNuPos, genePosRanges); assertEquals(true,result.has3Nucleotides()); assertEquals(new Integer(3), result.getAminoAcidPosition()); // get isoform position of aa corresponding to codon with nucleotides at position 100,101,102 codonNuPos.clear(); codonNuPos.addNucleotidePosition(100); codonNuPos.addNucleotidePosition(101); codonNuPos.addNucleotidePosition(102); result = SequencePositionMapper.getCodonNucleotideIndices(codonNuPos, genePosRanges); assertEquals(new Integer(1), result.getAminoAcidPosition()); // get isoform position of aa corresponding to codon with nucleotides at position 103 104 201 codonNuPos.clear(); codonNuPos.addNucleotidePosition(103); codonNuPos.addNucleotidePosition(104); codonNuPos.addNucleotidePosition(201); result = SequencePositionMapper.getCodonNucleotideIndices(codonNuPos, genePosRanges); assertEquals(new Integer(2), result.getAminoAcidPosition()); // get isoform position of aa corresponding to codon with nucleotides at position 202 203 204 codonNuPos.clear(); codonNuPos.addNucleotidePosition(202); codonNuPos.addNucleotidePosition(203); codonNuPos.addNucleotidePosition(204); result = SequencePositionMapper.getCodonNucleotideIndices(codonNuPos, genePosRanges); assertEquals(new Integer(3), result.getAminoAcidPosition()); // trying to find a codon position having NON consecutive nucleotides i.e. at pos 201 203 204 codonNuPos.clear(); codonNuPos.addNucleotidePosition(201); codonNuPos.addNucleotidePosition(203); codonNuPos.addNucleotidePosition(204); result = SequencePositionMapper.getCodonNucleotideIndices(codonNuPos, genePosRanges); assertEquals(false, result.areConsecutive()); assertEquals(null, result.getAminoAcidPosition()); // trying to find a codon position having nucleotide positions that are not in frame (3 nucl of same codon) // i.e. at pos 101 102 103 codonNuPos.clear(); codonNuPos.addNucleotidePosition(101); codonNuPos.addNucleotidePosition(102); codonNuPos.addNucleotidePosition(103); result = SequencePositionMapper.getCodonNucleotideIndices(codonNuPos, genePosRanges); assertEquals(false, result.areInFrame()); assertEquals(null, result.getAminoAcidPosition()); // trying to find a codon position having nucleotide positions that are not in frame (3 nucl of same codon) // i.e. at pos 102 103 104 codonNuPos.clear(); codonNuPos.addNucleotidePosition(102); codonNuPos.addNucleotidePosition(103); codonNuPos.addNucleotidePosition(104); result = SequencePositionMapper.getCodonNucleotideIndices(codonNuPos, genePosRanges); assertEquals(false, result.areInFrame()); assertEquals(null, result.getAminoAcidPosition()); // trying to find a codon having nucleotide positions out of the gene mapping ranges // i.e. at pos 77,78,79 codonNuPos.clear(); codonNuPos.addNucleotidePosition(77); codonNuPos.addNucleotidePosition(78); codonNuPos.addNucleotidePosition(79); result = SequencePositionMapper.getCodonNucleotideIndices(codonNuPos, genePosRanges); assertEquals(null, result.getAminoAcidPosition()); // trying to find a codon having nucleotide positions out of the gene mapping ranges // i.e. at pos 99,100,101 codonNuPos.clear(); codonNuPos.addNucleotidePosition(99); codonNuPos.addNucleotidePosition(100); codonNuPos.addNucleotidePosition(101); result = SequencePositionMapper.getCodonNucleotideIndices(codonNuPos, genePosRanges); assertEquals(null, result.getAminoAcidPosition()); // trying to find a codon having nucleotide positions out of the gene mapping ranges // i.e. at pos 103,104, 015 codonNuPos.clear(); codonNuPos.addNucleotidePosition(103); codonNuPos.addNucleotidePosition(104); codonNuPos.addNucleotidePosition(105); result = SequencePositionMapper.getCodonNucleotideIndices(codonNuPos, genePosRanges); assertEquals(null, result.getAminoAcidPosition()); } @Test public void geneCodonPosTest() { // represent two coding regions of DNA (gene,master) mapped to an isoform sequence List<NucleotidePositionRange> ranges = new ArrayList<NucleotidePositionRange>(); ranges.add(new NucleotidePositionRange(100,104)); ranges.add(new NucleotidePositionRange(201,204)); /* * * nuNum 0 1 2 3 4 5 6 7 8 * exons |---- exon1 ------| |-- exon 2 ---| * nuPos 100 101 102 103 104 201 202 203 204 * codons |--codon1--|-------codon2-------|--codon3--| * * */ GeneMasterCodonPosition result; // get gene position of each nucl of the codon coding for aa of isoform at pos 1 result = SequencePositionMapper.getCodonPositionOnMaster(1, ranges); assertEquals(new Integer(100), result.getNucleotidePosition(0)); assertEquals(new Integer(101), result.getNucleotidePosition(1)); assertEquals(new Integer(102), result.getNucleotidePosition(2)); assertEquals(true, result.isValid()); // get gene position of each nucl of the codon coding for aa of isoform at pos 2 result = SequencePositionMapper.getCodonPositionOnMaster(2, ranges); assertEquals(new Integer(103), result.getNucleotidePosition(0)); assertEquals(new Integer(104), result.getNucleotidePosition(1)); assertEquals(new Integer(201), result.getNucleotidePosition(2)); assertEquals(true, result.isValid()); // get gene position of each nucl of the codon coding for aa of isoform at pos 3 result = SequencePositionMapper.getCodonPositionOnMaster(3, ranges); assertEquals(new Integer(202), result.getNucleotidePosition(0)); assertEquals(new Integer(203), result.getNucleotidePosition(1)); assertEquals(new Integer(204), result.getNucleotidePosition(2)); assertEquals(true, result.isValid()); // get gene position of each nucl of the codon coding for aa of isoform at pos 0 (out of range) result = SequencePositionMapper.getCodonPositionOnMaster(0, ranges); assertEquals(0, result.size()); assertEquals(false, result.isValid()); // get gene position of each nucl of the codon coding for aa of isoform at pos 4 (out of range) result = SequencePositionMapper.getCodonPositionOnMaster(4, ranges); assertEquals(0, result.size()); assertEquals(false, result.isValid()); } @Test public void checkAminoAcidsFromPositionWhenMultipleD() { String sequence = "MDDRCYPVIFPDERNFRPFTSDS"; Assert.assertTrue(SequencePositionMapper.checkAminoAcidsFromPosition(sequence, 3, "D")); } }