/* * 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.io; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertNotNull; import static org.testng.AssertJUnit.fail; import jalview.datamodel.AlignmentI; import jalview.datamodel.SequenceI; import jalview.gui.JvOptionPane; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.testng.annotations.BeforeClass; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; public class FormatAdapterTest { @BeforeClass(alwaysRun = true) public void setUpJvOptionPane() { JvOptionPane.setInteractiveMode(false); JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION); } /** * Test saving and re-reading in a specified format * * @throws IOException */ @Test(groups = { "Functional" }, dataProvider = "formats") public void testRoundTrip(FileFormatI format) throws IOException { try { AlignmentI al = new FormatAdapter().readFile("examples/uniref50.fa", DataSourceType.FILE, FileFormat.Fasta); /* * 'gap' is the gap character used in the alignment data file here, * not the user preferred gap character */ char gap = al.getGapCharacter(); assertNotNull(al); SequenceI[] seqs = al.getSequencesArray(); String formatted = new FormatAdapter().formatSequences(format, al, false); AlignmentI reloaded = new FormatAdapter().readFile(formatted, DataSourceType.PASTE, format); List reread = reloaded.getSequences(); assertEquals("Wrong number of reloaded sequences", seqs.length, reread.size()); int i = 0; for (SequenceI seq : reread) { String sequenceString = seq.getSequenceAsString(); /* * special case: MSF always uses '.' as gap character */ sequenceString = adjustForGapTreatment(sequenceString, gap, format); assertEquals( String.format("Sequence %d: %s", i, seqs[i].getName()), seqs[i].getSequenceAsString(), sequenceString); i++; } } catch (IOException e) { fail(String .format("Format %s failed with %s", format, e.getMessage())); } } /** * Optionally change the gap character in the string to the given character, * depending on the sequence file format * * @param sequenceString * a sequence (as written in 'format' format) * @param gap * the sequence's original gap character * @param format * @return */ String adjustForGapTreatment(String sequenceString, char gap, FileFormatI format) { if (FileFormat.MSF.equals(format)) { /* * MSF forces gap character to '.', so change it back * for comparison purposes */ sequenceString = sequenceString.replace('.', gap); } return sequenceString; } /** * Data provider that serves alignment formats that are both readable and * (text) writable * * @return */ @DataProvider(name = "formats") static Object[][] getFormats() { List both = new ArrayList(); for (FileFormatI format : FileFormats.getInstance().getFormats()) { if (format.isReadable() && format.isWritable() && format.isTextFormat()) { both.add(format); } } Object[][] formats = new Object[both.size()][]; int i = 0; for (FileFormatI format : both) { formats[i] = new Object[] { format }; i++; } return formats; } /** * Enable this to isolate testing to a single file format * * @throws IOException */ @Test(groups = { "Functional" }, enabled = false) public void testOneFormatRoundTrip() throws IOException { testRoundTrip(FileFormat.Json); } }