ee731e89273ce4bf9ff34d90a57cee5974aa9041
[jalview.git] / test / jalview / io / NewickFileTests.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.io;
22
23 import org.testng.annotations.Factory;
24 import static org.testng.ConversionUtils.wrapDataProvider;
25 import org.testng.annotations.AfterClass;
26 import org.testng.annotations.Test;
27 import org.testng.annotations.BeforeClass;
28 import org.testng.Assert;
29 import org.testng.AssertJUnit;
30 import java.util.Arrays;
31 import java.util.Collection;
32 import java.util.Iterator;
33 import java.util.Vector;
34
35 import jalview.analysis.NJTree;
36 import jalview.analysis.SequenceIdMatcher;
37 import jalview.datamodel.SequenceI;
38 import jalview.datamodel.SequenceNode;
39
40 import org.jmol.util.ArrayUtil;
41 import org.junit.runners.Parameterized.Parameters;
42
43 /**
44  * @author jimp
45  * 
46  */
47 public class NewickFileTests
48 {
49
50   @Factory
51   public static Object[] factoryData()
52   {
53     return wrapDataProvider(NewickFileTests.class, data());
54   }
55
56   @Parameters
57   public static Collection data()
58   {
59     return Arrays
60             .asList(new Object[][]
61             {
62
63                 new String[]
64                 {
65                     "Simple uniref50 newick",
66                     "(((FER_BRANA:128.0,FER3_RAPSA:128.0):50.75,FER_CAPAA:178.75):121.94443,(Q93Z60_ARATH:271.45456,((O80429_MAIZE:183.0,FER1_MAIZE:183.0):30.5,((Q7XA98_TRIPR:90.0,FER1_PEA:90.0):83.32143,(((FER2_ARATH:64.0,FER1_ARATH:64.0):94.375,(FER1_SPIOL:124.5,FER1_MESCR:124.5):33.875):6.4166718,((Q93XJ9_SOLTU:33.5,FER1_SOLLC:33.5):49.0,FER_CAPAN:82.5):82.29167):8.529755):40.178574):57.95456):29.239868);" },
67                 new String[]
68                 {
69                     "Tree with quotes",
70                     "('Syn_PROSU-1_IIh_3d(CA4)|CK_Syn_PROSU-1_1907':1.0638313,'Syn_MINOS11_5.3_3d(CA4)|CK_Syn_MINOS11_750':1.063831);" },
71                 new String[]
72                 {
73                     "Tree with double escaped comma in node",
74                     "('Syn_PROSU-1_IIh_3d(CA4)|CK_Syn_PROSU-1_1907':1.0638313,'Syn_MINOS11_5.3_3d(CA4)''|CK_Syn_MINOS11_750':1.063831);" } });
75   };
76
77   String name, testTree;
78
79   public NewickFileTests(String _name, String _testTree)
80   {
81     this.name = _name;
82     this.testTree = _testTree;
83   }
84
85   /**
86    * @throws java.lang.Exception
87    */
88   @BeforeClass
89   public static void setUpBeforeClass() throws Exception
90   {
91   }
92
93   @Test
94   public void testTreeIO() throws Exception
95   {
96     String stage = "Init", treename = " '" + name + "' :";
97     try
98     {
99       stage = "Parsing testTree " + treename;
100       System.out.println(treename + "\n" + testTree);
101       NewickFile nf = new NewickFile(testTree, FormatAdapter.PASTE);
102       nf.parse();
103       AssertJUnit.assertTrue(stage + "Invalid Tree '" + nf.getWarningMessage() + "'",
104               nf.isValid());
105       SequenceNode tree = nf.getTree();
106       AssertJUnit.assertTrue(stage + "Null Tree", tree != null);
107       stage = "Creating newick file from testTree " + treename;
108       String gentree = new NewickFile(tree).print(nf.HasBootstrap(),
109               nf.HasDistances());
110       AssertJUnit.assertTrue(stage + "Empty string generated", gentree != null
111               && gentree.trim().length() > 0);
112       stage = "Parsing regenerated testTree " + treename;
113       NewickFile nf_regen = new NewickFile(gentree, FormatAdapter.PASTE);
114       nf_regen.parse();
115       AssertJUnit.assertTrue(
116               stage + "Newick file is invalid ('"
117                       + nf_regen.getWarningMessage() + "')",
118               nf_regen.isValid());
119       SequenceNode tree_regen = nf.getTree();
120       AssertJUnit.assertTrue(stage + "Null Tree", tree_regen != null);
121       stage = "Compare original and generated tree" + treename;
122
123       Vector oseqs, nseqs;
124       oseqs = new NJTree(new SequenceI[0], nf).findLeaves(nf.getTree(),
125               new Vector());
126       AssertJUnit.assertTrue(stage + "No nodes in original tree.", oseqs.size() > 0);
127       SequenceI[] olsqs = new SequenceI[oseqs.size()];
128       for (int i = 0, iSize = oseqs.size(); i < iSize; i++)
129       {
130         olsqs[i] = (SequenceI) ((SequenceNode) oseqs.get(i)).element();
131       }
132       nseqs = (Vector) new NJTree(new SequenceI[0], nf_regen).findLeaves(
133               nf_regen.getTree(), new Vector());
134       AssertJUnit.assertTrue(stage + "No nodes in regerated tree.", nseqs.size() > 0);
135       SequenceI[] nsqs = new SequenceI[nseqs.size()];
136       for (int i = 0, iSize = nseqs.size(); i < iSize; i++)
137       {
138         nsqs[i] = (SequenceI) ((SequenceNode) nseqs.get(i)).element();
139       }
140       AssertJUnit.assertTrue(stage + " Different number of leaves (original "
141               + olsqs.length + " and regen " + nsqs.length + ")",
142               olsqs.length == nsqs.length);
143       SequenceIdMatcher omatcher = new SequenceIdMatcher(olsqs), nmatcher = new SequenceIdMatcher(
144               nsqs);
145
146       SequenceI[] osmatches = omatcher.findIdMatch(nsqs);
147       SequenceI[] nsmatches = nmatcher.findIdMatch(olsqs);
148       String warns = "";
149       for (int i = 0, iSize = nseqs.size(); i < iSize; i++)
150       {
151         if (nsmatches[i] == null)
152         {
153           warns += "\noriginal sequence ID '" + olsqs[i].getName()
154                   + "' wasn't found in regenerated set.";
155         }
156         if (osmatches[i] == null)
157         {
158           warns += "\nregenerated sequence ID '" + nsqs[i].getName()
159                   + "' wasn't found in original set.";
160         }
161       }
162
163       if (warns.length() > 0)
164       {
165         Assert.fail(stage + warns);
166       }
167     } catch (Exception x)
168     {
169       throw (new Exception(stage + "Exception raised", x));
170     }
171   }
172
173   /**
174    * @throws java.lang.Exception
175    */
176   @AfterClass
177   public static void tearDownAfterClass() throws Exception
178   {
179   }
180
181 }