/*
* 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.gui;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertSame;
import static org.testng.Assert.assertTrue;
import jalview.bin.Cache;
import jalview.datamodel.Alignment;
import jalview.datamodel.AlignmentI;
import jalview.datamodel.Sequence;
import jalview.datamodel.SequenceI;
import jalview.schemes.ClustalxColourScheme;
import jalview.schemes.ColourSchemeI;
import jalview.schemes.ColourSchemes;
import jalview.schemes.NucleotideColourScheme;
import jalview.schemes.PIDColourScheme;
import jalview.schemes.ResidueColourScheme;
import jalview.util.MessageManager;
import java.util.Enumeration;
import java.util.Iterator;
import javax.swing.AbstractButton;
import javax.swing.ButtonGroup;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
public class ColourMenuHelperTest
{
/**
* Use a properties file with a user-defined colour scheme
*/
@BeforeClass(alwaysRun = true)
public void setUp()
{
Cache.loadProperties("test/jalview/io/testProps.jvprops");
}
@Test(groups = "Functional")
public void testAddMenuItems_peptide()
{
SequenceI s1 = new Sequence("s1", "KFRQSILM");
AlignmentI al = new Alignment(new SequenceI[] { s1 });
JMenu menu = new JMenu();
ButtonGroup bg = ColourMenuHelper.addMenuItems(menu, null, al, false);
Enumeration bgElements = bg.getElements();
/*
* first entry is 'No Colour' option
*/
JMenuItem item = menu.getItem(0);
assertEquals(item.getName(), ResidueColourScheme.NONE);
assertEquals(item.getText(), MessageManager.getString("label.none"));
AbstractButton bgItem = bgElements.nextElement();
assertSame(bgItem, item);
/*
* check that each registered colour scheme is in the menu,
* and in the button group;
* nucleotide-only schemes should be disabled menu items
*/
Iterator colourSchemes = ColourSchemes.getInstance()
.getColourSchemes().iterator();
final int items = menu.getItemCount();
for (int i = 1; i < items; i++)
{
item = menu.getItem(i);
bgItem = bgElements.nextElement();
assertSame(bgItem, item);
ColourSchemeI cs = colourSchemes.next();
String name = cs.getSchemeName();
assertEquals(item.getName(), name);
boolean enabled = item.isEnabled();
assertEquals(enabled, cs.isApplicableTo(al));
if (cs instanceof NucleotideColourScheme) // nucleotide only
{
assertFalse(enabled);
}
if (cs instanceof ClustalxColourScheme) // peptide only
{
assertTrue(enabled);
}
if (cs instanceof PIDColourScheme) // nucleotide or peptide
{
assertTrue(enabled);
}
/*
* check i18n for display name
*/
String label = MessageManager.getStringOrReturn("label.colourScheme_",
name);
assertEquals(item.getText(), label);
}
/*
* check nothing left over
*/
assertFalse(colourSchemes.hasNext());
assertFalse(bgElements.hasMoreElements());
}
@Test(groups = "Functional")
public void testAddMenuItems_nucleotide()
{
SequenceI s1 = new Sequence("s1", "GAATAATCCATAACAG");
AlignmentI al = new Alignment(new SequenceI[] { s1 });
JMenu menu = new JMenu();
AlignFrame af = new AlignFrame(al, 500, 500);
/*
* menu for SequenceGroup excludes 'User Defined Colour'
*/
PopupMenu popup = new PopupMenu(af.alignPanel, s1, null);
ButtonGroup bg = ColourMenuHelper.addMenuItems(menu, popup, al, false);
Enumeration bgElements = bg.getElements();
/*
* first entry is 'No Colour' option
*/
JMenuItem item = menu.getItem(0);
assertEquals(item.getName(), ResidueColourScheme.NONE);
assertEquals(item.getText(), MessageManager.getString("label.none"));
AbstractButton bgItem = bgElements.nextElement();
assertSame(bgItem, item);
/*
* check that each registered colour scheme is in the menu,
* and in the button group;
* nucleotide-only schemes should be disabled menu items
*/
Iterator colourSchemes = ColourSchemes.getInstance()
.getColourSchemes().iterator();
final int items = menu.getItemCount();
for (int i = 1; i < items; i++)
{
item = menu.getItem(i);
bgItem = bgElements.nextElement();
assertSame(bgItem, item);
ColourSchemeI cs = colourSchemes.next();
String name = cs.getSchemeName();
assertEquals(item.getName(), name);
boolean enabled = item.isEnabled();
assertEquals(enabled, cs.isApplicableTo(al));
if (cs instanceof NucleotideColourScheme) // nucleotide only
{
assertTrue(enabled);
}
if (cs instanceof ClustalxColourScheme) // peptide only
{
assertFalse(enabled);
}
if (cs instanceof PIDColourScheme) // nucleotide or peptide
{
assertTrue(enabled);
}
/*
* check i18n for display name
*/
String label = MessageManager.getStringOrReturn("label.colourScheme_",
name);
assertEquals(item.getText(), label);
}
/*
* check nothing left over
*/
assertFalse(colourSchemes.hasNext());
assertFalse(bgElements.hasMoreElements());
}
/**
* 'Simple only' mode constructs colour menu for structures
*
* - no 'No Colour' option
* - only simple colour schemes (colour per residue)
*
*/
@Test(groups = "Functional")
public void testAddMenuItems_simpleOnly()
{
SequenceI s1 = new Sequence("s1", "KFRQSILM");
AlignmentI al = new Alignment(new SequenceI[] { s1 });
JMenu menu = new JMenu();
ButtonGroup bg = ColourMenuHelper.addMenuItems(menu, null, al, true);
Enumeration bgElements = bg.getElements();
/*
* check that only 'simple' colour schemes are included
*/
Iterator colourSchemes = ColourSchemes.getInstance()
.getColourSchemes().iterator();
int i = 0;
while (colourSchemes.hasNext())
{
ColourSchemeI cs = colourSchemes.next();
if (!cs.isSimple())
{
continue;
}
JMenuItem item = menu.getItem(i++);
AbstractButton bgItem = bgElements.nextElement();
assertSame(bgItem, item);
}
/*
* check nothing left over
*/
assertEquals(i, menu.getItemCount());
assertFalse(bgElements.hasMoreElements());
}
/*
* menu for AlignFrame includes 'User Defined Colour'
*/
@Test(groups = "Functional")
public void testAddMenuItems_forAlignFrame()
{
SequenceI s1 = new Sequence("s1", "KFRQSILM");
AlignmentI al = new Alignment(new SequenceI[] { s1 });
AlignFrame af = new AlignFrame(al, 500, 500);
JMenu menu = new JMenu();
ButtonGroup bg = ColourMenuHelper.addMenuItems(menu, af, al, false);
Enumeration bgElements = bg.getElements();
/*
* check that each registered colour scheme is in the menu,
* (skipping over No Colour which is the first menu item),
* and in the button group
*/
bgElements.nextElement(); // skip No Colour
Iterator colourSchemes = ColourSchemes.getInstance()
.getColourSchemes().iterator();
final int items = menu.getItemCount();
for (int i = 1; i < items - 1; i++)
{
JMenuItem item = menu.getItem(i);
AbstractButton bgItem = bgElements.nextElement();
assertSame(bgItem, item);
ColourSchemeI cs = colourSchemes.next();
assertEquals(item.getName(), cs.getSchemeName());
}
/*
* check menu also has User Defined Colour
*/
assertFalse(colourSchemes.hasNext());
JMenuItem item = menu.getItem(items - 1);
AbstractButton bgItem = bgElements.nextElement();
assertSame(bgItem, item);
assertEquals(item.getName(), ResidueColourScheme.USER_DEFINED_MENU);
assertEquals(item.getText(),
MessageManager.getString("action.user_defined"));
}
}