/*
 *                    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 static org.biojava.nbio.sequencing.io.fastq.FastqVariant.*;

/**
 * Unit test for FastqVariant.
 */
public final class FastqVariantTest
	extends TestCase
{

	public void testDescription()
	{
		for (FastqVariant variant : values())
		{
			assertNotNull(variant.getDescription());
		}
	}

	public void testIsSanger()
	{
		assertTrue(FASTQ_SANGER.isSanger());
		assertFalse(FASTQ_SOLEXA.isSanger());
		assertFalse(FASTQ_ILLUMINA.isSanger());
	}

	public void testIsSolexa()
	{
		assertFalse(FASTQ_SANGER.isSolexa());
		assertTrue(FASTQ_SOLEXA.isSolexa());
		assertFalse(FASTQ_ILLUMINA.isSolexa());
	}

	public void testIsIllumina()
	{
		assertFalse(FASTQ_SANGER.isIllumina());
		assertFalse(FASTQ_SOLEXA.isIllumina());
		assertTrue(FASTQ_ILLUMINA.isIllumina());
	}

	public void testParseFastqVariant()
	{
		assertEquals(null, parseFastqVariant(null));
		assertEquals(null, parseFastqVariant(""));
		assertEquals(null, parseFastqVariant("not a valid FASTQ variant"));
		assertEquals(FASTQ_SANGER, parseFastqVariant("FASTQ_SANGER"));
		assertEquals(FASTQ_SANGER, parseFastqVariant("fastq-sanger"));
	}

	public void testQualityLessThanMinimumQualityScore()
	{
		for (FastqVariant variant : values())
		{
			try
			{
				variant.quality(variant.minimumQualityScore() - 1);
				fail("expected IllegalArgumentException");
			}
			catch (IllegalArgumentException e)
			{
				// expected
			}
		}
	}

	public void testQualityMoreThanMaximumQualityScore()
	{
		for (FastqVariant variant : values())
		{
			try
			{
				variant.quality(variant.maximumQualityScore() + 1);
				fail("expected IllegalArgumentException");
			}
			catch (IllegalArgumentException e)
			{
				// expected
			}
		}
	}

	public void testQualityQualityScoreRoundTrip()
	{
		for (FastqVariant variant : values())
		{
			for (int i = variant.minimumQualityScore(); i < (variant.maximumQualityScore() + 1); i++)
			{
				assertEquals(i, variant.qualityScore(variant.quality(i)));
			}
		}
	}
}
