/* * The MIT License * * Copyright (c) 2009 The Broad Institute * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package htsjdk.samtools; import org.testng.Assert; import org.testng.annotations.Test; import java.util.Arrays; public class CigarCodecTest { private final BinaryCigarCodec binaryCigarCodec = new BinaryCigarCodec(); private final TextCigarCodec textCigarCodec = new TextCigarCodec(); @Test public void testDefault() { final Cigar emptyCigar = new Cigar(); Assert.assertEquals(emptyCigar, binaryCigarCodec.decode(new int[0])); final int[] binaryCigar = binaryCigarCodec.encode(emptyCigar); Assert.assertEquals(0, binaryCigar.length); Assert.assertEquals(emptyCigar, textCigarCodec.decode(SAMRecord.NO_ALIGNMENT_CIGAR)); Assert.assertEquals(textCigarCodec.encode(emptyCigar), SAMRecord.NO_ALIGNMENT_CIGAR); } private static class Cigarette { final int length; final char op; private Cigarette(final int length, final char op) { this.length = length; this.op = op; } int getBinaryOp() { switch (op) { case 'M': return 0; case 'I': return 1; case 'D': return 2; case 'N': return 3; case 'S': return 4; case 'H': return 5; case 'P': return 6; case '=': return 7; case 'X' : return 8; default: Assert.assertTrue(false); } return -1; } } private String makeTextCigar(final Cigarette[] cigarettes) { final StringBuilder sb = new StringBuilder(); for (final Cigarette c : cigarettes) { sb.append(Integer.toString(c.length)); sb.append(c.op); } return sb.toString(); } private int[] makeBinaryCigar(final Cigarette[] cigarettes) { final int[] ret = new int[cigarettes.length]; for (int i = 0; i < cigarettes.length; ++i) { ret[i] = cigarettes[i].length << 4 | cigarettes[i].getBinaryOp(); } return ret; } @Test public void testSimple() { final Cigarette[] cigarettes = { new Cigarette(100, 'M'), new Cigarette(200, 'I'), new Cigarette(50, 'D'), new Cigarette(21, 'N'), new Cigarette(12, 'S'), new Cigarette(99, 'H'), new Cigarette(20, 'P'), new Cigarette(2, '='), new Cigarette(2, 'X') }; final String textCigar = makeTextCigar(cigarettes); final int[] binaryCigar = makeBinaryCigar(cigarettes); final Cigar fromText = textCigarCodec.decode(textCigar); final Cigar fromBinary = binaryCigarCodec.decode(binaryCigar); Assert.assertEquals(fromText, fromBinary); final String anotherTextCigar = textCigarCodec.encode(fromBinary); final int[] anotherBinaryCigar = binaryCigarCodec.encode(fromText); Assert.assertEquals(anotherTextCigar, textCigar); Assert.assertTrue(Arrays.equals(anotherBinaryCigar, binaryCigar)); } }