/*
* 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 junit.framework.TestCase;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.net.URL;
/**
* Abstract unit test for implementations of FastqReader.
*/
public abstract class AbstractFastqReaderTest
extends TestCase
{
/** Array of example files that should throw IOExceptions. */
static final String[] ERROR_EXAMPLES = new String[]
{
"error_diff_ids.fastq",
"error_double_qual.fastq",
"error_double_seq.fastq",
"error_long_qual.fastq",
"error_no_qual.fastq",
"error_qual_del.fastq",
"error_qual_escape.fastq",
"error_qual_null.fastq",
"error_qual_space.fastq",
"error_qual_tab.fastq",
"error_qual_unit_sep.fastq",
"error_qual_vtab.fastq",
"error_short_qual.fastq",
"error_spaces.fastq",
"error_tabs.fastq",
"error_trunc_at_plus.fastq",
"error_trunc_at_qual.fastq",
"error_trunc_at_seq.fastq",
"error_trunc_in_plus.fastq",
"error_trunc_in_qual.fastq",
"error_trunc_in_seq.fastq",
"error_trunc_in_title.fastq"
};
/**
* Create and return a new FASTQ formatted sequence suitable for testing.
*
* @return a new FASTQ formatted sequence suitable for testing.
*/
public abstract Fastq createFastq();
/**
* Create and return a new instance of an implementation of FastqReader to test.
*
* @return a new instance of an implementation of FastqReader to test
*/
public abstract FastqReader createFastqReader();
/**
* Create and return a new instance of an implementation of FastqWriter to test round-tripping.
*
* @return a new instance of an implementation of FastqWriter to test round-tripping.
*/
public abstract FastqWriter createFastqWriter();
public void testCreateFastq()
{
Fastq fastq = createFastq();
assertNotNull(fastq);
}
public void testCreateFastqReader()
{
FastqReader reader = createFastqReader();
assertNotNull(reader);
}
public void testCreateFastqWriter()
{
FastqWriter writer = createFastqWriter();
assertNotNull(writer);
}
public void testReadFile() throws Exception
{
FastqReader reader = createFastqReader();
try
{
reader.read((File) null);
fail("read((File) null) expected IllegalArgumentException");
}
catch (IllegalArgumentException e)
{
// expected
}
try
{
File noSuchFile = new File("no such file");
reader.read(noSuchFile);
fail("read(no such file) expected IOException");
}
catch (IOException e)
{
// expected
}
}
public void testReadEmptyFile() throws Exception
{
FastqReader reader = createFastqReader();
File empty = File.createTempFile("abstractFastqReaderTest", null);
Iterable<Fastq> iterable = reader.read(empty);
assertNotNull(iterable);
int count = 0;
for (Fastq f : iterable)
{
assertNotNull(f);
count++;
}
assertEquals(0, count);
}
public void testReadRoundTripSingleFile() throws Exception
{
FastqReader reader = createFastqReader();
File single = File.createTempFile("abstractFastqReaderTest", null);
Fastq fastq = createFastq();
FastqWriter writer = createFastqWriter();
writer.write(single, fastq);
Iterable<Fastq> iterable = reader.read(single);
assertNotNull(iterable);
int count = 0;
for (Fastq f : iterable)
{
assertNotNull(f);
count++;
}
assertEquals(1, count);
}
public void testReadRoundTripMultipleFile() throws Exception
{
FastqReader reader = createFastqReader();
File multiple = File.createTempFile("abstractFastqReaderTest", null);
Fastq fastq0 = createFastq();
Fastq fastq1 = createFastq();
Fastq fastq2 = createFastq();
FastqWriter writer = createFastqWriter();
writer.write(multiple, fastq0, fastq1, fastq2);
Iterable<Fastq> iterable = reader.read(multiple);
assertNotNull(iterable);
int count = 0;
for (Fastq f : iterable)
{
assertNotNull(f);
count++;
}
assertEquals(3, count);
}
public void testReadURL() throws Exception
{
FastqReader reader = createFastqReader();
try
{
reader.read((URL) null);
fail("read((URL) null) expected IllegalArgumentException");
}
catch (IllegalArgumentException e)
{
// expected
}
try
{
URL noSuchURL = new URL("file:///no such url");
reader.read(noSuchURL);
fail("read(no such URL) expected IOException");
}
catch (IOException e)
{
// expected
}
}
public void testReadEmptyURL() throws Exception
{
FastqReader reader = createFastqReader();
URL empty = getClass().getResource("empty.fastq");
Iterable<Fastq> iterable = reader.read(empty);
assertNotNull(iterable);
int count = 0;
for (Fastq f : iterable)
{
assertNotNull(f);
count++;
}
assertEquals(0, count);
}
public void testReadInputStream() throws Exception
{
FastqReader reader = createFastqReader();
try
{
reader.read((InputStream) null);
fail("read((InputStream) null) expected IllegalArgumentException");
}
catch (IllegalArgumentException e)
{
// expected
}
}
public void testReadEmptyInputStream() throws Exception
{
FastqReader reader = createFastqReader();
InputStream empty = getClass().getResourceAsStream("empty.fastq");
Iterable<Fastq> iterable = reader.read(empty);
assertNotNull(iterable);
int count = 0;
for (Fastq f : iterable)
{
assertNotNull(f);
count++;
}
assertEquals(0, count);
empty.close();
}
public void testWrappedSequence() throws Exception
{
FastqReader reader = createFastqReader();
InputStream wrappedSequence = getClass().getResourceAsStream("wrapped-sequence.fastq");
Iterable<Fastq> iterable = reader.read(wrappedSequence);
assertNotNull(iterable);
int count = 0;
for (Fastq f : iterable)
{
assertNotNull(f);
assertEquals("ACTG", f.getSequence());
count++;
}
assertEquals(1, count);
wrappedSequence.close();
}
public void testWrappedQuality() throws Exception
{
FastqReader reader = createFastqReader();
InputStream wrappedQuality = getClass().getResourceAsStream("wrapped-quality.fastq");
Iterable<Fastq> iterable = reader.read(wrappedQuality);
assertNotNull(iterable);
int count = 0;
for (Fastq f : iterable)
{
assertNotNull(f);
assertEquals("ZZZZ", f.getQuality());
count++;
}
assertEquals(1, count);
wrappedQuality.close();
}
public void testMultipleWrappedQuality() throws Exception
{
FastqReader reader = createFastqReader();
InputStream wrappedQuality = getClass().getResourceAsStream("multiple-wrapped-quality.fastq");
Iterable<Fastq> iterable = reader.read(wrappedQuality);
assertNotNull(iterable);
int count = 0;
for (Fastq f : iterable)
{
assertNotNull(f);
assertEquals("ZZZZ", f.getQuality());
count++;
}
assertEquals(4, count);
wrappedQuality.close();
}
public void testErrorExamples() throws Exception
{
FastqReader reader = createFastqReader();
for (String errorExample : ERROR_EXAMPLES)
{
InputStream inputStream = getClass().getResourceAsStream(errorExample);
try
{
reader.read(inputStream);
fail("error example " + errorExample + " expected IOException");
}
catch (IOException e)
{
// expected
}
finally
{
if (inputStream != null)
{
try
{
inputStream.close();
}
catch (IOException e)
{
// ignore
}
}
}
}
}
public void testParse() throws Exception
{
FastqReader reader = createFastqReader();
final String input = "";
reader.parse(new StringReader(input), new ParseListener() {
@Override
public void description(final String description) throws IOException {
// empty
}
@Override
public void sequence(final String sequence) throws IOException {
// empty
}
@Override
public void appendSequence(final String sequence) throws IOException {
// empty
}
@Override
public void repeatDescription(final String repeatDescription) throws IOException {
// empty
}
@Override
public void quality(final String quality) throws IOException {
// empty
}
@Override
public void appendQuality(final String quality) throws IOException {
// empty
}
@Override
public void complete() throws IOException {
// empty
}
});
}
public void testParseNullReadable() throws Exception
{
FastqReader reader = createFastqReader();
try
{
reader.parse((Readable) null, new ParseListener() {
@Override
public void description(final String description) throws IOException {
// empty
}
@Override
public void sequence(final String sequence) throws IOException {
// empty
}
@Override
public void appendSequence(final String sequence) throws IOException {
// empty
}
@Override
public void repeatDescription(final String repeatDescription) throws IOException {
// empty
}
@Override
public void quality(final String quality) throws IOException {
// empty
}
@Override
public void appendQuality(final String quality) throws IOException {
// empty
}
@Override
public void complete() throws IOException {
// empty
}
});
fail("parse(null, ) expected IllegalArgumentException");
}
catch (IllegalArgumentException e)
{
// expected
}
}
public void testParseNullParseListener() throws Exception
{
FastqReader reader = createFastqReader();
final String input = "";
try
{
reader.parse(new StringReader(input), null);
fail("parse(, null) expected IllegalArgumentException");
}
catch (IllegalArgumentException e)
{
// expected
}
}
}