// Copyright (C) 2011-2012 CRS4. // // This file is part of Seal. // // Seal is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the Free // Software Foundation, either version 3 of the License, or (at your option) // any later version. // // Seal is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License along // with Seal. If not, see <http://www.gnu.org/licenses/>. package tests.it.crs4.seal.recab; import java.io.File; import java.io.FileOutputStream; import java.nio.ByteBuffer; import org.junit.*; import static org.junit.Assert.*; import it.crs4.seal.recab.PackedSequence; public class TestPackedSequence { private PackedSequence seq; private File dataFile; private ByteBuffer space; @Before public void setup() throws java.io.IOException { seq = new PackedSequence(); dataFile = File.createTempFile("packed_sequence_test", null); space = ByteBuffer.allocate(10); } @After public void tearDown() throws java.io.IOException { seq.close(); dataFile.delete(); } @Test public void testSimple() throws java.io.IOException { // Write a packed sequence to a file. Re-read it and test for equality. // AGCT = 0 2 1 3 = // 00100111 // 0x2 0x7 byte[] packedBytes = { 0x27 }; writeBytesToDataFile(packedBytes); seq.load(dataFile); seq.readSection(space, 0, 4); compareBytes(new byte[]{0, 2, 1, 3}, space); } @Test public void testPart() throws java.io.IOException { // Write a packed sequence that takes part of a byte to a file. // Re-read it and test for equality. // TCG = 3 1 2 = // 11011000 // 0xD 0x8 byte[] packedBytes = { (byte)0xD8 }; writeBytesToDataFile(packedBytes); seq.load(dataFile); seq.readSection(space, 0, 3); compareBytes(new byte[]{3, 1, 2}, space); } @Test public void testOneAndABit() throws java.io.IOException { // Write a packed sequence that takes one byte plus part of a byte to a file. // Re-read it and test for equality. // AGCTTCG = 0 2 1 3 | 3 1 2 = // 00100111| 11011000 // 0x2 0x7 | 0xD 0x8 byte[] packedBytes = { 0x27, (byte)0xD8 }; writeBytesToDataFile(packedBytes); seq.load(dataFile); seq.readSection(space, 0, 7); compareBytes(new byte[]{ 0, 2, 1, 3, 3, 1, 2 }, space); } @Test public void testReadMiddleSection() throws java.io.IOException { // Read middle part of a packed sequence. // Re-read it and test for equality. // AGCTTCG = 0 2 1 3 | 3 1 2 = // 00100111| 11011000 // 0x2 0x7 | 0xD 0x8 // Read CTT - start 2, len 3 byte[] packedBytes = { 0x27, (byte)0xD8 }; writeBytesToDataFile(packedBytes); seq.load(dataFile); seq.readSection(space, 2, 3); compareBytes(new byte[]{ 1, 3, 3 }, space); } @Test public void testReadBwaPac() throws java.io.IOException { String sequence = "AATAACTAAAGTTAGCTGCCCTGGACTATTCACCCCCTAGTCTCAATTTAAGAAGATCC"; // These are the bytes of the packed sequence generated by bwa 0.5.8c for the sequence above byte[] bwaData = { (byte)0x0c, (byte)0x1c, (byte)0x0b, (byte)0xc9, (byte)0xe5, (byte)0x7a, (byte)0x1c, (byte)0xf4, (byte)0x55, (byte)0x72, (byte)0xdd, (byte)0x0f, (byte)0xc2, (byte)0x08, (byte)0xd4, (byte)0x03}; space = ByteBuffer.allocate(sequence.length()); // the default one is too small writeBytesToDataFile(bwaData); seq.load(dataFile); seq.readSection(space, 0, sequence.length()); space.position(0); String retrieved = PackedSequence.bytesToBases(space); assertEquals(sequence, retrieved); } private boolean compareBytes(byte[] array, ByteBuffer buffer) { for (int i = 0; i < array.length; ++i) { assertEquals(array[i], buffer.get(i)); } return true; } private void writeBytesToDataFile(byte[] bytes) throws java.io.IOException { FileOutputStream output = new FileOutputStream(dataFile); output.write(bytes); output.close(); } }