/*
* 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.datamodel.features;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertTrue;
import jalview.datamodel.SequenceFeature;
import jalview.datamodel.features.FeatureAttributes.Datatype;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import junit.extensions.PA;
public class FeatureAttributesTest
{
/**
* clear down attributes map before tests
*/
@BeforeClass(alwaysRun = true)
public void setUp()
{
FeatureAttributes fa = FeatureAttributes.getInstance();
((Map, ?>) PA.getValue(fa, "attributes")).clear();
}
/**
* clear down attributes map after tests
*/
@AfterMethod(alwaysRun = true)
public void tearDown()
{
FeatureAttributes fa = FeatureAttributes.getInstance();
((Map, ?>) PA.getValue(fa, "attributes")).clear();
}
/**
* Test the method that keeps attribute names in non-case-sensitive order,
* including handling of 'compound' names
*/
@Test(groups = "Functional")
public void testAttributeNameComparator()
{
FeatureAttributes fa = FeatureAttributes.getInstance();
Comparator comp = (Comparator) PA.getValue(fa,
"comparator");
assertEquals(
comp.compare(new String[]
{ "CSQ" }, new String[] { "csq" }), 0);
assertTrue(
comp.compare(new String[]
{ "CSQ", "a" }, new String[] { "csq" }) > 0);
assertTrue(
comp.compare(new String[]
{ "CSQ" }, new String[] { "csq", "b" }) < 0);
assertTrue(
comp.compare(new String[]
{ "CSQ", "AF" }, new String[] { "csq", "ac" }) > 0);
assertTrue(
comp.compare(new String[]
{ "CSQ", "ac" }, new String[] { "csq", "AF" }) < 0);
}
@Test(groups = "Functional")
public void testGetMinMax()
{
SequenceFeature sf = new SequenceFeature("Pfam", "desc", 10, 20,
"group");
FeatureAttributes fa = FeatureAttributes.getInstance();
assertNull(fa.getMinMax("Pfam", "kd"));
sf.setValue("domain", "xyz");
assertNull(fa.getMinMax("Pfam", "kd"));
sf.setValue("kd", "1.3");
assertEquals(fa.getMinMax("Pfam", "kd"), new float[] { 1.3f, 1.3f });
sf.setValue("kd", "-2.6");
assertEquals(fa.getMinMax("Pfam", "kd"), new float[] { -2.6f, 1.3f });
// setting 'mixed' character and numeric values wipes the min/max value
sf.setValue("kd", "some text");
assertNull(fa.getMinMax("Pfam", "kd"));
Map csq = new HashMap<>();
csq.put("AF", "-3");
sf.setValue("CSQ", csq);
assertEquals(fa.getMinMax("Pfam", "CSQ", "AF"),
new float[]
{ -3f, -3f });
csq.put("AF", "4");
sf.setValue("CSQ", csq);
assertEquals(fa.getMinMax("Pfam", "CSQ", "AF"),
new float[]
{ -3f, 4f });
}
/**
* Test the method that returns an attribute description, provided it is
* recorded and unique
*/
@Test(groups = "Functional")
public void testGetDescription()
{
FeatureAttributes fa = FeatureAttributes.getInstance();
// with no description returns null
assertNull(fa.getDescription("Pfam", "kd"));
// with a unique description, returns that value
fa.addDescription("Pfam", "desc1", "kd");
assertEquals(fa.getDescription("Pfam", "kd"), "desc1");
// with ambiguous description, returns null
fa.addDescription("Pfam", "desc2", "kd");
assertNull(fa.getDescription("Pfam", "kd"));
}
@Test(groups = "Functional")
public void testDatatype()
{
FeatureAttributes fa = FeatureAttributes.getInstance();
assertNull(fa.getDatatype("Pfam", "kd"));
SequenceFeature sf = new SequenceFeature("Pfam", "desc", 10, 20,
"group");
sf.setValue("kd", "-1");
sf.setValue("domain", "Metal");
sf.setValue("phase", "1");
sf.setValue("phase", "reverse");
assertEquals(fa.getDatatype("Pfam", "kd"), Datatype.Number);
assertEquals(fa.getDatatype("Pfam", "domain"), Datatype.Character);
assertEquals(fa.getDatatype("Pfam", "phase"), Datatype.Mixed);
}
}