### Question:
TranscriptSequenceDecorator { public String getCodonAt(TranscriptPosition txPos, CDSPosition cdsPos) throws InvalidCodonException { int frameShift = cdsPos.getPos() % 3; int codonStart = txPos.getPos() - frameShift; int endPos = codonStart + 3; if (transcript.getTrimmedSequence().length() < endPos) throw new InvalidCodonException("Could not access codon " + codonStart + " - " + endPos + ", transcript sequence length is " + transcript.getTrimmedSequence().length()); return transcript.getTrimmedSequence().substring(codonStart, endPos); } TranscriptSequenceDecorator(TranscriptModel transcript); TranscriptModel getTranscript(); static String codonWithUpdatedBase(String transcriptCodon, int frameShift, char targetNC); static String nucleotidesWithInsertion(String transcriptNTs, int frameShift, String insertion); String getCodonAt(TranscriptPosition txPos, CDSPosition cdsPos); String getCodonsStartingFrom(TranscriptPosition txPos, CDSPosition cdsPos, int count); String getCodonsStartingFrom(TranscriptPosition txPos, CDSPosition cdsPos);  }### Answer:
@Test public void testGetCodonAt() throws Exception { TranscriptSequenceDecorator decorator = new TranscriptSequenceDecorator(MODEL); Assert.assertEquals(CODONS[CODONS.length - 1], decorator.getCodonAt(tx(START_LAST_CODON), cds(START_LAST_CODON))); Assert.assertEquals(CODONS[0], decorator.getCodonAt(tx(0), cds(0))); }