/* * BioJava development code * * This code may be freely distributed and modified under the * terms of the GNU Lesser General Public Licence. This should * be distributed with the code. If you do not have a copy, * see: * * http://www.gnu.org/copyleft/lesser.html * * Copyright for this code is held jointly by the individual * authors. These should be listed in @author doc comments. * * For more information on the BioJava project and its aims, * or to join the biojava-l mailing list, visit the home page * at: * * http://www.biojava.org/ * */ package org.biojava.nbio.sequencing.io.fastq; import java.io.File; import java.io.FileWriter; import java.util.List; import java.util.Map; import junit.framework.TestCase; import com.google.common.collect.Lists; import com.google.common.collect.Maps; /** * Round trip conversion functional tests. */ public final class ConvertTest extends TestCase { public void testConvert() throws Exception { Map<FastqVariant, FastqReader> readers = Maps.newHashMap(); readers.put(FastqVariant.FASTQ_SANGER, new SangerFastqReader()); readers.put(FastqVariant.FASTQ_SOLEXA, new SolexaFastqReader()); readers.put(FastqVariant.FASTQ_ILLUMINA, new IlluminaFastqReader()); Map<FastqVariant, FastqWriter> writers = Maps.newHashMap(); writers.put(FastqVariant.FASTQ_SANGER, new SangerFastqWriter()); writers.put(FastqVariant.FASTQ_SOLEXA, new SolexaFastqWriter()); writers.put(FastqVariant.FASTQ_ILLUMINA, new IlluminaFastqWriter()); Map<FastqVariant, String> inputFileNames = Maps.newHashMap(); inputFileNames.put(FastqVariant.FASTQ_SANGER, "sanger_full_range_as_sanger.fastq"); inputFileNames.put(FastqVariant.FASTQ_SOLEXA, "solexa_full_range_as_solexa.fastq"); inputFileNames.put(FastqVariant.FASTQ_ILLUMINA, "illumina_full_range_as_illumina.fastq"); Map<FastqVariantPair, String> expectedFileNames = Maps.newHashMap(); expectedFileNames.put(new FastqVariantPair(FastqVariant.FASTQ_SANGER, FastqVariant.FASTQ_SANGER), "sanger_full_range_as_sanger.fastq"); expectedFileNames.put(new FastqVariantPair(FastqVariant.FASTQ_SANGER, FastqVariant.FASTQ_SOLEXA), "sanger_full_range_as_solexa.fastq"); expectedFileNames.put(new FastqVariantPair(FastqVariant.FASTQ_SANGER, FastqVariant.FASTQ_ILLUMINA), "sanger_full_range_as_illumina.fastq"); expectedFileNames.put(new FastqVariantPair(FastqVariant.FASTQ_SOLEXA, FastqVariant.FASTQ_SANGER), "solexa_full_range_as_sanger.fastq"); expectedFileNames.put(new FastqVariantPair(FastqVariant.FASTQ_SOLEXA, FastqVariant.FASTQ_SOLEXA), "solexa_full_range_as_solexa.fastq"); expectedFileNames.put(new FastqVariantPair(FastqVariant.FASTQ_SOLEXA, FastqVariant.FASTQ_ILLUMINA), "solexa_full_range_as_illumina.fastq"); expectedFileNames.put(new FastqVariantPair(FastqVariant.FASTQ_ILLUMINA, FastqVariant.FASTQ_SANGER), "illumina_full_range_as_sanger.fastq"); expectedFileNames.put(new FastqVariantPair(FastqVariant.FASTQ_ILLUMINA, FastqVariant.FASTQ_SOLEXA), "illumina_full_range_as_solexa.fastq"); expectedFileNames.put(new FastqVariantPair(FastqVariant.FASTQ_ILLUMINA, FastqVariant.FASTQ_ILLUMINA), "illumina_full_range_as_illumina.fastq"); for (FastqVariant variant1 : FastqVariant.values()) { FastqReader reader = readers.get(variant1); String inputFileName = inputFileNames.get(variant1); for (FastqVariant variant2 : FastqVariant.values()) { FastqWriter writer = writers.get(variant2); String expectedFileName = expectedFileNames.get(new FastqVariantPair(variant1, variant2)); File tmp = File.createTempFile("convertTest", "fastq"); FileWriter fileWriter = new FileWriter(tmp); for (Fastq fastq : reader.read(getClass().getResource(inputFileName))) { writer.append(fileWriter, fastq); } try { fileWriter.close(); } catch (Exception e) { // ignore } FastqReader resultReader = readers.get(variant2); List<Fastq> observed = Lists.newArrayList(resultReader.read(tmp)); List<Fastq> expected = Lists.newArrayList(resultReader.read(getClass().getResource(expectedFileName))); assertEquals(expected.size(), observed.size()); for (int i = 0; i < expected.size(); i++) { assertEquals(expected.get(i).getDescription(), observed.get(i).getDescription()); assertEquals(expected.get(i).getSequence(), observed.get(i).getSequence()); assertEquals(expected.get(i).getQuality(), observed.get(i).getQuality()); assertEquals(expected.get(i).getVariant(), observed.get(i).getVariant()); } } } } static final class FastqVariantPair { final FastqVariant variant1; final FastqVariant variant2; FastqVariantPair(final FastqVariant variant1, final FastqVariant variant2) { this.variant1 = variant1; this.variant2 = variant2; } @Override public int hashCode() { int result = 47; result = 31 * result + variant1.hashCode(); result = 31 * result + variant2.hashCode(); return result; } @Override public boolean equals(final Object o) { if (o == this) { return true; } if (!(o instanceof FastqVariantPair)) { return false; } FastqVariantPair pair = (FastqVariantPair) o; return variant1.equals(pair.variant1) && variant2.equals(pair.variant2); } } }