/*
* Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
* Copyright (C) $$Year-Rel$$ The Jalview Authors
*
* This file is part of Jalview.
*
* Jalview 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.
*
* Jalview 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 Jalview. If not, see .
* The Jalview Authors are detailed in the 'AUTHORS' file.
*/
package jalview.util;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNull;
import static org.testng.AssertJUnit.fail;
import jalview.gui.JvOptionPane;
import java.text.ParseException;
import java.util.List;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
public class DnaUtilsTest
{
@BeforeClass(alwaysRun = true)
public void setUpJvOptionPane()
{
JvOptionPane.setInteractiveMode(false);
JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
}
/**
* Tests for parsing an ENA/GenBank location specifier
*
* @throws ParseException
*
* @see http://www.insdc.org/files/feature_table.html#3.4
*/
@Test(groups = { "Functional" })
public void testParseLocation() throws ParseException
{
/*
* single locus
*/
List ranges = DnaUtils.parseLocation("467");
assertEquals(1, ranges.size());
assertEquals(467, ranges.get(0)[0]);
assertEquals(467, ranges.get(0)[1]);
/*
* simple range
*/
ranges = DnaUtils.parseLocation("12..78");
assertEquals(1, ranges.size());
assertEquals(12, ranges.get(0)[0]);
assertEquals(78, ranges.get(0)[1]);
/*
* join of simple ranges
*/
ranges = DnaUtils.parseLocation("join(12..78,134..202,322..345)");
assertEquals(3, ranges.size());
assertEquals(12, ranges.get(0)[0]);
assertEquals(78, ranges.get(0)[1]);
assertEquals(134, ranges.get(1)[0]);
assertEquals(202, ranges.get(1)[1]);
assertEquals(322, ranges.get(2)[0]);
assertEquals(345, ranges.get(2)[1]);
/*
* complement of a simple range
*/
ranges = DnaUtils.parseLocation("complement(34..126)");
assertEquals(1, ranges.size());
assertEquals(126, ranges.get(0)[0]);
assertEquals(34, ranges.get(0)[1]);
/*
* complement of a join
*/
ranges = DnaUtils
.parseLocation("complement(join(2691..4571,4918..5163))");
assertEquals(2, ranges.size());
assertEquals(5163, ranges.get(0)[0]);
assertEquals(4918, ranges.get(0)[1]);
assertEquals(4571, ranges.get(1)[0]);
assertEquals(2691, ranges.get(1)[1]);
/*
* join of two complements
*/
ranges = DnaUtils
.parseLocation("join(complement(4918..5163),complement(2691..4571))");
assertEquals(2, ranges.size());
assertEquals(5163, ranges.get(0)[0]);
assertEquals(4918, ranges.get(0)[1]);
assertEquals(4571, ranges.get(1)[0]);
assertEquals(2691, ranges.get(1)[1]);
/*
* join complement to non-complement
* @see http://www.ncbi.nlm.nih.gov/genbank/genomesubmit_annotation/ Transpliced Genes
*/
ranges = DnaUtils
.parseLocation("join(complement(36618..36700),86988..87064)");
assertEquals(2, ranges.size());
assertEquals(36700, ranges.get(0)[0]);
assertEquals(36618, ranges.get(0)[1]);
assertEquals(86988, ranges.get(1)[0]);
assertEquals(87064, ranges.get(1)[1]);
/*
* valid things we don't yet handle
*/
checkForParseException("<34..126");
checkForParseException("35..>126");
checkForParseException("34.126");
checkForParseException("34^126");
checkForParseException("order(34..126,130..180)");
/*
* invalid things
*/
checkForParseException("");
checkForParseException("JOIN(1..2)");
checkForParseException("join(1..2");
checkForParseException("join(1..2(");
checkForParseException("complement(1..2");
checkForParseException("complement(1..2(");
try
{
assertNull(DnaUtils.parseLocation(null));
fail("Expected exception");
} catch (NullPointerException e)
{
// expected
}
/*
* nested joins are not allowed; just as well since this fails to parse
* (splitting tokens by comma fragments the inner join expression)
*/
checkForParseException("join(1..2,join(4..5,10..12),18..22)");
/*
* complement may not enclose multiple ranges
* parsing fails for the same reason
*/
checkForParseException("join(complement(36618..36700,4000..4200),86988..87064)");
}
/**
* Verifies that a ParseException is thrown when the given location is parsed
*
* @param location
*/
void checkForParseException(String location)
{
try
{
DnaUtils.parseLocation(location);
fail("Expected exception");
} catch (ParseException e)
{
// expected;
}
}
}